summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTimo Kösters <timo@koesters.xyz>2022-12-16 08:38:49 +0000
committerTimo Kösters <timo@koesters.xyz>2022-12-16 08:38:49 +0000
commitdb7a7085f4e65fed17140a5d15327bc67bcdacdd (patch)
tree9b889b7469b36090c3369c5f840828ed7baabf70 /src
parent5894d35eb234194b85ad8ed575159f56a3ab6529 (diff)
parenta2d8aec1e3a1578872f1caaee719d3acfa5227bc (diff)
downloadconduit-db7a7085f4e65fed17140a5d15327bc67bcdacdd.zip
Merge branch 'fix/pushrules_database' into 'next'
Migrate database to use correct rule id in pushrules. See merge request famedly/conduit!405
Diffstat (limited to 'src')
-rw-r--r--src/database/mod.rs81
1 files changed, 78 insertions, 3 deletions
diff --git a/src/database/mod.rs b/src/database/mod.rs
index 3746efe..46ffad0 100644
--- a/src/database/mod.rs
+++ b/src/database/mod.rs
@@ -7,7 +7,8 @@ use directories::ProjectDirs;
use lru_cache::LruCache;
use ruma::{
events::{
- push_rules::PushRulesEventContent, room::message::RoomMessageEventContent,
+ push_rules::{PushRulesEvent, PushRulesEventContent},
+ room::message::RoomMessageEventContent,
GlobalAccountDataEvent, GlobalAccountDataEventType, StateEventType,
},
push::Ruleset,
@@ -407,7 +408,7 @@ impl KeyValueDatabase {
}
// If the database has any data, perform data migrations before starting
- let latest_database_version = 11;
+ let latest_database_version = 12;
if services().users.count()? > 0 {
// MIGRATIONS
@@ -803,7 +804,81 @@ impl KeyValueDatabase {
warn!("Migration: 10 -> 11 finished");
}
- assert_eq!(11, latest_database_version);
+ if services().globals.database_version()? < 12 {
+ for username in services().users.list_local_users().unwrap() {
+ let user =
+ UserId::parse_with_server_name(username, services().globals.server_name())
+ .unwrap();
+
+ let raw_rules_list = services()
+ .account_data
+ .get(
+ None,
+ &user,
+ GlobalAccountDataEventType::PushRules.to_string().into(),
+ )
+ .unwrap()
+ .expect("Username is invalid");
+
+ let mut account_data =
+ serde_json::from_str::<PushRulesEvent>(raw_rules_list.get()).unwrap();
+ let rules_list = &mut account_data.content.global;
+
+ //content rule
+ {
+ let content_rule_transformation =
+ [".m.rules.contains_user_name", ".m.rule.contains_user_name"];
+
+ let rule = rules_list.content.get(content_rule_transformation[0]);
+ if rule.is_some() {
+ let mut rule = rule.unwrap().clone();
+ rule.rule_id = content_rule_transformation[1].to_string();
+ rules_list.content.remove(content_rule_transformation[0]);
+ rules_list.content.insert(rule);
+ }
+ }
+
+ //underride rules
+ {
+ let underride_rule_transformation = [
+ [".m.rules.call", ".m.rule.call"],
+ [".m.rules.room_one_to_one", ".m.rule.room_one_to_one"],
+ [
+ ".m.rules.encrypted_room_one_to_one",
+ ".m.rule.encrypted_room_one_to_one",
+ ],
+ [".m.rules.message", ".m.rule.message"],
+ [".m.rules.encrypted", ".m.rule.encrypted"],
+ ];
+
+ for transformation in underride_rule_transformation {
+ let rule = rules_list.underride.get(transformation[0]);
+ if let Some(rule) = rule {
+ let mut rule = rule.clone();
+ rule.rule_id = transformation[1].to_string();
+ rules_list.underride.remove(transformation[0]);
+ rules_list.underride.insert(rule);
+ }
+ }
+ }
+
+ services().account_data.update(
+ None,
+ &user,
+ GlobalAccountDataEventType::PushRules.to_string().into(),
+ &serde_json::to_value(account_data).expect("to json value always works"),
+ )?;
+ }
+
+ services().globals.bump_database_version(12)?;
+
+ warn!("Migration: 11 -> 12 finished");
+ }
+
+ assert_eq!(
+ services().globals.database_version().unwrap(),
+ latest_database_version
+ );
info!(
"Loaded {} database with version {}",