|
|
|
@ -4,7 +4,8 @@ use ruma::{ |
|
|
|
client::r0::sync::sync_events, |
|
|
|
client::r0::sync::sync_events, |
|
|
|
federation::discovery::{ServerSigningKeys, VerifyKey}, |
|
|
|
federation::discovery::{ServerSigningKeys, VerifyKey}, |
|
|
|
}, |
|
|
|
}, |
|
|
|
DeviceId, EventId, MilliSecondsSinceUnixEpoch, RoomId, ServerName, ServerSigningKeyId, UserId, |
|
|
|
DeviceId, EventId, MilliSecondsSinceUnixEpoch, RoomId, RoomVersionId, ServerName, |
|
|
|
|
|
|
|
ServerSigningKeyId, UserId, |
|
|
|
}; |
|
|
|
}; |
|
|
|
use std::{ |
|
|
|
use std::{ |
|
|
|
collections::{BTreeMap, HashMap}, |
|
|
|
collections::{BTreeMap, HashMap}, |
|
|
|
@ -39,6 +40,8 @@ pub struct Globals { |
|
|
|
keypair: Arc<ruma::signatures::Ed25519KeyPair>, |
|
|
|
keypair: Arc<ruma::signatures::Ed25519KeyPair>, |
|
|
|
dns_resolver: TokioAsyncResolver, |
|
|
|
dns_resolver: TokioAsyncResolver, |
|
|
|
jwt_decoding_key: Option<jsonwebtoken::DecodingKey<'static>>, |
|
|
|
jwt_decoding_key: Option<jsonwebtoken::DecodingKey<'static>>, |
|
|
|
|
|
|
|
pub stable_room_versions: Vec<RoomVersionId>, |
|
|
|
|
|
|
|
pub unstable_room_versions: Vec<RoomVersionId>, |
|
|
|
pub(super) server_signingkeys: Arc<dyn Tree>, |
|
|
|
pub(super) server_signingkeys: Arc<dyn Tree>, |
|
|
|
pub bad_event_ratelimiter: Arc<RwLock<HashMap<EventId, RateLimitState>>>, |
|
|
|
pub bad_event_ratelimiter: Arc<RwLock<HashMap<EventId, RateLimitState>>>, |
|
|
|
pub bad_signature_ratelimiter: Arc<RwLock<HashMap<Vec<String>, RateLimitState>>>, |
|
|
|
pub bad_signature_ratelimiter: Arc<RwLock<HashMap<Vec<String>, RateLimitState>>>, |
|
|
|
@ -132,7 +135,16 @@ impl Globals { |
|
|
|
.as_ref() |
|
|
|
.as_ref() |
|
|
|
.map(|secret| jsonwebtoken::DecodingKey::from_secret(secret.as_bytes()).into_static()); |
|
|
|
.map(|secret| jsonwebtoken::DecodingKey::from_secret(secret.as_bytes()).into_static()); |
|
|
|
|
|
|
|
|
|
|
|
let s = Self { |
|
|
|
// Supported and stable room versions
|
|
|
|
|
|
|
|
let stable_room_versions = vec![RoomVersionId::Version6]; |
|
|
|
|
|
|
|
// Experimental, partially supported room versions
|
|
|
|
|
|
|
|
let unstable_room_versions = vec![ |
|
|
|
|
|
|
|
RoomVersionId::Version3, |
|
|
|
|
|
|
|
RoomVersionId::Version4, |
|
|
|
|
|
|
|
RoomVersionId::Version5, |
|
|
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let mut s = Self { |
|
|
|
globals, |
|
|
|
globals, |
|
|
|
config, |
|
|
|
config, |
|
|
|
keypair: Arc::new(keypair), |
|
|
|
keypair: Arc::new(keypair), |
|
|
|
@ -143,6 +155,8 @@ impl Globals { |
|
|
|
tls_name_override, |
|
|
|
tls_name_override, |
|
|
|
server_signingkeys, |
|
|
|
server_signingkeys, |
|
|
|
jwt_decoding_key, |
|
|
|
jwt_decoding_key, |
|
|
|
|
|
|
|
stable_room_versions, |
|
|
|
|
|
|
|
unstable_room_versions, |
|
|
|
bad_event_ratelimiter: Arc::new(RwLock::new(HashMap::new())), |
|
|
|
bad_event_ratelimiter: Arc::new(RwLock::new(HashMap::new())), |
|
|
|
bad_signature_ratelimiter: Arc::new(RwLock::new(HashMap::new())), |
|
|
|
bad_signature_ratelimiter: Arc::new(RwLock::new(HashMap::new())), |
|
|
|
servername_ratelimiter: Arc::new(RwLock::new(HashMap::new())), |
|
|
|
servername_ratelimiter: Arc::new(RwLock::new(HashMap::new())), |
|
|
|
@ -155,6 +169,14 @@ impl Globals { |
|
|
|
|
|
|
|
|
|
|
|
fs::create_dir_all(s.get_media_folder())?; |
|
|
|
fs::create_dir_all(s.get_media_folder())?; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if !s |
|
|
|
|
|
|
|
.supported_room_versions() |
|
|
|
|
|
|
|
.contains(&s.config.default_room_version) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
error!("Room version in config isn't supported, falling back to Version 6"); |
|
|
|
|
|
|
|
s.config.default_room_version = RoomVersionId::Version6; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
Ok(s) |
|
|
|
Ok(s) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -214,6 +236,14 @@ impl Globals { |
|
|
|
self.config.allow_room_creation |
|
|
|
self.config.allow_room_creation |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn allow_unstable_room_versions(&self) -> bool { |
|
|
|
|
|
|
|
self.config.allow_unstable_room_versions |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn default_room_version(&self) -> RoomVersionId { |
|
|
|
|
|
|
|
self.config.default_room_version.clone() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
pub fn trusted_servers(&self) -> &[Box<ServerName>] { |
|
|
|
pub fn trusted_servers(&self) -> &[Box<ServerName>] { |
|
|
|
&self.config.trusted_servers |
|
|
|
&self.config.trusted_servers |
|
|
|
} |
|
|
|
} |
|
|
|
@ -246,6 +276,15 @@ impl Globals { |
|
|
|
&self.config.turn_secret |
|
|
|
&self.config.turn_secret |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn supported_room_versions(&self) -> Vec<RoomVersionId> { |
|
|
|
|
|
|
|
let mut room_versions: Vec<RoomVersionId> = vec![]; |
|
|
|
|
|
|
|
room_versions.extend(self.stable_room_versions.clone()); |
|
|
|
|
|
|
|
if self.allow_unstable_room_versions() { |
|
|
|
|
|
|
|
room_versions.extend(self.unstable_room_versions.clone()); |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
room_versions |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// TODO: the key valid until timestamp is only honored in room version > 4
|
|
|
|
/// TODO: the key valid until timestamp is only honored in room version > 4
|
|
|
|
/// Remove the outdated keys and insert the new ones.
|
|
|
|
/// Remove the outdated keys and insert the new ones.
|
|
|
|
///
|
|
|
|
///
|
|
|
|
|