]> Untitled Git - lemmy.git/commitdiff
Fix problem where actors can have empty public key (fixes #2347) (#2348)
authorNutomic <me@nutomic.com>
Mon, 11 Jul 2022 18:25:33 +0000 (18:25 +0000)
committerGitHub <noreply@github.com>
Mon, 11 Jul 2022 18:25:33 +0000 (18:25 +0000)
29 files changed:
crates/api/src/lib.rs
crates/api/src/local_user/save_settings.rs
crates/api_crud/src/community/create.rs
crates/api_crud/src/user/create.rs
crates/apub/src/collections/community_moderators.rs
crates/apub/src/objects/person.rs
crates/apub/src/protocol/objects/group.rs
crates/db_schema/src/aggregates/comment_aggregates.rs
crates/db_schema/src/aggregates/community_aggregates.rs
crates/db_schema/src/aggregates/person_aggregates.rs
crates/db_schema/src/aggregates/post_aggregates.rs
crates/db_schema/src/aggregates/site_aggregates.rs
crates/db_schema/src/impls/activity.rs
crates/db_schema/src/impls/comment.rs
crates/db_schema/src/impls/community.rs
crates/db_schema/src/impls/moderator.rs
crates/db_schema/src/impls/password_reset_request.rs
crates/db_schema/src/impls/person.rs
crates/db_schema/src/impls/person_mention.rs
crates/db_schema/src/impls/post.rs
crates/db_schema/src/impls/private_message.rs
crates/db_schema/src/source/community.rs
crates/db_schema/src/source/person.rs
crates/db_views/src/comment_report_view.rs
crates/db_views/src/comment_view.rs
crates/db_views/src/post_report_view.rs
crates/db_views/src/post_view.rs
crates/db_views/src/registration_application_view.rs
src/code_migrations.rs

index 2974103e209def3f0c33b9394664b6027c73cbf4..dc105918bdcfa86e9906066f8b43b4600281d91b 100644 (file)
@@ -230,6 +230,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "Gerry9812".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
index ec34321469b985725030ddf7ac856cf562e7ce69..9929fc0c76f0c32053ec50f2b4cc9a781c4a7cca 100644 (file)
@@ -87,7 +87,7 @@ impl Perform for SaveUserSettings {
     let default_listing_type = data.default_listing_type;
     let default_sort_type = data.default_sort_type;
     let password_encrypted = local_user_view.local_user.password_encrypted;
-    let public_key = local_user_view.person.public_key;
+    let public_key = Some(local_user_view.person.public_key);
 
     let person_form = PersonForm {
       name: local_user_view.person.name,
index 3de024f8ef201477860aaf2b82ab58853c37dec6..2767750dcf9c06b2582b93a22bd948a209cb9328 100644 (file)
@@ -93,7 +93,7 @@ impl PerformCrud for CreateCommunity {
       nsfw: data.nsfw,
       actor_id: Some(community_actor_id.to_owned()),
       private_key: Some(Some(keypair.private_key)),
-      public_key: keypair.public_key,
+      public_key: Some(keypair.public_key),
       followers_url: Some(generate_followers_url(&community_actor_id)?),
       inbox_url: Some(generate_inbox_url(&community_actor_id)?),
       shared_inbox_url: Some(Some(generate_shared_inbox_url(&community_actor_id)?)),
index edb048928f5ea80ed13d8529943e183a33097780..7d35f3207e0d36d53eed69590807afc911d06611 100644 (file)
@@ -118,7 +118,7 @@ impl PerformCrud for Register {
       name: data.username.to_owned(),
       actor_id: Some(actor_id.clone()),
       private_key: Some(Some(actor_keypair.private_key)),
-      public_key: actor_keypair.public_key,
+      public_key: Some(actor_keypair.public_key),
       inbox_url: Some(generate_inbox_url(&actor_id)?),
       shared_inbox_url: Some(Some(generate_shared_inbox_url(&actor_id)?)),
       admin: Some(no_admins),
index 7243ac3e75455250dc177a55e0b29ef837027660..2c0c4cd90e8ed4a10b2a663ae90651f5a2e9162d 100644 (file)
@@ -169,6 +169,7 @@ mod tests {
 
     let old_mod = PersonForm {
       name: "holly".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
     let old_mod = Person::create(&context.pool().get().unwrap(), &old_mod).unwrap();
index 5d47fbc04e0bf19ef982a0d37d105f26385bdd7f..0b1dd84de2a7ee3752cdea0ceecd8022a129cf6c 100644 (file)
@@ -156,7 +156,7 @@ impl ApubObject for ApubPerson {
       admin: Some(false),
       bot_account: Some(person.kind == UserTypes::Service),
       private_key: None,
-      public_key: person.public_key.public_key_pem,
+      public_key: Some(person.public_key.public_key_pem),
       last_refreshed_at: Some(naive_now()),
       inbox_url: Some(person.inbox.into()),
       shared_inbox_url: Some(person.endpoints.map(|e| e.shared_inbox.into())),
index 40409f641cb0cf22ac3ccdadb5c50cdc6502bffb..12c94a198826e0602dcbdc4a2c9631207025db84 100644 (file)
@@ -88,7 +88,7 @@ impl Group {
       local: Some(false),
       private_key: None,
       hidden: Some(false),
-      public_key: self.public_key.public_key_pem,
+      public_key: Some(self.public_key.public_key_pem),
       last_refreshed_at: Some(naive_now()),
       icon: Some(self.icon.map(|i| i.url.into())),
       banner: Some(self.image.map(|i| i.url.into())),
index 5e70bcc5f0f1afacd190e64a0d61d643d199c74b..ec08bd4ec4148b9fadcaad228865bfd50a8eb01f 100644 (file)
@@ -35,6 +35,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "thommy_comment_agg".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -42,6 +43,7 @@ mod tests {
 
     let another_person = PersonForm {
       name: "jerry_comment_agg".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -50,6 +52,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "TIL_comment_agg".into(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index 950e68d3738a121ada292b373c8128af40afd9a9..a4a3343b637cfff966d5a29265269db915c2237e 100644 (file)
@@ -35,6 +35,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "thommy_community_agg".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -42,6 +43,7 @@ mod tests {
 
     let another_person = PersonForm {
       name: "jerry_community_agg".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -50,6 +52,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "TIL_community_agg".into(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
@@ -58,6 +61,7 @@ mod tests {
     let another_community = CommunityForm {
       name: "TIL_community_agg_2".into(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index 0f270f9cb8f4a31df13153eccba0c2c68eea4424..37fcb1f48cb48b96964a44fbfcfbc7bdd5109fa4 100644 (file)
@@ -31,6 +31,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "thommy_user_agg".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -38,6 +39,7 @@ mod tests {
 
     let another_person = PersonForm {
       name: "jerry_user_agg".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -46,6 +48,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "TIL_site_agg".into(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index 3d1a272901792d44ec2610d4aced16b5f0006826..33c8b502a5640644af629a9e9ccecc3c7816c227 100644 (file)
@@ -31,6 +31,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "thommy_community_agg".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -38,6 +39,7 @@ mod tests {
 
     let another_person = PersonForm {
       name: "jerry_community_agg".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -46,6 +48,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "TIL_community_agg".into(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index 8cf57dfd8b2f99de9235d4ee3d757dddc3347883..bf372815a6f565264107542030d04bd27dc64f30 100644 (file)
@@ -30,6 +30,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "thommy_site_agg".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -37,6 +38,7 @@ mod tests {
 
     let site_form = SiteForm {
       name: "test_site".into(),
+      public_key: Some("pubkey".to_string()),
       ..Default::default()
     };
 
@@ -45,6 +47,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "TIL_site_agg".into(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index 48429315eb6ad8161e876da76c6e5c392eabc5fe..b22550a4e75df4f1c726ec86d2c7a400adad5ba6 100644 (file)
@@ -97,6 +97,7 @@ mod tests {
 
     let creator_form = PersonForm {
       name: "activity_creator_pm".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
index 5fb3280c9b5c88c0e286aa1971d29f9f8e2b0d96..908aed86f2148522a654cc01d22b1ceb7b9016a7 100644 (file)
@@ -227,6 +227,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "terry".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -235,6 +236,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "test community".to_string(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index a0a1dde2a99effd4fa2618869f6382ac0413123c..45675aa368329851fd456e50d3dd9166a609f7b8 100644 (file)
@@ -377,6 +377,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "bobbee".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -385,7 +386,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "TIL".into(),
       title: "nada".to_owned(),
-      public_key: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
@@ -404,7 +405,7 @@ mod tests {
       actor_id: inserted_community.actor_id.to_owned(),
       local: true,
       private_key: None,
-      public_key: "nada".to_owned(),
+      public_key: "pubkey".to_owned(),
       last_refreshed_at: inserted_community.published,
       icon: None,
       banner: None,
index d432373594631c94a72e2e9429645f2630a66a2d..b3d19118f15e11db17fde11c0533a81242208e92 100644 (file)
@@ -372,6 +372,7 @@ mod tests {
 
     let new_mod = PersonForm {
       name: "the mod".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -379,6 +380,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "jim2".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -387,6 +389,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "mod_community".to_string(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index 576e2673955fbe2c355b73f9fe095f58e6429e7a..780c6c2804abd14698b1072b30319df10ac0ee3b 100644 (file)
@@ -87,6 +87,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "thommy prw".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
index 2608ef5be1eb4986d51877655c1aecc6566711cc..73807d2e39f1542fc15bf7adf8aab8e03229bb1b 100644 (file)
@@ -343,7 +343,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "holly".into(),
-      public_key: "nada".to_owned(),
+      public_key: Some("nada".to_owned()),
       ..PersonForm::default()
     };
 
index c8fb6cc0966c0f14f0ac5f4acbf04797d5db299b..1de3fef1f7fbc8eea9d8d985214ce9df6670fa44 100644 (file)
@@ -97,6 +97,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "terrylake".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -104,6 +105,7 @@ mod tests {
 
     let recipient_form = PersonForm {
       name: "terrylakes recipient".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -112,6 +114,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "test community lake".to_string(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index d616229a20a4a96d78e2ea5399beb1d7e0f4bd3a..9018cdadfd4311773ea6329641ce5aed5377b251 100644 (file)
@@ -343,6 +343,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "jim".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -351,6 +352,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "test community_3".to_string(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index d5506990d4ad4e6fbb6a03b2abce01d1ce6a933a..b2407bdfab5759bfbf7fb4e2df1b359c853e2828 100644 (file)
@@ -151,6 +151,7 @@ mod tests {
 
     let creator_form = PersonForm {
       name: "creator_pm".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -158,6 +159,7 @@ mod tests {
 
     let recipient_form = PersonForm {
       name: "recipient_pm".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
index 7693f2f419c8d88ac335930632873e333d32bed2..a82a7a82bb75d9d10ac1d9fc42654bfcbec3183e 100644 (file)
@@ -68,7 +68,7 @@ pub struct CommunityForm {
   pub actor_id: Option<DbUrl>,
   pub local: Option<bool>,
   pub private_key: Option<Option<String>>,
-  pub public_key: String,
+  pub public_key: Option<String>,
   pub last_refreshed_at: Option<chrono::NaiveDateTime>,
   pub icon: Option<Option<DbUrl>>,
   pub banner: Option<Option<DbUrl>>,
index 7c301c99881afc392a1871d4067e4caa398bb4b4..e4888ddbf576b5f689cbddfca596724524acf0b0 100644 (file)
@@ -172,7 +172,7 @@ pub struct PersonForm {
   pub bio: Option<Option<String>>,
   pub local: Option<bool>,
   pub private_key: Option<Option<String>>,
-  pub public_key: String,
+  pub public_key: Option<String>,
   pub last_refreshed_at: Option<chrono::NaiveDateTime>,
   pub banner: Option<Option<DbUrl>>,
   pub deleted: Option<bool>,
index 946503efe2beb6b667b5f73fd1e2ad560bc53a0c..b6f5694550163cbbf76e566b2ee25967310d404f 100644 (file)
@@ -321,6 +321,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "timmy_crv".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -328,6 +329,7 @@ mod tests {
 
     let new_person_2 = PersonForm {
       name: "sara_crv".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -336,6 +338,7 @@ mod tests {
     // Add a third person, since new ppl can only report something once.
     let new_person_3 = PersonForm {
       name: "jessica_crv".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -344,6 +347,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "test community crv".to_string(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index 6a665975caef7e97ba9c7a99e4f7af1c31e3554f..02c523aa09bb49659c0f86cc740b8888ff259bb9 100644 (file)
@@ -551,6 +551,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "timmy".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -558,6 +559,7 @@ mod tests {
 
     let new_person_2 = PersonForm {
       name: "sara".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -566,6 +568,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "test community 5".to_string(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index 64550d214e6fab6f0b84849f0625fdeed4b37755..1991fab2ce01d545f9cb3c0ec9f880fa0ebd89ea 100644 (file)
@@ -310,6 +310,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: "timmy_prv".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -317,6 +318,7 @@ mod tests {
 
     let new_person_2 = PersonForm {
       name: "sara_prv".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -325,6 +327,7 @@ mod tests {
     // Add a third person, since new ppl can only report something once.
     let new_person_3 = PersonForm {
       name: "jessica_prv".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -333,6 +336,7 @@ mod tests {
     let new_community = CommunityForm {
       name: "test community prv".to_string(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
index 65b177cb139042a8eb2d32bf1bac7154dd048b2a..9de6edcd4ae84ba7ea3d86abb6a2a4b1e211ca49 100644 (file)
@@ -535,6 +535,7 @@ mod tests {
 
     let new_person = PersonForm {
       name: person_name.to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -543,6 +544,7 @@ mod tests {
     let new_bot = PersonForm {
       name: person_name.to_owned(),
       bot_account: Some(true),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -551,6 +553,7 @@ mod tests {
     let new_community = CommunityForm {
       name: community_name.to_owned(),
       title: "nada".to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..CommunityForm::default()
     };
 
@@ -559,6 +562,7 @@ mod tests {
     // Test a person block, make sure the post query doesn't include their post
     let blocked_person = PersonForm {
       name: person_name.to_owned(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
index 2e3724d14896e6fd5a2b278c4e98165ba7f73cc1..02d1ec24bd4f227eda98dd8df8ec0214959b49a5 100644 (file)
@@ -187,6 +187,7 @@ mod tests {
     let timmy_person_form = PersonForm {
       name: "timmy_rav".into(),
       admin: Some(true),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -202,6 +203,7 @@ mod tests {
 
     let sara_person_form = PersonForm {
       name: "sara_rav".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
@@ -228,6 +230,7 @@ mod tests {
 
     let jess_person_form = PersonForm {
       name: "jess_rav".into(),
+      public_key: Some("pubkey".to_string()),
       ..PersonForm::default()
     };
 
index de681631542878d2e1e28f55267022d32b85bd4b..ff8c715268a2915fe320440e35a727a58cc4afa0 100644 (file)
@@ -25,6 +25,7 @@ use lemmy_db_schema::{
   utils::naive_now,
 };
 use lemmy_utils::error::LemmyError;
+use std::default::Default;
 use tracing::info;
 use url::Url;
 
@@ -40,6 +41,7 @@ pub fn run_advanced_migrations(
   post_thumbnail_url_updates_2020_07_27(conn, protocol_and_hostname)?;
   apub_columns_2021_02_02(conn)?;
   instance_actor_2022_01_28(conn, protocol_and_hostname)?;
+  regenerate_public_keys_2022_07_05(conn)?;
 
   Ok(())
 }
@@ -69,7 +71,7 @@ fn user_updates_2020_04_02(
         protocol_and_hostname,
       )?),
       private_key: Some(Some(keypair.private_key)),
-      public_key: keypair.public_key,
+      public_key: Some(keypair.public_key),
       last_refreshed_at: Some(naive_now()),
       ..PersonForm::default()
     };
@@ -112,7 +114,7 @@ fn community_updates_2020_04_02(
       actor_id: Some(community_actor_id.to_owned()),
       local: Some(ccommunity.local),
       private_key: Some(Some(keypair.private_key)),
-      public_key: keypair.public_key,
+      public_key: Some(keypair.public_key),
       last_refreshed_at: Some(naive_now()),
       icon: Some(ccommunity.icon.to_owned()),
       banner: Some(ccommunity.banner.to_owned()),
@@ -294,6 +296,10 @@ fn instance_actor_2022_01_28(
 ) -> Result<(), LemmyError> {
   info!("Running instance_actor_2021_09_29");
   if let Ok(site) = Site::read_local_site(conn) {
+    // if site already has public key, we dont need to do anything here
+    if !site.public_key.is_empty() {
+      return Ok(());
+    }
     let key_pair = generate_actor_keypair()?;
     let actor_id = Url::parse(protocol_and_hostname)?;
     let site_form = SiteForm {
@@ -309,3 +315,60 @@ fn instance_actor_2022_01_28(
   }
   Ok(())
 }
+
+/// Fix for bug #2347, which can result in community/person public keys being overwritten with
+/// empty string when the database value is updated. We go through all actors, and if the public
+/// key field is empty, generate a new keypair. It would be possible to regenerate only the pubkey,
+/// but thats more complicated and has no benefit, as federation is already broken for these actors.
+/// https://github.com/LemmyNet/lemmy/issues/2347
+fn regenerate_public_keys_2022_07_05(conn: &PgConnection) -> Result<(), LemmyError> {
+  info!("Running regenerate_public_keys_2022_07_05");
+
+  {
+    // update communities with empty pubkey
+    use lemmy_db_schema::schema::community::dsl::*;
+    let communities: Vec<Community> = community
+      .filter(local.eq(true))
+      .filter(public_key.eq(""))
+      .load::<Community>(conn)?;
+    for community_ in communities {
+      info!(
+        "local community {} has empty public key field, regenerating key",
+        community_.name
+      );
+      let key_pair = generate_actor_keypair()?;
+      let form = CommunityForm {
+        name: community_.name,
+        title: community_.title,
+        public_key: Some(key_pair.public_key),
+        private_key: Some(Some(key_pair.private_key)),
+        ..Default::default()
+      };
+      Community::update(conn, community_.id, &form)?;
+    }
+  }
+
+  {
+    // update persons with empty pubkey
+    use lemmy_db_schema::schema::person::dsl::*;
+    let persons = person
+      .filter(local.eq(true))
+      .filter(public_key.eq(""))
+      .load::<Person>(conn)?;
+    for person_ in persons {
+      info!(
+        "local user {} has empty public key field, regenerating key",
+        person_.name
+      );
+      let key_pair = generate_actor_keypair()?;
+      let form = PersonForm {
+        name: person_.name,
+        public_key: Some(key_pair.public_key),
+        private_key: Some(Some(key_pair.private_key)),
+        ..Default::default()
+      };
+      Person::update(conn, person_.id, &form)?;
+    }
+  }
+  Ok(())
+}