diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 00000000..1089e6cd --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[build] +rustflags = ["--cfg=ruma_unstable_exhaustive_types"] diff --git a/Cargo.lock b/Cargo.lock index 4b020ed8..4cca6c5a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -514,7 +514,6 @@ dependencies = [ "opentelemetry-otlp", "opentelemetry_sdk", "parking_lot", - "persy", "rand", "regex", "reqwest", @@ -529,7 +528,7 @@ dependencies = [ "serde_json", "serde_yaml", "sha-1", - "thiserror", + "thiserror 1.0.61", "thread_local", "threadpool", "tikv-jemallocator", @@ -587,21 +586,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crc" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - [[package]] name = "crc32fast" version = "1.4.2" @@ -842,16 +826,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" -dependencies = [ - "libc", - "winapi", -] - [[package]] name = "futures-channel" version = "0.3.30" @@ -1088,7 +1062,7 @@ dependencies = [ "ipnet", "once_cell", "rand", - "thiserror", + "thiserror 1.0.61", "tinyvec", "tokio", "tracing", @@ -1111,7 +1085,7 @@ dependencies = [ "rand", "resolv-conf", "smallvec", - "thiserror", + "thiserror 1.0.61", "tokio", "tracing", ] @@ -1749,7 +1723,7 @@ dependencies = [ "js-sys", "once_cell", "pin-project-lite", - "thiserror", + "thiserror 1.0.61", "urlencoding", ] @@ -1776,7 +1750,7 @@ dependencies = [ "opentelemetry-semantic-conventions", "opentelemetry_sdk", "prost", - "thiserror", + "thiserror 1.0.61", "tokio", "tonic", ] @@ -1816,7 +1790,7 @@ dependencies = [ "ordered-float", "percent-encoding", "rand", - "thiserror", + "thiserror 1.0.61", "tokio", "tokio-stream", ] @@ -1904,22 +1878,6 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" -[[package]] -name = "persy" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef4b7250ab3a90ded0e284b2633469c23ef01ea868fe7cbb64e2f0a7d6f6d02" -dependencies = [ - "crc", - "data-encoding", - "fs2", - "linked-hash-map", - "rand", - "thiserror", - "unsigned-varint", - "zigzag", -] - [[package]] name = "pin-project" version = "1.1.5" @@ -2010,9 +1968,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.85" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23" +checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" dependencies = [ "unicode-ident", ] @@ -2115,7 +2073,7 @@ checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.61", ] [[package]] @@ -2231,8 +2189,8 @@ dependencies = [ [[package]] name = "ruma" -version = "0.10.1" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.12.1" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "assign", "js_int", @@ -2242,7 +2200,6 @@ dependencies = [ "ruma-common", "ruma-events", "ruma-federation-api", - "ruma-identity-service-api", "ruma-push-gateway-api", "ruma-server-util", "ruma-signatures", @@ -2252,8 +2209,8 @@ dependencies = [ [[package]] name = "ruma-appservice-api" -version = "0.10.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.12.1" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "js_int", "ruma-common", @@ -2264,8 +2221,8 @@ dependencies = [ [[package]] name = "ruma-client-api" -version = "0.18.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.20.1" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "as_variant", "assign", @@ -2280,20 +2237,21 @@ dependencies = [ "serde", "serde_html_form", "serde_json", - "thiserror", + "thiserror 2.0.11", "url", "web-time", ] [[package]] name = "ruma-common" -version = "0.13.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.15.1" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "as_variant", "base64 0.22.1", "bytes", "form_urlencoded", + "getrandom", "http 1.1.0", "indexmap 2.2.6", "js_int", @@ -2306,7 +2264,7 @@ dependencies = [ "serde", "serde_html_form", "serde_json", - "thiserror", + "thiserror 2.0.11", "time", "tracing", "url", @@ -2317,8 +2275,8 @@ dependencies = [ [[package]] name = "ruma-events" -version = "0.28.1" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.30.1" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "as_variant", "indexmap 2.2.6", @@ -2331,7 +2289,7 @@ dependencies = [ "ruma-macros", "serde", "serde_json", - "thiserror", + "thiserror 2.0.11", "tracing", "url", "web-time", @@ -2340,8 +2298,8 @@ dependencies = [ [[package]] name = "ruma-federation-api" -version = "0.9.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.11.0" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "bytes", "http 1.1.0", @@ -2358,30 +2316,19 @@ dependencies = [ [[package]] name = "ruma-identifiers-validation" -version = "0.9.5" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.10.1" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "js_int", - "thiserror", -] - -[[package]] -name = "ruma-identity-service-api" -version = "0.9.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" -dependencies = [ - "js_int", - "ruma-common", - "serde", + "thiserror 2.0.11", ] [[package]] name = "ruma-macros" -version = "0.13.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.15.1" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "cfg-if", - "once_cell", "proc-macro-crate", "proc-macro2", "quote", @@ -2393,8 +2340,8 @@ dependencies = [ [[package]] name = "ruma-push-gateway-api" -version = "0.9.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.11.0" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "js_int", "ruma-common", @@ -2405,21 +2352,21 @@ dependencies = [ [[package]] name = "ruma-server-util" -version = "0.3.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.5.0" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "headers", "http 1.1.0", "http-auth", "ruma-common", - "thiserror", + "thiserror 2.0.11", "tracing", ] [[package]] name = "ruma-signatures" -version = "0.15.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.17.0" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ "base64 0.22.1", "ed25519-dalek", @@ -2429,21 +2376,20 @@ dependencies = [ "serde_json", "sha2", "subslice", - "thiserror", + "thiserror 2.0.11", ] [[package]] name = "ruma-state-res" -version = "0.11.0" -source = "git+https://github.com/ruma/ruma#c06af4385e0e30c48a8e9ca3d488da32102d0db9" +version = "0.13.0" +source = "git+https://github.com/ruma/ruma.git#afaf132362fe6195556a872351a70337e97ab755" dependencies = [ - "itertools", "js_int", "ruma-common", "ruma-events", "serde", "serde_json", - "thiserror", + "thiserror 2.0.11", "tracing", ] @@ -2835,7 +2781,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.61", "time", ] @@ -2897,9 +2843,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.66" +version = "2.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" +checksum = "36147f1a48ae0ec2b5b3bc5b537d267457555a10dc06f3dbc8cb11ba3006d3b1" dependencies = [ "proc-macro2", "quote", @@ -2924,7 +2870,16 @@ version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.61", +] + +[[package]] +name = "thiserror" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d452f284b73e6d76dd36758a0c8684b1d5be31f92b89d07fd5822175732206fc" +dependencies = [ + "thiserror-impl 2.0.11", ] [[package]] @@ -2938,6 +2893,17 @@ dependencies = [ "syn", ] +[[package]] +name = "thiserror-impl" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -3091,7 +3057,7 @@ checksum = "51165dfa029d2a65969413a6cc96f354b86b464498702f174a4efa13608fd8c0" dependencies = [ "either", "futures-util", - "thiserror", + "thiserror 1.0.61", "tokio", ] @@ -3395,12 +3361,6 @@ version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" -[[package]] -name = "unsigned-varint" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" - [[package]] name = "untrusted" version = "0.9.0" @@ -3802,15 +3762,6 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" -[[package]] -name = "zigzag" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b40401a28d86ce16a330b863b86fd7dbee4d7c940587ab09ab8c019f9e3fdf" -dependencies = [ - "num-traits", -] - [[package]] name = "zstd-sys" version = "2.0.10+zstd.1.5.6" diff --git a/Cargo.toml b/Cargo.toml index 0cdde4ab..3e463174 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ repository = "https://gitlab.com/famedly/conduit" version = "0.10.0-alpha" # See also `rust-toolchain.toml` -rust-version = "1.79.0" +rust-version = "1.80.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -49,10 +49,6 @@ tower-service = "0.3" # Async runtime and utilities tokio = { version = "1.28.1", features = ["fs", "macros", "signal", "sync"] } -# Used for storing data permanently -#sled = { version = "0.34.7", features = ["compression", "no_metrics"], optional = true } -#sled = { git = "https://github.com/spacejam/sled.git", rev = "e4640e0773595229f398438886f19bca6f7326a2", features = ["compression"] } -persy = { version = "1.4.4", optional = true, features = ["background_ops"] } # Used for the http request / response body type for Ruma endpoints used with reqwest bytes = "1.4.0" @@ -116,7 +112,6 @@ rusqlite = { version = "0.31", optional = true, features = ["bundled"] } # crossbeam = { version = "0.8.2", optional = true } num_cpus = "1.15.0" threadpool = "1.8.1" -# heed = { git = "https://github.com/timokoesters/heed.git", rev = "f6f825da7fb2c758867e05ad973ef800a6fe1d5d", optional = true } # Used for ruma wrapper serde_html_form = "0.2.0" @@ -152,19 +147,25 @@ sd-notify = { version = "0.4.1", optional = true } features = [ "appservice-api-c", "client-api", - "compat", + "compat-empty-string-null", + "compat-get-3pids", + "compat-null", + "compat-optional", + "compat-optional-txn-pdus", + "compat-server-signing-key-version", + "compat-signature-id", + "compat-tag-info", + "compat-unset-avatar", "federation-api", "push-gateway-api-c", "rand", "ring-compat", "server-util", "state-res", - "unstable-exhaustive-types", "unstable-msc2448", "unstable-msc3575", - "unstable-unspecified", ] -git = "https://github.com/ruma/ruma" +git = "https://github.com/ruma/ruma.git" [dependencies.rocksdb] features = ["lz4", "multi-threaded-cf", "zstd"] @@ -176,13 +177,10 @@ version = "0.25" nix = { version = "0.28", features = ["resource"] } [features] -default = ["backend_rocksdb", "backend_sqlite", "conduit_bin", "systemd"] -#backend_sled = ["sled"] -backend_persy = ["parking_lot", "persy"] -backend_sqlite = ["sqlite"] -#backend_heed = ["heed", "crossbeam"] backend_rocksdb = ["rocksdb"] +backend_sqlite = ["sqlite"] conduit_bin = ["axum"] +default = ["backend_rocksdb", "backend_sqlite", "conduit_bin", "systemd"] jemalloc = ["tikv-jemallocator"] sqlite = ["parking_lot", "rusqlite", "tokio/signal"] systemd = ["sd-notify"] diff --git a/complement/Dockerfile b/complement/Dockerfile index e7cde40e..0bf0cfcd 100644 --- a/complement/Dockerfile +++ b/complement/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.79.0 +FROM rust:1.80.0 WORKDIR /workdir diff --git a/flake.nix b/flake.nix index f36f7e7a..4b50a7ec 100644 --- a/flake.nix +++ b/flake.nix @@ -59,7 +59,7 @@ file = ./rust-toolchain.toml; # See also `rust-toolchain.toml` - sha256 = "sha256-Ngiz76YP4HTY75GGdH2P+APE/DEIx2R/Dn+BwwOyzZU="; + sha256 = "sha256-6eN/GKzjVSjEhGO9FhWObkRFaE1Jf+uqMSdQnb8lcB4="; }; }); in diff --git a/nix/pkgs/default/default.nix b/nix/pkgs/default/default.nix index 4577fea9..92b953a1 100644 --- a/nix/pkgs/default/default.nix +++ b/nix/pkgs/default/default.nix @@ -52,6 +52,7 @@ let # Keep sorted include = [ + ".cargo" "Cargo.lock" "Cargo.toml" "src" diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 957c8f41..995b142b 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -9,7 +9,7 @@ # If you're having trouble making the relevant changes, bug a maintainer. [toolchain] -channel = "1.79.0" +channel = "1.80.0" components = [ # For rust-analyzer "rust-src", diff --git a/src/api/client_server/account.rs b/src/api/client_server/account.rs index 47ccdc83..fd92f524 100644 --- a/src/api/client_server/account.rs +++ b/src/api/client_server/account.rs @@ -305,7 +305,7 @@ pub async fn register_route(body: Ruma) -> Result, ) -> Result { diff --git a/src/api/client_server/keys.rs b/src/api/client_server/keys.rs index 4af8890d..f5a923b9 100644 --- a/src/api/client_server/keys.rs +++ b/src/api/client_server/keys.rs @@ -14,7 +14,7 @@ use ruma::{ federation, }, serde::Raw, - DeviceKeyAlgorithm, OwnedDeviceId, OwnedUserId, UserId, + OneTimeKeyAlgorithm, OwnedDeviceId, OwnedUserId, UserId, }; use serde_json::json; use std::{ @@ -465,7 +465,7 @@ fn add_unsigned_device_display_name( } pub(crate) async fn claim_keys_helper( - one_time_keys_input: &BTreeMap>, + one_time_keys_input: &BTreeMap>, ) -> Result { let mut one_time_keys = BTreeMap::new(); diff --git a/src/api/client_server/media.rs b/src/api/client_server/media.rs index b38ff6ff..9b7cf22e 100644 --- a/src/api/client_server/media.rs +++ b/src/api/client_server/media.rs @@ -301,7 +301,11 @@ async fn get_content_as_filename( pub async fn get_content_thumbnail_route( body: Ruma, ) -> Result { - let get_content_thumbnail::v1::Response { file, content_type } = get_content_thumbnail( + let get_content_thumbnail::v1::Response { + file, + content_type, + content_disposition, + } = get_content_thumbnail( &body.server_name, body.media_id.clone(), body.height, @@ -316,6 +320,7 @@ pub async fn get_content_thumbnail_route( file, content_type, cross_origin_resource_policy: Some("cross-origin".to_owned()), + content_disposition, }) } @@ -349,7 +354,9 @@ async fn get_content_thumbnail( let mxc = format!("mxc://{}/{}", server_name, media_id); if let Some(FileMeta { - file, content_type, .. + file, + content_type, + content_disposition, }) = services() .media .get_thumbnail( @@ -363,7 +370,11 @@ async fn get_content_thumbnail( ) .await? { - Ok(get_content_thumbnail::v1::Response { file, content_type }) + Ok(get_content_thumbnail::v1::Response { + file, + content_type, + content_disposition: Some(content_disposition), + }) } else if server_name != services().globals.server_name() && allow_remote { let thumbnail_response = match services() .sending @@ -386,6 +397,7 @@ async fn get_content_thumbnail( }) => get_content_thumbnail::v1::Response { file: content.file, content_type: content.content_type, + content_disposition: content.content_disposition, }, Ok(federation_media::get_content_thumbnail::v1::Response { @@ -393,14 +405,23 @@ async fn get_content_thumbnail( content: FileOrLocation::Location(url), }) => { let get_content::v1::Response { - file, content_type, .. + file, + content_type, + content_disposition, } = get_location_content(url).await?; - get_content_thumbnail::v1::Response { file, content_type } + get_content_thumbnail::v1::Response { + file, + content_type, + content_disposition, + } } Err(Error::BadRequest(ErrorKind::Unrecognized, _)) => { let media::get_content_thumbnail::v3::Response { - file, content_type, .. + file, + content_type, + content_disposition, + .. } = services() .sending .send_federation_request( @@ -419,7 +440,11 @@ async fn get_content_thumbnail( ) .await?; - get_content_thumbnail::v1::Response { file, content_type } + get_content_thumbnail::v1::Response { + file, + content_type, + content_disposition, + } } Err(e) => return Err(e), }; diff --git a/src/api/client_server/message.rs b/src/api/client_server/message.rs index fbdda077..c9a1b978 100644 --- a/src/api/client_server/message.rs +++ b/src/api/client_server/message.rs @@ -115,7 +115,7 @@ pub async fn send_message_event_route( /// Allows paginating through room history. /// /// - Only works if the user is joined (TODO: always allow, but only show events where the user was -/// joined, depending on history_visibility) +/// joined, depending on history_visibility) pub async fn get_message_events_route( body: Ruma, ) -> Result { diff --git a/src/api/client_server/push.rs b/src/api/client_server/push.rs index 72768662..2968455c 100644 --- a/src/api/client_server/push.rs +++ b/src/api/client_server/push.rs @@ -5,7 +5,7 @@ use ruma::{ push::{ delete_pushrule, get_pushers, get_pushrule, get_pushrule_actions, get_pushrule_enabled, get_pushrules_all, set_pusher, set_pushrule, set_pushrule_actions, - set_pushrule_enabled, RuleScope, + set_pushrule_enabled, }, }, events::{push_rules::PushRulesEvent, GlobalAccountDataEventType}, @@ -89,13 +89,6 @@ pub async fn set_pushrule_route( let sender_user = body.sender_user.as_ref().expect("user is authenticated"); let body = body.body; - if body.scope != RuleScope::Global { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Scopes other than 'global' are not supported.", - )); - } - let event = services() .account_data .get( @@ -161,13 +154,6 @@ pub async fn get_pushrule_actions_route( ) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); - if body.scope != RuleScope::Global { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Scopes other than 'global' are not supported.", - )); - } - let event = services() .account_data .get( @@ -204,13 +190,6 @@ pub async fn set_pushrule_actions_route( ) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); - if body.scope != RuleScope::Global { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Scopes other than 'global' are not supported.", - )); - } - let event = services() .account_data .get( @@ -256,13 +235,6 @@ pub async fn get_pushrule_enabled_route( ) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); - if body.scope != RuleScope::Global { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Scopes other than 'global' are not supported.", - )); - } - let event = services() .account_data .get( @@ -298,13 +270,6 @@ pub async fn set_pushrule_enabled_route( ) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); - if body.scope != RuleScope::Global { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Scopes other than 'global' are not supported.", - )); - } - let event = services() .account_data .get( @@ -350,13 +315,6 @@ pub async fn delete_pushrule_route( ) -> Result { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); - if body.scope != RuleScope::Global { - return Err(Error::BadRequest( - ErrorKind::InvalidParam, - "Scopes other than 'global' are not supported.", - )); - } - let event = services() .account_data .get( diff --git a/src/api/client_server/sync.rs b/src/api/client_server/sync.rs index 57ceec3b..ec6c06b0 100644 --- a/src/api/client_server/sync.rs +++ b/src/api/client_server/sync.rs @@ -37,7 +37,7 @@ use tracing::{error, info}; /// Synchronize the client's state with the latest state on the server. /// /// - This endpoint takes a `since` parameter which should be the `next_batch` value from a -/// previous request for incremental syncs. +/// previous request for incremental syncs. /// /// Calling this endpoint without a `since` parameter returns: /// - Some of the most recent events of each timeline @@ -49,9 +49,9 @@ use tracing::{error, info}; /// For joined rooms: /// - Some of the most recent events of each timeline that happened after since /// - If user joined the room after since: All state events (unless lazy loading is activated) and -/// all device list updates in that room +/// all device list updates in that room /// - If the user was already in the room: A list of all events that are in the state now, but were -/// not in the state at `since` +/// not in the state at `since` /// - If the state we send contains a member event: Joined and invited member counts, heroes /// - Device list updates that happened after `since` /// - If there are events in the timeline we send or the user send updated his read mark: Notification counts @@ -65,7 +65,7 @@ use tracing::{error, info}; /// - If the user left after `since`: prev_batch token, empty state (TODO: subset of the state at the point of the leave) /// /// - Sync is handled in an async task, multiple requests from the same device with the same -/// `since` will be cached +/// `since` will be cached pub async fn sync_events_route( body: Ruma, ) -> Result> { diff --git a/src/api/client_server/user_directory.rs b/src/api/client_server/user_directory.rs index b4d11800..5447882e 100644 --- a/src/api/client_server/user_directory.rs +++ b/src/api/client_server/user_directory.rs @@ -12,7 +12,7 @@ use ruma::{ /// Searches all known users for a match. /// /// - Hides any local users that aren't in any public rooms (i.e. those that have the join rule set to public) -/// and don't share a room with the sender +/// and don't share a room with the sender pub async fn search_users_route( body: Ruma, ) -> Result { diff --git a/src/api/server_server.rs b/src/api/server_server.rs index f8afcf39..6d36d59e 100644 --- a/src/api/server_server.rs +++ b/src/api/server_server.rs @@ -56,7 +56,7 @@ use ruma::{ to_device::DeviceIdOrAllDevices, uint, user_id, CanonicalJsonObject, CanonicalJsonValue, EventId, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedRoomId, OwnedServerName, OwnedServerSigningKeyId, OwnedUserId, RoomId, - ServerName, + ServerName, Signatures, }; use serde_json::value::{to_raw_value, RawValue as RawJsonValue}; use std::{ @@ -696,7 +696,7 @@ pub async fn get_server_version_route( /// Gets the public signing keys of this server. /// /// - Matrix does not support invalidating public keys, so the key returned by this will be valid -/// forever. +/// forever. // Response type for this endpoint is Json because we need to calculate a signature for the response pub async fn get_server_keys_route() -> Result { let mut verify_keys: BTreeMap = BTreeMap::new(); @@ -714,7 +714,7 @@ pub async fn get_server_keys_route() -> Result { server_name: services().globals.server_name().to_owned(), verify_keys, old_verify_keys: BTreeMap::new(), - signatures: BTreeMap::new(), + signatures: Signatures::new(), valid_until_ts: MilliSecondsSinceUnixEpoch::from_system_time( SystemTime::now() + Duration::from_secs(86400 * 7), ) @@ -743,7 +743,7 @@ pub async fn get_server_keys_route() -> Result { /// Gets the public signing keys of this server. /// /// - Matrix does not support invalidating public keys, so the key returned by this will be valid -/// forever. +/// forever. pub async fn get_server_keys_deprecated_route() -> impl IntoResponse { get_server_keys_route().await } diff --git a/src/database/abstraction.rs b/src/database/abstraction.rs index 93660f9f..a1913b23 100644 --- a/src/database/abstraction.rs +++ b/src/database/abstraction.rs @@ -3,27 +3,13 @@ use crate::Result; use std::{future::Future, pin::Pin, sync::Arc}; -#[cfg(feature = "sled")] -pub mod sled; - #[cfg(feature = "sqlite")] pub mod sqlite; -#[cfg(feature = "heed")] -pub mod heed; - #[cfg(feature = "rocksdb")] pub mod rocksdb; -#[cfg(feature = "persy")] -pub mod persy; - -#[cfg(any( - feature = "sqlite", - feature = "rocksdb", - feature = "heed", - feature = "persy" -))] +#[cfg(any(feature = "sqlite", feature = "rocksdb"))] pub mod watchers; pub trait KeyValueDatabaseEngine: Send + Sync { diff --git a/src/database/abstraction/heed.rs b/src/database/abstraction/heed.rs deleted file mode 100644 index 9cca0975..00000000 --- a/src/database/abstraction/heed.rs +++ /dev/null @@ -1,194 +0,0 @@ -use super::{super::Config, watchers::Watchers}; -use crossbeam::channel::{bounded, Sender as ChannelSender}; -use threadpool::ThreadPool; - -use crate::{Error, Result}; -use std::{ - future::Future, - pin::Pin, - sync::{Arc, Mutex}, -}; - -use super::{DatabaseEngine, Tree}; - -type TupleOfBytes = (Vec, Vec); - -pub struct Engine { - env: heed::Env, - iter_pool: Mutex, -} - -pub struct EngineTree { - engine: Arc, - tree: Arc, - watchers: Watchers, -} - -fn convert_error(error: heed::Error) -> Error { - Error::HeedError { - error: error.to_string(), - } -} - -impl DatabaseEngine for Engine { - fn open(config: &Config) -> Result> { - let mut env_builder = heed::EnvOpenOptions::new(); - env_builder.map_size(1024 * 1024 * 1024 * 1024); // 1 Terabyte - env_builder.max_readers(126); - env_builder.max_dbs(128); - unsafe { - env_builder.flag(heed::flags::Flags::MdbWriteMap); - env_builder.flag(heed::flags::Flags::MdbMapAsync); - } - - Ok(Arc::new(Engine { - env: env_builder - .open(&config.database_path) - .map_err(convert_error)?, - iter_pool: Mutex::new(ThreadPool::new(10)), - })) - } - - fn open_tree(self: &Arc, name: &'static str) -> Result> { - // Creates the db if it doesn't exist already - Ok(Arc::new(EngineTree { - engine: Arc::clone(self), - tree: Arc::new( - self.env - .create_database(Some(name)) - .map_err(convert_error)?, - ), - watchers: Default::default(), - })) - } - - fn flush(self: &Arc) -> Result<()> { - self.env.force_sync().map_err(convert_error)?; - Ok(()) - } -} - -impl EngineTree { - fn iter_from_thread( - &self, - tree: Arc, - from: Vec, - backwards: bool, - ) -> Box + Send + Sync> { - let (s, r) = bounded::(100); - let engine = Arc::clone(&self.engine); - - let lock = self.engine.iter_pool.lock().await; - if lock.active_count() < lock.max_count() { - lock.execute(move || { - iter_from_thread_work(tree, &engine.env.read_txn().unwrap(), from, backwards, &s); - }); - } else { - std::thread::spawn(move || { - iter_from_thread_work(tree, &engine.env.read_txn().unwrap(), from, backwards, &s); - }); - } - - Box::new(r.into_iter()) - } -} - -fn iter_from_thread_work( - tree: Arc, - txn: &heed::RoTxn<'_>, - from: Vec, - backwards: bool, - s: &ChannelSender<(Vec, Vec)>, -) { - if backwards { - for (k, v) in tree.rev_range(txn, ..=&*from).unwrap().map(|r| r.unwrap()) { - if s.send((k.to_vec(), v.to_vec())).is_err() { - return; - } - } - } else { - if from.is_empty() { - for (k, v) in tree.iter(txn).unwrap().map(|r| r.unwrap()) { - if s.send((k.to_vec(), v.to_vec())).is_err() { - return; - } - } - } else { - for (k, v) in tree.range(txn, &*from..).unwrap().map(|r| r.unwrap()) { - if s.send((k.to_vec(), v.to_vec())).is_err() { - return; - } - } - } - } -} - -impl Tree for EngineTree { - fn get(&self, key: &[u8]) -> Result>> { - let txn = self.engine.env.read_txn().map_err(convert_error)?; - Ok(self - .tree - .get(&txn, &key) - .map_err(convert_error)? - .map(|s| s.to_vec())) - } - - fn insert(&self, key: &[u8], value: &[u8]) -> Result<()> { - let mut txn = self.engine.env.write_txn().map_err(convert_error)?; - self.tree - .put(&mut txn, &key, &value) - .map_err(convert_error)?; - txn.commit().map_err(convert_error)?; - self.watchers.wake(key); - Ok(()) - } - - fn remove(&self, key: &[u8]) -> Result<()> { - let mut txn = self.engine.env.write_txn().map_err(convert_error)?; - self.tree.delete(&mut txn, &key).map_err(convert_error)?; - txn.commit().map_err(convert_error)?; - Ok(()) - } - - fn iter<'a>(&'a self) -> Box, Vec)> + Send + 'a> { - self.iter_from(&[], false) - } - - fn iter_from( - &self, - from: &[u8], - backwards: bool, - ) -> Box, Vec)> + Send> { - self.iter_from_thread(Arc::clone(&self.tree), from.to_vec(), backwards) - } - - fn increment(&self, key: &[u8]) -> Result> { - let mut txn = self.engine.env.write_txn().map_err(convert_error)?; - - let old = self.tree.get(&txn, &key).map_err(convert_error)?; - let new = - crate::utils::increment(old.as_deref()).expect("utils::increment always returns Some"); - - self.tree - .put(&mut txn, &key, &&*new) - .map_err(convert_error)?; - - txn.commit().map_err(convert_error)?; - - Ok(new) - } - - fn scan_prefix<'a>( - &'a self, - prefix: Vec, - ) -> Box, Vec)> + Send + 'a> { - Box::new( - self.iter_from(&prefix, false) - .take_while(move |(key, _)| key.starts_with(&prefix)), - ) - } - - fn watch_prefix<'a>(&'a self, prefix: &[u8]) -> Pin + Send + 'a>> { - self.watchers.watch(prefix) - } -} diff --git a/src/database/abstraction/persy.rs b/src/database/abstraction/persy.rs deleted file mode 100644 index da7d4cf0..00000000 --- a/src/database/abstraction/persy.rs +++ /dev/null @@ -1,197 +0,0 @@ -use crate::{ - database::{ - abstraction::{watchers::Watchers, KeyValueDatabaseEngine, KvTree}, - Config, - }, - Result, -}; -use persy::{ByteVec, OpenOptions, Persy, Transaction, TransactionConfig, ValueMode}; - -use std::{future::Future, pin::Pin, sync::Arc}; - -use tracing::warn; - -pub struct Engine { - persy: Persy, -} - -impl KeyValueDatabaseEngine for Arc { - fn open(config: &Config) -> Result { - let mut cfg = persy::Config::new(); - cfg.change_cache_size((config.db_cache_capacity_mb * 1024.0 * 1024.0) as u64); - - let persy = OpenOptions::new() - .create(true) - .config(cfg) - .open(&format!("{}/db.persy", config.database_path))?; - Ok(Arc::new(Engine { persy })) - } - - fn open_tree(&self, name: &'static str) -> Result> { - // Create if it doesn't exist - if !self.persy.exists_index(name)? { - let mut tx = self.persy.begin()?; - tx.create_index::(name, ValueMode::Replace)?; - tx.prepare()?.commit()?; - } - - Ok(Arc::new(PersyTree { - persy: self.persy.clone(), - name: name.to_owned(), - watchers: Watchers::default(), - })) - } - - fn flush(&self) -> Result<()> { - Ok(()) - } -} - -pub struct PersyTree { - persy: Persy, - name: String, - watchers: Watchers, -} - -impl PersyTree { - fn begin(&self) -> Result { - Ok(self - .persy - .begin_with(TransactionConfig::new().set_background_sync(true))?) - } -} - -impl KvTree for PersyTree { - fn get(&self, key: &[u8]) -> Result>> { - let result = self - .persy - .get::(&self.name, &ByteVec::from(key))? - .next() - .map(|v| (*v).to_owned()); - Ok(result) - } - - fn insert(&self, key: &[u8], value: &[u8]) -> Result<()> { - self.insert_batch(&mut Some((key.to_owned(), value.to_owned())).into_iter())?; - self.watchers.wake(key); - Ok(()) - } - - fn insert_batch<'a>(&self, iter: &mut dyn Iterator, Vec)>) -> Result<()> { - let mut tx = self.begin()?; - for (key, value) in iter { - tx.put::( - &self.name, - ByteVec::from(key.clone()), - ByteVec::from(value), - )?; - } - tx.prepare()?.commit()?; - Ok(()) - } - - fn increment_batch<'a>(&self, iter: &mut dyn Iterator>) -> Result<()> { - let mut tx = self.begin()?; - for key in iter { - let old = tx - .get::(&self.name, &ByteVec::from(key.clone()))? - .next() - .map(|v| (*v).to_owned()); - let new = crate::utils::increment(old.as_deref()).unwrap(); - tx.put::(&self.name, ByteVec::from(key), ByteVec::from(new))?; - } - tx.prepare()?.commit()?; - Ok(()) - } - - fn remove(&self, key: &[u8]) -> Result<()> { - let mut tx = self.begin()?; - tx.remove::(&self.name, ByteVec::from(key), None)?; - tx.prepare()?.commit()?; - Ok(()) - } - - fn iter<'a>(&'a self) -> Box, Vec)> + 'a> { - let iter = self.persy.range::(&self.name, ..); - match iter { - Ok(iter) => Box::new(iter.filter_map(|(k, v)| { - v.into_iter() - .map(|val| ((*k).to_owned(), (*val).to_owned())) - .next() - })), - Err(e) => { - warn!("error iterating {:?}", e); - Box::new(std::iter::empty()) - } - } - } - - fn iter_from<'a>( - &'a self, - from: &[u8], - backwards: bool, - ) -> Box, Vec)> + 'a> { - let range = if backwards { - self.persy - .range::(&self.name, ..=ByteVec::from(from)) - } else { - self.persy - .range::(&self.name, ByteVec::from(from)..) - }; - match range { - Ok(iter) => { - let map = iter.filter_map(|(k, v)| { - v.into_iter() - .map(|val| ((*k).to_owned(), (*val).to_owned())) - .next() - }); - if backwards { - Box::new(map.rev()) - } else { - Box::new(map) - } - } - Err(e) => { - warn!("error iterating with prefix {:?}", e); - Box::new(std::iter::empty()) - } - } - } - - fn increment(&self, key: &[u8]) -> Result> { - self.increment_batch(&mut Some(key.to_owned()).into_iter())?; - Ok(self.get(key)?.unwrap()) - } - - fn scan_prefix<'a>( - &'a self, - prefix: Vec, - ) -> Box, Vec)> + 'a> { - let range_prefix = ByteVec::from(prefix.clone()); - let range = self - .persy - .range::(&self.name, range_prefix..); - - match range { - Ok(iter) => { - let owned_prefix = prefix.clone(); - Box::new( - iter.take_while(move |(k, _)| (*k).starts_with(&owned_prefix)) - .filter_map(|(k, v)| { - v.into_iter() - .map(|val| ((*k).to_owned(), (*val).to_owned())) - .next() - }), - ) - } - Err(e) => { - warn!("error scanning prefix {:?}", e); - Box::new(std::iter::empty()) - } - } - } - - fn watch_prefix<'a>(&'a self, prefix: &[u8]) -> Pin + Send + 'a>> { - self.watchers.watch(prefix) - } -} diff --git a/src/database/abstraction/sled.rs b/src/database/abstraction/sled.rs deleted file mode 100644 index 87defc57..00000000 --- a/src/database/abstraction/sled.rs +++ /dev/null @@ -1,127 +0,0 @@ -use super::super::Config; -use crate::{utils, Result}; -use std::{future::Future, pin::Pin, sync::Arc}; -use tracing::warn; - -use super::{DatabaseEngine, Tree}; - -pub struct Engine(sled::Db); - -pub struct SledEngineTree(sled::Tree); - -impl DatabaseEngine for Engine { - fn open(config: &Config) -> Result> { - Ok(Arc::new(Engine( - sled::Config::default() - .path(&config.database_path) - .cache_capacity((config.db_cache_capacity_mb * 1024.0 * 1024.0) as u64) - .use_compression(true) - .open()?, - ))) - } - - fn open_tree(self: &Arc, name: &'static str) -> Result> { - Ok(Arc::new(SledEngineTree(self.0.open_tree(name)?))) - } - - fn flush(self: &Arc) -> Result<()> { - Ok(()) // noop - } -} - -impl Tree for SledEngineTree { - fn get(&self, key: &[u8]) -> Result>> { - Ok(self.0.get(key)?.map(|v| v.to_vec())) - } - - fn insert(&self, key: &[u8], value: &[u8]) -> Result<()> { - self.0.insert(key, value)?; - Ok(()) - } - - fn insert_batch<'a>(&self, iter: &mut dyn Iterator, Vec)>) -> Result<()> { - for (key, value) in iter { - self.0.insert(key, value)?; - } - - Ok(()) - } - - fn remove(&self, key: &[u8]) -> Result<()> { - self.0.remove(key)?; - Ok(()) - } - - fn iter<'a>(&'a self) -> Box, Vec)> + 'a> { - Box::new( - self.0 - .iter() - .filter_map(|r| { - if let Err(e) = &r { - warn!("Error: {}", e); - } - r.ok() - }) - .map(|(k, v)| (k.to_vec().into(), v.to_vec().into())), - ) - } - - fn iter_from( - &self, - from: &[u8], - backwards: bool, - ) -> Box, Vec)>> { - let iter = if backwards { - self.0.range(..=from) - } else { - self.0.range(from..) - }; - - let iter = iter - .filter_map(|r| { - if let Err(e) = &r { - warn!("Error: {}", e); - } - r.ok() - }) - .map(|(k, v)| (k.to_vec().into(), v.to_vec().into())); - - if backwards { - Box::new(iter.rev()) - } else { - Box::new(iter) - } - } - - fn increment(&self, key: &[u8]) -> Result> { - Ok(self - .0 - .update_and_fetch(key, utils::increment) - .map(|o| o.expect("increment always sets a value").to_vec())?) - } - - fn scan_prefix<'a>( - &'a self, - prefix: Vec, - ) -> Box, Vec)> + 'a> { - let iter = self - .0 - .scan_prefix(prefix) - .filter_map(|r| { - if let Err(e) = &r { - warn!("Error: {}", e); - } - r.ok() - }) - .map(|(k, v)| (k.to_vec().into(), v.to_vec().into())); - - Box::new(iter) - } - - fn watch_prefix<'a>(&'a self, prefix: &[u8]) -> Pin + Send + 'a>> { - let prefix = prefix.to_vec(); - Box::pin(async move { - self.0.watch_prefix(prefix).await; - }) - } -} diff --git a/src/database/key_value/rooms/edus/read_receipt.rs b/src/database/key_value/rooms/edus/read_receipt.rs index fa97ea34..9fc05f64 100644 --- a/src/database/key_value/rooms/edus/read_receipt.rs +++ b/src/database/key_value/rooms/edus/read_receipt.rs @@ -1,5 +1,3 @@ -use std::mem; - use ruma::{ events::receipt::ReceiptEvent, serde::Raw, CanonicalJsonObject, OwnedUserId, RoomId, UserId, }; @@ -73,12 +71,13 @@ impl service::rooms::edus::read_receipt::Data for KeyValueDatabase { .iter_from(&first_possible_edu, false) .take_while(move |(k, _)| k.starts_with(&prefix2)) .map(move |(k, v)| { - let count = utils::u64_from_bytes( - &k[prefix.len()..prefix.len() + mem::size_of::()], - ) - .map_err(|_| Error::bad_database("Invalid readreceiptid count in db."))?; + let count = + utils::u64_from_bytes(&k[prefix.len()..prefix.len() + size_of::()]) + .map_err(|_| { + Error::bad_database("Invalid readreceiptid count in db.") + })?; let user_id = UserId::parse( - utils::string_from_bytes(&k[prefix.len() + mem::size_of::() + 1..]) + utils::string_from_bytes(&k[prefix.len() + size_of::() + 1..]) .map_err(|_| { Error::bad_database("Invalid readreceiptid userid bytes in db.") })?, diff --git a/src/database/key_value/rooms/pdu_metadata.rs b/src/database/key_value/rooms/pdu_metadata.rs index 0641f9d8..dbc9bfb8 100644 --- a/src/database/key_value/rooms/pdu_metadata.rs +++ b/src/database/key_value/rooms/pdu_metadata.rs @@ -1,4 +1,4 @@ -use std::{mem, sync::Arc}; +use std::sync::Arc; use ruma::{EventId, RoomId, UserId}; @@ -40,7 +40,7 @@ impl service::rooms::pdu_metadata::Data for KeyValueDatabase { .iter_from(¤t, true) .take_while(move |(k, _)| k.starts_with(&prefix)) .map(move |(tofrom, _data)| { - let from = utils::u64_from_bytes(&tofrom[(mem::size_of::())..]) + let from = utils::u64_from_bytes(&tofrom[(size_of::())..]) .map_err(|_| Error::bad_database("Invalid count in tofrom_relation."))?; let mut pduid = shortroomid.to_be_bytes().to_vec(); diff --git a/src/database/key_value/rooms/threads.rs b/src/database/key_value/rooms/threads.rs index 5e3dc970..bfdc0cc5 100644 --- a/src/database/key_value/rooms/threads.rs +++ b/src/database/key_value/rooms/threads.rs @@ -1,5 +1,3 @@ -use std::mem; - use ruma::{api::client::threads::get_threads::v1::IncludeThreads, OwnedUserId, RoomId, UserId}; use crate::{database::KeyValueDatabase, service, services, utils, Error, PduEvent, Result}; @@ -28,7 +26,7 @@ impl service::rooms::threads::Data for KeyValueDatabase { .iter_from(¤t, true) .take_while(move |(k, _)| k.starts_with(&prefix)) .map(move |(pduid, _users)| { - let count = utils::u64_from_bytes(&pduid[(mem::size_of::())..]) + let count = utils::u64_from_bytes(&pduid[(size_of::())..]) .map_err(|_| Error::bad_database("Invalid pduid in threadid_userids."))?; let mut pdu = services() .rooms diff --git a/src/database/key_value/users.rs b/src/database/key_value/users.rs index 63321a40..e28f28b1 100644 --- a/src/database/key_value/users.rs +++ b/src/database/key_value/users.rs @@ -5,8 +5,8 @@ use ruma::{ encryption::{CrossSigningKey, DeviceKeys, OneTimeKey}, events::{AnyToDeviceEvent, StateEventType}, serde::Raw, - DeviceId, DeviceKeyAlgorithm, DeviceKeyId, MilliSecondsSinceUnixEpoch, OwnedDeviceId, - OwnedDeviceKeyId, OwnedMxcUri, OwnedUserId, UInt, UserId, + DeviceId, MilliSecondsSinceUnixEpoch, OneTimeKeyAlgorithm, OwnedDeviceId, OwnedMxcUri, + OwnedOneTimeKeyId, OwnedUserId, UInt, UserId, }; use tracing::warn; @@ -308,7 +308,7 @@ impl service::users::Data for KeyValueDatabase { &self, user_id: &UserId, device_id: &DeviceId, - one_time_key_key: &DeviceKeyId, + one_time_key_key: &OwnedOneTimeKeyId, one_time_key_value: &Raw, ) -> Result<()> { let mut key = user_id.as_bytes().to_vec(); @@ -356,8 +356,8 @@ impl service::users::Data for KeyValueDatabase { &self, user_id: &UserId, device_id: &DeviceId, - key_algorithm: &DeviceKeyAlgorithm, - ) -> Result)>> { + key_algorithm: &OneTimeKeyAlgorithm, + ) -> Result)>> { let mut prefix = user_id.as_bytes().to_vec(); prefix.push(0xff); prefix.extend_from_slice(device_id.as_bytes()); @@ -395,7 +395,7 @@ impl service::users::Data for KeyValueDatabase { &self, user_id: &UserId, device_id: &DeviceId, - ) -> Result> { + ) -> Result> { let mut userdeviceid = user_id.as_bytes().to_vec(); userdeviceid.push(0xff); userdeviceid.extend_from_slice(device_id.as_bytes()); @@ -406,15 +406,12 @@ impl service::users::Data for KeyValueDatabase { self.onetimekeyid_onetimekeys .scan_prefix(userdeviceid) .map(|(bytes, _)| { - Ok::<_, Error>( - serde_json::from_slice::( - bytes.rsplit(|&b| b == 0xff).next().ok_or_else(|| { - Error::bad_database("OneTimeKey ID in db is invalid.") - })?, - ) - .map_err(|_| Error::bad_database("DeviceKeyId in db is invalid."))? - .algorithm(), + serde_json::from_slice::( + bytes.rsplit(|&b| b == 0xff).next().ok_or_else(|| { + Error::bad_database("OneTimeKey ID in db is invalid.") + })?, ) + .map_err(|_| Error::bad_database("DeviceKeyId in db is invalid.")) }) { *counts.entry(algorithm?).or_default() += UInt::from(1_u32); diff --git a/src/database/mod.rs b/src/database/mod.rs index 2317f7a8..b4794dbc 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -246,24 +246,10 @@ impl KeyValueDatabase { } let builder: Arc = match &*config.database_backend { - "sqlite" => { - #[cfg(not(feature = "sqlite"))] - return Err(Error::BadConfig("Database backend not found.")); - #[cfg(feature = "sqlite")] - Arc::new(Arc::::open(&config)?) - } - "rocksdb" => { - #[cfg(not(feature = "rocksdb"))] - return Err(Error::BadConfig("Database backend not found.")); - #[cfg(feature = "rocksdb")] - Arc::new(Arc::::open(&config)?) - } - "persy" => { - #[cfg(not(feature = "persy"))] - return Err(Error::BadConfig("Database backend not found.")); - #[cfg(feature = "persy")] - Arc::new(Arc::::open(&config)?) - } + #[cfg(feature = "sqlite")] + "sqlite" => Arc::new(Arc::::open(&config)?), + #[cfg(feature = "rocksdb")] + "rocksdb" => Arc::new(Arc::::open(&config)?), _ => { return Err(Error::BadConfig("Database backend not found.")); } diff --git a/src/service/pusher/mod.rs b/src/service/pusher/mod.rs index 83127e63..3ef54b6c 100644 --- a/src/service/pusher/mod.rs +++ b/src/service/pusher/mod.rs @@ -230,7 +230,7 @@ impl Service { let event_id_only = http.format == Some(PushFormat::EventIdOnly); let mut device = Device::new(pusher.ids.app_id.clone(), pusher.ids.pushkey.clone()); - device.data.default_payload = http.default_payload.clone(); + device.data.data = http.data.clone(); device.data.format.clone_from(&http.format); // Tweaks are only added if the format is NOT event_id_only diff --git a/src/service/sending/mod.rs b/src/service/sending/mod.rs index fa14f123..d23f1617 100644 --- a/src/service/sending/mod.rs +++ b/src/service/sending/mod.rs @@ -498,6 +498,8 @@ impl Service { ) })?, appservice::event::push_events::v1::Request { + //TODO: ephemeral pushing + ephemeral: Vec::new(), events: pdu_jsons, txn_id: (&*general_purpose::URL_SAFE_NO_PAD.encode(calculate_hash( &events diff --git a/src/service/users/data.rs b/src/service/users/data.rs index 4566c36d..52cb8a70 100644 --- a/src/service/users/data.rs +++ b/src/service/users/data.rs @@ -4,8 +4,8 @@ use ruma::{ encryption::{CrossSigningKey, DeviceKeys, OneTimeKey}, events::AnyToDeviceEvent, serde::Raw, - DeviceId, DeviceKeyAlgorithm, DeviceKeyId, OwnedDeviceId, OwnedDeviceKeyId, OwnedMxcUri, - OwnedUserId, UInt, UserId, + DeviceId, OneTimeKeyAlgorithm, OwnedDeviceId, OwnedMxcUri, OwnedOneTimeKeyId, OwnedUserId, + UInt, UserId, }; use std::collections::BTreeMap; @@ -79,7 +79,7 @@ pub trait Data: Send + Sync { &self, user_id: &UserId, device_id: &DeviceId, - one_time_key_key: &DeviceKeyId, + one_time_key_key: &OwnedOneTimeKeyId, one_time_key_value: &Raw, ) -> Result<()>; @@ -89,14 +89,14 @@ pub trait Data: Send + Sync { &self, user_id: &UserId, device_id: &DeviceId, - key_algorithm: &DeviceKeyAlgorithm, - ) -> Result)>>; + key_algorithm: &OneTimeKeyAlgorithm, + ) -> Result)>>; fn count_one_time_keys( &self, user_id: &UserId, device_id: &DeviceId, - ) -> Result>; + ) -> Result>; fn add_device_keys( &self, diff --git a/src/service/users/mod.rs b/src/service/users/mod.rs index a5694a10..f7d2df38 100644 --- a/src/service/users/mod.rs +++ b/src/service/users/mod.rs @@ -18,8 +18,8 @@ use ruma::{ encryption::{CrossSigningKey, DeviceKeys, OneTimeKey}, events::AnyToDeviceEvent, serde::Raw, - DeviceId, DeviceKeyAlgorithm, DeviceKeyId, OwnedDeviceId, OwnedDeviceKeyId, OwnedMxcUri, - OwnedRoomId, OwnedUserId, UInt, UserId, + DeviceId, OneTimeKeyAlgorithm, OwnedDeviceId, OwnedMxcUri, OwnedOneTimeKeyId, OwnedRoomId, + OwnedUserId, UInt, UserId, }; use crate::{services, Error, Result}; @@ -373,7 +373,7 @@ impl Service { &self, user_id: &UserId, device_id: &DeviceId, - one_time_key_key: &DeviceKeyId, + one_time_key_key: &OwnedOneTimeKeyId, one_time_key_value: &Raw, ) -> Result<()> { self.db @@ -388,8 +388,8 @@ impl Service { &self, user_id: &UserId, device_id: &DeviceId, - key_algorithm: &DeviceKeyAlgorithm, - ) -> Result)>> { + key_algorithm: &OneTimeKeyAlgorithm, + ) -> Result)>> { self.db.take_one_time_key(user_id, device_id, key_algorithm) } @@ -397,7 +397,7 @@ impl Service { &self, user_id: &UserId, device_id: &DeviceId, - ) -> Result> { + ) -> Result> { self.db.count_one_time_keys(user_id, device_id) } diff --git a/src/utils/error.rs b/src/utils/error.rs index 1d811106..50afd6d0 100644 --- a/src/utils/error.rs +++ b/src/utils/error.rs @@ -11,33 +11,18 @@ use ruma::{ use thiserror::Error; use tracing::{error, info}; -#[cfg(feature = "persy")] -use persy::PersyError; - use crate::RumaResponse; pub type Result = std::result::Result; #[derive(Error, Debug)] pub enum Error { - #[cfg(feature = "sled")] - #[error("There was a problem with the connection to the sled database.")] - SledError { - #[from] - source: sled::Error, - }, #[cfg(feature = "sqlite")] #[error("There was a problem with the connection to the sqlite database: {source}")] SqliteError { #[from] source: rusqlite::Error, }, - #[cfg(feature = "persy")] - #[error("There was a problem with the connection to the persy database.")] - PersyError { source: PersyError }, - #[cfg(feature = "heed")] - #[error("There was a problem with the connection to the heed database: {error}")] - HeedError { error: String }, #[cfg(feature = "rocksdb")] #[error("There was a problem with the connection to the rocksdb database: {source}")] RocksDbError { @@ -75,7 +60,7 @@ pub enum Error { BadDatabase(&'static str), #[error("uiaa")] Uiaa(UiaaInfo), - #[error("{0}: {1}")] + #[error("{}: {1}",.0.errcode())] BadRequest(ErrorKind, &'static str), #[error("{0}")] Conflict(&'static str), // This is only needed for when a room alias already exists @@ -157,14 +142,8 @@ impl Error { let db_error = String::from("Database or I/O error occurred."); match self { - #[cfg(feature = "sled")] - Self::SledError { .. } => db_error, #[cfg(feature = "sqlite")] Self::SqliteError { .. } => db_error, - #[cfg(feature = "persy")] - Self::PersyError { .. } => db_error, - #[cfg(feature = "heed")] - Self::HeedError => db_error, #[cfg(feature = "rocksdb")] Self::RocksDbError { .. } => db_error, Self::IoError { .. } => db_error, @@ -175,15 +154,6 @@ impl Error { } } -#[cfg(feature = "persy")] -impl> From> for Error { - fn from(err: persy::PE) -> Self { - Error::PersyError { - source: err.error().into(), - } - } -} - impl From for Error { fn from(i: Infallible) -> Self { match i {}