mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6947b75f6e | |||
| 51185daca2 | |||
| 6e438c8448 | |||
| e6aae8a994 | |||
| cfff12190e | |||
| 5ea42418f7 | |||
| 3ebac17291 | |||
| b44211c03e | |||
| 24cd34ee98 | |||
| eda20ac4f5 |
@@ -1,2 +0,0 @@
|
|||||||
[alias]
|
|
||||||
xtask = "run --package xtask --"
|
|
||||||
@@ -19,20 +19,11 @@ outputs:
|
|||||||
rustc_version:
|
rustc_version:
|
||||||
description: The rustc version installed
|
description: The rustc version installed
|
||||||
value: ${{ steps.rustc-version.outputs.version }}
|
value: ${{ steps.rustc-version.outputs.version }}
|
||||||
rustup_version:
|
|
||||||
description: The rustup version installed
|
|
||||||
value: ${{ steps.rustup-version.outputs.version }}
|
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- name: Check if rustup is already installed
|
|
||||||
shell: bash
|
|
||||||
id: rustup-version
|
|
||||||
run: |
|
|
||||||
echo "version=$(rustup --version)" >> $GITHUB_OUTPUT
|
|
||||||
- name: Cache rustup toolchains
|
- name: Cache rustup toolchains
|
||||||
if: steps.rustup-version.outputs.version == ''
|
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
@@ -42,7 +33,6 @@ runs:
|
|||||||
# Requires repo to be cloned if toolchain is not specified
|
# Requires repo to be cloned if toolchain is not specified
|
||||||
key: ${{ runner.os }}-rustup-${{ inputs.toolchain || hashFiles('**/rust-toolchain.toml') }}
|
key: ${{ runner.os }}-rustup-${{ inputs.toolchain || hashFiles('**/rust-toolchain.toml') }}
|
||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
if: steps.rustup-version.outputs.version == ''
|
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
if ! command -v rustup &> /dev/null ; then
|
if ! command -v rustup &> /dev/null ; then
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ jobs:
|
|||||||
|
|
||||||
build-image:
|
build-image:
|
||||||
runs-on: dind
|
runs-on: dind
|
||||||
|
container: ghcr.io/catthehacker/ubuntu:act-latest
|
||||||
needs: define-variables
|
needs: define-variables
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -180,14 +181,14 @@ jobs:
|
|||||||
file: "docker/Dockerfile"
|
file: "docker/Dockerfile"
|
||||||
build-args: |
|
build-args: |
|
||||||
GIT_COMMIT_HASH=${{ github.sha }})
|
GIT_COMMIT_HASH=${{ github.sha }})
|
||||||
GIT_COMMIT_HASH_SHORT=${{ env.COMMIT_SHORT_SHA }}
|
GIT_COMMIT_HASH_SHORT=${{ env.COMMIT_SHORT_SHA }})
|
||||||
GIT_REMOTE_URL=${{github.event.repository.html_url }}
|
GIT_REMOTE_URL=${{github.event.repository.html_url }}
|
||||||
GIT_REMOTE_COMMIT_URL=${{github.event.head_commit.url }}
|
GIT_REMOTE_COMMIT_URL=${{github.event.head_commit.url }}
|
||||||
platforms: ${{ matrix.platform }}
|
platforms: ${{ matrix.platform }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
annotations: ${{ steps.meta.outputs.annotations }}
|
annotations: ${{ steps.meta.outputs.annotations }}
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
# cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
sbom: true
|
sbom: true
|
||||||
outputs: type=image,"name=${{ needs.define-variables.outputs.images_list }}",push-by-digest=true,name-canonical=true,push=true
|
outputs: type=image,"name=${{ needs.define-variables.outputs.images_list }}",push-by-digest=true,name-canonical=true,push=true
|
||||||
env:
|
env:
|
||||||
@@ -210,6 +211,7 @@ jobs:
|
|||||||
|
|
||||||
merge:
|
merge:
|
||||||
runs-on: dind
|
runs-on: dind
|
||||||
|
container: ghcr.io/catthehacker/ubuntu:act-latest
|
||||||
needs: [define-variables, build-image]
|
needs: [define-variables, build-image]
|
||||||
steps:
|
steps:
|
||||||
- name: Download digests
|
- name: Download digests
|
||||||
|
|||||||
Generated
-133
@@ -47,56 +47,12 @@ dependencies = [
|
|||||||
"alloc-no-stdlib",
|
"alloc-no-stdlib",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstream"
|
|
||||||
version = "0.6.19"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
|
|
||||||
dependencies = [
|
|
||||||
"anstyle",
|
|
||||||
"anstyle-parse",
|
|
||||||
"anstyle-query",
|
|
||||||
"anstyle-wincon",
|
|
||||||
"colorchoice",
|
|
||||||
"is_terminal_polyfill",
|
|
||||||
"utf8parse",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anstyle"
|
name = "anstyle"
|
||||||
version = "1.0.10"
|
version = "1.0.10"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
|
checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle-parse"
|
|
||||||
version = "0.2.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
|
|
||||||
dependencies = [
|
|
||||||
"utf8parse",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle-query"
|
|
||||||
version = "1.1.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
|
|
||||||
dependencies = [
|
|
||||||
"windows-sys 0.59.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "anstyle-wincon"
|
|
||||||
version = "3.0.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
|
|
||||||
dependencies = [
|
|
||||||
"anstyle",
|
|
||||||
"once_cell_polyfill",
|
|
||||||
"windows-sys 0.59.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "anyhow"
|
name = "anyhow"
|
||||||
version = "1.0.98"
|
version = "1.0.98"
|
||||||
@@ -761,25 +717,14 @@ dependencies = [
|
|||||||
"clap_derive",
|
"clap_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clap-markdown"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d2a2617956a06d4885b490697b5307ebb09fec10b088afc18c81762d848c2339"
|
|
||||||
dependencies = [
|
|
||||||
"clap",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap_builder"
|
name = "clap_builder"
|
||||||
version = "4.5.38"
|
version = "4.5.38"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120"
|
checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anstream",
|
|
||||||
"anstyle",
|
"anstyle",
|
||||||
"clap_lex",
|
"clap_lex",
|
||||||
"strsim",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -800,16 +745,6 @@ version = "0.7.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
|
checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clap_mangen"
|
|
||||||
version = "0.2.27"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "fc33c849748320656a90832f54a5eeecaa598e92557fb5dedebc3355746d31e4"
|
|
||||||
dependencies = [
|
|
||||||
"clap",
|
|
||||||
"roff",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cmake"
|
name = "cmake"
|
||||||
version = "0.1.54"
|
version = "0.1.54"
|
||||||
@@ -825,12 +760,6 @@ version = "1.1.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "colorchoice"
|
|
||||||
version = "1.0.4"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "concurrent-queue"
|
name = "concurrent-queue"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
@@ -865,7 +794,6 @@ dependencies = [
|
|||||||
"tokio-metrics",
|
"tokio-metrics",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-flame",
|
"tracing-flame",
|
||||||
"tracing-journald",
|
|
||||||
"tracing-opentelemetry",
|
"tracing-opentelemetry",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
@@ -2406,12 +2334,6 @@ version = "2.11.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
|
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "is_terminal_polyfill"
|
|
||||||
version = "1.70.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.12.1"
|
version = "0.12.1"
|
||||||
@@ -3002,12 +2924,6 @@ dependencies = [
|
|||||||
"portable-atomic",
|
"portable-atomic",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "once_cell_polyfill"
|
|
||||||
version = "1.70.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl-probe"
|
name = "openssl-probe"
|
||||||
version = "0.1.6"
|
version = "0.1.6"
|
||||||
@@ -3776,12 +3692,6 @@ dependencies = [
|
|||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "roff"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruma"
|
name = "ruma"
|
||||||
version = "0.10.1"
|
version = "0.10.1"
|
||||||
@@ -4614,12 +4524,6 @@ dependencies = [
|
|||||||
"quote",
|
"quote",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "strsim"
|
|
||||||
version = "0.11.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "subslice"
|
name = "subslice"
|
||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
@@ -5163,17 +5067,6 @@ dependencies = [
|
|||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tracing-journald"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "fc0b4143302cf1022dac868d521e36e8b27691f72c84b3311750d5188ebba657"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
"tracing-core",
|
|
||||||
"tracing-subscriber",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing-log"
|
name = "tracing-log"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
@@ -5351,12 +5244,6 @@ version = "1.0.4"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "utf8parse"
|
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "uuid"
|
name = "uuid"
|
||||||
version = "1.16.0"
|
version = "1.16.0"
|
||||||
@@ -5956,26 +5843,6 @@ dependencies = [
|
|||||||
"markup5ever",
|
"markup5ever",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "xtask"
|
|
||||||
version = "0.5.0-rc.5"
|
|
||||||
dependencies = [
|
|
||||||
"clap",
|
|
||||||
"serde",
|
|
||||||
"serde_json",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "xtask-admin-command"
|
|
||||||
version = "0.5.0-rc.5"
|
|
||||||
dependencies = [
|
|
||||||
"clap-markdown",
|
|
||||||
"clap_builder",
|
|
||||||
"clap_mangen",
|
|
||||||
"conduwuit",
|
|
||||||
"conduwuit_admin",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yansi"
|
name = "yansi"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
|
|||||||
+1
-8
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
members = ["src/*", "xtask/*"]
|
members = ["src/*"]
|
||||||
default-members = ["src/*"]
|
default-members = ["src/*"]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
@@ -213,8 +213,6 @@ default-features = false
|
|||||||
version = "0.3.19"
|
version = "0.3.19"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = ["env-filter", "std", "tracing", "tracing-log", "ansi", "fmt"]
|
features = ["env-filter", "std", "tracing", "tracing-log", "ansi", "fmt"]
|
||||||
[workspace.dependencies.tracing-journald]
|
|
||||||
version = "0.3.1"
|
|
||||||
[workspace.dependencies.tracing-core]
|
[workspace.dependencies.tracing-core]
|
||||||
version = "0.1.33"
|
version = "0.1.33"
|
||||||
default-features = false
|
default-features = false
|
||||||
@@ -639,11 +637,6 @@ package = "conduwuit_build_metadata"
|
|||||||
path = "src/build_metadata"
|
path = "src/build_metadata"
|
||||||
default-features = false
|
default-features = false
|
||||||
|
|
||||||
|
|
||||||
[workspace.dependencies.conduwuit]
|
|
||||||
package = "conduwuit"
|
|
||||||
path = "src/main"
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
#
|
#
|
||||||
# Release profiles
|
# Release profiles
|
||||||
|
|||||||
+3
-3
@@ -20,10 +20,10 @@ We may backport fixes to the previous release at our discretion, but we don't gu
|
|||||||
|
|
||||||
We appreciate the efforts of security researchers and the community in identifying and reporting vulnerabilities. To ensure that potential vulnerabilities are addressed properly, please follow these guidelines:
|
We appreciate the efforts of security researchers and the community in identifying and reporting vulnerabilities. To ensure that potential vulnerabilities are addressed properly, please follow these guidelines:
|
||||||
|
|
||||||
1. **Contact members of the team directly** over E2EE private message.
|
1. Contact members of the team over E2EE private message.
|
||||||
- [@jade:ellis.link](https://matrix.to/#/@jade:ellis.link)
|
- [@jade:ellis.link](https://matrix.to/#/@jade:ellis.link)
|
||||||
- [@nex:nexy7574.co.uk](https://matrix.to/#/@nex:nexy7574.co.uk) <!-- ? -->
|
- [@nex:nexy7574.co.uk](https://matrix.to/#/@nex:nexy7574.co.uk) <!-- ? -->
|
||||||
2. **Email the security team** at [security@continuwuity.org](mailto:security@continuwuity.org). This is not E2EE, so don't include sensitive details.
|
2. **Email the security team** directly at [security@continuwuity.org](mailto:security@continuwuity.org). This is not E2EE, so don't include sensitive details.
|
||||||
3. **Do not disclose the vulnerability publicly** until it has been addressed
|
3. **Do not disclose the vulnerability publicly** until it has been addressed
|
||||||
4. **Provide detailed information** about the vulnerability, including:
|
4. **Provide detailed information** about the vulnerability, including:
|
||||||
- A clear description of the issue
|
- A clear description of the issue
|
||||||
@@ -48,7 +48,7 @@ When you report a security vulnerability:
|
|||||||
|
|
||||||
When security vulnerabilities are identified:
|
When security vulnerabilities are identified:
|
||||||
|
|
||||||
1. We will develop and test fixes in a private fork
|
1. We will develop and test fixes in a private branch
|
||||||
2. Security updates will be released as soon as possible
|
2. Security updates will be released as soon as possible
|
||||||
3. Release notes will include information about the vulnerabilities, avoiding details that could facilitate exploitation where possible
|
3. Release notes will include information about the vulnerabilities, avoiding details that could facilitate exploitation where possible
|
||||||
4. Critical security updates may be backported to the previous stable release
|
4. Critical security updates may be backported to the previous stable release
|
||||||
|
|||||||
@@ -16,10 +16,6 @@ DeviceAllow=char-tty
|
|||||||
StandardInput=tty-force
|
StandardInput=tty-force
|
||||||
StandardOutput=tty
|
StandardOutput=tty
|
||||||
StandardError=journal+console
|
StandardError=journal+console
|
||||||
|
|
||||||
Environment="CONTINUWUITY_LOG_TO_JOURNALD=1"
|
|
||||||
Environment="CONTINUWUITY_JOURNALD_IDENTIFIER=%N"
|
|
||||||
|
|
||||||
TTYReset=yes
|
TTYReset=yes
|
||||||
# uncomment to allow buffer to be cleared every restart
|
# uncomment to allow buffer to be cleared every restart
|
||||||
TTYVTDisallocate=no
|
TTYVTDisallocate=no
|
||||||
|
|||||||
@@ -660,21 +660,6 @@
|
|||||||
#
|
#
|
||||||
#log_thread_ids = false
|
#log_thread_ids = false
|
||||||
|
|
||||||
# Enable journald logging on Unix platforms
|
|
||||||
#
|
|
||||||
# When enabled, log output will be sent to the systemd journal
|
|
||||||
# This is only supported on Unix platforms
|
|
||||||
#
|
|
||||||
#log_to_journald = false
|
|
||||||
|
|
||||||
# The syslog identifier to use with journald logging
|
|
||||||
#
|
|
||||||
# Only used when journald logging is enabled
|
|
||||||
#
|
|
||||||
# Defaults to the binary name
|
|
||||||
#
|
|
||||||
#journald_identifier =
|
|
||||||
|
|
||||||
# OpenID token expiration/TTL in seconds.
|
# OpenID token expiration/TTL in seconds.
|
||||||
#
|
#
|
||||||
# These are the OpenID tokens that are primarily used for Matrix account
|
# These are the OpenID tokens that are primarily used for Matrix account
|
||||||
|
|||||||
Vendored
-3
@@ -14,9 +14,6 @@ Type=notify
|
|||||||
|
|
||||||
Environment="CONTINUWUITY_CONFIG=/etc/conduwuit/conduwuit.toml"
|
Environment="CONTINUWUITY_CONFIG=/etc/conduwuit/conduwuit.toml"
|
||||||
|
|
||||||
Environment="CONTINUWUITY_LOG_TO_JOURNALD=1"
|
|
||||||
Environment="CONTINUWUITY_JOURNALD_IDENTIFIER=%N"
|
|
||||||
|
|
||||||
ExecStart=/usr/sbin/conduwuit
|
ExecStart=/usr/sbin/conduwuit
|
||||||
|
|
||||||
ReadWritePaths=/var/lib/conduwuit /etc/conduwuit
|
ReadWritePaths=/var/lib/conduwuit /etc/conduwuit
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ use crate::{
|
|||||||
|
|
||||||
#[derive(Debug, Parser)]
|
#[derive(Debug, Parser)]
|
||||||
#[command(name = "conduwuit", version = conduwuit::version())]
|
#[command(name = "conduwuit", version = conduwuit::version())]
|
||||||
pub enum AdminCommand {
|
pub(super) enum AdminCommand {
|
||||||
#[command(subcommand)]
|
#[command(subcommand)]
|
||||||
/// - Commands for managing appservices
|
/// - Commands for managing appservices
|
||||||
Appservices(AppserviceCommand),
|
Appservices(AppserviceCommand),
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use crate::admin_command_dispatch;
|
|||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
pub enum AppserviceCommand {
|
pub(super) enum AppserviceCommand {
|
||||||
/// - Register an appservice using its registration YAML
|
/// - Register an appservice using its registration YAML
|
||||||
///
|
///
|
||||||
/// This command needs a YAML generated by an appservice (such as a bridge),
|
/// This command needs a YAML generated by an appservice (such as a bridge),
|
||||||
|
|||||||
@@ -7,6 +7,6 @@ use crate::admin_command_dispatch;
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum CheckCommand {
|
pub(super) enum CheckCommand {
|
||||||
CheckAllUsers,
|
CheckAllUsers,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ use crate::admin_command_dispatch;
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum DebugCommand {
|
pub(super) enum DebugCommand {
|
||||||
/// - Echo input of admin command
|
/// - Echo input of admin command
|
||||||
Echo {
|
Echo {
|
||||||
message: Vec<String>,
|
message: Vec<String>,
|
||||||
@@ -125,13 +125,13 @@ pub enum DebugCommand {
|
|||||||
reset: bool,
|
reset: bool,
|
||||||
},
|
},
|
||||||
|
|
||||||
/// - Sign JSON blob
|
/// - Verify json signatures
|
||||||
///
|
///
|
||||||
/// This command needs a JSON blob provided in a Markdown code block below
|
/// This command needs a JSON blob provided in a Markdown code block below
|
||||||
/// the command.
|
/// the command.
|
||||||
SignJson,
|
SignJson,
|
||||||
|
|
||||||
/// - Verify JSON signatures
|
/// - Verify json signatures
|
||||||
///
|
///
|
||||||
/// This command needs a JSON blob provided in a Markdown code block below
|
/// This command needs a JSON blob provided in a Markdown code block below
|
||||||
/// the command.
|
/// the command.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use crate::{admin_command, admin_command_dispatch};
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, clap::Subcommand)]
|
#[derive(Debug, clap::Subcommand)]
|
||||||
pub enum TesterCommand {
|
pub(crate) enum TesterCommand {
|
||||||
Panic,
|
Panic,
|
||||||
Failure,
|
Failure,
|
||||||
Tester,
|
Tester,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use crate::admin_command_dispatch;
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum FederationCommand {
|
pub(super) enum FederationCommand {
|
||||||
/// - List all rooms we are currently handling an incoming pdu from
|
/// - List all rooms we are currently handling an incoming pdu from
|
||||||
IncomingFederation,
|
IncomingFederation,
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use crate::admin_command_dispatch;
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum MediaCommand {
|
pub(super) enum MediaCommand {
|
||||||
/// - Deletes a single media file from our database and on the filesystem
|
/// - Deletes a single media file from our database and on the filesystem
|
||||||
/// via a single MXC URL or event ID (not redacted)
|
/// via a single MXC URL or event ID (not redacted)
|
||||||
Delete {
|
Delete {
|
||||||
@@ -90,10 +90,10 @@ pub enum MediaCommand {
|
|||||||
#[arg(short, long, default_value("10000"))]
|
#[arg(short, long, default_value("10000"))]
|
||||||
timeout: u32,
|
timeout: u32,
|
||||||
|
|
||||||
#[arg(long, default_value("800"))]
|
#[arg(short, long, default_value("800"))]
|
||||||
width: u32,
|
width: u32,
|
||||||
|
|
||||||
#[arg(long, default_value("800"))]
|
#[arg(short, long, default_value("800"))]
|
||||||
height: u32,
|
height: u32,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,6 @@ conduwuit::mod_ctor! {}
|
|||||||
conduwuit::mod_dtor! {}
|
conduwuit::mod_dtor! {}
|
||||||
conduwuit::rustc_flags_capture! {}
|
conduwuit::rustc_flags_capture! {}
|
||||||
|
|
||||||
pub use crate::admin::AdminCommand;
|
|
||||||
|
|
||||||
/// Install the admin command processor
|
/// Install the admin command processor
|
||||||
pub async fn init(admin_service: &service::admin::Service) {
|
pub async fn init(admin_service: &service::admin::Service) {
|
||||||
_ = admin_service
|
_ = admin_service
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use crate::{admin_command, admin_command_dispatch};
|
|||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// All the getters and iterators from src/database/key_value/account_data.rs
|
/// All the getters and iterators from src/database/key_value/account_data.rs
|
||||||
pub enum AccountDataCommand {
|
pub(crate) enum AccountDataCommand {
|
||||||
/// - Returns all changes to the account data that happened after `since`.
|
/// - Returns all changes to the account data that happened after `since`.
|
||||||
ChangesSince {
|
ChangesSince {
|
||||||
/// Full user ID
|
/// Full user ID
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use crate::Context;
|
|||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// All the getters and iterators from src/database/key_value/appservice.rs
|
/// All the getters and iterators from src/database/key_value/appservice.rs
|
||||||
pub enum AppserviceCommand {
|
pub(crate) enum AppserviceCommand {
|
||||||
/// - Gets the appservice registration info/details from the ID as a string
|
/// - Gets the appservice registration info/details from the ID as a string
|
||||||
GetRegistration {
|
GetRegistration {
|
||||||
/// Appservice registration ID
|
/// Appservice registration ID
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use crate::Context;
|
|||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// All the getters and iterators from src/database/key_value/globals.rs
|
/// All the getters and iterators from src/database/key_value/globals.rs
|
||||||
pub enum GlobalsCommand {
|
pub(crate) enum GlobalsCommand {
|
||||||
DatabaseVersion,
|
DatabaseVersion,
|
||||||
|
|
||||||
CurrentCount,
|
CurrentCount,
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ use crate::admin_command_dispatch;
|
|||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// Query tables from database
|
/// Query tables from database
|
||||||
pub enum QueryCommand {
|
pub(super) enum QueryCommand {
|
||||||
/// - account_data.rs iterators and getters
|
/// - account_data.rs iterators and getters
|
||||||
#[command(subcommand)]
|
#[command(subcommand)]
|
||||||
AccountData(AccountDataCommand),
|
AccountData(AccountDataCommand),
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use crate::Context;
|
|||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// All the getters and iterators from src/database/key_value/presence.rs
|
/// All the getters and iterators from src/database/key_value/presence.rs
|
||||||
pub enum PresenceCommand {
|
pub(crate) enum PresenceCommand {
|
||||||
/// - Returns the latest presence event for the given user.
|
/// - Returns the latest presence event for the given user.
|
||||||
GetPresence {
|
GetPresence {
|
||||||
/// Full user ID
|
/// Full user ID
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use ruma::OwnedUserId;
|
|||||||
use crate::Context;
|
use crate::Context;
|
||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum PusherCommand {
|
pub(crate) enum PusherCommand {
|
||||||
/// - Returns all the pushers for the user.
|
/// - Returns all the pushers for the user.
|
||||||
GetPushers {
|
GetPushers {
|
||||||
/// Full user ID
|
/// Full user ID
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ use crate::{admin_command, admin_command_dispatch};
|
|||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
#[allow(clippy::enum_variant_names)]
|
#[allow(clippy::enum_variant_names)]
|
||||||
/// Query tables from database
|
/// Query tables from database
|
||||||
pub enum RawCommand {
|
pub(crate) enum RawCommand {
|
||||||
/// - List database maps
|
/// - List database maps
|
||||||
RawMaps,
|
RawMaps,
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use crate::{admin_command, admin_command_dispatch};
|
|||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// Resolver service and caches
|
/// Resolver service and caches
|
||||||
pub enum ResolverCommand {
|
pub(crate) enum ResolverCommand {
|
||||||
/// Query the destinations cache
|
/// Query the destinations cache
|
||||||
DestinationsCache {
|
DestinationsCache {
|
||||||
server_name: Option<OwnedServerName>,
|
server_name: Option<OwnedServerName>,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use crate::Context;
|
|||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// All the getters and iterators from src/database/key_value/rooms/alias.rs
|
/// All the getters and iterators from src/database/key_value/rooms/alias.rs
|
||||||
pub enum RoomAliasCommand {
|
pub(crate) enum RoomAliasCommand {
|
||||||
ResolveLocalAlias {
|
ResolveLocalAlias {
|
||||||
/// Full room alias
|
/// Full room alias
|
||||||
alias: OwnedRoomAliasId,
|
alias: OwnedRoomAliasId,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use ruma::{OwnedRoomId, OwnedServerName, OwnedUserId};
|
|||||||
use crate::Context;
|
use crate::Context;
|
||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum RoomStateCacheCommand {
|
pub(crate) enum RoomStateCacheCommand {
|
||||||
ServerInRoom {
|
ServerInRoom {
|
||||||
server: OwnedServerName,
|
server: OwnedServerName,
|
||||||
room_id: OwnedRoomId,
|
room_id: OwnedRoomId,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use crate::{admin_command, admin_command_dispatch};
|
|||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// Query tables from database
|
/// Query tables from database
|
||||||
pub enum RoomTimelineCommand {
|
pub(crate) enum RoomTimelineCommand {
|
||||||
Pdus {
|
Pdus {
|
||||||
room_id: OwnedRoomOrAliasId,
|
room_id: OwnedRoomOrAliasId,
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use crate::Context;
|
|||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// All the getters and iterators from src/database/key_value/sending.rs
|
/// All the getters and iterators from src/database/key_value/sending.rs
|
||||||
pub enum SendingCommand {
|
pub(crate) enum SendingCommand {
|
||||||
/// - Queries database for all `servercurrentevent_data`
|
/// - Queries database for all `servercurrentevent_data`
|
||||||
ActiveRequests,
|
ActiveRequests,
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use crate::{admin_command, admin_command_dispatch};
|
|||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// Query tables from database
|
/// Query tables from database
|
||||||
pub enum ShortCommand {
|
pub(crate) enum ShortCommand {
|
||||||
ShortEventId {
|
ShortEventId {
|
||||||
event_id: OwnedEventId,
|
event_id: OwnedEventId,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use crate::{admin_command, admin_command_dispatch};
|
|||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
/// All the getters and iterators from src/database/key_value/users.rs
|
/// All the getters and iterators from src/database/key_value/users.rs
|
||||||
pub enum UsersCommand {
|
pub(crate) enum UsersCommand {
|
||||||
CountUsers,
|
CountUsers,
|
||||||
|
|
||||||
IterUsers,
|
IterUsers,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use ruma::{OwnedRoomAliasId, OwnedRoomId};
|
|||||||
use crate::Context;
|
use crate::Context;
|
||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum RoomAliasCommand {
|
pub(crate) enum RoomAliasCommand {
|
||||||
/// - Make an alias point to a room.
|
/// - Make an alias point to a room.
|
||||||
Set {
|
Set {
|
||||||
#[arg(short, long)]
|
#[arg(short, long)]
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use ruma::OwnedRoomId;
|
|||||||
use crate::{Context, PAGE_SIZE, get_room_info};
|
use crate::{Context, PAGE_SIZE, get_room_info};
|
||||||
|
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum RoomDirectoryCommand {
|
pub(crate) enum RoomDirectoryCommand {
|
||||||
/// - Publish a room to the room directory
|
/// - Publish a room to the room directory
|
||||||
Publish {
|
Publish {
|
||||||
/// The room id of the room to publish
|
/// The room id of the room to publish
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ use crate::{admin_command, admin_command_dispatch};
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum RoomInfoCommand {
|
pub(crate) enum RoomInfoCommand {
|
||||||
/// - List joined members in a room
|
/// - List joined members in a room
|
||||||
ListJoinedMembers {
|
ListJoinedMembers {
|
||||||
room_id: OwnedRoomId,
|
room_id: OwnedRoomId,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ use crate::admin_command_dispatch;
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum RoomCommand {
|
pub(super) enum RoomCommand {
|
||||||
/// - List all rooms the server knows about
|
/// - List all rooms the server knows about
|
||||||
#[clap(alias = "list")]
|
#[clap(alias = "list")]
|
||||||
ListRooms {
|
ListRooms {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use crate::{admin_command, admin_command_dispatch, get_room_info};
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum RoomModerationCommand {
|
pub(crate) enum RoomModerationCommand {
|
||||||
/// - Bans a room from local users joining and evicts all our local users
|
/// - Bans a room from local users joining and evicts all our local users
|
||||||
/// (including server
|
/// (including server
|
||||||
/// admins)
|
/// admins)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ use crate::admin_command_dispatch;
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum ServerCommand {
|
pub(super) enum ServerCommand {
|
||||||
/// - Time elapsed since startup
|
/// - Time elapsed since startup
|
||||||
Uptime,
|
Uptime,
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ use crate::admin_command_dispatch;
|
|||||||
|
|
||||||
#[admin_command_dispatch]
|
#[admin_command_dispatch]
|
||||||
#[derive(Debug, Subcommand)]
|
#[derive(Debug, Subcommand)]
|
||||||
pub enum UserCommand {
|
pub(super) enum UserCommand {
|
||||||
/// - Create a new user
|
/// - Create a new user
|
||||||
#[clap(alias = "create")]
|
#[clap(alias = "create")]
|
||||||
CreateUser {
|
CreateUser {
|
||||||
|
|||||||
@@ -1243,6 +1243,7 @@ async fn join_room_by_id_helper_remote(
|
|||||||
services.rooms.timeline.get_pdu(event_id).await.ok()
|
services.rooms.timeline.get_pdu(event_id).await.ok()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
debug!("running stateres check on send_join parsed PDU");
|
||||||
let auth_check = state_res::event_auth::auth_check(
|
let auth_check = state_res::event_auth::auth_check(
|
||||||
&state_res::RoomVersion::new(&room_version_id)?,
|
&state_res::RoomVersion::new(&room_version_id)?,
|
||||||
&parsed_join_pdu,
|
&parsed_join_pdu,
|
||||||
@@ -2162,109 +2163,6 @@ async fn knock_room_by_id_helper(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For knock_restricted rooms, check if the user meets the restricted conditions
|
|
||||||
// If they do, attempt to join instead of knock
|
|
||||||
// This is not mentioned in the spec, but should be allowable (we're allowed to
|
|
||||||
// auto-join invites to knocked rooms)
|
|
||||||
let join_rule = services.rooms.state_accessor.get_join_rules(room_id).await;
|
|
||||||
if let JoinRule::KnockRestricted(restricted) = &join_rule {
|
|
||||||
let restriction_rooms: Vec<_> = restricted
|
|
||||||
.allow
|
|
||||||
.iter()
|
|
||||||
.filter_map(|a| match a {
|
|
||||||
| AllowRule::RoomMembership(r) => Some(&r.room_id),
|
|
||||||
| _ => None,
|
|
||||||
})
|
|
||||||
.collect();
|
|
||||||
|
|
||||||
// Check if the user is in any of the allowed rooms
|
|
||||||
let mut user_meets_restrictions = false;
|
|
||||||
for restriction_room_id in &restriction_rooms {
|
|
||||||
if services
|
|
||||||
.rooms
|
|
||||||
.state_cache
|
|
||||||
.is_joined(sender_user, restriction_room_id)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
user_meets_restrictions = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the user meets the restrictions, try joining instead
|
|
||||||
if user_meets_restrictions {
|
|
||||||
debug_info!(
|
|
||||||
"{sender_user} meets the restricted criteria in knock_restricted room \
|
|
||||||
{room_id}, attempting to join instead of knock"
|
|
||||||
);
|
|
||||||
// For this case, we need to drop the state lock and get a new one in
|
|
||||||
// join_room_by_id_helper We need to release the lock here and let
|
|
||||||
// join_room_by_id_helper acquire it again
|
|
||||||
drop(state_lock);
|
|
||||||
match join_room_by_id_helper(
|
|
||||||
services,
|
|
||||||
sender_user,
|
|
||||||
room_id,
|
|
||||||
reason.clone(),
|
|
||||||
servers,
|
|
||||||
None,
|
|
||||||
&None,
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
| Ok(_) => return Ok(knock_room::v3::Response::new(room_id.to_owned())),
|
|
||||||
| Err(e) => {
|
|
||||||
debug_warn!(
|
|
||||||
"Failed to convert knock to join for {sender_user} in {room_id}: {e:?}"
|
|
||||||
);
|
|
||||||
// Get a new state lock for the remaining knock logic
|
|
||||||
let new_state_lock = services.rooms.state.mutex.lock(room_id).await;
|
|
||||||
|
|
||||||
let server_in_room = services
|
|
||||||
.rooms
|
|
||||||
.state_cache
|
|
||||||
.server_in_room(services.globals.server_name(), room_id)
|
|
||||||
.await;
|
|
||||||
|
|
||||||
let local_knock = server_in_room
|
|
||||||
|| servers.is_empty()
|
|
||||||
|| (servers.len() == 1 && services.globals.server_is_ours(&servers[0]));
|
|
||||||
|
|
||||||
if local_knock {
|
|
||||||
knock_room_helper_local(
|
|
||||||
services,
|
|
||||||
sender_user,
|
|
||||||
room_id,
|
|
||||||
reason,
|
|
||||||
servers,
|
|
||||||
new_state_lock,
|
|
||||||
)
|
|
||||||
.boxed()
|
|
||||||
.await?;
|
|
||||||
} else {
|
|
||||||
knock_room_helper_remote(
|
|
||||||
services,
|
|
||||||
sender_user,
|
|
||||||
room_id,
|
|
||||||
reason,
|
|
||||||
servers,
|
|
||||||
new_state_lock,
|
|
||||||
)
|
|
||||||
.boxed()
|
|
||||||
.await?;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Ok(knock_room::v3::Response::new(room_id.to_owned()));
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if !matches!(join_rule, JoinRule::Knock | JoinRule::KnockRestricted(_)) {
|
|
||||||
debug_warn!(
|
|
||||||
"{sender_user} attempted to knock on room {room_id} but its join rule is \
|
|
||||||
{join_rule:?}, not knock or knock_restricted"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
let server_in_room = services
|
let server_in_room = services
|
||||||
.rooms
|
.rooms
|
||||||
.state_cache
|
.state_cache
|
||||||
@@ -2312,12 +2210,6 @@ async fn knock_room_helper_local(
|
|||||||
return Err!(Request(Forbidden("This room does not support knocking.")));
|
return Err!(Request(Forbidden("This room does not support knocking.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify that this room has a valid knock or knock_restricted join rule
|
|
||||||
let join_rule = services.rooms.state_accessor.get_join_rules(room_id).await;
|
|
||||||
if !matches!(join_rule, JoinRule::Knock | JoinRule::KnockRestricted(_)) {
|
|
||||||
return Err!(Request(Forbidden("This room's join rule does not allow knocking.")));
|
|
||||||
}
|
|
||||||
|
|
||||||
let content = RoomMemberEventContent {
|
let content = RoomMemberEventContent {
|
||||||
displayname: services.users.displayname(sender_user).await.ok(),
|
displayname: services.users.displayname(sender_user).await.ok(),
|
||||||
avatar_url: services.users.avatar_url(sender_user).await.ok(),
|
avatar_url: services.users.avatar_url(sender_user).await.ok(),
|
||||||
|
|||||||
@@ -79,12 +79,12 @@ fn main() {
|
|||||||
|
|
||||||
// --- Rerun Triggers ---
|
// --- Rerun Triggers ---
|
||||||
// TODO: The git rerun triggers seem to always run
|
// TODO: The git rerun triggers seem to always run
|
||||||
// // Rerun if the git HEAD changes
|
// Rerun if the git HEAD changes
|
||||||
// println!("cargo:rerun-if-changed=.git/HEAD");
|
println!("cargo:rerun-if-changed=.git/HEAD");
|
||||||
// // Rerun if the ref pointed to by HEAD changes (e.g., new commit on branch)
|
// Rerun if the ref pointed to by HEAD changes (e.g., new commit on branch)
|
||||||
// if let Some(ref_path) = run_git_command(&["symbolic-ref", "--quiet", "HEAD"])
|
if let Some(ref_path) = run_git_command(&["symbolic-ref", "--quiet", "HEAD"]) {
|
||||||
// { println!("cargo:rerun-if-changed=.git/{ref_path}");
|
println!("cargo:rerun-if-changed=.git/{ref_path}");
|
||||||
// }
|
}
|
||||||
|
|
||||||
println!("cargo:rerun-if-env-changed=GIT_COMMIT_HASH");
|
println!("cargo:rerun-if-env-changed=GIT_COMMIT_HASH");
|
||||||
println!("cargo:rerun-if-env-changed=GIT_COMMIT_HASH_SHORT");
|
println!("cargo:rerun-if-env-changed=GIT_COMMIT_HASH_SHORT");
|
||||||
|
|||||||
@@ -219,15 +219,6 @@ pub fn check(config: &Config) -> Result {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if support contact information is configured
|
|
||||||
if config.well_known.support_email.is_none() && config.well_known.support_mxid.is_none() {
|
|
||||||
warn!(
|
|
||||||
"No support contact information (support_email or support_mxid) is configured in \
|
|
||||||
the well_known section. Users in the admin room will be automatically listed as \
|
|
||||||
support contacts in the /.well-known/matrix/support endpoint."
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if config
|
if config
|
||||||
.url_preview_domain_contains_allowlist
|
.url_preview_domain_contains_allowlist
|
||||||
.contains(&"*".to_owned())
|
.contains(&"*".to_owned())
|
||||||
|
|||||||
@@ -795,24 +795,6 @@ pub struct Config {
|
|||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub log_thread_ids: bool,
|
pub log_thread_ids: bool,
|
||||||
|
|
||||||
/// Enable journald logging on Unix platforms
|
|
||||||
///
|
|
||||||
/// When enabled, log output will be sent to the systemd journal
|
|
||||||
/// This is only supported on Unix platforms
|
|
||||||
///
|
|
||||||
/// default: false
|
|
||||||
#[cfg(target_family = "unix")]
|
|
||||||
#[serde(default)]
|
|
||||||
pub log_to_journald: bool,
|
|
||||||
|
|
||||||
/// The syslog identifier to use with journald logging
|
|
||||||
///
|
|
||||||
/// Only used when journald logging is enabled
|
|
||||||
///
|
|
||||||
/// Defaults to the binary name
|
|
||||||
#[cfg(target_family = "unix")]
|
|
||||||
pub journald_identifier: Option<String>,
|
|
||||||
|
|
||||||
/// OpenID token expiration/TTL in seconds.
|
/// OpenID token expiration/TTL in seconds.
|
||||||
///
|
///
|
||||||
/// These are the OpenID tokens that are primarily used for Matrix account
|
/// These are the OpenID tokens that are primarily used for Matrix account
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ use ruma::{
|
|||||||
power_levels::RoomPowerLevelsEventContent,
|
power_levels::RoomPowerLevelsEventContent,
|
||||||
third_party_invite::RoomThirdPartyInviteEventContent,
|
third_party_invite::RoomThirdPartyInviteEventContent,
|
||||||
},
|
},
|
||||||
|
EventId,
|
||||||
int,
|
int,
|
||||||
serde::{Base64, Raw},
|
serde::{Base64, Raw},
|
||||||
};
|
};
|
||||||
@@ -21,7 +22,6 @@ use serde::{
|
|||||||
de::{Error as _, IgnoredAny},
|
de::{Error as _, IgnoredAny},
|
||||||
};
|
};
|
||||||
use serde_json::{from_str as from_json_str, value::RawValue as RawJsonValue};
|
use serde_json::{from_str as from_json_str, value::RawValue as RawJsonValue};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
Error, Event, Result, StateEventType, StateKey, TimelineEventType,
|
Error, Event, Result, StateEventType, StateKey, TimelineEventType,
|
||||||
power_levels::{
|
power_levels::{
|
||||||
@@ -217,8 +217,9 @@ where
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
// TODO: In the past this code caused problems federating with synapse, maybe this has been
|
// TODO: In the past this code was commented as it caused problems with Synapse. This is no
|
||||||
// resolved already. Needs testing.
|
// longer the case. This needs to be implemented.
|
||||||
|
// See also: https://github.com/ruma/ruma/pull/2064
|
||||||
//
|
//
|
||||||
// 2. Reject if auth_events
|
// 2. Reject if auth_events
|
||||||
// a. auth_events cannot have duplicate keys since it's a BTree
|
// a. auth_events cannot have duplicate keys since it's a BTree
|
||||||
@@ -250,11 +251,33 @@ where
|
|||||||
|
|
||||||
let room_create_event = match room_create_event {
|
let room_create_event = match room_create_event {
|
||||||
| None => {
|
| None => {
|
||||||
warn!("no m.room.create event in auth chain");
|
error!(
|
||||||
|
create_event = room_create_event.as_ref().map(Event::event_id).unwrap_or(<&EventId>::try_from("$unknown").unwrap()).as_str(),
|
||||||
|
power_levels = power_levels_event.as_ref().map(Event::event_id).unwrap_or(<&EventId>::try_from("$unknown").unwrap()).as_str(),
|
||||||
|
member_event = sender_member_event.as_ref().map(Event::event_id).unwrap_or(<&EventId>::try_from("$unknown").unwrap()).as_str(),
|
||||||
|
"no m.room.create event found for {} ({})!",
|
||||||
|
incoming_event.event_id().as_str(),
|
||||||
|
incoming_event.room_id().as_str()
|
||||||
|
);
|
||||||
return Ok(false);
|
return Ok(false);
|
||||||
},
|
},
|
||||||
| Some(e) => e,
|
| Some(e) => e,
|
||||||
};
|
};
|
||||||
|
// just re-check 1.2 to work around a bug
|
||||||
|
let Some(room_id_server_name) = incoming_event.room_id().server_name() else {
|
||||||
|
warn!("room ID has no servername");
|
||||||
|
return Ok(false);
|
||||||
|
};
|
||||||
|
|
||||||
|
if room_id_server_name != room_create_event.sender().server_name() {
|
||||||
|
warn!(
|
||||||
|
"servername of room ID origin ({}) does not match servername of m.room.create \
|
||||||
|
sender ({})",
|
||||||
|
room_id_server_name,
|
||||||
|
room_create_event.sender().server_name()
|
||||||
|
);
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
|
||||||
// 3. If event does not have m.room.create in auth_events reject
|
// 3. If event does not have m.room.create in auth_events reject
|
||||||
if !incoming_event
|
if !incoming_event
|
||||||
@@ -638,7 +661,7 @@ fn valid_membership_change(
|
|||||||
warn!(?target_user_membership_event_id, "Banned user can't join");
|
warn!(?target_user_membership_event_id, "Banned user can't join");
|
||||||
false
|
false
|
||||||
} else if (join_rules == JoinRule::Invite
|
} else if (join_rules == JoinRule::Invite
|
||||||
|| room_version.allow_knocking && (join_rules == JoinRule::Knock || matches!(join_rules, JoinRule::KnockRestricted(_))))
|
|| room_version.allow_knocking && join_rules == JoinRule::Knock)
|
||||||
// If the join_rule is invite then allow if membership state is invite or join
|
// If the join_rule is invite then allow if membership state is invite or join
|
||||||
&& (target_user_current_membership == MembershipState::Join
|
&& (target_user_current_membership == MembershipState::Join
|
||||||
|| target_user_current_membership == MembershipState::Invite)
|
|| target_user_current_membership == MembershipState::Invite)
|
||||||
|
|||||||
@@ -609,7 +609,7 @@ where
|
|||||||
let fetch_state = |ty: &StateEventType, key: &str| {
|
let fetch_state = |ty: &StateEventType, key: &str| {
|
||||||
future::ready(auth_state.get(&ty.with_state_key(key)))
|
future::ready(auth_state.get(&ty.with_state_key(key)))
|
||||||
};
|
};
|
||||||
|
debug!("running auth check on {:?}", event.event_id());
|
||||||
let auth_result =
|
let auth_result =
|
||||||
auth_check(room_version, &event, current_third_party.as_ref(), fetch_state).await;
|
auth_check(room_version, &event, current_third_party.as_ref(), fetch_state).await;
|
||||||
|
|
||||||
@@ -726,8 +726,12 @@ where
|
|||||||
Fut: Future<Output = Option<E>> + Send,
|
Fut: Future<Output = Option<E>> + Send,
|
||||||
E: Event + Send + Sync,
|
E: Event + Send + Sync,
|
||||||
{
|
{
|
||||||
|
let mut room_id = None;
|
||||||
while let Some(sort_ev) = event {
|
while let Some(sort_ev) = event {
|
||||||
debug!(event_id = sort_ev.event_id().as_str(), "mainline");
|
trace!(event_id = sort_ev.event_id().as_str(), "mainline");
|
||||||
|
if room_id.is_none() {
|
||||||
|
room_id = Some(sort_ev.room_id().to_owned());
|
||||||
|
}
|
||||||
|
|
||||||
let id = sort_ev.event_id();
|
let id = sort_ev.event_id();
|
||||||
if let Some(depth) = mainline_map.get(id) {
|
if let Some(depth) = mainline_map.get(id) {
|
||||||
@@ -746,7 +750,7 @@ where
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Did not find a power level event so we default to zero
|
warn!("could not find a power event in the mainline map for {room_id:?}, defaulting to zero depth");
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-4
@@ -21,10 +21,7 @@ pub use ::toml;
|
|||||||
pub use ::tracing;
|
pub use ::tracing;
|
||||||
pub use config::Config;
|
pub use config::Config;
|
||||||
pub use error::Error;
|
pub use error::Error;
|
||||||
pub use info::{
|
pub use info::{rustc_flags_capture, version, version::version};
|
||||||
rustc_flags_capture, version,
|
|
||||||
version::{name, version},
|
|
||||||
};
|
|
||||||
pub use matrix::{Event, EventTypeExt, PduCount, PduEvent, PduId, RoomVersion, pdu, state_res};
|
pub use matrix::{Event, EventTypeExt, PduCount, PduEvent, PduId, RoomVersion, pdu, state_res};
|
||||||
pub use server::Server;
|
pub use server::Server;
|
||||||
pub use utils::{ctor, dtor, implement, result, result::Result};
|
pub use utils::{ctor, dtor, implement, result, result::Result};
|
||||||
|
|||||||
@@ -43,7 +43,6 @@ default = [
|
|||||||
"io_uring",
|
"io_uring",
|
||||||
"jemalloc",
|
"jemalloc",
|
||||||
"jemalloc_conf",
|
"jemalloc_conf",
|
||||||
"journald",
|
|
||||||
"media_thumbnail",
|
"media_thumbnail",
|
||||||
"release_max_log_level",
|
"release_max_log_level",
|
||||||
"systemd",
|
"systemd",
|
||||||
@@ -131,11 +130,6 @@ sentry_telemetry = [
|
|||||||
systemd = [
|
systemd = [
|
||||||
"conduwuit-router/systemd",
|
"conduwuit-router/systemd",
|
||||||
]
|
]
|
||||||
journald = [ # This is a stub on non-unix platforms
|
|
||||||
"dep:tracing-journald",
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
# enable the tokio_console server ncompatible with release_max_log_level
|
# enable the tokio_console server ncompatible with release_max_log_level
|
||||||
tokio_console = [
|
tokio_console = [
|
||||||
"dep:console-subscriber",
|
"dep:console-subscriber",
|
||||||
@@ -189,7 +183,6 @@ tracing-opentelemetry.optional = true
|
|||||||
tracing-opentelemetry.workspace = true
|
tracing-opentelemetry.workspace = true
|
||||||
tracing-subscriber.workspace = true
|
tracing-subscriber.workspace = true
|
||||||
tracing.workspace = true
|
tracing.workspace = true
|
||||||
tracing-journald = { workspace = true, optional = true }
|
|
||||||
|
|
||||||
[target.'cfg(all(not(target_env = "msvc"), target_os = "linux"))'.dependencies]
|
[target.'cfg(all(not(target_env = "msvc"), target_os = "linux"))'.dependencies]
|
||||||
hardened_malloc-rs.workspace = true
|
hardened_malloc-rs.workspace = true
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ use conduwuit_core::{
|
|||||||
#[clap(
|
#[clap(
|
||||||
about,
|
about,
|
||||||
long_about = None,
|
long_about = None,
|
||||||
name = conduwuit_core::name(),
|
name = "conduwuit",
|
||||||
version = conduwuit_core::version(),
|
version = conduwuit_core::version(),
|
||||||
)]
|
)]
|
||||||
pub(crate) struct Args {
|
pub(crate) struct Args {
|
||||||
|
|||||||
+1
-36
@@ -43,16 +43,6 @@ pub(crate) fn init(
|
|||||||
.with(console_layer.with_filter(console_reload_filter))
|
.with(console_layer.with_filter(console_reload_filter))
|
||||||
.with(cap_layer);
|
.with(cap_layer);
|
||||||
|
|
||||||
// If journald logging is enabled on Unix platforms, create a separate
|
|
||||||
// subscriber for it
|
|
||||||
#[cfg(all(target_family = "unix", feature = "journald"))]
|
|
||||||
if config.log_to_journald {
|
|
||||||
println!("Initialising journald logging");
|
|
||||||
if let Err(e) = init_journald_logging(config) {
|
|
||||||
eprintln!("Failed to initialize journald logging: {e}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "sentry_telemetry")]
|
#[cfg(feature = "sentry_telemetry")]
|
||||||
let subscriber = {
|
let subscriber = {
|
||||||
let sentry_filter = EnvFilter::try_new(&config.sentry_filter)
|
let sentry_filter = EnvFilter::try_new(&config.sentry_filter)
|
||||||
@@ -132,28 +122,6 @@ pub(crate) fn init(
|
|||||||
Ok(ret)
|
Ok(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(all(target_family = "unix", feature = "journald"))]
|
|
||||||
fn init_journald_logging(config: &Config) -> Result<()> {
|
|
||||||
use tracing_journald::Layer as JournaldLayer;
|
|
||||||
|
|
||||||
let journald_filter =
|
|
||||||
EnvFilter::try_new(&config.log).map_err(|e| err!(Config("log", "{e}.")))?;
|
|
||||||
|
|
||||||
let mut journald_layer = JournaldLayer::new()
|
|
||||||
.map_err(|e| err!(Config("journald", "Failed to initialize journald layer: {e}.")))?;
|
|
||||||
|
|
||||||
if let Some(ref identifier) = config.journald_identifier {
|
|
||||||
journald_layer = journald_layer.with_syslog_identifier(identifier.to_owned());
|
|
||||||
}
|
|
||||||
|
|
||||||
let journald_subscriber =
|
|
||||||
Registry::default().with(journald_layer.with_filter(journald_filter));
|
|
||||||
|
|
||||||
let _guard = tracing::subscriber::set_default(journald_subscriber);
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn tokio_console_enabled(config: &Config) -> (bool, &'static str) {
|
fn tokio_console_enabled(config: &Config) -> (bool, &'static str) {
|
||||||
if !cfg!(all(feature = "tokio_console", tokio_unstable)) {
|
if !cfg!(all(feature = "tokio_console", tokio_unstable)) {
|
||||||
return (false, "");
|
return (false, "");
|
||||||
@@ -173,10 +141,7 @@ fn tokio_console_enabled(config: &Config) -> (bool, &'static str) {
|
|||||||
(true, "")
|
(true, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_global_default<S>(subscriber: S)
|
fn set_global_default<S: SubscriberExt + Send + Sync>(subscriber: S) {
|
||||||
where
|
|
||||||
S: tracing::Subscriber + Send + Sync + 'static,
|
|
||||||
{
|
|
||||||
tracing::subscriber::set_global_default(subscriber)
|
tracing::subscriber::set_global_default(subscriber)
|
||||||
.expect("the global default tracing subscriber failed to be initialized");
|
.expect("the global default tracing subscriber failed to be initialized");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ pub(super) async fn handle_outlier_pdu<'a>(
|
|||||||
// 5. Reject "due to auth events" if can't get all the auth events or some of
|
// 5. Reject "due to auth events" if can't get all the auth events or some of
|
||||||
// the auth events are also rejected "due to auth events"
|
// the auth events are also rejected "due to auth events"
|
||||||
// NOTE: Step 5 is not applied anymore because it failed too often
|
// NOTE: Step 5 is not applied anymore because it failed too often
|
||||||
debug!("Fetching auth events");
|
debug!("Fetching auth events for {}", incoming_pdu.event_id);
|
||||||
Box::pin(self.fetch_and_handle_outliers(
|
Box::pin(self.fetch_and_handle_outliers(
|
||||||
origin,
|
origin,
|
||||||
&incoming_pdu.auth_events,
|
&incoming_pdu.auth_events,
|
||||||
@@ -88,12 +88,12 @@ pub(super) async fn handle_outlier_pdu<'a>(
|
|||||||
|
|
||||||
// 6. Reject "due to auth events" if the event doesn't pass auth based on the
|
// 6. Reject "due to auth events" if the event doesn't pass auth based on the
|
||||||
// auth events
|
// auth events
|
||||||
debug!("Checking based on auth events");
|
debug!("Checking {} based on auth events", incoming_pdu.event_id);
|
||||||
// Build map of auth events
|
// Build map of auth events
|
||||||
let mut auth_events = HashMap::with_capacity(incoming_pdu.auth_events.len());
|
let mut auth_events = HashMap::with_capacity(incoming_pdu.auth_events.len());
|
||||||
for id in &incoming_pdu.auth_events {
|
for id in &incoming_pdu.auth_events {
|
||||||
let Ok(auth_event) = self.services.timeline.get_pdu(id).await else {
|
let Ok(auth_event) = self.services.timeline.get_pdu(id).await else {
|
||||||
warn!("Could not find auth event {id}");
|
warn!("Could not find auth event {id} for {}", incoming_pdu.event_id);
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -119,10 +119,7 @@ pub(super) async fn handle_outlier_pdu<'a>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The original create event must be in the auth events
|
// The original create event must be in the auth events
|
||||||
if !matches!(
|
if !auth_events.contains_key(&(StateEventType::RoomCreate, String::new().into())) {
|
||||||
auth_events.get(&(StateEventType::RoomCreate, String::new().into())),
|
|
||||||
Some(_) | None
|
|
||||||
) {
|
|
||||||
return Err!(Request(InvalidParam("Incoming event refers to wrong create event.")));
|
return Err!(Request(InvalidParam("Incoming event refers to wrong create event.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -131,6 +128,7 @@ pub(super) async fn handle_outlier_pdu<'a>(
|
|||||||
ready(auth_events.get(&key))
|
ready(auth_events.get(&key))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
debug!("running auth check to handle outlier pdu {:?}", incoming_pdu.event_id);
|
||||||
let auth_check = state_res::event_auth::auth_check(
|
let auth_check = state_res::event_auth::auth_check(
|
||||||
&to_room_version(&room_version_id),
|
&to_room_version(&room_version_id),
|
||||||
&incoming_pdu,
|
&incoming_pdu,
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
use std::{borrow::Borrow, collections::BTreeMap, iter::once, sync::Arc, time::Instant};
|
use std::{borrow::Borrow, collections::BTreeMap, iter::once, sync::Arc, time::Instant};
|
||||||
|
|
||||||
use conduwuit::{
|
use conduwuit::{Err, Result, debug, debug_info, err, implement, matrix::{EventTypeExt, PduEvent, StateKey, state_res}, trace, utils::stream::{BroadbandExt, ReadyExt}, warn, info};
|
||||||
Err, Result, debug, debug_info, err, implement,
|
|
||||||
matrix::{EventTypeExt, PduEvent, StateKey, state_res},
|
|
||||||
trace,
|
|
||||||
utils::stream::{BroadbandExt, ReadyExt},
|
|
||||||
warn,
|
|
||||||
};
|
|
||||||
use futures::{FutureExt, StreamExt, future::ready};
|
use futures::{FutureExt, StreamExt, future::ready};
|
||||||
use ruma::{CanonicalJsonValue, RoomId, ServerName, events::StateEventType};
|
use ruma::{CanonicalJsonValue, RoomId, ServerName, events::StateEventType};
|
||||||
|
|
||||||
@@ -44,7 +38,7 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu(
|
|||||||
return Err!(Request(InvalidParam("Event has been soft failed")));
|
return Err!(Request(InvalidParam("Event has been soft failed")));
|
||||||
}
|
}
|
||||||
|
|
||||||
debug!("Upgrading to timeline pdu");
|
debug!("Upgrading pdu {} from outlier to timeline pdu", incoming_pdu.event_id);
|
||||||
let timer = Instant::now();
|
let timer = Instant::now();
|
||||||
let room_version_id = get_room_version_id(create_event)?;
|
let room_version_id = get_room_version_id(create_event)?;
|
||||||
|
|
||||||
@@ -52,7 +46,7 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu(
|
|||||||
// backwards extremities doing all the checks in this list starting at 1.
|
// backwards extremities doing all the checks in this list starting at 1.
|
||||||
// These are not timeline events.
|
// These are not timeline events.
|
||||||
|
|
||||||
debug!("Resolving state at event");
|
debug!("Resolving state at event {}", incoming_pdu.event_id);
|
||||||
let mut state_at_incoming_event = if incoming_pdu.prev_events.len() == 1 {
|
let mut state_at_incoming_event = if incoming_pdu.prev_events.len() == 1 {
|
||||||
self.state_at_incoming_degree_one(&incoming_pdu).await?
|
self.state_at_incoming_degree_one(&incoming_pdu).await?
|
||||||
} else {
|
} else {
|
||||||
@@ -70,7 +64,7 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu(
|
|||||||
state_at_incoming_event.expect("we always set this to some above");
|
state_at_incoming_event.expect("we always set this to some above");
|
||||||
let room_version = to_room_version(&room_version_id);
|
let room_version = to_room_version(&room_version_id);
|
||||||
|
|
||||||
debug!("Performing auth check");
|
debug!("Performing auth check to upgrade {}", incoming_pdu.event_id);
|
||||||
// 11. Check the auth of the event passes based on the state of the event
|
// 11. Check the auth of the event passes based on the state of the event
|
||||||
let state_fetch_state = &state_at_incoming_event;
|
let state_fetch_state = &state_at_incoming_event;
|
||||||
let state_fetch = |k: StateEventType, s: StateKey| async move {
|
let state_fetch = |k: StateEventType, s: StateKey| async move {
|
||||||
@@ -80,6 +74,7 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu(
|
|||||||
self.services.timeline.get_pdu(event_id).await.ok()
|
self.services.timeline.get_pdu(event_id).await.ok()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
debug!("running auth check on {}", incoming_pdu.event_id);
|
||||||
let auth_check = state_res::event_auth::auth_check(
|
let auth_check = state_res::event_auth::auth_check(
|
||||||
&room_version,
|
&room_version,
|
||||||
&incoming_pdu,
|
&incoming_pdu,
|
||||||
@@ -93,7 +88,7 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu(
|
|||||||
return Err!(Request(Forbidden("Event has failed auth check with state at the event.")));
|
return Err!(Request(Forbidden("Event has failed auth check with state at the event.")));
|
||||||
}
|
}
|
||||||
|
|
||||||
debug!("Gathering auth events");
|
debug!("Gathering auth events for {}", incoming_pdu.event_id);
|
||||||
let auth_events = self
|
let auth_events = self
|
||||||
.services
|
.services
|
||||||
.state
|
.state
|
||||||
@@ -111,6 +106,7 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu(
|
|||||||
ready(auth_events.get(&key).cloned())
|
ready(auth_events.get(&key).cloned())
|
||||||
};
|
};
|
||||||
|
|
||||||
|
debug!("running auth check on {} with claimed state auth", incoming_pdu.event_id);
|
||||||
let auth_check = state_res::event_auth::auth_check(
|
let auth_check = state_res::event_auth::auth_check(
|
||||||
&room_version,
|
&room_version,
|
||||||
&incoming_pdu,
|
&incoming_pdu,
|
||||||
@@ -121,7 +117,7 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu(
|
|||||||
.map_err(|e| err!(Request(Forbidden("Auth check failed: {e:?}"))))?;
|
.map_err(|e| err!(Request(Forbidden("Auth check failed: {e:?}"))))?;
|
||||||
|
|
||||||
// Soft fail check before doing state res
|
// Soft fail check before doing state res
|
||||||
debug!("Performing soft-fail check");
|
debug!("Performing soft-fail check on {}", incoming_pdu.event_id);
|
||||||
let soft_fail = match (auth_check, incoming_pdu.redacts_id(&room_version_id)) {
|
let soft_fail = match (auth_check, incoming_pdu.redacts_id(&room_version_id)) {
|
||||||
| (false, _) => true,
|
| (false, _) => true,
|
||||||
| (true, None) => false,
|
| (true, None) => false,
|
||||||
@@ -218,7 +214,8 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu(
|
|||||||
// 14. Check if the event passes auth based on the "current state" of the room,
|
// 14. Check if the event passes auth based on the "current state" of the room,
|
||||||
// if not soft fail it
|
// if not soft fail it
|
||||||
if soft_fail {
|
if soft_fail {
|
||||||
debug!("Soft failing event");
|
info!("Soft failing event {}", incoming_pdu.event_id);
|
||||||
|
assert!(extremities.is_empty(), "soft_fail extremities empty");
|
||||||
let extremities = extremities.iter().map(Borrow::borrow);
|
let extremities = extremities.iter().map(Borrow::borrow);
|
||||||
|
|
||||||
self.services
|
self.services
|
||||||
|
|||||||
@@ -698,6 +698,20 @@ impl Service {
|
|||||||
.await
|
.await
|
||||||
.saturating_add(uint!(1));
|
.saturating_add(uint!(1));
|
||||||
|
|
||||||
|
if state_key.is_none() {
|
||||||
|
if prev_events.is_empty() {
|
||||||
|
warn!("Timeline event had zero prev_events, something broke.");
|
||||||
|
return Err!(Request(Unknown("Timeline event had zero prev_events.")));
|
||||||
|
}
|
||||||
|
if depth.le(&uint!(2)) {
|
||||||
|
warn!(
|
||||||
|
"Had unsafe depth of {depth} in {room_id} when creating non-state event. \
|
||||||
|
Bad!"
|
||||||
|
);
|
||||||
|
return Err!(Request(Unknown("Unsafe depth for non-state event.")));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
let mut unsigned = unsigned.unwrap_or_default();
|
let mut unsigned = unsigned.unwrap_or_default();
|
||||||
|
|
||||||
if let Some(state_key) = &state_key {
|
if let Some(state_key) = &state_key {
|
||||||
@@ -757,6 +771,7 @@ impl Service {
|
|||||||
ready(auth_events.get(&key))
|
ready(auth_events.get(&key))
|
||||||
};
|
};
|
||||||
|
|
||||||
|
debug!("running auth check on new {} event by {} in {}", pdu.kind, pdu.sender, pdu.room_id);
|
||||||
let auth_check = state_res::auth_check(
|
let auth_check = state_res::auth_check(
|
||||||
&room_version,
|
&room_version,
|
||||||
&pdu,
|
&pdu,
|
||||||
@@ -961,8 +976,9 @@ impl Service {
|
|||||||
state_lock: &'a RoomMutexGuard,
|
state_lock: &'a RoomMutexGuard,
|
||||||
) -> Result<Option<RawPduId>>
|
) -> Result<Option<RawPduId>>
|
||||||
where
|
where
|
||||||
Leaves: Iterator<Item = &'a EventId> + Send + 'a,
|
Leaves: Iterator<Item = &'a EventId> + Send + Clone + 'a,
|
||||||
{
|
{
|
||||||
|
assert!(new_room_leaves.clone().count() > 0, "extremities are empty");
|
||||||
// We append to state before appending the pdu, so we don't have a moment in
|
// We append to state before appending the pdu, so we don't have a moment in
|
||||||
// time with the pdu without it's state. This is okay because append_pdu can't
|
// time with the pdu without it's state. This is okay because append_pdu can't
|
||||||
// fail.
|
// fail.
|
||||||
@@ -1142,7 +1158,7 @@ impl Service {
|
|||||||
.boxed();
|
.boxed();
|
||||||
|
|
||||||
while let Some(ref backfill_server) = servers.next().await {
|
while let Some(ref backfill_server) = servers.next().await {
|
||||||
info!("Asking {backfill_server} for backfill");
|
info!("Asking {backfill_server} for backfill in {:?}", room_id.to_owned());
|
||||||
let response = self
|
let response = self
|
||||||
.services
|
.services
|
||||||
.sending
|
.sending
|
||||||
@@ -1170,7 +1186,7 @@ impl Service {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("No servers could backfill, but backfill was needed in room {room_id}");
|
warn!("No servers could backfill, but backfill was needed in room {room_id}");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "xtask-admin-command"
|
|
||||||
authors.workspace = true
|
|
||||||
categories.workspace = true
|
|
||||||
description.workspace = true
|
|
||||||
edition.workspace = true
|
|
||||||
homepage.workspace = true
|
|
||||||
keywords.workspace = true
|
|
||||||
license.workspace = true
|
|
||||||
readme.workspace = true
|
|
||||||
repository.workspace = true
|
|
||||||
rust-version.workspace = true
|
|
||||||
version.workspace = true
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
clap-markdown = "0.1.5"
|
|
||||||
clap_builder = { version = "4.5.38", default-features = false }
|
|
||||||
clap_mangen = "0.2"
|
|
||||||
|
|
||||||
conduwuit-admin.workspace = true
|
|
||||||
|
|
||||||
# Hack to prevent rebuilds
|
|
||||||
conduwuit.workspace = true
|
|
||||||
|
|
||||||
[lints]
|
|
||||||
workspace = true
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,58 +0,0 @@
|
|||||||
use std::{
|
|
||||||
fs::{self, File},
|
|
||||||
io,
|
|
||||||
path::Path,
|
|
||||||
};
|
|
||||||
|
|
||||||
use clap_builder::{Command, CommandFactory};
|
|
||||||
use conduwuit_admin::AdminCommand;
|
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
||||||
let mut args = std::env::args().skip(1);
|
|
||||||
let task = args.next();
|
|
||||||
match task {
|
|
||||||
| None => todo!(),
|
|
||||||
| Some(t) => match t.as_str() {
|
|
||||||
| "man" => {
|
|
||||||
let dir = Path::new("./admin-man");
|
|
||||||
gen_manpages(dir)?;
|
|
||||||
},
|
|
||||||
| "md" => {
|
|
||||||
let command = AdminCommand::command().name("admin");
|
|
||||||
|
|
||||||
let res = clap_markdown::help_markdown_command_custom(
|
|
||||||
&command,
|
|
||||||
&clap_markdown::MarkdownOptions::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
println!("{res}");
|
|
||||||
},
|
|
||||||
| invalid => return Err(format!("Invalid task name: {invalid}").into()),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn gen_manpages(dir: &Path) -> Result<(), io::Error> {
|
|
||||||
fn r#gen(dir: &Path, c: &Command, prefix: Option<&str>) -> Result<(), io::Error> {
|
|
||||||
fs::create_dir_all(dir)?;
|
|
||||||
let sub_name = c.get_display_name().unwrap_or_else(|| c.get_name());
|
|
||||||
let name = if let Some(prefix) = prefix {
|
|
||||||
format!("{prefix}-{sub_name}")
|
|
||||||
} else {
|
|
||||||
sub_name.to_owned()
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut out = File::create(dir.join(format!("{name}.1")))?;
|
|
||||||
let clap_mangen = clap_mangen::Man::new(c.to_owned().disable_help_flag(true));
|
|
||||||
clap_mangen.render(&mut out)?;
|
|
||||||
|
|
||||||
for sub in c.get_subcommands() {
|
|
||||||
r#gen(&dir.join(sub_name), sub, Some(&name))?;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
r#gen(dir, &AdminCommand::command().name("admin"), None)
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "xtask"
|
|
||||||
authors.workspace = true
|
|
||||||
categories.workspace = true
|
|
||||||
description.workspace = true
|
|
||||||
edition.workspace = true
|
|
||||||
homepage.workspace = true
|
|
||||||
keywords.workspace = true
|
|
||||||
license.workspace = true
|
|
||||||
readme.workspace = true
|
|
||||||
repository.workspace = true
|
|
||||||
rust-version.workspace = true
|
|
||||||
version.workspace = true
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
clap.workspace = true
|
|
||||||
# Required for working with JSON output from cargo metadata
|
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
|
||||||
serde_json = "1.0"
|
|
||||||
|
|
||||||
[lints]
|
|
||||||
workspace = true
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
use std::{env, process::Command};
|
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
||||||
let mut child = Command::new("cargo").args(["run", "--package", "xtask-admin-command", "--"].into_iter().map(ToOwned::to_owned).chain(env::args().skip(2)))
|
|
||||||
// .stdout(Stdio::piped())
|
|
||||||
// .stderr(Stdio::piped())
|
|
||||||
.spawn()
|
|
||||||
.expect("failed to execute child");
|
|
||||||
child.wait()?;
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user