|
|
|
|
@ -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 {}", |
|
|
|
|
|