mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e5b11af3e8 | |||
| 71a26e433f |
@@ -1,28 +1,3 @@
|
|||||||
# Continuwuity 0.5.2 (2026-01-09)
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- Added support for issuing additional registration tokens, stored in the database, which supplement the existing registration token hardcoded in the config file. These tokens may optionally expire after a certain number of uses or after a certain amount of time has passed. Additionally, the `registration_token_file` configuration option is superseded by this feature and **has been removed**. Use the new `!admin token` command family to manage registration tokens. Contributed by @ginger (#783).
|
|
||||||
- Implemented a configuration defined admin list independent of the admin room. Contributed by @Terryiscool160. (#1253)
|
|
||||||
- Added support for invite and join anti-spam via Draupnir and Meowlnir, similar to that of synapse-http-antispam. Contributed by @nex. (#1263)
|
|
||||||
- Implemented account locking functionality, to complement user suspension. Contributed by @nex. (#1266)
|
|
||||||
- Added admin command to forcefully log out all of a user's existing sessions. Contributed by @nex. (#1271)
|
|
||||||
- Implemented toggling the ability for an account to log in without mutating any of its data. Contributed by @nex. (#1272)
|
|
||||||
- Add support for custom room create event timestamps, to allow generating custom prefixes in hashed room IDs. Contributed by @nex. (#1277)
|
|
||||||
- Certain potentially dangerous admin commands are now restricted to only be usable in the admin room and server console. Contributed by @ginger.
|
|
||||||
|
|
||||||
## Bugfixes
|
|
||||||
|
|
||||||
- Fixed unreliable room summary fetching and improved error messages. Contributed by @nex. (#1257)
|
|
||||||
- Client requested timeout parameter is now applied to e2ee key lookups and claims. Related federation requests are now also concurrent. Contributed by @nex. (#1261)
|
|
||||||
- Fixed the whoami endpoint returning HTTP 404 instead of HTTP 403, which confused some appservices. Contributed by @nex. (#1276)
|
|
||||||
|
|
||||||
## Misc
|
|
||||||
|
|
||||||
- The `console` feature is now enabled by default, allowing the server console to be used for running admin commands directly. To automatically open the console on startup, set the `admin_console_automatic` config option to `true`. Contributed by @ginger.
|
|
||||||
- We now (finally) document our container image mirrors. Contributed by @Jade
|
|
||||||
|
|
||||||
|
|
||||||
# Continuwuity 0.5.0 (2025-12-30)
|
# Continuwuity 0.5.0 (2025-12-30)
|
||||||
|
|
||||||
**This release contains a CRITICAL vulnerability patch, and you must update as soon as possible**
|
**This release contains a CRITICAL vulnerability patch, and you must update as soon as possible**
|
||||||
|
|||||||
Generated
+25
-25
@@ -940,7 +940,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit"
|
name = "conduwuit"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"conduwuit_admin",
|
"conduwuit_admin",
|
||||||
@@ -972,7 +972,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_admin"
|
name = "conduwuit_admin"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"conduwuit_api",
|
"conduwuit_api",
|
||||||
@@ -994,7 +994,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_api"
|
name = "conduwuit_api"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"axum 0.7.9",
|
"axum 0.7.9",
|
||||||
@@ -1027,14 +1027,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_build_metadata"
|
name = "conduwuit_build_metadata"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"built",
|
"built",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_core"
|
name = "conduwuit_core"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"argon2",
|
"argon2",
|
||||||
"arrayvec",
|
"arrayvec",
|
||||||
@@ -1095,7 +1095,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_database"
|
name = "conduwuit_database"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-channel",
|
"async-channel",
|
||||||
"conduwuit_core",
|
"conduwuit_core",
|
||||||
@@ -1114,7 +1114,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_macros"
|
name = "conduwuit_macros"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itertools 0.14.0",
|
"itertools 0.14.0",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
@@ -1124,7 +1124,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_router"
|
name = "conduwuit_router"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"axum 0.7.9",
|
"axum 0.7.9",
|
||||||
"axum-client-ip",
|
"axum-client-ip",
|
||||||
@@ -1159,7 +1159,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_service"
|
name = "conduwuit_service"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
@@ -1200,7 +1200,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_web"
|
name = "conduwuit_web"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"askama",
|
"askama",
|
||||||
"axum 0.7.9",
|
"axum 0.7.9",
|
||||||
@@ -1635,7 +1635,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "draupnir-antispam"
|
name = "draupnir-antispam"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -2995,7 +2995,7 @@ checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "meowlnir-antispam"
|
name = "meowlnir-antispam"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -4085,7 +4085,7 @@ checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma"
|
name = "ruma"
|
||||||
version = "0.10.1"
|
version = "0.10.1"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"assign",
|
"assign",
|
||||||
"draupnir-antispam",
|
"draupnir-antispam",
|
||||||
@@ -4107,7 +4107,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-appservice-api"
|
name = "ruma-appservice-api"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
@@ -4119,7 +4119,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-client-api"
|
name = "ruma-client-api"
|
||||||
version = "0.18.0"
|
version = "0.18.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as_variant",
|
"as_variant",
|
||||||
"assign",
|
"assign",
|
||||||
@@ -4142,7 +4142,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-common"
|
name = "ruma-common"
|
||||||
version = "0.13.0"
|
version = "0.13.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as_variant",
|
"as_variant",
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
@@ -4174,7 +4174,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-events"
|
name = "ruma-events"
|
||||||
version = "0.28.1"
|
version = "0.28.1"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"as_variant",
|
"as_variant",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
@@ -4199,7 +4199,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-federation-api"
|
name = "ruma-federation-api"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes",
|
"bytes",
|
||||||
"headers",
|
"headers",
|
||||||
@@ -4221,7 +4221,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-identifiers-validation"
|
name = "ruma-identifiers-validation"
|
||||||
version = "0.9.5"
|
version = "0.9.5"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"thiserror 2.0.17",
|
"thiserror 2.0.17",
|
||||||
@@ -4230,7 +4230,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-identity-service-api"
|
name = "ruma-identity-service-api"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
@@ -4240,7 +4240,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-macros"
|
name = "ruma-macros"
|
||||||
version = "0.13.0"
|
version = "0.13.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"proc-macro-crate",
|
"proc-macro-crate",
|
||||||
@@ -4255,7 +4255,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-push-gateway-api"
|
name = "ruma-push-gateway-api"
|
||||||
version = "0.9.0"
|
version = "0.9.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"js_int",
|
"js_int",
|
||||||
"ruma-common",
|
"ruma-common",
|
||||||
@@ -4267,7 +4267,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma-signatures"
|
name = "ruma-signatures"
|
||||||
version = "0.15.0"
|
version = "0.15.0"
|
||||||
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=f9e74cb206cfa45cf5f17d39282253b43a15fcd5#f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=79abd5d331bca596b7f37e367a9f2cebccd9f64d#79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
"ed25519-dalek",
|
"ed25519-dalek",
|
||||||
@@ -6228,7 +6228,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xtask"
|
name = "xtask"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -6237,7 +6237,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xtask-generate-commands"
|
name = "xtask-generate-commands"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap-markdown",
|
"clap-markdown",
|
||||||
"clap_builder",
|
"clap_builder",
|
||||||
|
|||||||
+3
-3
@@ -12,7 +12,7 @@ license = "Apache-2.0"
|
|||||||
# See also `rust-toolchain.toml`
|
# See also `rust-toolchain.toml`
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
repository = "https://forgejo.ellis.link/continuwuation/continuwuity"
|
repository = "https://forgejo.ellis.link/continuwuation/continuwuity"
|
||||||
version = "0.5.2"
|
version = "0.5.1"
|
||||||
|
|
||||||
[workspace.metadata.crane]
|
[workspace.metadata.crane]
|
||||||
name = "conduwuit"
|
name = "conduwuit"
|
||||||
@@ -342,7 +342,7 @@ version = "0.1.2"
|
|||||||
# Used for matrix spec type definitions and helpers
|
# Used for matrix spec type definitions and helpers
|
||||||
[workspace.dependencies.ruma]
|
[workspace.dependencies.ruma]
|
||||||
git = "https://forgejo.ellis.link/continuwuation/ruwuma"
|
git = "https://forgejo.ellis.link/continuwuation/ruwuma"
|
||||||
rev = "f9e74cb206cfa45cf5f17d39282253b43a15fcd5"
|
rev = "79abd5d331bca596b7f37e367a9f2cebccd9f64d"
|
||||||
features = [
|
features = [
|
||||||
"compat",
|
"compat",
|
||||||
"rand",
|
"rand",
|
||||||
@@ -840,7 +840,7 @@ unknown_lints = "allow"
|
|||||||
###################
|
###################
|
||||||
cargo = { level = "warn", priority = -1 }
|
cargo = { level = "warn", priority = -1 }
|
||||||
# Nobody except for us should be consuming these crates, they don't need metadata
|
# Nobody except for us should be consuming these crates, they don't need metadata
|
||||||
cargo_common_metadata = { level = "allow" }
|
cargo_common_metadata = { level = "allow"}
|
||||||
|
|
||||||
## some sadness
|
## some sadness
|
||||||
multiple_crate_versions = { level = "allow", priority = 1 }
|
multiple_crate_versions = { level = "allow", priority = 1 }
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
The `console` feature is now enabled by default, allowing the server console to be used for running admin commands directly.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Certain potentially dangerous admin commands are now restricted to only be usable in the admin room and server console.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Implemented a configuration defined admin list independent of the admin room. (@Terryiscool160).
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Fixed unreliable room summary fetching and improved error messages. Contributed by @nex.
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Client requested timeout parameter is now applied to e2ee key lookups and claims. Related federation requests are now
|
||||||
|
also concurrent. Contributed by @nex.
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Added support for invite and join anti-spam via Draupnir and Meowlnir, similar to that of synapse-http-antispam.
|
||||||
|
Contributed by @nex.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Implemented account locking functionality, to complement user suspension. Contributed by @nex.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Added admin command to forcefully log out all of a user's existing sessions. Contributed by @nex.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Implemented toggling the ability for an account to log in without mutating any of its data. Contributed by @nex.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Added support for issuing additional registration tokens, stored in the database, which supplement the existing registration token hardcoded in the config file. These tokens may optionally expire after a certain number of uses or after a certain amount of time has passed. Additionally, the `registration_token_file` configuration option is superseded by this feature and **has been removed**.
|
||||||
+2
-17
@@ -340,9 +340,7 @@
|
|||||||
# this to be high to account for extremely large room joins, slow
|
# this to be high to account for extremely large room joins, slow
|
||||||
# homeservers, your own resources etc.
|
# homeservers, your own resources etc.
|
||||||
#
|
#
|
||||||
# Joins have 6x the timeout.
|
#federation_timeout = 300
|
||||||
#
|
|
||||||
#federation_timeout = 60
|
|
||||||
|
|
||||||
# MSC4284 Policy server request timeout (seconds). Generally policy
|
# MSC4284 Policy server request timeout (seconds). Generally policy
|
||||||
# servers should respond near instantly, however may slow down under
|
# servers should respond near instantly, however may slow down under
|
||||||
@@ -391,15 +389,7 @@
|
|||||||
#
|
#
|
||||||
#appservice_idle_timeout = 300
|
#appservice_idle_timeout = 300
|
||||||
|
|
||||||
# Notification gateway pusher request connection timeout (seconds).
|
# Notification gateway pusher idle connection pool timeout.
|
||||||
#
|
|
||||||
#pusher_conn_timeout = 15
|
|
||||||
|
|
||||||
# Notification gateway pusher total request timeout (seconds).
|
|
||||||
#
|
|
||||||
#pusher_timeout = 60
|
|
||||||
|
|
||||||
# Notification gateway pusher idle connection pool timeout (seconds).
|
|
||||||
#
|
#
|
||||||
#pusher_idle_timeout = 15
|
#pusher_idle_timeout = 15
|
||||||
|
|
||||||
@@ -1456,11 +1446,6 @@
|
|||||||
#
|
#
|
||||||
#url_preview_max_spider_size = 256000
|
#url_preview_max_spider_size = 256000
|
||||||
|
|
||||||
# Total request timeout for URL previews (seconds). This includes
|
|
||||||
# connection, request, and response body reading time.
|
|
||||||
#
|
|
||||||
#url_preview_timeout = 120
|
|
||||||
|
|
||||||
# Option to decide whether you would like to run the domain allowlist
|
# Option to decide whether you would like to run the domain allowlist
|
||||||
# checks (contains and explicit) on the root domain or not. Does not apply
|
# checks (contains and explicit) on the root domain or not. Does not apply
|
||||||
# to URL contains allowlist. Defaults to false.
|
# to URL contains allowlist. Defaults to false.
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -724,7 +724,7 @@ pub(crate) async fn change_password_route(
|
|||||||
Ok(change_password::v3::Response {})
|
Ok(change_password::v3::Response {})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// # `GET /_matrix/client/v3/account/whoami`
|
/// # `GET _matrix/client/r0/account/whoami`
|
||||||
///
|
///
|
||||||
/// Get `user_id` of the sender user.
|
/// Get `user_id` of the sender user.
|
||||||
///
|
///
|
||||||
@@ -733,17 +733,11 @@ pub(crate) async fn whoami_route(
|
|||||||
State(services): State<crate::State>,
|
State(services): State<crate::State>,
|
||||||
body: Ruma<whoami::v3::Request>,
|
body: Ruma<whoami::v3::Request>,
|
||||||
) -> Result<whoami::v3::Response> {
|
) -> Result<whoami::v3::Response> {
|
||||||
let is_guest = services
|
|
||||||
.users
|
|
||||||
.is_deactivated(body.sender_user())
|
|
||||||
.await
|
|
||||||
.map_err(|_| {
|
|
||||||
err!(Request(Forbidden("Application service has not registered this user.")))
|
|
||||||
})? && body.appservice_info.is_none();
|
|
||||||
Ok(whoami::v3::Response {
|
Ok(whoami::v3::Response {
|
||||||
user_id: body.sender_user().to_owned(),
|
user_id: body.sender_user().to_owned(),
|
||||||
device_id: body.sender_device.clone(),
|
device_id: body.sender_device.clone(),
|
||||||
is_guest,
|
is_guest: services.users.is_deactivated(body.sender_user()).await?
|
||||||
|
&& body.appservice_info.is_none(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -238,7 +238,6 @@ pub(crate) async fn create_room_route(
|
|||||||
event_type: TimelineEventType::RoomCreate,
|
event_type: TimelineEventType::RoomCreate,
|
||||||
content: to_raw_value(&create_content)?,
|
content: to_raw_value(&create_content)?,
|
||||||
state_key: Some(StateKey::new()),
|
state_key: Some(StateKey::new()),
|
||||||
timestamp: body.origin_server_ts,
|
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
sender_user,
|
sender_user,
|
||||||
@@ -257,14 +256,6 @@ pub(crate) async fn create_room_route(
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
drop(state_lock);
|
drop(state_lock);
|
||||||
if let Some(expected_room_id) = body.room_id.as_ref() {
|
|
||||||
if expected_room_id.as_str() != room_id.as_str() {
|
|
||||||
return Err!(Request(InvalidParam(
|
|
||||||
"Custom room ID {expected_room_id} does not match the generated room ID \
|
|
||||||
{room_id}.",
|
|
||||||
)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
debug!("Room created with ID {room_id}");
|
debug!("Room created with ID {room_id}");
|
||||||
let state_lock = services.rooms.state.mutex.lock(&room_id).await;
|
let state_lock = services.rooms.state.mutex.lock(&room_id).await;
|
||||||
|
|
||||||
|
|||||||
+3
-30
@@ -435,9 +435,7 @@ pub struct Config {
|
|||||||
/// this to be high to account for extremely large room joins, slow
|
/// this to be high to account for extremely large room joins, slow
|
||||||
/// homeservers, your own resources etc.
|
/// homeservers, your own resources etc.
|
||||||
///
|
///
|
||||||
/// Joins have 6x the timeout.
|
/// default: 300
|
||||||
///
|
|
||||||
/// default: 60
|
|
||||||
#[serde(default = "default_federation_timeout")]
|
#[serde(default = "default_federation_timeout")]
|
||||||
pub federation_timeout: u64,
|
pub federation_timeout: u64,
|
||||||
|
|
||||||
@@ -503,19 +501,7 @@ pub struct Config {
|
|||||||
#[serde(default = "default_appservice_idle_timeout")]
|
#[serde(default = "default_appservice_idle_timeout")]
|
||||||
pub appservice_idle_timeout: u64,
|
pub appservice_idle_timeout: u64,
|
||||||
|
|
||||||
/// Notification gateway pusher request connection timeout (seconds).
|
/// Notification gateway pusher idle connection pool timeout.
|
||||||
///
|
|
||||||
/// default: 15
|
|
||||||
#[serde(default = "default_pusher_conn_timeout")]
|
|
||||||
pub pusher_conn_timeout: u64,
|
|
||||||
|
|
||||||
/// Notification gateway pusher total request timeout (seconds).
|
|
||||||
///
|
|
||||||
/// default: 60
|
|
||||||
#[serde(default = "default_pusher_timeout")]
|
|
||||||
pub pusher_timeout: u64,
|
|
||||||
|
|
||||||
/// Notification gateway pusher idle connection pool timeout (seconds).
|
|
||||||
///
|
///
|
||||||
/// default: 15
|
/// default: 15
|
||||||
#[serde(default = "default_pusher_idle_timeout")]
|
#[serde(default = "default_pusher_idle_timeout")]
|
||||||
@@ -1677,13 +1663,6 @@ pub struct Config {
|
|||||||
#[serde(default = "default_url_preview_max_spider_size")]
|
#[serde(default = "default_url_preview_max_spider_size")]
|
||||||
pub url_preview_max_spider_size: usize,
|
pub url_preview_max_spider_size: usize,
|
||||||
|
|
||||||
/// Total request timeout for URL previews (seconds). This includes
|
|
||||||
/// connection, request, and response body reading time.
|
|
||||||
///
|
|
||||||
/// default: 120
|
|
||||||
#[serde(default = "default_url_preview_timeout")]
|
|
||||||
pub url_preview_timeout: u64,
|
|
||||||
|
|
||||||
/// Option to decide whether you would like to run the domain allowlist
|
/// Option to decide whether you would like to run the domain allowlist
|
||||||
/// checks (contains and explicit) on the root domain or not. Does not apply
|
/// checks (contains and explicit) on the root domain or not. Does not apply
|
||||||
/// to URL contains allowlist. Defaults to false.
|
/// to URL contains allowlist. Defaults to false.
|
||||||
@@ -2476,7 +2455,7 @@ fn default_well_known_timeout() -> u64 { 10 }
|
|||||||
|
|
||||||
fn default_federation_conn_timeout() -> u64 { 10 }
|
fn default_federation_conn_timeout() -> u64 { 10 }
|
||||||
|
|
||||||
fn default_federation_timeout() -> u64 { 60 }
|
fn default_federation_timeout() -> u64 { 25 }
|
||||||
|
|
||||||
fn default_policy_server_request_timeout() -> u64 { 10 }
|
fn default_policy_server_request_timeout() -> u64 { 10 }
|
||||||
|
|
||||||
@@ -2494,10 +2473,6 @@ fn default_appservice_timeout() -> u64 { 35 }
|
|||||||
|
|
||||||
fn default_appservice_idle_timeout() -> u64 { 300 }
|
fn default_appservice_idle_timeout() -> u64 { 300 }
|
||||||
|
|
||||||
fn default_pusher_conn_timeout() -> u64 { 15 }
|
|
||||||
|
|
||||||
fn default_pusher_timeout() -> u64 { 60 }
|
|
||||||
|
|
||||||
fn default_pusher_idle_timeout() -> u64 { 15 }
|
fn default_pusher_idle_timeout() -> u64 { 15 }
|
||||||
|
|
||||||
fn default_max_fetch_prev_events() -> u16 { 192_u16 }
|
fn default_max_fetch_prev_events() -> u16 { 192_u16 }
|
||||||
@@ -2625,8 +2600,6 @@ fn default_url_preview_max_spider_size() -> usize {
|
|||||||
256_000 // 256KB
|
256_000 // 256KB
|
||||||
}
|
}
|
||||||
|
|
||||||
fn default_url_preview_timeout() -> u64 { 120 }
|
|
||||||
|
|
||||||
fn default_new_user_displayname_suffix() -> String { "🏳️⚧️".to_owned() }
|
fn default_new_user_displayname_suffix() -> String { "🏳️⚧️".to_owned() }
|
||||||
|
|
||||||
fn default_sentry_endpoint() -> Option<Url> { None }
|
fn default_sentry_endpoint() -> Option<Url> { None }
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ impl crate::Service for Service {
|
|||||||
})?
|
})?
|
||||||
.local_address(url_preview_bind_addr)
|
.local_address(url_preview_bind_addr)
|
||||||
.dns_resolver(resolver.resolver.clone())
|
.dns_resolver(resolver.resolver.clone())
|
||||||
.timeout(Duration::from_secs(config.url_preview_timeout))
|
|
||||||
.redirect(redirect::Policy::limited(3))
|
.redirect(redirect::Policy::limited(3))
|
||||||
.build()?,
|
.build()?,
|
||||||
|
|
||||||
@@ -69,11 +68,6 @@ impl crate::Service for Service {
|
|||||||
.dns_resolver(resolver.resolver.hooked.clone())
|
.dns_resolver(resolver.resolver.hooked.clone())
|
||||||
.connect_timeout(Duration::from_secs(config.federation_conn_timeout))
|
.connect_timeout(Duration::from_secs(config.federation_conn_timeout))
|
||||||
.read_timeout(Duration::from_secs(config.federation_timeout))
|
.read_timeout(Duration::from_secs(config.federation_timeout))
|
||||||
.timeout(Duration::from_secs(
|
|
||||||
config
|
|
||||||
.federation_timeout
|
|
||||||
.saturating_add(config.federation_conn_timeout),
|
|
||||||
))
|
|
||||||
.pool_max_idle_per_host(config.federation_idle_per_host.into())
|
.pool_max_idle_per_host(config.federation_idle_per_host.into())
|
||||||
.pool_idle_timeout(Duration::from_secs(config.federation_idle_timeout))
|
.pool_idle_timeout(Duration::from_secs(config.federation_idle_timeout))
|
||||||
.redirect(redirect::Policy::limited(3))
|
.redirect(redirect::Policy::limited(3))
|
||||||
@@ -82,13 +76,7 @@ impl crate::Service for Service {
|
|||||||
synapse: base(config)?
|
synapse: base(config)?
|
||||||
.dns_resolver(resolver.resolver.hooked.clone())
|
.dns_resolver(resolver.resolver.hooked.clone())
|
||||||
.connect_timeout(Duration::from_secs(config.federation_conn_timeout))
|
.connect_timeout(Duration::from_secs(config.federation_conn_timeout))
|
||||||
.read_timeout(Duration::from_secs(config.federation_timeout.saturating_mul(6)))
|
.read_timeout(Duration::from_secs(305))
|
||||||
.timeout(Duration::from_secs(
|
|
||||||
config
|
|
||||||
.federation_timeout
|
|
||||||
.saturating_mul(6)
|
|
||||||
.saturating_add(config.federation_conn_timeout),
|
|
||||||
))
|
|
||||||
.pool_max_idle_per_host(0)
|
.pool_max_idle_per_host(0)
|
||||||
.redirect(redirect::Policy::limited(3))
|
.redirect(redirect::Policy::limited(3))
|
||||||
.build()?,
|
.build()?,
|
||||||
@@ -115,8 +103,6 @@ impl crate::Service for Service {
|
|||||||
|
|
||||||
pusher: base(config)?
|
pusher: base(config)?
|
||||||
.dns_resolver(resolver.resolver.clone())
|
.dns_resolver(resolver.resolver.clone())
|
||||||
.connect_timeout(Duration::from_secs(config.pusher_conn_timeout))
|
|
||||||
.timeout(Duration::from_secs(config.pusher_timeout))
|
|
||||||
.pool_max_idle_per_host(1)
|
.pool_max_idle_per_host(1)
|
||||||
.pool_idle_timeout(Duration::from_secs(config.pusher_idle_timeout))
|
.pool_idle_timeout(Duration::from_secs(config.pusher_idle_timeout))
|
||||||
.redirect(redirect::Policy::limited(2))
|
.redirect(redirect::Policy::limited(2))
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use std::{fmt::Debug, mem};
|
|||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use conduwuit::{
|
use conduwuit::{
|
||||||
Err, Error, Result, debug, debug::INFO_SPAN_LEVEL, debug_error, debug_warn, err,
|
Err, Error, Result, debug, debug::INFO_SPAN_LEVEL, debug_error, debug_warn, err,
|
||||||
error::inspect_debug_log, implement, trace,
|
error::inspect_debug_log, implement, trace, utils::string::EMPTY,
|
||||||
};
|
};
|
||||||
use http::{HeaderValue, header::AUTHORIZATION};
|
use http::{HeaderValue, header::AUTHORIZATION};
|
||||||
use ipaddress::IPAddress;
|
use ipaddress::IPAddress;
|
||||||
@@ -90,9 +90,7 @@ where
|
|||||||
|
|
||||||
debug!(%method, %url, "Sending request");
|
debug!(%method, %url, "Sending request");
|
||||||
match client.execute(request).await {
|
match client.execute(request).await {
|
||||||
| Ok(response) =>
|
| Ok(response) => handle_response::<T>(dest, actual, &method, &url, response).await,
|
||||||
self.handle_response::<T>(dest, actual, &method, &url, response)
|
|
||||||
.await,
|
|
||||||
| Err(error) =>
|
| Err(error) =>
|
||||||
Err(handle_error(actual, &method, &url, error).expect_err("always returns error")),
|
Err(handle_error(actual, &method, &url, error).expect_err("always returns error")),
|
||||||
}
|
}
|
||||||
@@ -121,9 +119,7 @@ fn validate_url(&self, url: &Url) -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[implement(super::Service)]
|
|
||||||
async fn handle_response<T>(
|
async fn handle_response<T>(
|
||||||
&self,
|
|
||||||
dest: &ServerName,
|
dest: &ServerName,
|
||||||
actual: &ActualDest,
|
actual: &ActualDest,
|
||||||
method: &Method,
|
method: &Method,
|
||||||
@@ -166,6 +162,7 @@ async fn into_http_response(
|
|||||||
.expect("http::response::Builder is usable"),
|
.expect("http::response::Builder is usable"),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// TODO: handle timeout
|
||||||
trace!("Waiting for response body...");
|
trace!("Waiting for response body...");
|
||||||
let body = response
|
let body = response
|
||||||
.bytes()
|
.bytes()
|
||||||
@@ -289,13 +286,10 @@ where
|
|||||||
T: OutgoingRequest + Send,
|
T: OutgoingRequest + Send,
|
||||||
{
|
{
|
||||||
const VERSIONS: [MatrixVersion; 1] = [MatrixVersion::V1_11];
|
const VERSIONS: [MatrixVersion; 1] = [MatrixVersion::V1_11];
|
||||||
|
const SATIR: SendAccessToken<'_> = SendAccessToken::IfRequired(EMPTY);
|
||||||
|
|
||||||
let http_request = request
|
let http_request = request
|
||||||
.try_into_http_request::<Vec<u8>>(
|
.try_into_http_request::<Vec<u8>>(actual.string().as_str(), SATIR, &VERSIONS)
|
||||||
actual.string().as_str(),
|
|
||||||
SendAccessToken::None,
|
|
||||||
&VERSIONS,
|
|
||||||
)
|
|
||||||
.map_err(|e| err!(BadServerResponse("Invalid destination: {e:?}")))?;
|
.map_err(|e| err!(BadServerResponse("Invalid destination: {e:?}")))?;
|
||||||
|
|
||||||
Ok(http_request)
|
Ok(http_request)
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ impl Service {
|
|||||||
trace!("Push gateway destination: {dest}");
|
trace!("Push gateway destination: {dest}");
|
||||||
|
|
||||||
let http_request = request
|
let http_request = request
|
||||||
.try_into_http_request::<BytesMut>(&dest, SendAccessToken::None, &VERSIONS)
|
.try_into_http_request::<BytesMut>(&dest, SendAccessToken::IfRequired(""), &VERSIONS)
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
err!(BadServerResponse(warn!(
|
err!(BadServerResponse(warn!(
|
||||||
"Failed to find destination {dest} for push gateway: {e}"
|
"Failed to find destination {dest} for push gateway: {e}"
|
||||||
@@ -245,7 +245,7 @@ impl Service {
|
|||||||
.expect("http::response::Builder is usable"),
|
.expect("http::response::Builder is usable"),
|
||||||
);
|
);
|
||||||
|
|
||||||
let body = response.bytes().await?;
|
let body = response.bytes().await?; // TODO: handle timeout
|
||||||
|
|
||||||
if !status.is_success() {
|
if !status.is_success() {
|
||||||
debug_warn!("Push gateway response body: {:?}", string_from_bytes(&body));
|
debug_warn!("Push gateway response body: {:?}", string_from_bytes(&body));
|
||||||
@@ -288,7 +288,7 @@ impl Service {
|
|||||||
let mut notify = None;
|
let mut notify = None;
|
||||||
let mut tweaks = Vec::new();
|
let mut tweaks = Vec::new();
|
||||||
if event.room_id().is_none() {
|
if event.room_id().is_none() {
|
||||||
// This only affects v12+ create events
|
// TODO(hydra): does this matter?
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -131,6 +131,10 @@ pub async fn handle_incoming_pdu<'a>(
|
|||||||
.await?
|
.await?
|
||||||
.origin_server_ts();
|
.origin_server_ts();
|
||||||
|
|
||||||
|
if incoming_pdu.origin_server_ts() < first_ts_in_room {
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
|
||||||
// 9. Fetch any missing prev events doing all checks listed here starting at 1.
|
// 9. Fetch any missing prev events doing all checks listed here starting at 1.
|
||||||
// These are timeline events
|
// These are timeline events
|
||||||
let (sorted_prev_events, mut eventid_info) = self
|
let (sorted_prev_events, mut eventid_info) = self
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ use futures::{StreamExt, TryStreamExt, future, future::ready};
|
|||||||
use ruma::{
|
use ruma::{
|
||||||
CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, OwnedRoomId, RoomId, RoomVersionId,
|
CanonicalJsonObject, CanonicalJsonValue, OwnedEventId, OwnedRoomId, RoomId, RoomVersionId,
|
||||||
UserId,
|
UserId,
|
||||||
|
canonical_json::to_canonical_value,
|
||||||
events::{StateEventType, TimelineEventType, room::create::RoomCreateEventContent},
|
events::{StateEventType, TimelineEventType, room::create::RoomCreateEventContent},
|
||||||
uint,
|
uint,
|
||||||
};
|
};
|
||||||
@@ -209,7 +210,7 @@ pub async fn create_hash_and_sign_event(
|
|||||||
} else {
|
} else {
|
||||||
Some(to_raw_value(&unsigned)?)
|
Some(to_raw_value(&unsigned)?)
|
||||||
},
|
},
|
||||||
hashes: EventHash { sha256: String::new() },
|
hashes: EventHash { sha256: "aaa".to_owned() },
|
||||||
signatures: None,
|
signatures: None,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -268,6 +269,12 @@ pub async fn create_hash_and_sign_event(
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pdu_json.insert(
|
||||||
|
"origin".to_owned(),
|
||||||
|
to_canonical_value(self.services.globals.server_name())
|
||||||
|
.expect("server name is a valid CanonicalJsonValue"),
|
||||||
|
);
|
||||||
|
|
||||||
trace!("hashing and signing event {}", pdu.event_id);
|
trace!("hashing and signing event {}", pdu.event_id);
|
||||||
if let Err(e) = self
|
if let Err(e) = self
|
||||||
.services
|
.services
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
use std::{fmt::Debug, mem};
|
use std::{fmt::Debug, mem};
|
||||||
|
|
||||||
use bytes::BytesMut;
|
use bytes::BytesMut;
|
||||||
use conduwuit::{Err, Result, debug_error, err, implement, trace, utils, warn};
|
use conduwuit::{Err, Result, debug_error, err, trace, utils, warn};
|
||||||
|
use reqwest::Client;
|
||||||
use ruma::api::{
|
use ruma::api::{
|
||||||
IncomingResponse, MatrixVersion, OutgoingRequest, SendAccessToken, appservice::Registration,
|
IncomingResponse, MatrixVersion, OutgoingRequest, SendAccessToken, appservice::Registration,
|
||||||
};
|
};
|
||||||
@@ -10,9 +11,8 @@ use ruma::api::{
|
|||||||
///
|
///
|
||||||
/// Only returns Ok(None) if there is no url specified in the appservice
|
/// Only returns Ok(None) if there is no url specified in the appservice
|
||||||
/// registration file
|
/// registration file
|
||||||
#[implement(super::Service)]
|
pub(crate) async fn send_request<T>(
|
||||||
pub async fn send_appservice_request<T>(
|
client: &Client,
|
||||||
&self,
|
|
||||||
registration: Registration,
|
registration: Registration,
|
||||||
request: T,
|
request: T,
|
||||||
) -> Result<Option<T::IncomingResponse>>
|
) -> Result<Option<T::IncomingResponse>>
|
||||||
@@ -35,7 +35,7 @@ where
|
|||||||
let mut http_request = request
|
let mut http_request = request
|
||||||
.try_into_http_request::<BytesMut>(
|
.try_into_http_request::<BytesMut>(
|
||||||
&dest,
|
&dest,
|
||||||
SendAccessToken::Appservice(hs_token),
|
SendAccessToken::IfRequired(hs_token),
|
||||||
&VERSIONS,
|
&VERSIONS,
|
||||||
)
|
)
|
||||||
.map_err(|e| {
|
.map_err(|e| {
|
||||||
@@ -58,8 +58,6 @@ where
|
|||||||
|
|
||||||
let reqwest_request = reqwest::Request::try_from(http_request)?;
|
let reqwest_request = reqwest::Request::try_from(http_request)?;
|
||||||
|
|
||||||
let client = &self.services.client.appservice;
|
|
||||||
|
|
||||||
let mut response = client.execute(reqwest_request).await.map_err(|e| {
|
let mut response = client.execute(reqwest_request).await.map_err(|e| {
|
||||||
warn!("Could not send request to appservice \"{}\" at {dest}: {e:?}", registration.id);
|
warn!("Could not send request to appservice \"{}\" at {dest}: {e:?}", registration.id);
|
||||||
e
|
e
|
||||||
@@ -77,7 +75,7 @@ where
|
|||||||
.expect("http::response::Builder is usable"),
|
.expect("http::response::Builder is usable"),
|
||||||
);
|
);
|
||||||
|
|
||||||
let body = response.bytes().await?;
|
let body = response.bytes().await?; // TODO: handle timeout
|
||||||
|
|
||||||
if !status.is_success() {
|
if !status.is_success() {
|
||||||
debug_error!("Appservice response bytes: {:?}", utils::string_from_bytes(&body));
|
debug_error!("Appservice response bytes: {:?}", utils::string_from_bytes(&body));
|
||||||
|
|||||||
@@ -19,7 +19,10 @@ use conduwuit::{
|
|||||||
warn,
|
warn,
|
||||||
};
|
};
|
||||||
use futures::{FutureExt, Stream, StreamExt};
|
use futures::{FutureExt, Stream, StreamExt};
|
||||||
use ruma::{RoomId, ServerName, UserId, api::OutgoingRequest};
|
use ruma::{
|
||||||
|
RoomId, ServerName, UserId,
|
||||||
|
api::{OutgoingRequest, appservice::Registration},
|
||||||
|
};
|
||||||
use tokio::{task, task::JoinSet};
|
use tokio::{task, task::JoinSet};
|
||||||
|
|
||||||
use self::data::Data;
|
use self::data::Data;
|
||||||
@@ -316,6 +319,22 @@ impl Service {
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sends a request to an appservice
|
||||||
|
///
|
||||||
|
/// Only returns None if there is no url specified in the appservice
|
||||||
|
/// registration file
|
||||||
|
pub async fn send_appservice_request<T>(
|
||||||
|
&self,
|
||||||
|
registration: Registration,
|
||||||
|
request: T,
|
||||||
|
) -> Result<Option<T::IncomingResponse>>
|
||||||
|
where
|
||||||
|
T: OutgoingRequest + Debug + Send,
|
||||||
|
{
|
||||||
|
let client = &self.services.client.appservice;
|
||||||
|
appservice::send_request(client, registration, request).await
|
||||||
|
}
|
||||||
|
|
||||||
/// Clean up queued sending event data
|
/// Clean up queued sending event data
|
||||||
///
|
///
|
||||||
/// Used after we remove an appservice registration or a user deletes a push
|
/// Used after we remove an appservice registration or a user deletes a push
|
||||||
|
|||||||
@@ -50,7 +50,9 @@ use ruma::{
|
|||||||
};
|
};
|
||||||
use serde_json::value::{RawValue as RawJsonValue, to_raw_value};
|
use serde_json::value::{RawValue as RawJsonValue, to_raw_value};
|
||||||
|
|
||||||
use super::{Destination, EduBuf, EduVec, Msg, SendingEvent, Service, data::QueueItem};
|
use super::{
|
||||||
|
Destination, EduBuf, EduVec, Msg, SendingEvent, Service, appservice, data::QueueItem,
|
||||||
|
};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum TransactionStatus {
|
enum TransactionStatus {
|
||||||
@@ -718,18 +720,18 @@ impl Service {
|
|||||||
|
|
||||||
//debug_assert!(pdu_jsons.len() + edu_jsons.len() > 0, "sending empty
|
//debug_assert!(pdu_jsons.len() + edu_jsons.len() > 0, "sending empty
|
||||||
// transaction");
|
// transaction");
|
||||||
|
let client = &self.services.client.appservice;
|
||||||
match self
|
match appservice::send_request(
|
||||||
.send_appservice_request(
|
client,
|
||||||
appservice,
|
appservice,
|
||||||
ruma::api::appservice::event::push_events::v1::Request {
|
ruma::api::appservice::event::push_events::v1::Request {
|
||||||
events: pdu_jsons,
|
events: pdu_jsons,
|
||||||
txn_id: txn_id.into(),
|
txn_id: txn_id.into(),
|
||||||
ephemeral: edu_jsons,
|
ephemeral: edu_jsons,
|
||||||
to_device: Vec::new(), // TODO
|
to_device: Vec::new(), // TODO
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
| Ok(_) => Ok(Destination::Appservice(id)),
|
| Ok(_) => Ok(Destination::Appservice(id)),
|
||||||
| Err(e) => Err((Destination::Appservice(id), e)),
|
| Err(e) => Err((Destination::Appservice(id), e)),
|
||||||
|
|||||||
Reference in New Issue
Block a user