diff --git a/.editorconfig b/.editorconfig index 95843e73..3e7fd1b8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -26,7 +26,3 @@ max_line_length = 98 [*.yml] indent_size = 2 indent_style = space - -[*.json] -indent_size = 4 -indent_style = space diff --git a/.envrc b/.envrc index 172993c4..bad73b75 100644 --- a/.envrc +++ b/.envrc @@ -2,8 +2,6 @@ dotenv_if_exists -if [ -f /etc/os-release ] && grep -q '^ID=nixos' /etc/os-release; then - use flake ".#${DIRENV_DEVSHELL:-default}" -fi +# use flake ".#${DIRENV_DEVSHELL:-default}" PATH_add bin diff --git a/.forgejo/actions/detect-runner-os/action.yml b/.forgejo/actions/detect-runner-os/action.yml deleted file mode 100644 index be8f9b0a..00000000 --- a/.forgejo/actions/detect-runner-os/action.yml +++ /dev/null @@ -1,58 +0,0 @@ -name: detect-runner-os -description: | - Detect the actual OS name and version of the runner. - Provides separate outputs for name, version, and a combined slug. - -outputs: - name: - description: 'OS name (e.g. Ubuntu, Debian)' - value: ${{ steps.detect.outputs.name }} - version: - description: 'OS version (e.g. 22.04, 11)' - value: ${{ steps.detect.outputs.version }} - slug: - description: 'Combined OS slug (e.g. Ubuntu-22.04)' - value: ${{ steps.detect.outputs.slug }} - node_major: - description: 'Major version of Node.js if available (e.g. 22)' - value: ${{ steps.detect.outputs.node_major }} - node_version: - description: 'Full Node.js version if available (e.g. 22.19.0)' - value: ${{ steps.detect.outputs.node_version }} - -runs: - using: composite - steps: - - name: Detect runner OS - id: detect - shell: bash - run: | - # Detect OS version (try lsb_release first, fall back to /etc/os-release) - OS_VERSION=$(lsb_release -rs 2>/dev/null || grep VERSION_ID /etc/os-release | cut -d'"' -f2) - - # Detect OS name and capitalise (try lsb_release first, fall back to /etc/os-release) - OS_NAME=$(lsb_release -is 2>/dev/null || grep "^ID=" /etc/os-release | cut -d'=' -f2 | tr -d '"' | sed 's/\b\(.\)/\u\1/g') - - # Create combined slug - OS_SLUG="${OS_NAME}-${OS_VERSION}" - - # Detect Node.js version if available - if command -v node >/dev/null 2>&1; then - NODE_VERSION=$(node --version | sed 's/v//') - NODE_MAJOR=$(echo $NODE_VERSION | cut -d. -f1) - echo "node_version=${NODE_VERSION}" >> $GITHUB_OUTPUT - echo "node_major=${NODE_MAJOR}" >> $GITHUB_OUTPUT - echo "πŸ” Detected Node.js: v${NODE_VERSION}" - else - echo "node_version=" >> $GITHUB_OUTPUT - echo "node_major=" >> $GITHUB_OUTPUT - echo "πŸ” Node.js not found" - fi - - # Set OS outputs - echo "name=${OS_NAME}" >> $GITHUB_OUTPUT - echo "version=${OS_VERSION}" >> $GITHUB_OUTPUT - echo "slug=${OS_SLUG}" >> $GITHUB_OUTPUT - - # Log detection results - echo "πŸ” Detected Runner OS: ${OS_NAME} ${OS_VERSION}" diff --git a/.forgejo/actions/prefligit/action.yml b/.forgejo/actions/prefligit/action.yml new file mode 100644 index 00000000..8cbd4500 --- /dev/null +++ b/.forgejo/actions/prefligit/action.yml @@ -0,0 +1,27 @@ +name: prefligit +description: | + Runs prefligit, pre-commit reimplemented in Rust. +inputs: + extra_args: + description: options to pass to pre-commit run + required: false + default: '--all-files' + +runs: + using: composite + steps: + - name: Install uv + uses: https://github.com/astral-sh/setup-uv@v6 + with: + enable-cache: true + ignore-nothing-to-cache: true + - name: Install Prefligit + shell: bash + run: | + curl --proto '=https' --tlsv1.2 -LsSf https://github.com/j178/prefligit/releases/download/v0.0.10/prefligit-installer.sh | sh + - uses: actions/cache@v3 + with: + path: ~/.cache/prefligit + key: prefligit-0|${{ hashFiles('.pre-commit-config.yaml') }} + - run: prefligit run --show-diff-on-failure --color=always -v ${{ inputs.extra_args }} + shell: bash diff --git a/.forgejo/actions/sccache/action.yml b/.forgejo/actions/sccache/action.yml index b2441109..b5e5dcf4 100644 --- a/.forgejo/actions/sccache/action.yml +++ b/.forgejo/actions/sccache/action.yml @@ -2,12 +2,18 @@ name: sccache description: | Install sccache for caching builds in GitHub Actions. +inputs: + token: + description: 'A Github PAT' + required: false runs: using: composite steps: - name: Install sccache - uses: https://git.tomfos.tr/tom/sccache-action@v1 + uses: https://github.com/mozilla-actions/sccache-action@v0.0.9 + with: + token: ${{ inputs.token }} - name: Configure sccache uses: https://github.com/actions/github-script@v7 with: diff --git a/.forgejo/actions/setup-llvm-with-apt/action.yml b/.forgejo/actions/setup-llvm-with-apt/action.yml deleted file mode 100644 index eb421e4f..00000000 --- a/.forgejo/actions/setup-llvm-with-apt/action.yml +++ /dev/null @@ -1,167 +0,0 @@ -name: setup-llvm-with-apt -description: | - Set up LLVM toolchain with APT package management and smart caching. - Supports cross-compilation architectures and additional package installation. - - Creates symlinks in /usr/bin: clang, clang++, lld, llvm-ar, llvm-ranlib - -inputs: - dpkg-arch: - description: 'Debian architecture for cross-compilation (e.g. arm64)' - required: false - default: '' - extra-packages: - description: 'Additional APT packages to install (space-separated)' - required: false - default: '' - llvm-version: - description: 'LLVM version to install' - required: false - default: '20' - -outputs: - llvm-version: - description: 'Installed LLVM version' - value: ${{ steps.configure.outputs.version }} - -runs: - using: composite - steps: - - name: Detect runner OS - id: runner-os - uses: ./.forgejo/actions/detect-runner-os - - - name: Configure cross-compilation architecture - if: inputs.dpkg-arch != '' - shell: bash - run: | - echo "πŸ—οΈ Adding ${{ inputs.dpkg-arch }} architecture" - sudo dpkg --add-architecture ${{ inputs.dpkg-arch }} - - # Restrict default sources to amd64 - sudo sed -i 's/^deb http/deb [arch=amd64] http/g' /etc/apt/sources.list - sudo sed -i 's/^deb https/deb [arch=amd64] https/g' /etc/apt/sources.list - - # Add ports sources for foreign architecture - sudo tee /etc/apt/sources.list.d/${{ inputs.dpkg-arch }}.list > /dev/null <> $GITHUB_OUTPUT - else - echo "πŸ“¦ LLVM ${{ inputs.llvm-version }} not found or incomplete - installing..." - - echo "::group::πŸ”§ Installing LLVM ${{ inputs.llvm-version }}" - wget -O - https://apt.llvm.org/llvm.sh | bash -s -- ${{ inputs.llvm-version }} - echo "::endgroup::" - - if [ ! -f "/usr/bin/clang-${{ inputs.llvm-version }}" ]; then - echo "❌ Failed to install LLVM ${{ inputs.llvm-version }}" - exit 1 - fi - - echo "βœ… Installed LLVM ${{ inputs.llvm-version }}" - echo "needs-install=true" >> $GITHUB_OUTPUT - fi - - - name: Prepare for additional packages - if: inputs.extra-packages != '' - shell: bash - run: | - # Update APT if LLVM was cached (installer script already does apt-get update) - if [[ "${{ steps.llvm-setup.outputs.needs-install }}" != "true" ]]; then - echo "::group::πŸ“¦ Running apt-get update (LLVM cached, extra packages needed)" - sudo apt-get update - echo "::endgroup::" - fi - echo "::group::πŸ“¦ Installing additional packages" - - - name: Install additional packages - if: inputs.extra-packages != '' - uses: https://github.com/awalsh128/cache-apt-pkgs-action@latest - with: - packages: ${{ inputs.extra-packages }} - version: 1.0 - - - name: End package installation group - if: inputs.extra-packages != '' - shell: bash - run: echo "::endgroup::" - - - name: Configure LLVM environment - id: configure - shell: bash - run: | - echo "::group::πŸ”§ Configuring LLVM ${{ inputs.llvm-version }} environment" - - # Create symlinks - sudo ln -sf "/usr/bin/clang-${{ inputs.llvm-version }}" /usr/bin/clang - sudo ln -sf "/usr/bin/clang++-${{ inputs.llvm-version }}" /usr/bin/clang++ - sudo ln -sf "/usr/bin/lld-${{ inputs.llvm-version }}" /usr/bin/lld - sudo ln -sf "/usr/bin/llvm-ar-${{ inputs.llvm-version }}" /usr/bin/llvm-ar - sudo ln -sf "/usr/bin/llvm-ranlib-${{ inputs.llvm-version }}" /usr/bin/llvm-ranlib - echo " βœ“ Created symlinks" - - # Setup library paths - LLVM_LIB_PATH="/usr/lib/llvm-${{ inputs.llvm-version }}/lib" - if [ -d "$LLVM_LIB_PATH" ]; then - echo "LD_LIBRARY_PATH=${LLVM_LIB_PATH}:${LD_LIBRARY_PATH:-}" >> $GITHUB_ENV - echo "LIBCLANG_PATH=${LLVM_LIB_PATH}" >> $GITHUB_ENV - - echo "$LLVM_LIB_PATH" | sudo tee "/etc/ld.so.conf.d/llvm-${{ inputs.llvm-version }}.conf" > /dev/null - sudo ldconfig - echo " βœ“ Configured library paths" - else - # Fallback to standard library location - if [ -d "/usr/lib/x86_64-linux-gnu" ]; then - echo "LIBCLANG_PATH=/usr/lib/x86_64-linux-gnu" >> $GITHUB_ENV - echo " βœ“ Using fallback library path" - fi - fi - - # Set output - echo "version=${{ inputs.llvm-version }}" >> $GITHUB_OUTPUT - echo "::endgroup::" - echo "βœ… LLVM ready: $(clang --version | head -1)" diff --git a/.forgejo/actions/setup-rust/action.yml b/.forgejo/actions/setup-rust/action.yml deleted file mode 100644 index a8736a75..00000000 --- a/.forgejo/actions/setup-rust/action.yml +++ /dev/null @@ -1,226 +0,0 @@ -name: setup-rust -description: | - Set up Rust toolchain with sccache for compilation caching. - Respects rust-toolchain.toml by default or accepts explicit version override. - -inputs: - cache-key-suffix: - description: 'Optional suffix for cache keys (e.g. platform identifier)' - required: false - default: '' - rust-components: - description: 'Additional Rust components to install (space-separated)' - required: false - default: '' - rust-target: - description: 'Rust target triple (e.g. x86_64-unknown-linux-gnu)' - required: false - default: '' - rust-version: - description: 'Rust version to install (e.g. nightly). Defaults to 1.87.0' - required: false - default: '1.87.0' - sccache-cache-limit: - description: 'Maximum size limit for sccache local cache (e.g. 2G, 500M)' - required: false - default: '2G' - github-token: - description: 'GitHub token for downloading sccache from GitHub releases' - required: false - default: '' - -outputs: - rust-version: - description: 'Installed Rust version' - value: ${{ steps.rust-setup.outputs.version }} - -runs: - using: composite - steps: - - name: Detect runner OS - id: runner-os - uses: ./.forgejo/actions/detect-runner-os - - - name: Configure Cargo environment - shell: bash - run: | - # Use workspace-relative paths for better control and consistency - echo "CARGO_HOME=${{ github.workspace }}/.cargo" >> $GITHUB_ENV - echo "CARGO_TARGET_DIR=${{ github.workspace }}/target" >> $GITHUB_ENV - echo "SCCACHE_DIR=${{ github.workspace }}/.sccache" >> $GITHUB_ENV - echo "RUSTUP_HOME=${{ github.workspace }}/.rustup" >> $GITHUB_ENV - - # Limit binstall resolution timeout to avoid GitHub rate limit delays - echo "BINSTALL_MAXIMUM_RESOLUTION_TIMEOUT=10" >> $GITHUB_ENV - - # Ensure directories exist for first run - mkdir -p "${{ github.workspace }}/.cargo" - mkdir -p "${{ github.workspace }}/.sccache" - mkdir -p "${{ github.workspace }}/target" - mkdir -p "${{ github.workspace }}/.rustup" - - - name: Start cache restore group - shell: bash - run: echo "::group::πŸ“¦ Restoring caches (registry, toolchain, build artifacts)" - - - name: Cache Cargo registry and git - id: registry-cache - uses: https://github.com/actions/cache@v4 - with: - path: | - .cargo/registry/index - .cargo/registry/cache - .cargo/git/db - # Registry cache saved per workflow, restored from any workflow's cache - # Each workflow maintains its own registry that accumulates its needed crates - key: cargo-registry-${{ steps.runner-os.outputs.slug }}-${{ github.workflow }} - restore-keys: | - cargo-registry-${{ steps.runner-os.outputs.slug }}- - - - name: Cache toolchain binaries - id: toolchain-cache - uses: https://github.com/actions/cache@v4 - with: - path: | - .cargo/bin - .rustup/toolchains - .rustup/update-hashes - # Shared toolchain cache across all Rust versions - key: toolchain-${{ steps.runner-os.outputs.slug }} - - - - name: Setup sccache - uses: https://git.tomfos.tr/tom/sccache-action@v1 - - - name: Cache build artifacts - id: build-cache - uses: https://github.com/actions/cache@v4 - with: - path: | - target/**/deps - !target/**/deps/*.rlib - target/**/build - target/**/.fingerprint - target/**/incremental - target/**/*.d - /timelord/ - # Build artifacts - cache per code change, restore from deps when code changes - key: >- - build-${{ steps.runner-os.outputs.slug }}-${{ inputs.rust-version }}${{ inputs.cache-key-suffix && format('-{0}', inputs.cache-key-suffix) || '' }}-${{ hashFiles('rust-toolchain.toml', '**/Cargo.lock') }}-${{ hashFiles('**/*.rs', '**/Cargo.toml') }} - restore-keys: | - build-${{ steps.runner-os.outputs.slug }}-${{ inputs.rust-version }}${{ inputs.cache-key-suffix && format('-{0}', inputs.cache-key-suffix) || '' }}-${{ hashFiles('rust-toolchain.toml', '**/Cargo.lock') }}- - - - name: End cache restore group - shell: bash - run: echo "::endgroup::" - - - name: Setup Rust toolchain - shell: bash - run: | - # Install rustup if not already cached - if ! command -v rustup &> /dev/null; then - echo "::group::πŸ“¦ Installing rustup" - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path --default-toolchain none - source "$CARGO_HOME/env" - echo "::endgroup::" - else - echo "βœ… rustup already available" - fi - - # Setup the appropriate Rust version - if [[ -n "${{ inputs.rust-version }}" ]]; then - echo "::group::πŸ“¦ Setting up Rust ${{ inputs.rust-version }}" - # Set override first to prevent rust-toolchain.toml from auto-installing - rustup override set ${{ inputs.rust-version }} 2>/dev/null || true - - # Check if we need to install/update the toolchain - if rustup toolchain list | grep -q "^${{ inputs.rust-version }}-"; then - rustup update ${{ inputs.rust-version }} - else - rustup toolchain install ${{ inputs.rust-version }} --profile minimal -c cargo,clippy,rustfmt - fi - else - echo "::group::πŸ“¦ Setting up Rust from rust-toolchain.toml" - rustup show - fi - echo "::endgroup::" - - - name: Configure PATH and install tools - shell: bash - env: - GITHUB_TOKEN: ${{ inputs.github-token }} - run: | - # Add .cargo/bin to PATH permanently for all subsequent steps - echo "${{ github.workspace }}/.cargo/bin" >> $GITHUB_PATH - - # For this step only, we need to add it to PATH since GITHUB_PATH takes effect in the next step - export PATH="${{ github.workspace }}/.cargo/bin:$PATH" - - # Install cargo-binstall for fast binary installations - if command -v cargo-binstall &> /dev/null; then - echo "βœ… cargo-binstall already available" - else - echo "::group::πŸ“¦ Installing cargo-binstall" - curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash - echo "::endgroup::" - fi - - if command -v prek &> /dev/null; then - echo "βœ… prek already available" - else - echo "::group::πŸ“¦ Installing prek" - # prek isn't regularly published to crates.io, so we use git source - cargo-binstall -y --no-symlinks --git https://github.com/j178/prek prek - echo "::endgroup::" - fi - - if command -v timelord &> /dev/null; then - echo "βœ… timelord already available" - else - echo "::group::πŸ“¦ Installing timelord" - cargo-binstall -y --no-symlinks timelord-cli - echo "::endgroup::" - fi - - - name: Configure sccache environment - shell: bash - run: | - echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV - echo "CMAKE_C_COMPILER_LAUNCHER=sccache" >> $GITHUB_ENV - echo "CMAKE_CXX_COMPILER_LAUNCHER=sccache" >> $GITHUB_ENV - echo "CMAKE_CUDA_COMPILER_LAUNCHER=sccache" >> $GITHUB_ENV - echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV - - # Configure incremental compilation GC - # If we restored from old cache (partial hit), clean up aggressively - if [[ "${{ steps.build-cache.outputs.cache-hit }}" != "true" ]]; then - echo "♻️ Partial cache hit - enabling cache cleanup" - echo "CARGO_INCREMENTAL_GC_THRESHOLD=5" >> $GITHUB_ENV - fi - - - name: Install Rust components - if: inputs.rust-components != '' - shell: bash - run: | - echo "πŸ“¦ Installing components: ${{ inputs.rust-components }}" - rustup component add ${{ inputs.rust-components }} - - - name: Install Rust target - if: inputs.rust-target != '' - shell: bash - run: | - echo "πŸ“¦ Installing target: ${{ inputs.rust-target }}" - rustup target add ${{ inputs.rust-target }} - - - name: Output version and summary - id: rust-setup - shell: bash - run: | - RUST_VERSION=$(rustc --version | cut -d' ' -f2) - echo "version=$RUST_VERSION" >> $GITHUB_OUTPUT - - echo "πŸ“‹ Setup complete:" - echo " Rust: $(rustc --version)" - echo " Cargo: $(cargo --version)" - echo " prek: $(prek --version 2>/dev/null || echo 'installed')" - echo " timelord: $(timelord --version 2>/dev/null || echo 'installed')" diff --git a/.forgejo/workflows/documentation.yml b/.forgejo/workflows/documentation.yml index 67c8a30c..4f3e903c 100644 --- a/.forgejo/workflows/documentation.yml +++ b/.forgejo/workflows/documentation.yml @@ -49,23 +49,10 @@ jobs: cp ./docs/static/_headers ./public/_headers echo "Copied .well-known files and _headers to ./public" - - name: Detect runner environment - id: runner-env - uses: ./.forgejo/actions/detect-runner-os - - name: Setup Node.js - if: steps.runner-env.outputs.node_major == '' || steps.runner-env.outputs.node_major < '20' uses: https://github.com/actions/setup-node@v4 with: - node-version: 22 - - - name: Cache npm dependencies - uses: actions/cache@v3 - with: - path: ~/.npm - key: ${{ steps.runner-env.outputs.slug }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ steps.runner-env.outputs.slug }}-node- + node-version: 20 - name: Install dependencies run: npm install --save-dev wrangler@latest diff --git a/.forgejo/workflows/prefligit-checks.yml b/.forgejo/workflows/prefligit-checks.yml new file mode 100644 index 00000000..cc512496 --- /dev/null +++ b/.forgejo/workflows/prefligit-checks.yml @@ -0,0 +1,22 @@ +name: Checks / Prefligit + +on: + push: + pull_request: +permissions: + contents: read + +jobs: + prefligit: + runs-on: ubuntu-latest + env: + FROM_REF: ${{ github.event.pull_request.base.sha || (!github.event.forced && ( github.event.before != '0000000000000000000000000000000000000000' && github.event.before || github.sha )) || format('{0}~', github.sha) }} + TO_REF: ${{ github.sha }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + - uses: ./.forgejo/actions/prefligit + with: + extra_args: --all-files --hook-stage manual diff --git a/.forgejo/workflows/prek-checks.yml b/.forgejo/workflows/prek-checks.yml deleted file mode 100644 index 45288bef..00000000 --- a/.forgejo/workflows/prek-checks.yml +++ /dev/null @@ -1,83 +0,0 @@ -name: Checks / Prek - -on: - pull_request: - push: - branches: - - main - workflow_dispatch: - -permissions: - contents: read - -jobs: - fast-checks: - name: Pre-commit & Formatting - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Setup Rust nightly - uses: ./.forgejo/actions/setup-rust - with: - rust-version: nightly - github-token: ${{ secrets.GH_PUBLIC_RO }} - - - name: Run prek - run: | - prek run \ - --all-files \ - --hook-stage manual \ - --show-diff-on-failure \ - --color=always \ - -v - - - name: Check Rust formatting - run: | - cargo +nightly fmt --all -- --check && \ - echo "βœ… Formatting check passed" || \ - exit 1 - - clippy-and-tests: - name: Clippy and Cargo Tests - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - persist-credentials: false - - - name: Setup LLVM - uses: ./.forgejo/actions/setup-llvm-with-apt - with: - extra-packages: liburing-dev liburing2 - - - name: Setup Rust with caching - uses: ./.forgejo/actions/setup-rust - with: - github-token: ${{ secrets.GH_PUBLIC_RO }} - - - name: Run Clippy lints - run: | - cargo clippy \ - --workspace \ - --features full \ - --locked \ - --no-deps \ - --profile test \ - -- \ - -D warnings - - - name: Run Cargo tests - run: | - cargo test \ - --workspace \ - --features full \ - --locked \ - --profile test \ - --all-targets \ - --no-fail-fast diff --git a/.forgejo/workflows/release-image.yml b/.forgejo/workflows/release-image.yml index b7423567..04fc9de9 100644 --- a/.forgejo/workflows/release-image.yml +++ b/.forgejo/workflows/release-image.yml @@ -3,25 +3,15 @@ concurrency: group: "release-image-${{ github.ref }}" on: - pull_request: - paths-ignore: - - "*.md" - - "**/*.md" - - ".gitlab-ci.yml" - - ".gitignore" - - "renovate.json" - - "pkg/**" - - "docs/**" push: - branches: - - main paths-ignore: - "*.md" - "**/*.md" - ".gitlab-ci.yml" - ".gitignore" - "renovate.json" - - "pkg/**" + - "debian/**" + - "docker/**" - "docs/**" # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -53,9 +43,6 @@ jobs: let images = [] if (process.env.BUILTIN_REGISTRY_ENABLED === "true") { images.push(builtinImage) - } else { - // Fallback to official registry for forks/PRs without credentials - images.push('forgejo.ellis.link/continuwuation/continuwuity') } core.setOutput('images', images.join("\n")) core.setOutput('images_list', images.join(",")) @@ -101,22 +88,15 @@ jobs: with: persist-credentials: false - name: Install rust - if: ${{ env.BUILDKIT_ENDPOINT == '' }} id: rust-toolchain uses: ./.forgejo/actions/rust-toolchain - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - with: - # Use persistent BuildKit if BUILDKIT_ENDPOINT is set (e.g. tcp://buildkit:8125) - driver: ${{ env.BUILDKIT_ENDPOINT != '' && 'remote' || 'docker-container' }} - endpoint: ${{ env.BUILDKIT_ENDPOINT || '' }} - name: Set up QEMU - if: ${{ env.BUILDKIT_ENDPOINT == '' }} uses: docker/setup-qemu-action@v3 # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here. - name: Login to builtin registry - if: ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' }} uses: docker/login-action@v3 with: registry: ${{ env.BUILTIN_REGISTRY }} @@ -142,21 +122,15 @@ jobs: run: | calculatedSha=$(git rev-parse --short ${{ github.sha }}) echo "COMMIT_SHORT_SHA=$calculatedSha" >> $GITHUB_ENV - echo "Short SHA: $calculatedSha" - name: Get Git commit timestamps - run: | - timestamp=$(git log -1 --pretty=%ct) - echo "TIMESTAMP=$timestamp" >> $GITHUB_ENV - echo "Commit timestamp: $timestamp" + run: echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV - uses: ./.forgejo/actions/timelord - if: ${{ env.BUILDKIT_ENDPOINT == '' }} with: key: timelord-v0 path: . - name: Cache Rust registry - if: ${{ env.BUILDKIT_ENDPOINT == '' }} uses: actions/cache@v3 with: path: | @@ -166,7 +140,6 @@ jobs: .cargo/registry/src key: rust-registry-image-${{hashFiles('**/Cargo.lock') }} - name: Cache cargo target - if: ${{ env.BUILDKIT_ENDPOINT == '' }} id: cache-cargo-target uses: actions/cache@v3 with: @@ -174,7 +147,6 @@ jobs: cargo-target-${{ matrix.target_cpu }}-${{ matrix.slug }}-${{ matrix.profile }} key: cargo-target-${{ matrix.target_cpu }}-${{ matrix.slug }}-${{ matrix.profile }}-${{hashFiles('**/Cargo.lock') }}-${{steps.rust-toolchain.outputs.rustc_version}} - name: Cache apt cache - if: ${{ env.BUILDKIT_ENDPOINT == '' }} id: cache-apt uses: actions/cache@v3 with: @@ -182,7 +154,6 @@ jobs: var-cache-apt-${{ matrix.slug }} key: var-cache-apt-${{ matrix.slug }} - name: Cache apt lib - if: ${{ env.BUILDKIT_ENDPOINT == '' }} id: cache-apt-lib uses: actions/cache@v3 with: @@ -190,8 +161,7 @@ jobs: var-lib-apt-${{ matrix.slug }} key: var-lib-apt-${{ matrix.slug }} - name: inject cache into docker - if: ${{ env.BUILDKIT_ENDPOINT == '' }} - uses: https://github.com/reproducible-containers/buildkit-cache-dance@v3.3.0 + uses: https://github.com/reproducible-containers/buildkit-cache-dance@v3.1.0 with: cache-map: | { @@ -213,7 +183,7 @@ jobs: context: . file: "docker/Dockerfile" build-args: | - GIT_COMMIT_HASH=${{ github.sha }} + GIT_COMMIT_HASH=${{ github.sha }}) GIT_COMMIT_HASH_SHORT=${{ env.COMMIT_SHORT_SHA }} GIT_REMOTE_URL=${{github.event.repository.html_url }} GIT_REMOTE_COMMIT_URL=${{github.event.head_commit.url }} @@ -223,23 +193,27 @@ jobs: cache-from: type=gha # cache-to: type=gha,mode=max sbom: true - outputs: | - ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' && format('type=image,"name={0}",push-by-digest=true,name-canonical=true,push=true', needs.define-variables.outputs.images_list) || format('type=image,"name={0}",push=false', needs.define-variables.outputs.images_list) }} - type=local,dest=/tmp/binaries + outputs: type=image,"name=${{ needs.define-variables.outputs.images_list }}",push-by-digest=true,name-canonical=true,push=true env: SOURCE_DATE_EPOCH: ${{ env.TIMESTAMP }} # For publishing multi-platform manifests - name: Export digest - if: ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' }} run: | mkdir -p /tmp/digests digest="${{ steps.build.outputs.digest }}" touch "/tmp/digests/${digest#sha256:}" - # Binary extracted via local output for all builds - - name: Rename extracted binary - run: mv /tmp/binaries/sbin/conduwuit /tmp/binaries/conduwuit-${{ matrix.target_cpu }}-${{ matrix.slug }}-${{ matrix.profile }} + - name: Extract binary from container (image) + id: extract-binary-image + run: | + mkdir -p /tmp/binaries + digest="${{ steps.build.outputs.digest }}" + echo "container_id=$(docker create --platform ${{ matrix.platform }} ${{ needs.define-variables.outputs.images_list }}@$digest)" >> $GITHUB_OUTPUT + - name: Extract binary from container (copy) + run: docker cp ${{ steps.extract-binary-image.outputs.container_id }}:/sbin/conduwuit /tmp/binaries/conduwuit-${{ matrix.target_cpu }}-${{ matrix.slug }}-${{ matrix.profile }} + - name: Extract binary from container (cleanup) + run: docker rm ${{ steps.extract-binary-image.outputs.container_id }} - name: Upload binary artifact uses: forgejo/upload-artifact@v4 @@ -249,7 +223,6 @@ jobs: if-no-files-found: error - name: Upload digest - if: ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' }} uses: forgejo/upload-artifact@v4 with: name: digests-${{ matrix.slug }} @@ -262,7 +235,6 @@ jobs: needs: [define-variables, build-image] steps: - name: Download digests - if: ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' }} uses: forgejo/download-artifact@v4 with: path: /tmp/digests @@ -270,7 +242,6 @@ jobs: merge-multiple: true # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here. - name: Login to builtin registry - if: ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' }} uses: docker/login-action@v3 with: registry: ${{ env.BUILTIN_REGISTRY }} @@ -278,15 +249,9 @@ jobs: password: ${{ secrets.BUILTIN_REGISTRY_PASSWORD || secrets.GITHUB_TOKEN }} - name: Set up Docker Buildx - if: ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' }} uses: docker/setup-buildx-action@v3 - with: - # Use persistent BuildKit if BUILDKIT_ENDPOINT is set (e.g. tcp://buildkit:8125) - driver: ${{ env.BUILDKIT_ENDPOINT != '' && 'remote' || 'docker-container' }} - endpoint: ${{ env.BUILDKIT_ENDPOINT || '' }} - name: Extract metadata (tags) for Docker - if: ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' }} id: meta uses: docker/metadata-action@v5 with: @@ -304,7 +269,6 @@ jobs: DOCKER_METADATA_ANNOTATIONS_LEVELS: index - name: Create manifest list and push - if: ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' }} working-directory: /tmp/digests env: IMAGES: ${{needs.define-variables.outputs.images}} @@ -322,7 +286,6 @@ jobs: done - name: Inspect image - if: ${{ env.BUILTIN_REGISTRY_ENABLED == 'true' }} env: IMAGES: ${{needs.define-variables.outputs.images}} shell: bash diff --git a/.forgejo/workflows/renovate.yml b/.forgejo/workflows/renovate.yml deleted file mode 100644 index 6c898657..00000000 --- a/.forgejo/workflows/renovate.yml +++ /dev/null @@ -1,111 +0,0 @@ -name: Maintenance / Renovate - -on: - schedule: - # Run at 5am UTC daily to avoid late-night dev - - cron: '0 5 * * *' - - workflow_dispatch: - inputs: - dryRun: - description: 'Dry run mode' - required: false - default: null - type: choice - options: - - null - - 'extract' - - 'lookup' - - 'full' - logLevel: - description: 'Log level' - required: false - default: 'info' - type: choice - options: - - 'info' - - 'warning' - - 'critical' - - push: - branches: - - main - paths: - # Re-run when config changes - - '.forgejo/workflows/renovate.yml' - - 'renovate.json' - -jobs: - renovate: - name: Renovate - runs-on: ubuntu-latest - container: - image: ghcr.io/renovatebot/renovate:41 - options: --tmpfs /tmp:exec - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - show-progress: false - - - name: print node heap - run: /usr/local/renovate/node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)' - - - name: Restore renovate repo cache - uses: https://github.com/actions/cache@v4 - with: - path: | - /tmp/renovate/cache/renovate/repository - key: repo-cache-${{ github.run_id }} - restore-keys: | - repo-cache- - - - name: Restore renovate package cache - uses: https://github.com/actions/cache@v4 - with: - path: | - /tmp/renovate/cache/renovate/renovate-cache-sqlite - key: package-cache-${{ github.run_id }} - restore-keys: | - package-cache- - - - name: Self-hosted Renovate - uses: https://github.com/renovatebot/github-action@v43.0.11 - env: - LOG_LEVEL: ${{ inputs.logLevel || 'info' }} - RENOVATE_DRY_RUN: ${{ inputs.dryRun || 'false' }} - - RENOVATE_PLATFORM: forgejo - RENOVATE_ENDPOINT: ${{ github.server_url }} - RENOVATE_AUTODISCOVER: 'false' - RENOVATE_REPOSITORIES: '["${{ github.repository }}"]' - - RENOVATE_GIT_TIMEOUT: 60000 - - RENOVATE_REQUIRE_CONFIG: 'required' - RENOVATE_ONBOARDING: 'false' - - RENOVATE_PR_COMMITS_PER_RUN_LIMIT: 3 - - RENOVATE_GITHUB_TOKEN_WARN: 'false' - RENOVATE_TOKEN: ${{ secrets.RENOVATE_TOKEN }} - GITHUB_COM_TOKEN: ${{ secrets.GH_PUBLIC_RO }} - - RENOVATE_REPOSITORY_CACHE: 'enabled' - RENOVATE_X_SQLITE_PACKAGE_CACHE: true - - - name: Save renovate repo cache - if: always() && env.RENOVATE_DRY_RUN != 'full' - uses: https://github.com/actions/cache@v4 - with: - path: | - /tmp/renovate/cache/renovate/repository - key: repo-cache-${{ github.run_id }} - - - name: Save renovate package cache - if: always() && env.RENOVATE_DRY_RUN != 'full' - uses: https://github.com/actions/cache@v4 - with: - path: | - /tmp/renovate/cache/renovate/renovate-cache-sqlite - key: package-cache-${{ github.run_id }} diff --git a/.forgejo/workflows/rust-checks.yml b/.forgejo/workflows/rust-checks.yml new file mode 100644 index 00000000..c46363a0 --- /dev/null +++ b/.forgejo/workflows/rust-checks.yml @@ -0,0 +1,144 @@ +name: Checks / Rust + +on: + push: + +jobs: + format: + name: Format + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Install rust + uses: ./.forgejo/actions/rust-toolchain + with: + toolchain: "nightly" + components: "rustfmt" + + - name: Check formatting + run: | + cargo +nightly fmt --all -- --check + + clippy: + name: Clippy + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Install rust + uses: ./.forgejo/actions/rust-toolchain + + - uses: https://github.com/actions/create-github-app-token@v2 + id: app-token + with: + app-id: ${{ vars.GH_APP_ID }} + private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} + github-api-url: https://api.github.com + owner: ${{ vars.GH_APP_OWNER }} + repositories: "" + - name: Install sccache + uses: ./.forgejo/actions/sccache + with: + token: ${{ steps.app-token.outputs.token }} + - run: sudo apt-get update + - name: Install system dependencies + uses: https://github.com/awalsh128/cache-apt-pkgs-action@v1 + with: + packages: clang liburing-dev + version: 1 + - name: Cache Rust registry + uses: actions/cache@v3 + with: + path: | + ~/.cargo/git + !~/.cargo/git/checkouts + ~/.cargo/registry + !~/.cargo/registry/src + key: rust-registry-${{hashFiles('**/Cargo.lock') }} + - name: Timelord + uses: ./.forgejo/actions/timelord + with: + key: sccache-v0 + path: . + - name: Clippy + run: | + cargo clippy \ + --workspace \ + --features full \ + --locked \ + --no-deps \ + --profile test \ + -- \ + -D warnings + + - name: Show sccache stats + if: always() + run: sccache --show-stats + + cargo-test: + name: Cargo Test + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + + - name: Install rust + uses: ./.forgejo/actions/rust-toolchain + + - uses: https://github.com/actions/create-github-app-token@v2 + id: app-token + with: + app-id: ${{ vars.GH_APP_ID }} + private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} + github-api-url: https://api.github.com + owner: ${{ vars.GH_APP_OWNER }} + repositories: "" + - name: Install sccache + uses: ./.forgejo/actions/sccache + with: + token: ${{ steps.app-token.outputs.token }} + - run: sudo apt-get update + - name: Install system dependencies + uses: https://github.com/awalsh128/cache-apt-pkgs-action@v1 + with: + packages: clang liburing-dev + version: 1 + - name: Cache Rust registry + uses: actions/cache@v3 + with: + path: | + ~/.cargo/git + !~/.cargo/git/checkouts + ~/.cargo/registry + !~/.cargo/registry/src + key: rust-registry-${{hashFiles('**/Cargo.lock') }} + - name: Timelord + uses: ./.forgejo/actions/timelord + with: + key: sccache-v0 + path: . + - name: Cargo Test + run: | + cargo test \ + --workspace \ + --features full \ + --locked \ + --profile test \ + --all-targets \ + --no-fail-fast + + - name: Show sccache stats + if: always() + run: sccache --show-stats diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 841427b7..fcfaade5 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,4 +1,5 @@ -github: [JadedBlueEyes, nexy7574] +github: [JadedBlueEyes] +# Doesn't support an array, so we can only list nex +ko_fi: nexy7574 custom: - - https://ko-fi.com/nexy7574 - https://ko-fi.com/JadedBlueEyes diff --git a/.mailmap b/.mailmap index 7c25737d..fa267e13 100644 --- a/.mailmap +++ b/.mailmap @@ -13,4 +13,3 @@ Rudi Floren Tamara Schmitz <15906939+tamara-schmitz@users.noreply.github.com> Timo KΓΆsters x4u <14617923-x4u@users.noreply.gitlab.com> -Ginger <75683114+gingershaped@users.noreply.github.com> diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index da594310..68e3a982 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -9,7 +9,7 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 hooks: - - id: fix-byte-order-marker + - id: check-byte-order-marker - id: check-case-conflict - id: check-symlinks - id: destroyed-symlinks diff --git a/.vscode/settings.json b/.vscode/settings.json index 82162ff7..a4fad964 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,6 +7,5 @@ "continuwuity", "homeserver", "homeservers" - ], - "rust-analyzer.cargo.features": ["full"] + ] } diff --git a/Cargo.lock b/Cargo.lock index 9e56ad45..5d7192b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -52,9 +52,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.20" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae563653d1938f79b1ab1b5e668c87c76a9930414574a6583a7b7e11a8e6192" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", @@ -82,35 +82,35 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.4" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.10" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" [[package]] name = "arbitrary" -version = "1.4.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" [[package]] name = "arc-swap" @@ -126,7 +126,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -183,7 +183,7 @@ dependencies = [ "rustc-hash 2.1.1", "serde", "serde_derive", - "syn 2.0.106", + "syn", ] [[package]] @@ -198,45 +198,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "asn1-rs" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" -dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror 1.0.69", - "time", -] - -[[package]] -name = "asn1-rs-derive" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure 0.12.6", -] - -[[package]] -name = "asn1-rs-impl" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "assign" version = "1.1.1" @@ -256,13 +217,11 @@ dependencies = [ [[package]] name = "async-compression" -version = "0.4.29" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bee399cc3a623ec5a2db2c5b90ee0190a2260241fbe0c023ac8f7bab426aaf8" +checksum = "ddb939d66e4ae03cee6091612804ba446b12878410cfa17f785f4dd67d4014e8" dependencies = [ "brotli", - "compression-codecs", - "compression-core", "flate2", "futures-core", "memchr", @@ -291,18 +250,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "async-trait" -version = "0.1.89" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -342,9 +301,9 @@ dependencies = [ [[package]] name = "avif-serialize" -version = "0.8.6" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47c8fbc0f831f4519fe8b810b6a7a91410ec83031b8233f730a0480029f6a23f" +checksum = "2ea8ef51aced2b9191c08197f55450d830876d9933f8f48a429b354f1d496b42" dependencies = [ "arrayvec", ] @@ -474,11 +433,11 @@ dependencies = [ "hyper", "hyper-util", "pin-project-lite", - "rustls 0.23.31", - "rustls-pemfile 2.2.0", + "rustls", + "rustls-pemfile", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls", "tower-service", ] @@ -493,9 +452,9 @@ dependencies = [ "http", "http-body-util", "pin-project", - "rustls 0.23.31", + "rustls", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls", "tokio-util", "tower-layer", "tower-service", @@ -549,7 +508,7 @@ version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.1", "cexpr", "clang-sys", "itertools 0.12.1", @@ -562,7 +521,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.106", + "syn", "which", ] @@ -572,7 +531,7 @@ version = "0.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f72209734318d0b619a5e0f5129918b848c416e122a3c4ce054e03cb87b726f" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.1", "cexpr", "clang-sys", "itertools 0.13.0", @@ -581,14 +540,14 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.106", + "syn", ] [[package]] name = "bit_field" -version = "0.10.3" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" [[package]] name = "bitflags" @@ -598,9 +557,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.3" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "bitstream-io" @@ -637,9 +596,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.2" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -676,9 +635,9 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.23.2" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" [[package]] name = "byteorder" @@ -716,19 +675,19 @@ dependencies = [ [[package]] name = "cargo_toml" -version = "0.22.3" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +checksum = "5fbd1fe9db3ebf71b89060adaf7b0504c2d6a425cf061313099547e382c2e472" dependencies = [ "serde", - "toml 0.9.5", + "toml", ] [[package]] name = "cc" -version = "1.2.34" +version = "1.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" +checksum = "deec109607ca693028562ed836a5f1c4b8bd77755c4e132fc5ce11b0b6211ae7" dependencies = [ "jobserver", "libc", @@ -756,9 +715,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "cfg_aliases" @@ -797,9 +756,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.46" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57" +checksum = "be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9" dependencies = [ "clap_builder", "clap_derive", @@ -816,9 +775,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.46" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41" +checksum = "707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d" dependencies = [ "anstream", "anstyle", @@ -828,14 +787,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.45" +version = "4.5.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" +checksum = "ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -846,9 +805,9 @@ checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "clap_mangen" -version = "0.2.29" +version = "0.2.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b4c3c54b30f0d9adcb47f25f61fcce35c4dd8916638c6b82fbd5f4fb4179e2" +checksum = "e2fb6d3f935bbb9819391528b0e7cf655e78a0bc7a7c3d227211a1d24fc11db1" dependencies = [ "clap", "roff", @@ -875,28 +834,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" -[[package]] -name = "compression-codecs" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7eea68f0e02c2b0aa8856e9a9478444206d4b6828728e7b0697c0f8cca265cb" -dependencies = [ - "brotli", - "compression-core", - "flate2", - "futures-core", - "memchr", - "pin-project-lite", - "zstd", - "zstd-safe", -] - -[[package]] -name = "compression-core" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" - [[package]] name = "concurrent-queue" version = "2.5.0" @@ -919,12 +856,10 @@ dependencies = [ "conduwuit_service", "console-subscriber", "const-str", - "ctor", "hardened_malloc-rs", "log", "opentelemetry", - "opentelemetry-jaeger-propagator", - "opentelemetry-otlp", + "opentelemetry-jaeger", "opentelemetry_sdk", "sentry", "sentry-tower", @@ -949,7 +884,6 @@ dependencies = [ "conduwuit_macros", "conduwuit_service", "const-str", - "ctor", "futures", "log", "ruma", @@ -973,7 +907,6 @@ dependencies = [ "conduwuit_core", "conduwuit_service", "const-str", - "ctor", "futures", "hmac", "http", @@ -1039,7 +972,7 @@ dependencies = [ "rand 0.8.5", "regex", "reqwest", - "ring 0.17.14", + "ring", "ruma", "sanitize-filename", "serde", @@ -1048,13 +981,13 @@ dependencies = [ "serde_yaml", "smallstr", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.12", "tikv-jemalloc-ctl", "tikv-jemalloc-sys", "tikv-jemallocator", "tokio", "tokio-metrics", - "toml 0.9.5", + "toml", "tracing", "tracing-core", "tracing-subscriber", @@ -1068,7 +1001,6 @@ dependencies = [ "async-channel", "conduwuit_core", "const-str", - "ctor", "futures", "log", "minicbor", @@ -1087,7 +1019,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1105,7 +1037,6 @@ dependencies = [ "conduwuit_service", "conduwuit_web", "const-str", - "ctor", "futures", "http", "http-body-util", @@ -1113,7 +1044,7 @@ dependencies = [ "hyper-util", "log", "ruma", - "rustls 0.23.31", + "rustls", "sd-notify", "sentry", "sentry-tower", @@ -1136,7 +1067,6 @@ dependencies = [ "conduwuit_core", "conduwuit_database", "const-str", - "ctor", "either", "futures", "hickory-resolver 0.25.2", @@ -1144,7 +1074,6 @@ dependencies = [ "image", "ipaddress", "itertools 0.14.0", - "ldap3", "log", "loole", "lru-cache", @@ -1175,7 +1104,7 @@ dependencies = [ "conduwuit_service", "futures", "rand 0.8.5", - "thiserror 2.0.16", + "thiserror 2.0.12", "tracing", ] @@ -1188,7 +1117,7 @@ dependencies = [ "futures-core", "prost", "prost-types", - "tonic 0.12.3", + "tonic", "tracing-core", ] @@ -1212,7 +1141,7 @@ dependencies = [ "thread_local", "tokio", "tokio-stream", - "tonic 0.12.3", + "tonic", "tracing", "tracing-core", "tracing-subscriber", @@ -1226,18 +1155,15 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const-str" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451d0640545a0553814b4c646eb549343561618838e9b42495f466131fe3ad49" +checksum = "041fbfcf8e7054df725fb9985297e92422cdc80fcf313665f5ca3d761bb63f4c" [[package]] name = "const_panic" -version = "0.2.14" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb8a602185c3c95b52f86dc78e55a6df9a287a7a93ddbcf012509930880cf879" -dependencies = [ - "typewit", -] +checksum = "b98d1483e98c9d67f341ab4b3915cfdc54740bd6f5cccc9226ee0535d86aa8fb" [[package]] name = "convert_case" @@ -1257,16 +1183,6 @@ dependencies = [ "crossterm", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation" version = "0.10.1" @@ -1319,9 +1235,9 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "crokey" -version = "1.3.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51360853ebbeb3df20c76c82aecf43d387a62860f1a59ba65ab51f00eea85aad" +checksum = "5282b45c96c5978c8723ea83385cb9a488b64b7d175733f48d07bf9da514a863" dependencies = [ "crokey-proc_macros", "crossterm", @@ -1332,15 +1248,15 @@ dependencies = [ [[package]] name = "crokey-proc_macros" -version = "1.3.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bf1a727caeb5ee5e0a0826a97f205a9cf84ee964b0b48239fef5214a00ae439" +checksum = "2ea0218d3fedf0797fa55676f1964ef5d27103d41ed0281b4bbd2a6e6c3d8d28" dependencies = [ "crossterm", "proc-macro2", "quote", "strict", - "syn 2.0.106", + "syn", ] [[package]] @@ -1405,7 +1321,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.1", "crossterm_winapi", "derive_more", "document-features", @@ -1445,20 +1361,14 @@ dependencies = [ [[package]] name = "ctor" -version = "0.5.0" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67773048316103656a637612c4a62477603b777d91d9c62ff2290f9cde178fdb" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ - "ctor-proc-macro", - "dtor", + "quote", + "syn", ] -[[package]] -name = "ctor-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" - [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -1483,7 +1393,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1524,20 +1434,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "der-parser" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", -] - [[package]] name = "deranged" version = "0.4.0" @@ -1565,7 +1461,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1587,7 +1483,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1599,21 +1495,6 @@ dependencies = [ "litrs", ] -[[package]] -name = "dtor" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58a0764cddb55ab28955347b45be00ade43d4d6f3ba4bf3dc354e4ec9432934" -dependencies = [ - "dtor-proc-macro", -] - -[[package]] -name = "dtor-proc-macro" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f678cf4a922c215c63e0de95eb1ff08a958a81d47e485cf9da1e27bf6305cfa5" - [[package]] name = "dunce" version = "1.0.5" @@ -1663,7 +1544,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1683,7 +1564,7 @@ checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1761,7 +1642,7 @@ dependencies = [ "atomic", "pear", "serde", - "toml 0.8.23", + "toml", "uncased", "version_check", ] @@ -1802,9 +1683,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] @@ -1853,7 +1734,6 @@ checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", - "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -1901,7 +1781,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -1936,9 +1816,9 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.7" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2" +checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" dependencies = [ "cc", "cfg-if", @@ -1981,7 +1861,7 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.3+wasi-0.2.4", + "wasi 0.14.2+wasi-0.2.4", "wasm-bindgen", ] @@ -2003,15 +1883,15 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] name = "h2" -version = "0.4.12" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" dependencies = [ "atomic-waker", "bytes", @@ -2019,7 +1899,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.11.0", + "indexmap 2.10.0", "slab", "tokio", "tokio-util", @@ -2050,9 +1930,9 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.5" +version = "0.15.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" [[package]] name = "hdrhistogram" @@ -2150,9 +2030,9 @@ dependencies = [ "ipnet", "once_cell", "rand 0.9.2", - "ring 0.17.14", + "ring", "serde", - "thiserror 2.0.16", + "thiserror 2.0.12", "tinyvec", "tokio", "tracing", @@ -2197,7 +2077,7 @@ dependencies = [ "resolv-conf", "serde", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.12", "tokio", "tracing", ] @@ -2242,7 +2122,7 @@ dependencies = [ "markup5ever", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -2308,14 +2188,13 @@ checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" [[package]] name = "hyper" -version = "1.7.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" dependencies = [ - "atomic-waker", "bytes", "futures-channel", - "futures-core", + "futures-util", "h2", "http", "http-body", @@ -2323,7 +2202,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -2338,11 +2216,11 @@ dependencies = [ "http", "hyper", "hyper-util", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", + "rustls", + "rustls-native-certs", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls", "tower-service", "webpki-roots 1.0.2", ] @@ -2373,7 +2251,7 @@ dependencies = [ "hyper", "libc", "pin-project-lite", - "socket2 0.5.10", + "socket2", "tokio", "tower-service", "tracing", @@ -2467,9 +2345,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.1.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ "idna_adapter", "smallvec", @@ -2511,9 +2389,9 @@ dependencies = [ [[package]] name = "image-webp" -version = "0.2.4" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b" dependencies = [ "byteorder-lite", "quick-error", @@ -2537,12 +2415,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", - "hashbrown 0.15.5", + "hashbrown 0.15.4", "serde", ] @@ -2552,6 +2430,12 @@ version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + [[package]] name = "interpolate_name" version = "0.2.4" @@ -2560,16 +2444,16 @@ checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "io-uring" -version = "0.7.10" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.1", "cfg-if", "libc", ] @@ -2594,7 +2478,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.10", + "socket2", "widestring", "windows-sys 0.48.0", "winreg", @@ -2647,9 +2531,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.34" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" dependencies = [ "getrandom 0.3.3", "libc", @@ -2729,7 +2613,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.106", + "syn", ] [[package]] @@ -2744,43 +2628,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" -[[package]] -name = "lber" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2df7f9fd9f64cf8f59e1a4a0753fe7d575a5b38d3d7ac5758dcee9357d83ef0a" -dependencies = [ - "bytes", - "nom", -] - -[[package]] -name = "ldap3" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "166199a8207874a275144c8a94ff6eed5fcbf5c52303e4d9b4d53a0c7ac76554" -dependencies = [ - "async-trait", - "bytes", - "futures", - "futures-util", - "lazy_static", - "lber", - "log", - "nom", - "percent-encoding", - "ring 0.16.20", - "rustls 0.21.12", - "rustls-native-certs 0.6.3", - "thiserror 1.0.69", - "tokio", - "tokio-rustls 0.24.1", - "tokio-stream", - "tokio-util", - "url", - "x509-parser", -] - [[package]] name = "lebe" version = "0.5.2" @@ -2789,9 +2636,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.175" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libfuzzer-sys" @@ -2810,7 +2657,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.3", + "windows-targets 0.53.2", ] [[package]] @@ -2850,9 +2697,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "litrs" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" [[package]] name = "lock_api" @@ -3004,29 +2851,29 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minicbor" -version = "2.1.1" +version = "0.26.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f182275033b808ede9427884caa8e05fa7db930801759524ca7925bd8aa7a82" +checksum = "8a309f581ade7597820083bc275075c4c6986e57e53f8d26f88507cfefc8c987" dependencies = [ "minicbor-derive", ] [[package]] name = "minicbor-derive" -version = "0.18.2" +version = "0.16.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17290c95158a760027059fe3f511970d6857e47ff5008f9e09bffe3d3e1c6af" +checksum = "a9882ef5c56df184b8ffc107fc6c61e33ee3a654b021961d790a78571bb9d67a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "minicbor-serde" -version = "0.6.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bbf243b8cc68a7a76473b14328d3546fb002ae3d069227794520e9181003de9" +checksum = "54e45e8beeefea1b8b6f52fa188a5b6ea3746c2885606af8d4d8bf31cee633fb" dependencies = [ "minicbor", "serde", @@ -3096,11 +2943,11 @@ checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" [[package]] name = "nix" -version = "0.30.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", @@ -3185,7 +3032,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -3247,15 +3094,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "oid-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" -dependencies = [ - "asn1-rs", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -3280,87 +3118,85 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "opentelemetry" -version = "0.30.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf416e4cb72756655126f7dd7bb0af49c674f4c1b9903e80c009e0c37e552e6" +checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a" dependencies = [ "futures-core", "futures-sink", + "indexmap 2.10.0", "js-sys", + "once_cell", "pin-project-lite", - "thiserror 2.0.16", - "tracing", + "thiserror 1.0.69", + "urlencoding", ] [[package]] -name = "opentelemetry-http" -version = "0.30.0" +name = "opentelemetry-jaeger" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f6639e842a97dbea8886e3439710ae463120091e2e064518ba8e716e6ac36d" +checksum = "e617c66fd588e40e0dbbd66932fdc87393095b125d4459b1a3a10feb1712f8a1" dependencies = [ "async-trait", - "bytes", - "http", + "futures-core", + "futures-util", "opentelemetry", - "reqwest", -] - -[[package]] -name = "opentelemetry-jaeger-propagator" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090b8ec07bb2e304b529581aa1fe530d7861298c9ef549ebbf44a4a56472c539" -dependencies = [ - "opentelemetry", -] - -[[package]] -name = "opentelemetry-otlp" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbee664a43e07615731afc539ca60c6d9f1a9425e25ca09c57bc36c87c55852b" -dependencies = [ - "http", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-proto", + "opentelemetry-semantic-conventions", "opentelemetry_sdk", - "prost", - "reqwest", - "thiserror 2.0.16", - "tracing", + "thrift", + "tokio", ] [[package]] -name = "opentelemetry-proto" -version = "0.30.0" +name = "opentelemetry-semantic-conventions" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e046fd7660710fe5a05e8748e70d9058dc15c94ba914e7c4faa7c728f0e8ddc" +checksum = "f5774f1ef1f982ef2a447f6ee04ec383981a3ab99c8e77a1a7b30182e65bbc84" dependencies = [ "opentelemetry", - "opentelemetry_sdk", - "prost", - "tonic 0.13.1", ] [[package]] name = "opentelemetry_sdk" -version = "0.30.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f644aa9e5e31d11896e024305d7e3c98a88884d9f8919dbf37a9991bc47a4b" +checksum = "2f16aec8a98a457a52664d69e0091bac3a0abd18ead9b641cb00202ba4e0efe4" dependencies = [ + "async-trait", + "crossbeam-channel", "futures-channel", "futures-executor", "futures-util", + "glob", + "once_cell", "opentelemetry", + "ordered-float 4.6.0", "percent-encoding", - "rand 0.9.2", - "serde_json", - "thiserror 2.0.16", + "rand 0.8.5", + "thiserror 1.0.69", "tokio", "tokio-stream", ] +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + [[package]] name = "os_info" version = "3.12.0" @@ -3448,14 +3284,14 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "percent-encoding" -version = "2.3.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "petgraph" @@ -3464,7 +3300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.11.0", + "indexmap 2.10.0", ] [[package]] @@ -3522,7 +3358,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -3560,7 +3396,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3af6b589e163c5a788fab00ce0c0366f6efbb9959c2f9874b224936af7fce7e1" dependencies = [ "base64 0.22.1", - "indexmap 2.11.0", + "indexmap 2.10.0", "quick-xml", "serde", "time", @@ -3587,9 +3423,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "potential_utf" -version = "0.1.3" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" dependencies = [ "zerovec", ] @@ -3617,12 +3453,12 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "prettyplease" -version = "0.2.37" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" dependencies = [ "proc-macro2", - "syn 2.0.106", + "syn", ] [[package]] @@ -3636,9 +3472,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] @@ -3651,7 +3487,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "version_check", "yansi", ] @@ -3672,7 +3508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -3695,7 +3531,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -3713,7 +3549,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.1", "memchr", "pulldown-cmark-escape", "unicase", @@ -3742,18 +3578,18 @@ checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quick-xml" -version = "0.38.3" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" +checksum = "8927b0664f5c5a98265138b7e3f90aa19a6b21353182469ace36d4ac527b7b1b" dependencies = [ "memchr", ] [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" dependencies = [ "bytes", "cfg_aliases", @@ -3761,47 +3597,47 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.1.1", - "rustls 0.23.31", - "socket2 0.6.0", - "thiserror 2.0.16", + "rustls", + "socket2", + "thiserror 2.0.12", "tokio", "tracing", - "web-time", + "web-time 1.1.0", ] [[package]] name = "quinn-proto" -version = "0.11.13" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", "rand 0.9.2", - "ring 0.17.14", + "ring", "rustc-hash 2.1.1", - "rustls 0.23.31", + "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.16", + "thiserror 2.0.12", "tinyvec", "tracing", - "web-time", + "web-time 1.1.0", ] [[package]] name = "quinn-udp" -version = "0.5.14" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.6.0", + "socket2", "tracing", - "windows-sys 0.60.2", + "windows-sys 0.59.0", ] [[package]] @@ -3930,9 +3766,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.11.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -3940,9 +3776,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.13.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -3950,9 +3786,9 @@ dependencies = [ [[package]] name = "recaptcha-verify" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d694033c2b0abdbb8893edfb367f16270e790be4a67e618206d811dbe4efee4" +checksum = "71e3be7b2e46e24637ac96b0c9f70070f188652018573f36f4e511dcad09738a" dependencies = [ "reqwest", "serde", @@ -3961,23 +3797,23 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "7e8af0dde094006011e6a740d4879319439489813bd0bcdc7d821beaeeff48ec" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.1", ] [[package]] name = "regex" -version = "1.11.2" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.10", - "regex-syntax 0.8.6", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -3991,13 +3827,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.10" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.6", + "regex-syntax 0.8.5", ] [[package]] @@ -4008,9 +3844,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -4040,16 +3876,16 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.31", - "rustls-native-certs 0.8.1", - "rustls-pemfile 2.2.0", + "rustls", + "rustls-native-certs", + "rustls-pemfile", "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls", "tokio-socks", "tokio-util", "tower 0.5.2", @@ -4073,21 +3909,6 @@ version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - [[package]] name = "ring" version = "0.17.14" @@ -4098,7 +3919,7 @@ dependencies = [ "cfg-if", "getrandom 0.2.16", "libc", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.52.0", ] @@ -4111,7 +3932,7 @@ checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" [[package]] name = "ruma" version = "0.10.1" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "assign", "js_int", @@ -4125,13 +3946,13 @@ dependencies = [ "ruma-identity-service-api", "ruma-push-gateway-api", "ruma-signatures", - "web-time", + "web-time 1.1.0", ] [[package]] name = "ruma-appservice-api" version = "0.10.0" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "js_int", "ruma-common", @@ -4143,7 +3964,7 @@ dependencies = [ [[package]] name = "ruma-client-api" version = "0.18.0" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "as_variant", "assign", @@ -4158,15 +3979,15 @@ dependencies = [ "serde", "serde_html_form", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.12", "url", - "web-time", + "web-time 1.1.0", ] [[package]] name = "ruma-common" version = "0.13.0" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "as_variant", "base64 0.22.1", @@ -4174,7 +3995,7 @@ dependencies = [ "form_urlencoded", "getrandom 0.2.16", "http", - "indexmap 2.11.0", + "indexmap 2.10.0", "js_int", "konst", "percent-encoding", @@ -4186,22 +4007,22 @@ dependencies = [ "serde_html_form", "serde_json", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.12", "time", "tracing", "url", "uuid", - "web-time", + "web-time 1.1.0", "wildmatch", ] [[package]] name = "ruma-events" version = "0.28.1" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "as_variant", - "indexmap 2.11.0", + "indexmap 2.10.0", "js_int", "js_option", "percent-encoding", @@ -4213,17 +4034,17 @@ dependencies = [ "serde", "serde_json", "smallvec", - "thiserror 2.0.16", + "thiserror 2.0.12", "tracing", "url", - "web-time", + "web-time 1.1.0", "wildmatch", ] [[package]] name = "ruma-federation-api" version = "0.9.0" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "bytes", "headers", @@ -4238,23 +4059,23 @@ dependencies = [ "ruma-events", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 2.0.12", "tracing", ] [[package]] name = "ruma-identifiers-validation" version = "0.9.5" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "js_int", - "thiserror 2.0.16", + "thiserror 2.0.12", ] [[package]] name = "ruma-identity-service-api" version = "0.9.0" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "js_int", "ruma-common", @@ -4264,7 +4085,7 @@ dependencies = [ [[package]] name = "ruma-macros" version = "0.13.0" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "cfg-if", "proc-macro-crate", @@ -4272,14 +4093,14 @@ dependencies = [ "quote", "ruma-identifiers-validation", "serde", - "syn 2.0.106", - "toml 0.8.23", + "syn", + "toml", ] [[package]] name = "ruma-push-gateway-api" version = "0.9.0" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "js_int", "ruma-common", @@ -4291,7 +4112,7 @@ dependencies = [ [[package]] name = "ruma-signatures" version = "0.15.0" -source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd#8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b753738047d1f443aca870896ef27ecaacf027da#b753738047d1f443aca870896ef27ecaacf027da" dependencies = [ "base64 0.22.1", "ed25519-dalek", @@ -4301,7 +4122,7 @@ dependencies = [ "serde_json", "sha2", "subslice", - "thiserror 2.0.16", + "thiserror 2.0.12", ] [[package]] @@ -4332,9 +4153,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.26" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rustc-hash" @@ -4357,22 +4178,13 @@ dependencies = [ "semver", ] -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - [[package]] name = "rustix" version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4385,7 +4197,7 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" dependencies = [ - "bitflags 2.9.3", + "bitflags 2.9.1", "errno", "libc", "linux-raw-sys 0.9.4", @@ -4394,44 +4206,20 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.12" +version = "0.23.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" -dependencies = [ - "log", - "ring 0.17.14", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.23.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "2491382039b29b9b11ff08b76ff6c97cf287671dbb74f0be44bda389fffe9bd1" dependencies = [ "aws-lc-rs", "log", "once_cell", - "ring 0.17.14", + "ring", "rustls-pki-types", - "rustls-webpki 0.103.4", + "rustls-webpki", "subtle", "zeroize", ] -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "schannel", - "security-framework 2.11.1", -] - [[package]] name = "rustls-native-certs" version = "0.8.1" @@ -4441,16 +4229,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.3.0", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", + "security-framework", ] [[package]] @@ -4468,20 +4247,10 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" dependencies = [ - "web-time", + "web-time 1.1.0", "zeroize", ] -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - [[package]] name = "rustls-webpki" version = "0.103.4" @@ -4489,16 +4258,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" dependencies = [ "aws-lc-rs", - "ring 0.17.14", + "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] name = "rustversion" -version = "1.0.22" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" [[package]] name = "rustyline-async" @@ -4509,7 +4278,7 @@ dependencies = [ "futures-util", "pin-project", "thingbuf", - "thiserror 2.0.16", + "thiserror 2.0.12", "unicode-segmentation", "unicode-width 0.2.1", ] @@ -4550,16 +4319,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.14", - "untrusted 0.9.0", -] - [[package]] name = "sd-notify" version = "0.4.5" @@ -4571,25 +4330,12 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.11.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" dependencies = [ - "bitflags 2.9.3", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c" -dependencies = [ - "bitflags 2.9.3", - "core-foundation 0.10.1", + "bitflags 2.9.1", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -4613,13 +4359,13 @@ checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "sentry" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989425268ab5c011e06400187eed6c298272f8ef913e49fcadc3fda788b45030" +checksum = "255914a8e53822abd946e2ce8baa41d4cded6b8e938913b7f7b9da5b7ab44335" dependencies = [ "httpdate", "reqwest", - "rustls 0.23.31", + "rustls", "sentry-backtrace", "sentry-contexts", "sentry-core", @@ -4630,24 +4376,26 @@ dependencies = [ "sentry-tracing", "tokio", "ureq", + "webpki-roots 0.26.11", ] [[package]] name = "sentry-backtrace" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e299dd3f7bcf676875eee852c9941e1d08278a743c32ca528e2debf846a653" +checksum = "00293cd332a859961f24fd69258f7e92af736feaeb91020cff84dac4188a4302" dependencies = [ "backtrace", + "once_cell", "regex", "sentry-core", ] [[package]] name = "sentry-contexts" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac0c5d6892cd4c414492fc957477b620026fb3411fca9fa12774831da561c88" +checksum = "961990f9caa76476c481de130ada05614cd7f5aa70fb57c2142f0e09ad3fb2aa" dependencies = [ "hostname", "libc", @@ -4659,32 +4407,33 @@ dependencies = [ [[package]] name = "sentry-core" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deaa38b94e70820ff3f1f9db3c8b0aef053b667be130f618e615e0ff2492cbcc" +checksum = "1a6409d845707d82415c800290a5d63be5e3df3c2e417b0997c60531dfbd35ef" dependencies = [ - "rand 0.9.2", + "once_cell", + "rand 0.8.5", "sentry-types", "serde", "serde_json", - "url", ] [[package]] name = "sentry-debug-images" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00950648aa0d371c7f57057434ad5671bd4c106390df7e7284739330786a01b6" +checksum = "71ab5df4f3b64760508edfe0ba4290feab5acbbda7566a79d72673065888e5cc" dependencies = [ "findshlibs", + "once_cell", "sentry-core", ] [[package]] name = "sentry-log" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670f08baf70058926b0fa60c8f10218524ef0cb1a1634b0388a4123bdec6288c" +checksum = "693841da8dfb693af29105edfbea1d91348a13d23dd0a5d03761eedb9e450c46" dependencies = [ "log", "sentry-core", @@ -4692,9 +4441,9 @@ dependencies = [ [[package]] name = "sentry-panic" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b7a23b13c004873de3ce7db86eb0f59fe4adfc655a31f7bbc17fd10bacc9bfe" +checksum = "609b1a12340495ce17baeec9e08ff8ed423c337c1a84dffae36a178c783623f3" dependencies = [ "sentry-backtrace", "sentry-core", @@ -4702,9 +4451,9 @@ dependencies = [ [[package]] name = "sentry-tower" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a303d0127d95ae928a937dcc0886931d28b4186e7338eea7d5786827b69b002" +checksum = "4b98005537e38ee3bc10e7d36e7febe9b8e573d03f2ddd85fcdf05d21f9abd6d" dependencies = [ "http", "pin-project", @@ -4716,11 +4465,10 @@ dependencies = [ [[package]] name = "sentry-tracing" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac841c7050aa73fc2bec8f7d8e9cb1159af0b3095757b99820823f3e54e5080" +checksum = "49f4e86402d5c50239dc7d8fd3f6d5e048221d5fcb4e026d8d50ab57fe4644cb" dependencies = [ - "bitflags 2.9.3", "sentry-backtrace", "sentry-core", "tracing-core", @@ -4729,16 +4477,16 @@ dependencies = [ [[package]] name = "sentry-types" -version = "0.42.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e477f4d4db08ddb4ab553717a8d3a511bc9e81dde0c808c680feacbb8105c412" +checksum = "3d3f117b8755dbede8260952de2aeb029e20f432e72634e8969af34324591631" dependencies = [ "debugid", "hex", - "rand 0.9.2", + "rand 0.8.5", "serde", "serde_json", - "thiserror 2.0.16", + "thiserror 1.0.69", "time", "url", "uuid", @@ -4761,7 +4509,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -4771,7 +4519,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d2de91cf02bbc07cde38891769ccd5d4f073d22a40683aa4bc7a95781aaa2c4" dependencies = [ "form_urlencoded", - "indexmap 2.11.0", + "indexmap 2.10.0", "itoa", "ryu", "serde", @@ -4779,9 +4527,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.143" +version = "1.0.141" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3" dependencies = [ "itoa", "memchr", @@ -4818,15 +4566,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4845,7 +4584,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.11.0", + "indexmap 2.10.0", "itoa", "ryu", "serde", @@ -4912,9 +4651,9 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.6" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -4951,15 +4690,15 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.11" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" [[package]] name = "smallstr" -version = "0.3.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862077b1e764f04c251fe82a2ef562fd78d7cadaeb072ca7c2bcaf7217b1ff3b" +checksum = "63b1aefdf380735ff8ded0b15f31aab05daf1f70216c01c02a12926badd1df9d" dependencies = [ "serde", "smallvec", @@ -4984,22 +4723,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "socket2" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - [[package]] name = "spki" version = "0.7.3" @@ -5070,20 +4793,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "1.0.109" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -5099,18 +4811,6 @@ dependencies = [ "futures-core", ] -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", -] - [[package]] name = "synstructure" version = "0.13.2" @@ -5119,7 +4819,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -5131,7 +4831,7 @@ dependencies = [ "cfg-expr", "heck", "pkg-config", - "toml 0.8.23", + "toml", "version-compare", ] @@ -5160,9 +4860,9 @@ dependencies = [ [[package]] name = "termimad" -version = "0.34.0" +version = "0.31.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ff5ca043d65d4ea43b65cdb4e3aba119657d0d12caf44f93212ec3168a8e20" +checksum = "7301d9c2c4939c97f25376b70d3c13311f8fefdee44092fc361d2a98adc2cbb6" dependencies = [ "coolor", "crokey", @@ -5170,7 +4870,7 @@ dependencies = [ "lazy-regex", "minimad", "serde", - "thiserror 2.0.16", + "thiserror 2.0.12", "unicode-width 0.1.14", ] @@ -5195,11 +4895,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.16" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" dependencies = [ - "thiserror-impl 2.0.16", + "thiserror-impl 2.0.12", ] [[package]] @@ -5210,18 +4910,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "thiserror-impl" -version = "2.0.16" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -5243,6 +4943,28 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "threadpool" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" +dependencies = [ + "num_cpus", +] + +[[package]] +name = "thrift" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" +dependencies = [ + "byteorder", + "integer-encoding", + "log", + "ordered-float 2.10.1", + "threadpool", +] + [[package]] name = "tiff" version = "0.9.1" @@ -5325,9 +5047,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" dependencies = [ "tinyvec_macros", ] @@ -5340,9 +5062,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.46.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17" dependencies = [ "backtrace", "bytes", @@ -5352,10 +5074,10 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", - "socket2 0.6.0", + "socket2", "tokio-macros", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -5366,14 +5088,14 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] name = "tokio-metrics" -version = "0.4.4" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f960dc1df82e5a0cff5a77e986a10ec7bfabf23ff2377922e012af742878e12" +checksum = "23ff82f660c98e4ff60da5eb8fa864a4130f34b56d92d5cd23d6fdfcc14e95fa" dependencies = [ "futures-util", "pin-project-lite", @@ -5381,23 +5103,13 @@ dependencies = [ "tokio-stream", ] -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" dependencies = [ - "rustls 0.23.31", + "rustls", "tokio", ] @@ -5426,9 +5138,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.16" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" dependencies = [ "bytes", "futures-core", @@ -5444,26 +5156,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", + "serde_spanned", + "toml_datetime", "toml_edit", ] -[[package]] -name = "toml" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" -dependencies = [ - "indexmap 2.11.0", - "serde", - "serde_spanned 1.0.0", - "toml_datetime 0.7.0", - "toml_parser", - "toml_writer", - "winnow", -] - [[package]] name = "toml_datetime" version = "0.6.11" @@ -5473,50 +5170,26 @@ dependencies = [ "serde", ] -[[package]] -name = "toml_datetime" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" -dependencies = [ - "serde", -] - [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.0", + "indexmap 2.10.0", "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", + "serde_spanned", + "toml_datetime", "toml_write", "winnow", ] -[[package]] -name = "toml_parser" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" -dependencies = [ - "winnow", -] - [[package]] name = "toml_write" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" -[[package]] -name = "toml_writer" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" - [[package]] name = "tonic" version = "0.12.3" @@ -5538,7 +5211,7 @@ dependencies = [ "percent-encoding", "pin-project", "prost", - "socket2 0.5.10", + "socket2", "tokio", "tokio-stream", "tower 0.4.13", @@ -5547,27 +5220,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tonic" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e581ba15a835f4d9ea06c55ab1bd4dce26fc53752c69a04aac00703bfb49ba9" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bytes", - "http", - "http-body", - "http-body-util", - "percent-encoding", - "pin-project", - "prost", - "tokio-stream", - "tower-layer", - "tower-service", - "tracing", -] - [[package]] name = "tower" version = "0.4.13" @@ -5610,7 +5262,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "async-compression", - "bitflags 2.9.3", + "bitflags 2.9.1", "bytes", "futures-core", "futures-util", @@ -5655,7 +5307,7 @@ source = "git+https://forgejo.ellis.link/continuwuation/tracing?rev=1e64095a8051 dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -5701,9 +5353,9 @@ dependencies = [ [[package]] name = "tracing-opentelemetry" -version = "0.31.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcf5959f39507d0d04d6413119c04f33b623f4f951ebcbdddddfad2d0623a9c" +checksum = "c67ac25c5407e7b961fafc6f7e9aa5958fd297aada2d20fa2ae1737357e55596" dependencies = [ "js-sys", "once_cell", @@ -5714,7 +5366,7 @@ dependencies = [ "tracing-core", "tracing-log", "tracing-subscriber", - "web-time", + "web-time 0.2.4", ] [[package]] @@ -5748,9 +5400,9 @@ checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "typewit" -version = "1.13.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd91acc53c592cb800c11c83e8e7ee1d48378d05cfa33b5474f5f80c5b236bf" +checksum = "97e72ba082eeb9da9dc68ff5a2bf727ef6ce362556e8d29ec1aed3bd05e7d86a" dependencies = [ "typewit_proc_macros", ] @@ -5809,24 +5461,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - [[package]] name = "unsafe-libyaml" version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -5835,38 +5475,24 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "ureq" -version = "3.1.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00432f493971db5d8e47a65aeb3b02f8226b9b11f1450ff86bb772776ebadd70" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" dependencies = [ "base64 0.22.1", "log", - "percent-encoding", - "rustls 0.23.31", - "rustls-pemfile 2.2.0", + "once_cell", + "rustls", "rustls-pki-types", - "ureq-proto", - "utf-8", - "webpki-roots 1.0.2", -] - -[[package]] -name = "ureq-proto" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbe120bb823a0061680e66e9075942fcdba06d46551548c2c259766b9558bc9a" -dependencies = [ - "base64 0.22.1", - "http", - "httparse", - "log", + "url", + "webpki-roots 0.26.11", ] [[package]] name = "url" -version = "2.5.7" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", "idna", @@ -5874,6 +5500,12 @@ dependencies = [ "serde", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "utf-8" version = "0.7.6" @@ -5894,9 +5526,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.18.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" dependencies = [ "getrandom 0.3.3", "js-sys", @@ -5956,11 +5588,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.3+wasi-0.2.4" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" dependencies = [ - "wit-bindgen", + "wit-bindgen-rt", ] [[package]] @@ -5985,7 +5617,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.106", + "syn", "wasm-bindgen-shared", ] @@ -6020,7 +5652,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -6044,6 +5676,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "web-time" version = "1.1.0" @@ -6190,7 +5832,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6201,7 +5843,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6228,7 +5870,7 @@ checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" dependencies = [ "windows-result", "windows-strings 0.3.1", - "windows-targets 0.53.3", + "windows-targets 0.53.2", ] [[package]] @@ -6291,7 +5933,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.2", ] [[package]] @@ -6327,11 +5969,10 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" dependencies = [ - "windows-link", "windows_aarch64_gnullvm 0.53.0", "windows_aarch64_msvc 0.53.0", "windows_i686_gnu 0.53.0", @@ -6491,9 +6132,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.13" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -6509,10 +6150,13 @@ dependencies = [ ] [[package]] -name = "wit-bindgen" -version = "0.45.0" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] [[package]] name = "writeable" @@ -6520,23 +6164,6 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" -[[package]] -name = "x509-parser" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7069fba5b66b9193bd2c5d3d4ff12b839118f6bcbef5328efafafb5395cf63da" -dependencies = [ - "asn1-rs", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror 1.0.69", - "time", -] - [[package]] name = "xml5ever" version = "0.18.1" @@ -6594,8 +6221,8 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", - "synstructure 0.13.2", + "syn", + "synstructure", ] [[package]] @@ -6615,7 +6242,7 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6635,8 +6262,8 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", - "synstructure 0.13.2", + "syn", + "synstructure", ] [[package]] @@ -6658,9 +6285,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.4" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" dependencies = [ "yoke", "zerofrom", @@ -6675,7 +6302,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn", ] [[package]] @@ -6723,9 +6350,9 @@ dependencies = [ [[package]] name = "zune-jpeg" -version = "0.4.20" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089" +checksum = "2c9e525af0a6a658e031e95f14b7f889976b74a11ba0eca5a5fc9ac8a1c43a6a" dependencies = [ "zune-core", ] diff --git a/Cargo.toml b/Cargo.toml index 12ba6456..c656e183 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,15 +48,15 @@ features = ["ffi", "std", "union"] version = "0.6.2" [workspace.dependencies.ctor] -version = "0.5.0" +version = "0.2.9" [workspace.dependencies.cargo_toml] -version = "0.22" +version = "0.21" default-features = false features = ["features"] [workspace.dependencies.toml] -version = "0.9.5" +version = "0.8.14" default-features = false features = ["parse"] @@ -352,7 +352,7 @@ version = "0.1.2" [workspace.dependencies.ruma] git = "https://forgejo.ellis.link/continuwuation/ruwuma" #branch = "conduwuit-changes" -rev = "8fb268fa2771dfc3a1c8075ef1246e7c9a0a53fd" +rev = "b753738047d1f443aca870896ef27ecaacf027da" features = [ "compat", "rand", @@ -411,28 +411,25 @@ default-features = false # optional opentelemetry, performance measurements, flamegraphs, etc for performance measurements and monitoring [workspace.dependencies.opentelemetry] -version = "0.30.0" +version = "0.21.0" [workspace.dependencies.tracing-flame] version = "0.2.0" [workspace.dependencies.tracing-opentelemetry] -version = "0.31.0" +version = "0.22.0" [workspace.dependencies.opentelemetry_sdk] -version = "0.30.0" +version = "0.21.2" features = ["rt-tokio"] -[workspace.dependencies.opentelemetry-otlp] -version = "0.30.0" -features = ["http", "trace", "logs", "metrics"] - -[workspace.dependencies.opentelemetry-jaeger-propagator] -version = "0.30.0" +[workspace.dependencies.opentelemetry-jaeger] +version = "0.20.0" +features = ["rt-tokio"] # optional sentry metrics for crash/panic reporting [workspace.dependencies.sentry] -version = "0.42.0" +version = "0.37.0" default-features = false features = [ "backtrace", @@ -448,9 +445,9 @@ features = [ ] [workspace.dependencies.sentry-tracing] -version = "0.42.0" +version = "0.37.0" [workspace.dependencies.sentry-tower] -version = "0.42.0" +version = "0.37.0" # jemalloc usage [workspace.dependencies.tikv-jemalloc-sys] @@ -479,7 +476,7 @@ features = ["use_std"] version = "0.4" [workspace.dependencies.nix] -version = "0.30.1" +version = "0.29.0" default-features = false features = ["resource"] @@ -501,7 +498,7 @@ version = "0.4.3" default-features = false [workspace.dependencies.termimad] -version = "0.34.0" +version = "0.31.2" default-features = false [workspace.dependencies.checked_ops] @@ -539,21 +536,16 @@ version = "0.2" version = "0.2" [workspace.dependencies.minicbor] -version = "2.1.1" +version = "0.26.3" features = ["std"] [workspace.dependencies.minicbor-serde] -version = "0.6.0" +version = "0.4.1" features = ["std"] [workspace.dependencies.maplit] version = "1.0.2" -[workspace.dependencies.ldap3] -version = "0.11.5" -default-features = false -features = ["sync", "tls-rustls"] - # # Patches # @@ -767,6 +759,25 @@ incremental = true [profile.dev.package.conduwuit_core] inherits = "dev" +#rustflags = [ +# '--cfg', 'conduwuit_mods', +# '-Ztime-passes', +# '-Zmir-opt-level=0', +# '-Ztls-model=initial-exec', +# '-Cprefer-dynamic=true', +# '-Zstaticlib-prefer-dynamic=true', +# '-Zstaticlib-allow-rdylib-deps=true', +# '-Zpacked-bundled-libs=false', +# '-Zplt=true', +# '-Clink-arg=-Wl,--as-needed', +# '-Clink-arg=-Wl,--allow-shlib-undefined', +# '-Clink-arg=-Wl,-z,lazy', +# '-Clink-arg=-Wl,-z,unique', +# '-Clink-arg=-Wl,-z,nodlopen', +# '-Clink-arg=-Wl,-z,nodelete', +#] +[profile.dev.package.xtask-generate-commands] +inherits = "dev" [profile.dev.package.conduwuit] inherits = "dev" #rustflags = [ @@ -856,7 +867,7 @@ unused-qualifications = "warn" #unused-results = "warn" # TODO ## some sadness -mismatched_lifetime_syntaxes = "allow" # TODO! +elided_named_lifetimes = "allow" # TODO! let_underscore_drop = "allow" missing_docs = "allow" # cfgs cannot be limited to expected cfgs or their de facto non-transitive/opt-in use-case e.g. @@ -995,6 +1006,3 @@ literal_string_with_formatting_args = { level = "allow", priority = 1 } needless_raw_string_hashes = "allow" - -# TODO: Enable this lint & fix all instances -collapsible_if = "allow" diff --git a/README.md b/README.md index a5f77a5b..e63fe80f 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ Continuwuity aims to: ### Can I try it out? -Check out the [documentation](https://continuwuity.org) for installation instructions. +Check out the [documentation](introduction) for installation instructions. There are currently no open registration Continuwuity instances available. diff --git a/arch/conduwuit.service b/arch/conduwuit.service new file mode 100644 index 00000000..f7100179 --- /dev/null +++ b/arch/conduwuit.service @@ -0,0 +1,83 @@ +[Unit] + +Description=Continuwuity - Matrix homeserver +Wants=network-online.target +After=network-online.target +Documentation=https://continuwuity.org/ +RequiresMountsFor=/var/lib/private/conduwuit +Alias=matrix-conduwuit.service + +[Service] +DynamicUser=yes +Type=notify-reload +ReloadSignal=SIGUSR1 + +TTYPath=/dev/tty25 +DeviceAllow=char-tty +StandardInput=tty-force +StandardOutput=tty +StandardError=journal+console + +Environment="CONTINUWUITY_LOG_TO_JOURNALD=true" +Environment="CONTINUWUITY_JOURNALD_IDENTIFIER=%N" + +TTYReset=yes +# uncomment to allow buffer to be cleared every restart +TTYVTDisallocate=no + +TTYColumns=120 +TTYRows=40 + +AmbientCapabilities= +CapabilityBoundingSet= + +DevicePolicy=closed +LockPersonality=yes +MemoryDenyWriteExecute=yes +NoNewPrivileges=yes +#ProcSubset=pid +ProtectClock=yes +ProtectControlGroups=yes +ProtectHome=yes +ProtectHostname=yes +ProtectKernelLogs=yes +ProtectKernelModules=yes +ProtectKernelTunables=yes +ProtectProc=invisible +ProtectSystem=strict +PrivateDevices=yes +PrivateMounts=yes +PrivateTmp=yes +PrivateUsers=yes +PrivateIPC=yes +RemoveIPC=yes +RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX +RestrictNamespaces=yes +RestrictRealtime=yes +RestrictSUIDSGID=yes +SystemCallArchitectures=native +SystemCallFilter=@system-service @resources +SystemCallFilter=~@clock @debug @module @mount @reboot @swap @cpu-emulation @obsolete @timer @chown @setuid @privileged @keyring @ipc +SystemCallErrorNumber=EPERM +StateDirectory=conduwuit + +RuntimeDirectory=conduwuit +RuntimeDirectoryMode=0750 + +Environment=CONTINUWUITY_CONFIG=${CREDENTIALS_DIRECTORY}/config.toml +LoadCredential=config.toml:/etc/conduwuit/conduwuit.toml +BindPaths=/var/lib/private/conduwuit:/var/lib/matrix-conduit +BindPaths=/var/lib/private/conduwuit:/var/lib/private/matrix-conduit + +ExecStart=/usr/bin/conduwuit +Restart=on-failure +RestartSec=5 + +TimeoutStopSec=4m +TimeoutStartSec=4m + +StartLimitInterval=1m +StartLimitBurst=5 + +[Install] +WantedBy=multi-user.target diff --git a/conduwuit-example.toml b/conduwuit-example.toml index 07374aae..541050b1 100644 --- a/conduwuit-example.toml +++ b/conduwuit-example.toml @@ -79,11 +79,9 @@ # This is the only directory where continuwuity will save its data, # including media. Note: this was previously "/var/lib/matrix-conduit". # -# YOU NEED TO EDIT THIS, UNLESS you are running continuwuity as a -# `systemd` service. The service file sets it to `/var/lib/conduwuit` -# using an environment variable and also grants write access. +# YOU NEED TO EDIT THIS. # -# example: "/var/lib/conduwuit" +# example: "/var/lib/continuwuity" # #database_path = @@ -591,19 +589,13 @@ # #default_room_version = 11 -# Enable OpenTelemetry OTLP tracing export. This replaces the deprecated -# Jaeger exporter. Traces will be sent via OTLP to a collector (such as -# Jaeger) that supports the OpenTelemetry Protocol. +# This item is undocumented. Please contribute documentation for it. # -# Configure your OTLP endpoint using the OTEL_EXPORTER_OTLP_ENDPOINT -# environment variable (defaults to http://localhost:4318). -# -#allow_otlp = false +#allow_jaeger = false -# Filter for OTLP tracing spans. This controls which spans are exported -# to the OTLP collector. +# This item is undocumented. Please contribute documentation for it. # -#otlp_filter = "info" +#jaeger_filter = "info" # If the 'perf_measurements' compile-time feature is enabled, enables # collecting folded stack trace profile of tracing spans using @@ -1704,10 +1696,6 @@ # #config_reload_signal = true -# This item is undocumented. Please contribute documentation for it. -# -#ldap = false - [global.tls] # Path to a valid TLS certificate file. @@ -1786,91 +1774,3 @@ # is 33.55MB. Setting it to 0 disables blurhashing. # #blurhash_max_raw_size = 33554432 - -[global.ldap] - -# Whether to enable LDAP login. -# -# example: "true" -# -#enable = false - -# Whether to force LDAP authentication or authorize classical password -# login. -# -# example: "true" -# -#ldap_only = false - -# URI of the LDAP server. -# -# example: "ldap://ldap.example.com:389" -# -#uri = "" - -# Root of the searches. -# -# example: "ou=users,dc=example,dc=org" -# -#base_dn = "" - -# Bind DN if anonymous search is not enabled. -# -# You can use the variable `{username}` that will be replaced by the -# entered username. In such case, the password used to bind will be the -# one provided for the login and not the one given by -# `bind_password_file`. Beware: automatically granting admin rights will -# not work if you use this direct bind instead of a LDAP search. -# -# example: "cn=ldap-reader,dc=example,dc=org" or -# "cn={username},ou=users,dc=example,dc=org" -# -#bind_dn = "" - -# Path to a file on the system that contains the password for the -# `bind_dn`. -# -# The server must be able to access the file, and it must not be empty. -# -#bind_password_file = "" - -# Search filter to limit user searches. -# -# You can use the variable `{username}` that will be replaced by the -# entered username for more complex filters. -# -# example: "(&(objectClass=person)(memberOf=matrix))" -# -#filter = "(objectClass=*)" - -# Attribute to use to uniquely identify the user. -# -# example: "uid" or "cn" -# -#uid_attribute = "uid" - -# Attribute containing the display name of the user. -# -# example: "givenName" or "sn" -# -#name_attribute = "givenName" - -# Root of the searches for admin users. -# -# Defaults to `base_dn` if empty. -# -# example: "ou=admins,dc=example,dc=org" -# -#admin_base_dn = "" - -# The LDAP search filter to find administrative users for continuwuity. -# -# If left blank, administrative state must be configured manually for each -# user. -# -# You can use the variable `{username}` that will be replaced by the -# entered username for more complex filters. -# -# example: "(objectClass=conduwuitAdmin)" or "(uid={username})" -# -#admin_filter = "" diff --git a/pkg/debian/README.md b/debian/README.md similarity index 100% rename from pkg/debian/README.md rename to debian/README.md diff --git a/pkg/conduwuit.service b/debian/conduwuit.service similarity index 85% rename from pkg/conduwuit.service rename to debian/conduwuit.service index db9aca1a..da78f09f 100644 --- a/pkg/conduwuit.service +++ b/debian/conduwuit.service @@ -1,24 +1,25 @@ [Unit] + Description=Continuwuity - Matrix homeserver -Documentation=https://continuwuity.org/ Wants=network-online.target After=network-online.target +Documentation=https://continuwuity.org/ Alias=matrix-conduwuit.service [Service] DynamicUser=yes User=conduwuit Group=conduwuit -Type=notify-reload -ReloadSignal=SIGUSR1 +Type=notify Environment="CONTINUWUITY_CONFIG=/etc/conduwuit/conduwuit.toml" Environment="CONTINUWUITY_LOG_TO_JOURNALD=true" Environment="CONTINUWUITY_JOURNALD_IDENTIFIER=%N" -Environment="CONTINUWUITY_DATABASE_PATH=/var/lib/conduwuit" -ExecStart=/usr/bin/conduwuit +ExecStart=/usr/sbin/conduwuit + +ReadWritePaths=/var/lib/conduwuit /etc/conduwuit AmbientCapabilities= CapabilityBoundingSet= @@ -51,17 +52,16 @@ SystemCallArchitectures=native SystemCallFilter=@system-service @resources SystemCallFilter=~@clock @debug @module @mount @reboot @swap @cpu-emulation @obsolete @timer @chown @setuid @privileged @keyring @ipc SystemCallErrorNumber=EPERM +#StateDirectory=conduwuit -StateDirectory=conduwuit -ConfigurationDirectory=conduwuit RuntimeDirectory=conduwuit RuntimeDirectoryMode=0750 Restart=on-failure RestartSec=5 -TimeoutStopSec=4m -TimeoutStartSec=4m +TimeoutStopSec=2m +TimeoutStartSec=2m StartLimitInterval=1m StartLimitBurst=5 diff --git a/pkg/debian/config b/debian/config similarity index 100% rename from pkg/debian/config rename to debian/config diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 00000000..4eae4573 --- /dev/null +++ b/debian/postinst @@ -0,0 +1,44 @@ +#!/bin/sh +set -e + +# TODO: implement debconf support that is maintainable without duplicating the config +#. /usr/share/debconf/confmodule + +CONDUWUIT_DATABASE_PATH=/var/lib/conduwuit +CONDUWUIT_CONFIG_PATH=/etc/conduwuit + +case "$1" in + configure) + # Create the `conduwuit` user if it does not exist yet. + if ! getent passwd conduwuit > /dev/null ; then + echo 'Adding system user for the conduwuit Matrix homeserver' 1>&2 + adduser --system --group --quiet \ + --home "$CONDUWUIT_DATABASE_PATH" \ + --disabled-login \ + --shell "/usr/sbin/nologin" \ + conduwuit + fi + + # Create the database path if it does not exist yet and fix up ownership + # and permissions for the config. + mkdir -v -p "$CONDUWUIT_DATABASE_PATH" + + # symlink the previous location for compatibility if it does not exist yet. + if ! test -L "/var/lib/matrix-conduit" ; then + ln -s -v "$CONDUWUIT_DATABASE_PATH" "/var/lib/matrix-conduit" + fi + + chown -v conduwuit:conduwuit -R "$CONDUWUIT_DATABASE_PATH" + chown -v conduwuit:conduwuit -R "$CONDUWUIT_CONFIG_PATH" + + chmod -v 740 "$CONDUWUIT_DATABASE_PATH" + + echo '' + echo 'Make sure you edit the example config at /etc/conduwuit/conduwuit.toml before starting!' + echo 'To start the server, run: systemctl start conduwuit.service' + echo '' + + ;; +esac + +#DEBHELPER# diff --git a/pkg/debian/postrm b/debian/postrm similarity index 71% rename from pkg/debian/postrm rename to debian/postrm index d5a9e0ac..3c0b1c09 100644 --- a/pkg/debian/postrm +++ b/debian/postrm @@ -20,18 +20,24 @@ case $1 in if [ -d "$CONDUWUIT_CONFIG_PATH" ]; then if test -L "$CONDUWUIT_CONFIG_PATH"; then - echo "Deleting continuwuity configuration files" + echo "Deleting conduwuit configuration files" rm -v -r "$CONDUWUIT_CONFIG_PATH" fi fi if [ -d "$CONDUWUIT_DATABASE_PATH" ]; then if test -L "$CONDUWUIT_DATABASE_PATH"; then - echo "Deleting continuwuity database directory" + echo "Deleting conduwuit database directory" rm -r "$CONDUWUIT_DATABASE_PATH" fi fi + if [ -d "$CONDUWUIT_DATABASE_PATH_SYMLINK" ]; then + if test -L "$CONDUWUIT_DATABASE_SYMLINK"; then + echo "Removing matrix-conduit symlink" + rm -r "$CONDUWUIT_DATABASE_PATH_SYMLINK" + fi + fi ;; esac diff --git a/docker/Dockerfile b/docker/Dockerfile index 17e1c6a1..55150902 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -199,57 +199,32 @@ RUN --mount=type=cache,target=/usr/local/cargo/registry \ EOF # Extract dynamically linked dependencies -RUN <<'DEPS_EOF' +RUN </dev/null) && [ -n "$lddtree_output" ]; then - echo "$lddtree_output" | awk '{print $(NF-0) " " $1}' | sort -u -k 1,1 | \ - awk '{dest = ($2 ~ /^\//) ? "/out/libs-root" $2 : "/out/libs/" $2; print "install -D " $1 " " dest}' | \ - while read cmd; do eval "$cmd"; done - fi + lddtree "$BINARY" | awk '{print $(NF-0) " " $1}' | sort -u -k 1,1 | awk '{print "install", "-D", $1, (($2 ~ /^\//) ? "/out/libs-root" $2 : "/out/libs/" $2)}' | xargs -I {} sh -c {} done - - # Show what will be copied to runtime - echo "=== Libraries being copied to runtime image:" - find /out/libs* -type f 2>/dev/null | sort || echo "No libraries found" -DEPS_EOF - -FROM ubuntu:latest AS prepper - -# Create layer structure -RUN mkdir -p /layer1/etc/ssl/certs \ - /layer2/usr/lib \ - /layer3/sbin /layer3/sbom - -# Copy SSL certs and root-path libraries to layer1 (ultra-stable) -COPY --from=base /etc/ssl/certs /layer1/etc/ssl/certs -COPY --from=builder /out/libs-root/ /layer1/ - -# Copy application libraries to layer2 (semi-stable) -COPY --from=builder /out/libs/ /layer2/usr/lib/ - -# Copy binaries and SBOM to layer3 (volatile) -COPY --from=builder /out/sbin/ /layer3/sbin/ -COPY --from=builder /out/sbom/ /layer3/sbom/ - -# Fix permissions after copying -RUN chmod -R 755 /layer1 /layer2 /layer3 +EOF FROM scratch WORKDIR / -# Copy ultra-stable layer (SSL certs, system libraries) -COPY --from=prepper /layer1/ / +# Copy root certs for tls into image +# You can also mount the certs from the host +# --volume /etc/ssl/certs:/etc/ssl/certs:ro +COPY --from=base /etc/ssl/certs /etc/ssl/certs -# Copy semi-stable layer (application libraries) -COPY --from=prepper /layer2/ / +# Copy our build +COPY --from=builder /out/sbin/ /sbin/ +# Copy SBOM +COPY --from=builder /out/sbom/ /sbom/ -# Copy volatile layer (binaries, SBOM) -COPY --from=prepper /layer3/ / +# Copy dynamic libraries to root +COPY --from=builder /out/libs-root/ / +COPY --from=builder /out/libs/ /usr/lib/ # Inform linker where to find libraries ENV LD_LIBRARY_PATH=/usr/lib diff --git a/docs/admin_reference.md b/docs/admin_reference.md index 1c9d4fb0..18e039e4 100644 --- a/docs/admin_reference.md +++ b/docs/admin_reference.md @@ -21,7 +21,6 @@ This document contains the help content for the `admin` command-line program. * [`admin users list-joined-rooms`↴](#admin-users-list-joined-rooms) * [`admin users force-join-room`↴](#admin-users-force-join-room) * [`admin users force-leave-room`↴](#admin-users-force-leave-room) -* [`admin users force-leave-remote-room`↴](#admin-users-force-leave-remote-room) * [`admin users force-demote`↴](#admin-users-force-demote) * [`admin users make-user-admin`↴](#admin-users-make-user-admin) * [`admin users put-room-tag`↴](#admin-users-put-room-tag) @@ -296,7 +295,6 @@ You can find the ID using the `list-appservices` command. * `list-joined-rooms` β€” - Lists all the rooms (local and remote) that the specified user is joined in * `force-join-room` β€” - Manually join a local user to a room * `force-leave-room` β€” - Manually leave a local user from a room -* `force-leave-remote-room` β€” - Manually leave a remote room for a local user * `force-demote` β€” - Forces the specified user to drop their power levels to the room default, if their permissions allow and the auth check permits * `make-user-admin` β€” - Grant server-admin privileges to a user * `put-room-tag` β€” - Puts a room tag for the specified user and room ID @@ -451,19 +449,6 @@ Reverses the effects of the `suspend` command, allowing the user to send message -## `admin users force-leave-remote-room` - -- Manually leave a remote room for a local user - -**Usage:** `admin users force-leave-remote-room ` - -###### **Arguments:** - -* `` -* `` - - - ## `admin users force-demote` - Forces the specified user to drop their power levels to the room default, if their permissions allow and the auth check permits diff --git a/docs/configuration/examples.md b/docs/configuration/examples.md index 9613e252..54aa8bd7 100644 --- a/docs/configuration/examples.md +++ b/docs/configuration/examples.md @@ -9,11 +9,24 @@ -## systemd unit file +## Debian systemd unit file
-systemd unit file +Debian systemd unit file ``` -{{#include ../../pkg/conduwuit.service}} +{{#include ../../debian/conduwuit.service}} ``` + +
+ +## Arch Linux systemd unit file + +
+Arch Linux systemd unit file + +``` +{{#include ../../arch/conduwuit.service}} +``` + +
diff --git a/docs/deploying/debian.md b/docs/deploying/debian.md index 369638a4..2e8a544a 100644 --- a/docs/deploying/debian.md +++ b/docs/deploying/debian.md @@ -1 +1 @@ -{{#include ../../pkg/debian/README.md}} +{{#include ../../debian/README.md}} diff --git a/docs/deploying/docker-compose.for-traefik.yml b/docs/deploying/docker-compose.for-traefik.yml index f67e603b..547712b6 100644 --- a/docs/deploying/docker-compose.for-traefik.yml +++ b/docs/deploying/docker-compose.for-traefik.yml @@ -12,15 +12,6 @@ services: #- ./continuwuity.toml:/etc/continuwuity.toml networks: - proxy - labels: - - "traefik.enable=true" - - "traefik.http.routers.continuwuity.rule=(Host(`matrix.example.com`) || (Host(`example.com`) && PathPrefix(`/.well-known/matrix`)))" - - "traefik.http.routers.continuwuity.entrypoints=websecure" # your HTTPS entry point - - "traefik.http.routers.continuwuity.tls=true" - - "traefik.http.routers.continuwuity.service=continuwuity" - - "traefik.http.services.continuwuity.loadbalancer.server.port=6167" - # possibly, depending on your config: - # - "traefik.http.routers.continuwuity.tls.certresolver=letsencrypt" environment: CONTINUWUITY_SERVER_NAME: your.server.name.example # EDIT THIS CONTINUWUITY_DATABASE_PATH: /var/lib/continuwuity diff --git a/docs/deploying/docker-compose.with-traefik.yml b/docs/deploying/docker-compose.with-traefik.yml index 8021e034..49b7c905 100644 --- a/docs/deploying/docker-compose.with-traefik.yml +++ b/docs/deploying/docker-compose.with-traefik.yml @@ -12,14 +12,6 @@ services: #- ./continuwuity.toml:/etc/continuwuity.toml networks: - proxy - labels: - - "traefik.enable=true" - - "traefik.http.routers.continuwuity.rule=(Host(`matrix.example.com`) || (Host(`example.com`) && PathPrefix(`/.well-known/matrix`)))" - - "traefik.http.routers.continuwuity.entrypoints=websecure" - - "traefik.http.routers.continuwuity.tls.certresolver=letsencrypt" - - "traefik.http.services.continuwuity.loadbalancer.server.port=6167" - # Uncomment and adjust the following if you want to use middleware - # - "traefik.http.routers.continuwuity.middlewares=secureHeaders@file" environment: CONTINUWUITY_SERVER_NAME: your.server.name.example # EDIT THIS CONTINUWUITY_TRUSTED_SERVERS: '["matrix.org"]' diff --git a/docs/static/announcements.json b/docs/static/announcements.json index fe27859b..7dd2fb72 100644 --- a/docs/static/announcements.json +++ b/docs/static/announcements.json @@ -6,8 +6,8 @@ "message": "Welcome to Continuwuity! Important announcements about the project will appear here." }, { - "id": 3, - "message": "_taps microphone_ The Continuwuity 0.5.0-rc.7 release is now available, and it's better than ever! **177 commits**, **35 pull requests**, **11 contributors,** and a lot of new stuff!\n\nFor highlights, we've got:\n\n* πŸ•΅οΈ Full Policy Server support to fight spam!\n* πŸš€ Smarter room & space upgrades.\n* 🚫 User suspension tools for better moderation.\n* πŸ€– reCaptcha support for safer open registration.\n* πŸ” Ability to disable read receipts & typing indicators.\n* ⚑ Sweeping performance improvements!\n\nGet the [full changelog and downloads on our Forgejo](https://forgejo.ellis.link/continuwuation/continuwuity/releases/tag/v0.5.0-rc.7) - and make sure you're in the [Announcements room](https://matrix.to/#/!releases:continuwuity.org/$hN9z6L2_dTAlPxFLAoXVfo_g8DyYXu4cpvWsSrWhmB0) to get stuff like this sooner." + "id": 2, + "message": "πŸŽ‰ Continuwuity v0.5.0-rc.6 is now available! This release includes improved knock-restricted room handling, automatic support contact configuration, and a new HTML landing page. Check [the release notes for full details](https://forgejo.ellis.link/continuwuation/continuwuity/releases/tag/v0.5.0-rc.6) and upgrade instructions." } ] } diff --git a/flake.lock b/flake.lock index f1859b57..51a04c6c 100644 --- a/flake.lock +++ b/flake.lock @@ -153,11 +153,11 @@ "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1755585599, - "narHash": "sha256-tl/0cnsqB/Yt7DbaGMel2RLa7QG5elA8lkaOXli6VdY=", + "lastModified": 1751525020, + "narHash": "sha256-oDO6lCYS5Bf4jUITChj9XV7k3TP38DE0Ckz5n5ORCME=", "owner": "nix-community", "repo": "fenix", - "rev": "6ed03ef4c8ec36d193c18e06b9ecddde78fb7e42", + "rev": "a1a5f92f47787e7df9f30e5e5ac13e679215aa1e", "type": "github" }, "original": { @@ -513,6 +513,23 @@ "type": "github" } }, + "rocksdb": { + "flake": false, + "locked": { + "lastModified": 1741308171, + "narHash": "sha256-YdBvdQ75UJg5ffwNjxizpviCVwVDJnBkM8ZtGIduMgY=", + "ref": "v9.11.1", + "rev": "3ce04794bcfbbb0d2e6f81ae35fc4acf688b6986", + "revCount": 13177, + "type": "git", + "url": "https://forgejo.ellis.link/continuwuation/rocksdb" + }, + "original": { + "ref": "v9.11.1", + "type": "git", + "url": "https://forgejo.ellis.link/continuwuation/rocksdb" + } + }, "root": { "inputs": { "attic": "attic", @@ -522,17 +539,18 @@ "flake-compat": "flake-compat_3", "flake-utils": "flake-utils", "nix-filter": "nix-filter", - "nixpkgs": "nixpkgs_5" + "nixpkgs": "nixpkgs_5", + "rocksdb": "rocksdb" } }, "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1755504847, - "narHash": "sha256-VX0B9hwhJypCGqncVVLC+SmeMVd/GAYbJZ0MiiUn2Pk=", + "lastModified": 1751433876, + "narHash": "sha256-IsdwOcvLLDDlkFNwhdD5BZy20okIQL01+UQ7Kxbqh8s=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "a905e3b21b144d77e1b304e49f3264f6f8d4db75", + "rev": "11d45c881389dae90b0da5a94cde52c79d0fc7ef", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index b8ac6029..564cd479 100644 --- a/flake.nix +++ b/flake.nix @@ -16,6 +16,10 @@ flake-utils.url = "github:numtide/flake-utils?ref=main"; nix-filter.url = "github:numtide/nix-filter?ref=main"; nixpkgs.url = "github:NixOS/nixpkgs?ref=nixpkgs-unstable"; + rocksdb = { + url = "git+https://forgejo.ellis.link/continuwuation/rocksdb?ref=v9.11.1"; + flake = false; + }; }; outputs = @@ -27,24 +31,20 @@ inherit system; }; - fnx = inputs.fenix.packages.${system}; # The Rust toolchain to use - toolchain = fnx.combine [ - (fnx.fromToolchainFile { - file = ./rust-toolchain.toml; + toolchain = inputs.fenix.packages.${system}.fromToolchainFile { + file = ./rust-toolchain.toml; - # See also `rust-toolchain.toml` - sha256 = "sha256-+9FmLhAOezBZCOziO0Qct1NOrfpjNsXxc/8I0c7BdKE="; - }) - fnx.complete.rustfmt - ]; + # See also `rust-toolchain.toml` + sha256 = "sha256-KUm16pHj+cRedf8vxs/Hd2YWxpOrWZ7UOrwhILdSJBU="; + }; mkScope = pkgs: pkgs.lib.makeScope pkgs.newScope (self: { inherit pkgs inputs; craneLib = (inputs.crane.mkLib pkgs).overrideToolchain (_: toolchain); - main = self.callPackage ./pkg/nix/pkgs/main { }; + main = self.callPackage ./nix/pkgs/main { }; liburing = pkgs.liburing.overrideAttrs { # Tests weren't building outputs = [ @@ -61,14 +61,8 @@ inherit (self) liburing; }).overrideAttrs (old: { - src = pkgsHost.fetchFromGitea { - domain = "forgejo.ellis.link"; - owner = "continuwuation"; - repo = "rocksdb"; - rev = "10.4.fb"; - sha256 = "sha256-/Hvy1yTH/0D5aa7bc+/uqFugCQq4InTdwlRw88vA5IY="; - }; - version = "v10.4.fb"; + src = inputs.rocksdb; + version = "v9.11.1"; cmakeFlags = pkgs.lib.subtractLists [ # No real reason to have snappy or zlib, no one uses this diff --git a/pkg/nix/pkgs/main/cross-compilation-env.nix b/nix/pkgs/main/cross-compilation-env.nix similarity index 100% rename from pkg/nix/pkgs/main/cross-compilation-env.nix rename to nix/pkgs/main/cross-compilation-env.nix diff --git a/pkg/nix/pkgs/main/default.nix b/nix/pkgs/main/default.nix similarity index 100% rename from pkg/nix/pkgs/main/default.nix rename to nix/pkgs/main/default.nix diff --git a/pkg/debian/postinst b/pkg/debian/postinst deleted file mode 100644 index 4bc89422..00000000 --- a/pkg/debian/postinst +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -set -e - -# TODO: implement debconf support that is maintainable without duplicating the config -#. /usr/share/debconf/confmodule - -CONDUWUIT_DATABASE_PATH=/var/lib/conduwuit -CONDUWUIT_CONFIG_PATH=/etc/conduwuit - -case "$1" in - configure) - echo '' - echo 'Make sure you edit the example config at /etc/conduwuit/conduwuit.toml before starting!' - echo 'To start the server, run: systemctl start conduwuit.service' - echo '' - - ;; -esac - -#DEBHELPER# diff --git a/pkg/fedora/continuwuity.spec.rpkg b/pkg/fedora/continuwuity.spec.rpkg deleted file mode 100644 index a2b32e48..00000000 --- a/pkg/fedora/continuwuity.spec.rpkg +++ /dev/null @@ -1,80 +0,0 @@ -# This should be run using rpkg-util: https://docs.pagure.org/rpkg-util -# it requires Internet access and is not suitable for Fedora main repos -# TODO: rpkg-util is no longer maintained, find a replacement - -Name: continuwuity -Version: {{{ git_repo_version }}} -Release: 1%{?dist} -Summary: Very cool Matrix chat homeserver written in Rust - -License: Apache-2.0 AND MIT - -URL: https://continuwuity.org -VCS: {{{ git_repo_vcs }}} -Source: {{{ git_repo_pack }}} - -BuildRequires: cargo-rpm-macros >= 25 -BuildRequires: systemd-rpm-macros -# Needed to build rust-librocksdb-sys -BuildRequires: clang -BuildRequires: liburing-devel - -Requires: liburing -Requires: glibc -Requires: libstdc++ - -%global _description %{expand: -A cool hard fork of Conduit, a Matrix homeserver written in Rust} - -%description %{_description} - -%prep -{{{ git_repo_setup_macro }}} -%cargo_prep -N -# Perform an online build so Git dependencies can be retrieved -sed -i 's/^offline = true$//' .cargo/config.toml - -%build -%cargo_build - -# Here's the one legally required mystery incantation in this file. -# Some of our dependencies have source files which are (for some reason) marked as executable. -# Files in .cargo/registry/ are copied into /usr/src/ by the debuginfo machinery -# at the end of the build step, and then the BRP shebang mangling script checks -# the entire buildroot to find executable files, and fails the build because -# it thinks Rust's file attributes are shebangs because they start with `#!`. -# So we have to clear the executable bit on all of them before that happens. -find .cargo/registry/ -executable -name "*.rs" -exec chmod -x {} + - -# TODO: this fails currently because it's forced to run in offline mode -# {cargo_license -- --no-dev} > LICENSE.dependencies - -%install -install -Dpm0755 target/rpm/conduwuit -t %{buildroot}%{_bindir} -install -Dpm0644 pkg/conduwuit.service -t %{buildroot}%{_unitdir} -install -Dpm0644 conduwuit-example.toml %{buildroot}%{_sysconfdir}/conduwuit/conduwuit.toml - -%files -%license LICENSE -%license src/core/matrix/state_res/LICENSE -%doc CODE_OF_CONDUCT.md -%doc CONTRIBUTING.md -%doc README.md -%doc SECURITY.md -%config %{_sysconfdir}/conduwuit/conduwuit.toml - -%{_bindir}/conduwuit -%{_unitdir}/conduwuit.service -# Do not create /var/lib/conduwuit, systemd will create it if necessary - -%post -%systemd_post conduwuit.service - -%preun -%systemd_preun conduwuit.service - -%postun -%systemd_postun_with_restart conduwuit.service - -%changelog -{{{ git_repo_changelog }}} diff --git a/renovate.json b/renovate.json index 68d21b9d..eecf8532 100644 --- a/renovate.json +++ b/renovate.json @@ -1,59 +1,26 @@ { - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["config:recommended"], - "lockFileMaintenance": { - "enabled": true, - "schedule": ["at any time"] - }, - "nix": { - "enabled": true - }, - "labels": ["Dependencies", "Dependencies/Renovate"], - "ignoreDeps": [ - "tikv-jemallocator", - "tikv-jemalloc-sys", - "tikv-jemalloc-ctl", - "opentelemetry", - "opentelemetry_sdk", - "opentelemetry-jaeger", - "tracing-opentelemetry" - ], - "github-actions": { - "enabled": true, - "managerFilePatterns": [ - "/(^|/)\\.forgejo/workflows/[^/]+\\.ya?ml$/", - "/(^|/)\\.forgejo/actions/[^/]+/action\\.ya?ml$/", - "/(^|/)\\.github/workflows/[^/]+\\.ya?ml$/", - "/(^|/)\\.github/actions/[^/]+/action\\.ya?ml$/" - ] - }, - "packageRules": [ - { - "description": "Batch minor and patch GitHub Actions updates", - "matchManagers": ["github-actions"], - "matchUpdateTypes": ["minor", "patch"], - "groupName": "github-actions-non-major" - }, - { - "description": "Group Rust toolchain updates into a single PR", - "matchManagers": ["custom.regex"], - "matchPackageNames": ["rust", "rustc", "cargo"], - "groupName": "rust-toolchain" - }, - { - "description": "Group lockfile updates into a single PR", - "matchUpdateTypes": ["lockFileMaintenance"], - "groupName": "lockfile-maintenance" - }, - { - "description": "Batch patch-level Rust dependency updates", - "matchManagers": ["cargo"], - "matchUpdateTypes": ["patch"], - "groupName": "rust-patch-updates" - }, - { - "matchManagers": ["cargo"], - "prConcurrentLimit": 5 - } + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended" + ], + "lockFileMaintenance": { + "enabled": true, + "schedule": [ + "at any time" ] + }, + "nix": { + "enabled": true + }, + "labels": [ + "dependencies", + "github_actions" + ], + "ignoreDeps": [ + "tikv-jemllocator", + "tikv-jemalloc-sys", + "tikv-jemalloc-ctl", + "opentelemetry-rust", + "tracing-opentelemetry" + ] } diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 63e9d9ce..bdb608aa 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -9,16 +9,13 @@ # If you're having trouble making the relevant changes, bug a maintainer. [toolchain] +channel = "1.87.0" profile = "minimal" -channel = "1.89.0" components = [ # For rust-analyzer "rust-src", "rust-analyzer", # For CI and editors + "rustfmt", "clippy", - # you have to install rustfmt nightly yourself (if you're not on NixOS) - # - # The rust-toolchain.toml file doesn't provide any syntax for specifying components from different toolchains - # "rustfmt" ] diff --git a/src/admin/Cargo.toml b/src/admin/Cargo.toml index 470d3e34..7896ef97 100644 --- a/src/admin/Cargo.toml +++ b/src/admin/Cargo.toml @@ -89,7 +89,6 @@ serde_yaml.workspace = true tokio.workspace = true tracing-subscriber.workspace = true tracing.workspace = true -ctor.workspace = true [lints] workspace = true diff --git a/src/admin/debug/commands.rs b/src/admin/debug/commands.rs index 64f68330..81b0e9da 100644 --- a/src/admin/debug/commands.rs +++ b/src/admin/debug/commands.rs @@ -281,8 +281,15 @@ pub(super) async fn get_remote_pdu( vec![(event_id, value, room_id)] }; + info!("Attempting to handle event ID {event_id} as backfilled PDU"); + self.services + .rooms + .timeline + .backfill_pdu(&server, response.pdu) + .await?; + let text = serde_json::to_string_pretty(&json)?; - let msg = "Got PDU from specified server:"; + let msg = "Got PDU from specified server and handled as backfilled"; write!(self, "{msg}. Event body:\n```json\n{text}\n```") }, } diff --git a/src/admin/mod.rs b/src/admin/mod.rs index 1e46dc7f..1d46590b 100644 --- a/src/admin/mod.rs +++ b/src/admin/mod.rs @@ -29,8 +29,6 @@ pub(crate) use crate::{context::Context, utils::get_room_info}; pub(crate) const PAGE_SIZE: usize = 100; -use ctor::{ctor, dtor}; - conduwuit::mod_ctor! {} conduwuit::mod_dtor! {} conduwuit::rustc_flags_capture! {} diff --git a/src/admin/query/room_timeline.rs b/src/admin/query/room_timeline.rs index 0f72b58c..afcfec34 100644 --- a/src/admin/query/room_timeline.rs +++ b/src/admin/query/room_timeline.rs @@ -57,5 +57,5 @@ pub(super) async fn pdus( .try_collect() .await?; - self.write_str(&format!("```\n{result:#?}\n```")).await + self.write_str(&format!("{result:#?}")).await } diff --git a/src/admin/user/commands.rs b/src/admin/user/commands.rs index 37ab030c..86206c2b 100644 --- a/src/admin/user/commands.rs +++ b/src/admin/user/commands.rs @@ -1,8 +1,8 @@ use std::{collections::BTreeMap, fmt::Write as _}; use api::client::{ - full_user_deactivate, join_room_by_id_helper, leave_all_rooms, leave_room, remote_leave_room, - update_avatar_url, update_displayname, + full_user_deactivate, join_room_by_id_helper, leave_all_rooms, leave_room, update_avatar_url, + update_displayname, }; use conduwuit::{ Err, Result, debug, debug_warn, error, info, is_equal_to, @@ -68,8 +68,7 @@ pub(super) async fn create_user(&self, username: String, password: Option return Err!("Couldn't reset the password for user {user_id}: {e}"), | Ok(()) => { @@ -926,29 +924,3 @@ pub(super) async fn redact_event(&self, event_id: OwnedEventId) -> Result { )) .await } - -#[admin_command] -pub(super) async fn force_leave_remote_room( - &self, - user_id: String, - room_id: OwnedRoomOrAliasId, -) -> Result { - let user_id = parse_local_user_id(self.services, &user_id)?; - let (room_id, _) = self - .services - .rooms - .alias - .resolve_with_servers(&room_id, None) - .await?; - - assert!( - self.services.globals.user_is_local(&user_id), - "Parsed user_id must be a local user" - ); - remote_leave_room(self.services, &user_id, &room_id, None) - .boxed() - .await?; - - self.write_str(&format!("{user_id} has been joined to {room_id}.",)) - .await -} diff --git a/src/admin/user/mod.rs b/src/admin/user/mod.rs index 366f7dd5..656cacaf 100644 --- a/src/admin/user/mod.rs +++ b/src/admin/user/mod.rs @@ -103,12 +103,6 @@ pub enum UserCommand { room_id: OwnedRoomOrAliasId, }, - /// - Manually leave a remote room for a local user. - ForceLeaveRemoteRoom { - user_id: String, - room_id: OwnedRoomOrAliasId, - }, - /// - Forces the specified user to drop their power levels to the room /// default, if their permissions allow and the auth check permits ForceDemote { diff --git a/src/api/Cargo.toml b/src/api/Cargo.toml index 18a2ddbd..15ada812 100644 --- a/src/api/Cargo.toml +++ b/src/api/Cargo.toml @@ -49,9 +49,6 @@ jemalloc_stats = [ "conduwuit-core/jemalloc_stats", "conduwuit-service/jemalloc_stats", ] -ldap = [ - "conduwuit-service/ldap" -] release_max_log_level = [ "conduwuit-core/release_max_log_level", "conduwuit-service/release_max_log_level", @@ -93,7 +90,6 @@ serde.workspace = true sha1.workspace = true tokio.workspace = true tracing.workspace = true -ctor.workspace = true [lints] workspace = true diff --git a/src/api/client/account.rs b/src/api/client/account.rs index 67268c9f..0cea7bd9 100644 --- a/src/api/client/account.rs +++ b/src/api/client/account.rs @@ -373,7 +373,7 @@ pub(crate) async fn register_route( let password = if is_guest { None } else { body.password.as_deref() }; // Create user - services.users.create(&user_id, password, None).await?; + services.users.create(&user_id, password)?; // Default to pretty displayname let mut displayname = user_id.localpart().to_owned(); @@ -659,8 +659,7 @@ pub(crate) async fn change_password_route( services .users - .set_password(sender_user, Some(&body.new_password)) - .await?; + .set_password(sender_user, Some(&body.new_password))?; if body.logout_devices { // Logout all devices except the current one diff --git a/src/api/client/admin/mod.rs b/src/api/client/admin/mod.rs deleted file mode 100644 index 8355a600..00000000 --- a/src/api/client/admin/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod suspend; - -pub(crate) use self::suspend::*; diff --git a/src/api/client/admin/suspend.rs b/src/api/client/admin/suspend.rs deleted file mode 100644 index bab1cb5a..00000000 --- a/src/api/client/admin/suspend.rs +++ /dev/null @@ -1,89 +0,0 @@ -use axum::extract::State; -use conduwuit::{Err, Result}; -use futures::future::{join, join3}; -use ruma::api::client::admin::{get_suspended, set_suspended}; - -use crate::Ruma; - -/// # `GET /_matrix/client/v1/admin/suspend/{userId}` -/// -/// Check the suspension status of a target user -pub(crate) async fn get_suspended_status( - State(services): State, - body: Ruma, -) -> Result { - let sender_user = body.sender_user(); - - let (admin, active) = - join(services.users.is_admin(sender_user), services.users.is_active(&body.user_id)).await; - if !admin { - return Err!(Request(Forbidden("Only server administrators can use this endpoint"))); - } - if !services.globals.user_is_local(&body.user_id) { - return Err!(Request(InvalidParam("Can only check the suspended status of local users"))); - } - if !active { - return Err!(Request(NotFound("Unknown user"))); - } - Ok(get_suspended::v1::Response::new( - services.users.is_suspended(&body.user_id).await?, - )) -} - -/// # `PUT /_matrix/client/v1/admin/suspend/{userId}` -/// -/// Set the suspension status of a target user -pub(crate) async fn put_suspended_status( - State(services): State, - body: Ruma, -) -> Result { - let sender_user = body.sender_user(); - - let (sender_admin, active, target_admin) = join3( - services.users.is_admin(sender_user), - services.users.is_active(&body.user_id), - services.users.is_admin(&body.user_id), - ) - .await; - - if !sender_admin { - return Err!(Request(Forbidden("Only server administrators can use this endpoint"))); - } - if !services.globals.user_is_local(&body.user_id) { - return Err!(Request(InvalidParam("Can only set the suspended status of local users"))); - } - if !active { - return Err!(Request(NotFound("Unknown user"))); - } - if body.user_id == *sender_user { - return Err!(Request(Forbidden("You cannot suspend yourself"))); - } - if target_admin { - return Err!(Request(Forbidden("You cannot suspend another server administrator"))); - } - if services.users.is_suspended(&body.user_id).await? == body.suspended { - // No change - return Ok(set_suspended::v1::Response::new(body.suspended)); - } - - let action = if body.suspended { - services - .users - .suspend_account(&body.user_id, sender_user) - .await; - "suspended" - } else { - services.users.unsuspend_account(&body.user_id).await; - "unsuspended" - }; - - if services.config.admin_room_notices { - // Notify the admin room that an account has been un/suspended - services - .admin - .send_text(&format!("{} has been {} by {}.", body.user_id, action, sender_user)) - .await; - } - - Ok(set_suspended::v1::Response::new(body.suspended)) -} diff --git a/src/api/client/capabilities.rs b/src/api/client/capabilities.rs index afa61498..c42c6dfd 100644 --- a/src/api/client/capabilities.rs +++ b/src/api/client/capabilities.rs @@ -19,7 +19,7 @@ use crate::Ruma; /// of this server. pub(crate) async fn get_capabilities_route( State(services): State, - body: Ruma, + _body: Ruma, ) -> Result { let available: BTreeMap = Server::available_room_versions().collect(); @@ -45,14 +45,5 @@ pub(crate) async fn get_capabilities_route( json!({"enabled": services.config.forget_forced_upon_leave}), )?; - if services - .users - .is_admin(body.sender_user.as_ref().unwrap()) - .await - { - // Advertise suspension API - capabilities.set("uk.timedout.msc4323", json!({"suspend":true, "lock": false}))?; - } - Ok(get_capabilities::v3::Response { capabilities }) } diff --git a/src/api/client/membership/join.rs b/src/api/client/membership/join.rs index f3434bf5..dc170cbf 100644 --- a/src/api/client/membership/join.rs +++ b/src/api/client/membership/join.rs @@ -156,34 +156,31 @@ pub(crate) async fn join_room_by_id_or_alias_route( .await?; let mut servers = body.via.clone(); - if servers.is_empty() { - debug!("No via servers provided for join, injecting some."); - servers.extend( - services - .rooms - .state_cache - .servers_invite_via(&room_id) - .map(ToOwned::to_owned) - .collect::>() - .await, - ); + servers.extend( + services + .rooms + .state_cache + .servers_invite_via(&room_id) + .map(ToOwned::to_owned) + .collect::>() + .await, + ); - servers.extend( - services - .rooms - .state_cache - .invite_state(sender_user, &room_id) - .await - .unwrap_or_default() - .iter() - .filter_map(|event| event.get_field("sender").ok().flatten()) - .filter_map(|sender: &str| UserId::parse(sender).ok()) - .map(|user| user.server_name().to_owned()), - ); + servers.extend( + services + .rooms + .state_cache + .invite_state(sender_user, &room_id) + .await + .unwrap_or_default() + .iter() + .filter_map(|event| event.get_field("sender").ok().flatten()) + .filter_map(|sender: &str| UserId::parse(sender).ok()) + .map(|user| user.server_name().to_owned()), + ); - if let Some(server) = room_id.server_name() { - servers.push(server.to_owned()); - } + if let Some(server) = room_id.server_name() { + servers.push(server.to_owned()); } servers.sort_unstable(); diff --git a/src/api/client/membership/leave.rs b/src/api/client/membership/leave.rs index 0aadd833..f4f1666b 100644 --- a/src/api/client/membership/leave.rs +++ b/src/api/client/membership/leave.rs @@ -215,7 +215,7 @@ pub async fn leave_room( Ok(()) } -pub async fn remote_leave_room( +async fn remote_leave_room( services: &Services, user_id: &UserId, room_id: &RoomId, diff --git a/src/api/client/membership/mod.rs b/src/api/client/membership/mod.rs index 691419f6..7a6f19ad 100644 --- a/src/api/client/membership/mod.rs +++ b/src/api/client/membership/mod.rs @@ -29,7 +29,7 @@ pub(crate) use self::{ }; pub use self::{ join::join_room_by_id_helper, - leave::{leave_all_rooms, leave_room, remote_leave_room}, + leave::{leave_all_rooms, leave_room}, }; use crate::{Ruma, client::full_user_deactivate}; diff --git a/src/api/client/message.rs b/src/api/client/message.rs index 842036f5..f8818ebb 100644 --- a/src/api/client/message.rs +++ b/src/api/client/message.rs @@ -8,7 +8,7 @@ use conduwuit::{ ref_at, utils::{ IterStream, ReadyExt, - result::LogErr, + result::{FlatOk, LogErr}, stream::{BroadbandExt, TryIgnore, WidebandExt}, }, }; @@ -91,7 +91,7 @@ pub(crate) async fn get_message_events_route( | Direction::Backward => PduCount::max(), }); - let to: Option = body.to.as_deref().map(str::parse).transpose()?; + let to: Option = body.to.as_deref().map(str::parse).flat_ok(); let limit: usize = body .limit @@ -181,7 +181,7 @@ pub(crate) async fn get_message_events_route( Ok(get_message_events::v3::Response { start: from.to_string(), - end: next_token.as_ref().map(PduCount::to_string), + end: next_token.as_ref().map(ToString::to_string), chunk, state, }) @@ -320,7 +320,7 @@ pub(crate) fn event_filter(item: PdusIterItem, filter: &RoomEventFilter) -> Opti filter.matches(pdu).then_some(item) } -#[cfg_attr(debug_assertions, ctor::ctor)] +#[cfg_attr(debug_assertions, conduwuit::ctor)] fn _is_sorted() { debug_assert!( IGNORED_MESSAGE_TYPES.is_sorted(), diff --git a/src/api/client/mod.rs b/src/api/client/mod.rs index 0014282c..be54e65f 100644 --- a/src/api/client/mod.rs +++ b/src/api/client/mod.rs @@ -1,6 +1,5 @@ pub(super) mod account; pub(super) mod account_data; -pub(super) mod admin; pub(super) mod alias; pub(super) mod appservice; pub(super) mod backup; @@ -43,7 +42,6 @@ pub(super) mod well_known; pub use account::full_user_deactivate; pub(super) use account::*; pub(super) use account_data::*; -pub(super) use admin::*; pub(super) use alias::*; pub(super) use appservice::*; pub(super) use backup::*; @@ -56,7 +54,7 @@ pub(super) use keys::*; pub(super) use media::*; pub(super) use media_legacy::*; pub(super) use membership::*; -pub use membership::{join_room_by_id_helper, leave_all_rooms, leave_room, remote_leave_room}; +pub use membership::{join_room_by_id_helper, leave_all_rooms, leave_room}; pub(super) use message::*; pub(super) use openid::*; pub(super) use presence::*; diff --git a/src/api/client/profile.rs b/src/api/client/profile.rs index eaa66e70..1882495c 100644 --- a/src/api/client/profile.rs +++ b/src/api/client/profile.rs @@ -90,7 +90,7 @@ pub(crate) async fn get_displayname_route( .await { if !services.users.exists(&body.user_id).await { - services.users.create(&body.user_id, None, None).await?; + services.users.create(&body.user_id, None)?; } services @@ -189,7 +189,7 @@ pub(crate) async fn get_avatar_url_route( .await { if !services.users.exists(&body.user_id).await { - services.users.create(&body.user_id, None, None).await?; + services.users.create(&body.user_id, None)?; } services @@ -248,7 +248,7 @@ pub(crate) async fn get_profile_route( .await { if !services.users.exists(&body.user_id).await { - services.users.create(&body.user_id, None, None).await?; + services.users.create(&body.user_id, None)?; } services diff --git a/src/api/client/relations.rs b/src/api/client/relations.rs index 79fa1459..1aa34ada 100644 --- a/src/api/client/relations.rs +++ b/src/api/client/relations.rs @@ -117,7 +117,7 @@ async fn paginate_relations_with_filter( | Direction::Backward => PduCount::max(), }); - let to: Option = to.map(str::parse).transpose()?; + let to: Option = to.map(str::parse).flat_ok(); // Use limit or else 30, with maximum 100 let limit: usize = limit @@ -129,11 +129,6 @@ async fn paginate_relations_with_filter( // Spec (v1.10) recommends depth of at least 3 let depth: u8 = if recurse { 3 } else { 1 }; - // Check if this is a thread request - let is_thread = filter_rel_type - .as_ref() - .is_some_and(|rel| *rel == RelationType::Thread); - let events: Vec<_> = services .rooms .pdu_metadata @@ -157,58 +152,23 @@ async fn paginate_relations_with_filter( .collect() .await; - // For threads, check if we should include the root event - let mut root_event = None; - if is_thread && dir == Direction::Backward { - // Check if we've reached the beginning of the thread - // (fewer events than requested means we've exhausted the thread) - if events.len() < limit { - // Try to get the thread root event - if let Ok(root_pdu) = services.rooms.timeline.get_pdu(target).await { - // Check visibility - if services - .rooms - .state_accessor - .user_can_see_event(sender_user, room_id, target) - .await - { - // Store the root event to add to the response - root_event = Some(root_pdu); - } - } - } + let next_batch = match dir { + | Direction::Forward => events.last(), + | Direction::Backward => events.first(), } - - // Determine if there are more events to fetch - let has_more = if root_event.is_some() { - false // We've included the root, no more events - } else { - // Check if we got a full page of results (might be more) - events.len() >= limit - }; - - let next_batch = if has_more { - match dir { - | Direction::Forward => events.last(), - | Direction::Backward => events.first(), - } - .map(|(count, _)| count.to_string()) - } else { - None - }; - - // Build the response chunk with thread root if needed - let chunk: Vec<_> = root_event - .into_iter() - .map(Event::into_format) - .chain(events.into_iter().map(at!(1)).map(Event::into_format)) - .collect(); + .map(at!(0)) + .as_ref() + .map(ToString::to_string); Ok(get_relating_events::v1::Response { next_batch, prev_batch: from.map(Into::into), recursion_depth: recurse.then_some(depth.into()), - chunk, + chunk: events + .into_iter() + .map(at!(1)) + .map(Event::into_format) + .collect(), }) } diff --git a/src/api/client/room/event.rs b/src/api/client/room/event.rs index 75ae0758..47228d67 100644 --- a/src/api/client/room/event.rs +++ b/src/api/client/room/event.rs @@ -18,7 +18,7 @@ pub(crate) async fn get_room_event_route( let event = services .rooms .timeline - .get_remote_pdu(room_id, event_id) + .get_pdu(event_id) .map_err(|_| err!(Request(NotFound("Event {} not found.", event_id)))); let visible = services @@ -33,6 +33,11 @@ pub(crate) async fn get_room_event_route( return Err!(Request(Forbidden("You don't have permission to view this event."))); } + debug_assert!( + event.event_id() == event_id && event.room_id() == room_id, + "Fetched PDU must match requested" + ); + event.add_age().ok(); Ok(get_room_event::v3::Response { event: event.into_format() }) diff --git a/src/api/client/session.rs b/src/api/client/session.rs index da7bed2c..992073c6 100644 --- a/src/api/client/session.rs +++ b/src/api/client/session.rs @@ -3,14 +3,13 @@ use std::time::Duration; use axum::extract::State; use axum_client_ip::InsecureClientIp; use conduwuit::{ - Err, Error, Result, debug, err, info, - utils::{self, ReadyExt, hash}, + Err, Error, Result, debug, err, info, utils, + utils::{ReadyExt, hash}, }; -use conduwuit_core::{debug_error, debug_warn}; -use conduwuit_service::{Services, uiaa::SESSION_ID_LENGTH}; +use conduwuit_service::uiaa::SESSION_ID_LENGTH; use futures::StreamExt; use ruma::{ - OwnedUserId, UserId, + UserId, api::client::{ session::{ get_login_token, @@ -50,154 +49,6 @@ pub(crate) async fn get_login_types_route( ])) } -/// Authenticates the given user by its ID and its password. -/// -/// Returns the user ID if successful, and an error otherwise. -#[tracing::instrument(skip_all, fields(%user_id), name = "password")] -pub(crate) async fn password_login( - services: &Services, - user_id: &UserId, - lowercased_user_id: &UserId, - password: &str, -) -> Result { - // Restrict login to accounts only of type 'password', including untyped - // legacy accounts which are equivalent to 'password'. - if services - .users - .origin(user_id) - .await - .is_ok_and(|origin| origin != "password") - { - return Err!(Request(Forbidden("Account does not permit password login."))); - } - - let (hash, user_id) = match services.users.password_hash(user_id).await { - | Ok(hash) => (hash, user_id), - | Err(_) => services - .users - .password_hash(lowercased_user_id) - .await - .map(|hash| (hash, lowercased_user_id)) - .map_err(|_| err!(Request(Forbidden("Wrong username or password."))))?, - }; - - if hash.is_empty() { - return Err!(Request(UserDeactivated("The user has been deactivated"))); - } - - hash::verify_password(password, &hash) - .inspect_err(|e| debug_error!("{e}")) - .map_err(|_| err!(Request(Forbidden("Wrong username or password."))))?; - - Ok(user_id.to_owned()) -} - -/// Authenticates the given user through the configured LDAP server. -/// -/// Creates the user if the user is found in the LDAP and do not already have an -/// account. -#[tracing::instrument(skip_all, fields(%user_id), name = "ldap")] -pub(super) async fn ldap_login( - services: &Services, - user_id: &UserId, - lowercased_user_id: &UserId, - password: &str, -) -> Result { - let (user_dn, is_ldap_admin) = match services.config.ldap.bind_dn.as_ref() { - | Some(bind_dn) if bind_dn.contains("{username}") => - (bind_dn.replace("{username}", lowercased_user_id.localpart()), false), - | _ => { - debug!("Searching user in LDAP"); - - let dns = services.users.search_ldap(user_id).await?; - if dns.len() >= 2 { - return Err!(Ldap("LDAP search returned two or more results")); - } - - let Some((user_dn, is_admin)) = dns.first() else { - return password_login(services, user_id, lowercased_user_id, password).await; - }; - - (user_dn.clone(), *is_admin) - }, - }; - - let user_id = services - .users - .auth_ldap(&user_dn, password) - .await - .map(|()| lowercased_user_id.to_owned())?; - - // LDAP users are automatically created on first login attempt. This is a very - // common feature that can be seen on many services using a LDAP provider for - // their users (synapse, Nextcloud, Jellyfin, ...). - // - // LDAP users are crated with a dummy password but non empty because an empty - // password is reserved for deactivated accounts. The conduwuit password field - // will never be read to login a LDAP user so it's not an issue. - if !services.users.exists(lowercased_user_id).await { - services - .users - .create(lowercased_user_id, Some("*"), Some("ldap")) - .await?; - } - - let is_conduwuit_admin = services.admin.user_is_admin(lowercased_user_id).await; - - if is_ldap_admin && !is_conduwuit_admin { - services.admin.make_user_admin(lowercased_user_id).await?; - } else if !is_ldap_admin && is_conduwuit_admin { - services.admin.revoke_admin(lowercased_user_id).await?; - } - - Ok(user_id) -} - -pub(crate) async fn handle_login( - services: &Services, - body: &Ruma, - identifier: Option<&uiaa::UserIdentifier>, - password: &str, - user: Option<&String>, -) -> Result { - debug!("Got password login type"); - let user_id = - if let Some(uiaa::UserIdentifier::UserIdOrLocalpart(user_id)) = identifier { - UserId::parse_with_server_name(user_id, &services.config.server_name) - } else if let Some(user) = user { - UserId::parse_with_server_name(user, &services.config.server_name) - } else { - return Err!(Request(Unknown( - debug_warn!(?body.login_info, "Valid identifier or username was not provided (invalid or unsupported login type?)") - ))); - } - .map_err(|e| err!(Request(InvalidUsername(warn!("Username is invalid: {e}")))))?; - - let lowercased_user_id = UserId::parse_with_server_name( - user_id.localpart().to_lowercase(), - &services.config.server_name, - )?; - - if !services.globals.user_is_local(&user_id) - || !services.globals.user_is_local(&lowercased_user_id) - { - return Err!(Request(Unknown("User ID does not belong to this homeserver"))); - } - - if cfg!(feature = "ldap") && services.config.ldap.enable { - match Box::pin(ldap_login(services, &user_id, &lowercased_user_id, password)).await { - | Ok(user_id) => Ok(user_id), - | Err(err) if services.config.ldap.ldap_only => Err(err), - | Err(err) => { - debug_warn!("{err}"); - password_login(services, &user_id, &lowercased_user_id, password).await - }, - } - } else { - password_login(services, &user_id, &lowercased_user_id, password).await - } -} - /// # `POST /_matrix/client/v3/login` /// /// Authenticates the user and returns an access token it can use in subsequent @@ -229,7 +80,70 @@ pub(crate) async fn login_route( password, user, .. - }) => handle_login(&services, &body, identifier.as_ref(), password, user.as_ref()).await?, + }) => { + debug!("Got password login type"); + let user_id = + if let Some(uiaa::UserIdentifier::UserIdOrLocalpart(user_id)) = identifier { + UserId::parse_with_server_name(user_id, &services.config.server_name) + } else if let Some(user) = user { + UserId::parse_with_server_name(user, &services.config.server_name) + } else { + return Err!(Request(Unknown( + debug_warn!(?body.login_info, "Valid identifier or username was not provided (invalid or unsupported login type?)") + ))); + } + .map_err(|e| err!(Request(InvalidUsername(warn!("Username is invalid: {e}")))))?; + + let lowercased_user_id = UserId::parse_with_server_name( + user_id.localpart().to_lowercase(), + &services.config.server_name, + )?; + + if !services.globals.user_is_local(&user_id) + || !services.globals.user_is_local(&lowercased_user_id) + { + return Err!(Request(Unknown("User ID does not belong to this homeserver"))); + } + + // first try the username as-is + let hash = services + .users + .password_hash(&user_id) + .await + .inspect_err(|e| debug!("{e}")); + + match hash { + | Ok(hash) => { + if hash.is_empty() { + return Err!(Request(UserDeactivated("The user has been deactivated"))); + } + + hash::verify_password(password, &hash) + .inspect_err(|e| debug!("{e}")) + .map_err(|_| err!(Request(Forbidden("Wrong username or password."))))?; + + user_id + }, + | Err(_e) => { + let hash_lowercased_user_id = services + .users + .password_hash(&lowercased_user_id) + .await + .inspect_err(|e| debug!("{e}")) + .map_err(|_| err!(Request(Forbidden("Wrong username or password."))))?; + + if hash_lowercased_user_id.is_empty() { + return Err!(Request(UserDeactivated("The user has been deactivated"))); + } + + hash::verify_password(password, &hash_lowercased_user_id) + .inspect_err(|e| debug!("{e}")) + .map_err(|_| err!(Request(Forbidden("Wrong username or password."))))?; + + lowercased_user_id + }, + } + }, | login::v3::LoginInfo::Token(login::v3::Token { token }) => { debug!("Got token login type"); if !services.server.config.login_via_existing_session { @@ -284,8 +198,8 @@ pub(crate) async fn login_route( .clone() .unwrap_or_else(|| utils::random_string(DEVICE_ID_LENGTH).into()); - // Generate a new token for the device (ensuring no collisions) - let token = services.users.generate_unique_token().await; + // Generate a new token for the device + let token = utils::random_string(TOKEN_LENGTH); // Determine if device_id was provided and exists in the db for this user let device_exists = if body.device_id.is_some() { diff --git a/src/api/client/sync/v3.rs b/src/api/client/sync/v3.rs index 298a6e4b..01428c08 100644 --- a/src/api/client/sync/v3.rs +++ b/src/api/client/sync/v3.rs @@ -430,7 +430,7 @@ async fn handle_left_room( .ok(); // Left before last sync - if (Some(since) >= left_count && !include_leave) || Some(next_batch) < left_count { + if Some(since) >= left_count { return Ok(None); } diff --git a/src/api/client/sync/v4.rs b/src/api/client/sync/v4.rs index a16e4526..14cd50d8 100644 --- a/src/api/client/sync/v4.rs +++ b/src/api/client/sync/v4.rs @@ -45,7 +45,6 @@ use crate::{ type TodoRooms = BTreeMap, usize, u64)>; const SINGLE_CONNECTION_SYNC: &str = "single_connection_sync"; -#[allow(clippy::cognitive_complexity)] /// POST `/_matrix/client/unstable/org.matrix.msc3575/sync` /// /// Sliding Sync endpoint (future endpoint: `/_matrix/client/v4/sync`) diff --git a/src/api/client/unstable.rs b/src/api/client/unstable.rs index f8703ff3..08f70975 100644 --- a/src/api/client/unstable.rs +++ b/src/api/client/unstable.rs @@ -292,7 +292,7 @@ pub(crate) async fn get_timezone_key_route( .await { if !services.users.exists(&body.user_id).await { - services.users.create(&body.user_id, None, None).await?; + services.users.create(&body.user_id, None)?; } services @@ -352,7 +352,7 @@ pub(crate) async fn get_profile_key_route( .await { if !services.users.exists(&body.user_id).await { - services.users.create(&body.user_id, None, None).await?; + services.users.create(&body.user_id, None)?; } services diff --git a/src/api/client/unversioned.rs b/src/api/client/unversioned.rs index 7f19bc94..a4136d1a 100644 --- a/src/api/client/unversioned.rs +++ b/src/api/client/unversioned.rs @@ -58,7 +58,6 @@ pub(crate) async fn get_supported_versions_route( ("uk.tcpip.msc4133".to_owned(), true), /* Extending User Profile API with Key:Value Pairs (https://github.com/matrix-org/matrix-spec-proposals/pull/4133) */ ("us.cloke.msc4175".to_owned(), true), /* Profile field for user time zone (https://github.com/matrix-org/matrix-spec-proposals/pull/4175) */ ("org.matrix.simplified_msc3575".to_owned(), true), /* Simplified Sliding sync (https://github.com/matrix-org/matrix-spec-proposals/pull/4186) */ - ("uk.timedout.msc4323".to_owned(), true), /* agnostic suspend (https://github.com/matrix-org/matrix-spec-proposals/pull/4323) */ ]), }; diff --git a/src/api/router.rs b/src/api/router.rs index 42934f70..8072fa5b 100644 --- a/src/api/router.rs +++ b/src/api/router.rs @@ -184,8 +184,6 @@ pub fn build(router: Router, server: &Server) -> Router { "/_matrix/client/unstable/im.nheko.summary/rooms/:room_id_or_alias/summary", get(client::get_room_summary_legacy) ) - .ruma_route(&client::get_suspended_status) - .ruma_route(&client::put_suspended_status) .ruma_route(&client::well_known_support) .ruma_route(&client::well_known_client) .route("/_conduwuit/server_version", get(client::conduwuit_server_version)) diff --git a/src/api/router/auth.rs b/src/api/router/auth.rs index 44afc3ef..01254c32 100644 --- a/src/api/router/auth.rs +++ b/src/api/router/auth.rs @@ -5,14 +5,6 @@ use axum_extra::{ typed_header::TypedHeaderRejectionReason, }; use conduwuit::{Err, Error, Result, debug_error, err, warn}; -use futures::{ - TryFutureExt, - future::{ - Either::{Left, Right}, - select_ok, - }, - pin_mut, -}; use ruma::{ CanonicalJsonObject, CanonicalJsonValue, OwnedDeviceId, OwnedServerName, OwnedUserId, UserId, api::{ @@ -62,7 +54,17 @@ pub(super) async fn auth( | None => request.query.access_token.as_deref(), }; - let token = find_token(services, token).await?; + let token = if let Some(token) = token { + match services.appservice.find_from_token(token).await { + | Some(reg_info) => Token::Appservice(Box::new(reg_info)), + | _ => match services.users.find_from_token(token).await { + | Ok((user_id, device_id)) => Token::User((user_id, device_id)), + | _ => Token::Invalid, + }, + } + } else { + Token::None + }; if metadata.authentication == AuthScheme::None { match metadata { @@ -340,25 +342,3 @@ async fn parse_x_matrix(request: &mut Request) -> Result { Ok(x_matrix) } - -async fn find_token(services: &Services, token: Option<&str>) -> Result { - let Some(token) = token else { - return Ok(Token::None); - }; - - let user_token = services.users.find_from_token(token).map_ok(Token::User); - - let appservice_token = services - .appservice - .find_from_token(token) - .map_ok(Box::new) - .map_ok(Token::Appservice); - - pin_mut!(user_token, appservice_token); - // Returns Ok if either token type succeeds, Err only if both fail - match select_ok([Left(user_token), Right(appservice_token)]).await { - | Err(e) if !e.is_not_found() => Err(e), - | Ok((token, _)) => Ok(token), - | _ => Ok(Token::Invalid), - } -} diff --git a/src/api/server/send_join.rs b/src/api/server/send_join.rs index d92581a1..652451c7 100644 --- a/src/api/server/send_join.rs +++ b/src/api/server/send_join.rs @@ -1,13 +1,12 @@ #![allow(deprecated)] -use std::{borrow::Borrow, time::Instant, vec}; +use std::borrow::Borrow; use axum::extract::State; use conduwuit::{ - Err, Event, Result, at, debug, err, info, + Err, Result, at, err, matrix::event::gen_event_id_canonical_json, - trace, - utils::stream::{BroadbandExt, IterStream, TryBroadbandExt}, + utils::stream::{IterStream, TryBroadbandExt}, warn, }; use conduwuit_service::Services; @@ -26,14 +25,12 @@ use serde_json::value::{RawValue as RawJsonValue, to_raw_value}; use crate::Ruma; /// helper method for /send_join v1 and v2 -#[tracing::instrument(skip(services, pdu, omit_members), fields(room_id = room_id.as_str(), origin = origin.as_str()))] async fn create_join_event( services: &Services, origin: &ServerName, room_id: &RoomId, pdu: &RawJsonValue, - omit_members: bool, -) -> Result { +) -> Result { if !services.rooms.metadata.exists(room_id).await { return Err!(Request(NotFound("Room is unknown to this server."))); } @@ -56,10 +53,8 @@ async fn create_join_event( // We do not add the event_id field to the pdu here because of signature and // hashes checks - trace!("Getting room version"); let room_version_id = services.rooms.state.get_room_version(room_id).await?; - trace!("Generating event ID and converting to canonical json"); let Ok((event_id, mut value)) = gen_event_id_canonical_json(pdu, &room_version_id) else { // Event could not be converted to canonical json return Err!(Request(BadJson("Could not convert event to canonical json."))); @@ -108,6 +103,7 @@ async fn create_join_event( ))); } + // ACL check sender user server name let sender: OwnedUserId = serde_json::from_value( value .get("sender") @@ -117,6 +113,12 @@ async fn create_join_event( ) .map_err(|e| err!(Request(BadJson(warn!("sender property is not a valid user ID: {e}")))))?; + services + .rooms + .event_handler + .acl_check(sender.server_name(), room_id) + .await?; + // check if origin server is trying to send for another server if sender.server_name() != origin { return Err!(Request(Forbidden("Not allowed to join on behalf of another server."))); @@ -178,6 +180,11 @@ async fn create_join_event( } } + services + .server_keys + .hash_and_sign_event(&mut value, &room_version_id) + .map_err(|e| err!(Request(InvalidParam(warn!("Failed to sign send_join event: {e}")))))?; + let origin: OwnedServerName = serde_json::from_value( value .get("origin") @@ -187,12 +194,6 @@ async fn create_join_event( ) .map_err(|e| err!(Request(BadJson("Event has an invalid origin server name: {e}"))))?; - trace!("Signing send_join event"); - services - .server_keys - .hash_and_sign_event(&mut value, &room_version_id) - .map_err(|e| err!(Request(InvalidParam(warn!("Failed to sign send_join event: {e}")))))?; - let mutex_lock = services .rooms .event_handler @@ -200,7 +201,6 @@ async fn create_join_event( .lock(room_id) .await; - trace!("Acquired send_join mutex, persisting join event"); let pdu_id = services .rooms .event_handler @@ -210,7 +210,7 @@ async fn create_join_event( .ok_or_else(|| err!(Request(InvalidParam("Could not accept as timeline event."))))?; drop(mutex_lock); - trace!("Fetching current state IDs"); + let state_ids: Vec = services .rooms .state_accessor @@ -219,23 +219,9 @@ async fn create_join_event( .collect() .await; - trace!(%omit_members, "Constructing current state"); let state = state_ids .iter() .try_stream() - .broad_filter_map(|event_id| async move { - if omit_members { - if let Ok(e) = event_id.as_ref() { - let pdu = services.rooms.timeline.get_pdu(e).await; - if pdu.is_ok_and(|p| p.kind().to_cow_str() == "m.room.member") { - trace!("omitting member event {e:?} from returned state"); - // skip members - return None; - } - } - } - Some(event_id) - }) .broad_and_then(|event_id| services.rooms.timeline.get_pdu_json(event_id)) .broad_and_then(|pdu| { services @@ -248,7 +234,6 @@ async fn create_join_event( .await?; let starting_events = state_ids.iter().map(Borrow::borrow); - trace!("Constructing auth chain"); let auth_chain = services .rooms .auth_chain @@ -265,37 +250,13 @@ async fn create_join_event( .try_collect() .boxed() .await?; - info!(fast_join = %omit_members, "Sending join event to other servers"); + services.sending.send_pdu_room(room_id, &pdu_id).await?; - debug!("Finished sending join event"); - let servers_in_room: Option> = if !omit_members { - None - } else { - trace!("Fetching list of servers in room"); - let servers: Vec = services - .rooms - .state_cache - .room_servers(room_id) - .map(|sn| sn.as_str().to_owned()) - .collect() - .await; - // If there's no servers, just add us - let servers = if servers.is_empty() { - warn!("Failed to find any servers, adding our own server name as a last resort"); - vec![services.globals.server_name().to_string()] - } else { - trace!("Found {} servers in room", servers.len()); - servers - }; - Some(servers) - }; - debug!("Returning send_join data"); - Ok(create_join_event::v2::RoomState { + + Ok(create_join_event::v1::RoomState { auth_chain, state, event: to_raw_value(&CanonicalJsonValue::Object(value)).ok(), - members_omitted: omit_members, - servers_in_room, }) } @@ -333,23 +294,11 @@ pub(crate) async fn create_join_event_v1_route( } } - let now = Instant::now(); - let room_state = create_join_event(&services, body.origin(), &body.room_id, &body.pdu, false) + let room_state = create_join_event(&services, body.origin(), &body.room_id, &body.pdu) .boxed() .await?; - let transformed = create_join_event::v1::RoomState { - auth_chain: room_state.auth_chain, - state: room_state.state, - event: room_state.event, - }; - info!( - "Finished sending a join for {} in {} in {:?}", - body.origin(), - &body.room_id, - now.elapsed() - ); - Ok(create_join_event::v1::Response { room_state: transformed }) + Ok(create_join_event::v1::Response { room_state }) } /// # `PUT /_matrix/federation/v2/send_join/{roomId}/{eventId}` @@ -380,17 +329,17 @@ pub(crate) async fn create_join_event_v2_route( } } - let now = Instant::now(); - let room_state = - create_join_event(&services, body.origin(), &body.room_id, &body.pdu, body.omit_members) + let create_join_event::v1::RoomState { auth_chain, state, event } = + create_join_event(&services, body.origin(), &body.room_id, &body.pdu) .boxed() .await?; - info!( - "Finished sending a join for {} in {} in {:?}", - body.origin(), - &body.room_id, - now.elapsed() - ); + let room_state = create_join_event::v2::RoomState { + members_omitted: false, + auth_chain, + state, + event, + servers_in_room: None, + }; Ok(create_join_event::v2::Response { room_state }) } diff --git a/src/core/config/mod.rs b/src/core/config/mod.rs index b6f6ab53..aa021be7 100644 --- a/src/core/config/mod.rs +++ b/src/core/config/mod.rs @@ -1,4 +1,3 @@ -#![allow(clippy::doc_link_with_quotes)] pub mod check; pub mod manager; pub mod proxy; @@ -126,11 +125,9 @@ pub struct Config { /// This is the only directory where continuwuity will save its data, /// including media. Note: this was previously "/var/lib/matrix-conduit". /// - /// YOU NEED TO EDIT THIS, UNLESS you are running continuwuity as a - /// `systemd` service. The service file sets it to `/var/lib/conduwuit` - /// using an environment variable and also grants write access. + /// YOU NEED TO EDIT THIS. /// - /// example: "/var/lib/conduwuit" + /// example: "/var/lib/continuwuity" pub database_path: PathBuf, /// continuwuity supports online database backups using RocksDB's Backup @@ -714,21 +711,12 @@ pub struct Config { #[serde(default)] pub well_known: WellKnownConfig, - /// Enable OpenTelemetry OTLP tracing export. This replaces the deprecated - /// Jaeger exporter. Traces will be sent via OTLP to a collector (such as - /// Jaeger) that supports the OpenTelemetry Protocol. - /// - /// Configure your OTLP endpoint using the OTEL_EXPORTER_OTLP_ENDPOINT - /// environment variable (defaults to http://localhost:4318). - #[serde(default, alias = "allow_jaeger")] - pub allow_otlp: bool, + #[serde(default)] + pub allow_jaeger: bool, - /// Filter for OTLP tracing spans. This controls which spans are exported - /// to the OTLP collector. - /// /// default: "info" - #[serde(default = "default_otlp_filter", alias = "jaeger_filter")] - pub otlp_filter: String, + #[serde(default = "default_jaeger_filter")] + pub jaeger_filter: String, /// If the 'perf_measurements' compile-time feature is enabled, enables /// collecting folded stack trace profile of tracing spans using @@ -1959,10 +1947,6 @@ pub struct Config { pub allow_invalid_tls_certificates_yes_i_know_what_the_fuck_i_am_doing_with_this_and_i_know_this_is_insecure: bool, - // external structure; separate section - #[serde(default)] - pub ldap: LdapConfig, - // external structure; separate section #[serde(default)] pub blurhashing: BlurhashConfig, @@ -2057,114 +2041,6 @@ pub struct BlurhashConfig { pub blurhash_max_raw_size: u64, } -#[derive(Clone, Debug, Default, Deserialize)] -#[config_example_generator(filename = "conduwuit-example.toml", section = "global.ldap")] -pub struct LdapConfig { - /// Whether to enable LDAP login. - /// - /// example: "true" - #[serde(default)] - pub enable: bool, - - /// Whether to force LDAP authentication or authorize classical password - /// login. - /// - /// example: "true" - #[serde(default)] - pub ldap_only: bool, - - /// URI of the LDAP server. - /// - /// example: "ldap://ldap.example.com:389" - /// - /// default: "" - #[serde(default)] - pub uri: Option, - - /// Root of the searches. - /// - /// example: "ou=users,dc=example,dc=org" - /// - /// default: "" - #[serde(default)] - pub base_dn: String, - - /// Bind DN if anonymous search is not enabled. - /// - /// You can use the variable `{username}` that will be replaced by the - /// entered username. In such case, the password used to bind will be the - /// one provided for the login and not the one given by - /// `bind_password_file`. Beware: automatically granting admin rights will - /// not work if you use this direct bind instead of a LDAP search. - /// - /// example: "cn=ldap-reader,dc=example,dc=org" or - /// "cn={username},ou=users,dc=example,dc=org" - /// - /// default: "" - #[serde(default)] - pub bind_dn: Option, - - /// Path to a file on the system that contains the password for the - /// `bind_dn`. - /// - /// The server must be able to access the file, and it must not be empty. - /// - /// default: "" - #[serde(default)] - pub bind_password_file: Option, - - /// Search filter to limit user searches. - /// - /// You can use the variable `{username}` that will be replaced by the - /// entered username for more complex filters. - /// - /// example: "(&(objectClass=person)(memberOf=matrix))" - /// - /// default: "(objectClass=*)" - #[serde(default = "default_ldap_search_filter")] - pub filter: String, - - /// Attribute to use to uniquely identify the user. - /// - /// example: "uid" or "cn" - /// - /// default: "uid" - #[serde(default = "default_ldap_uid_attribute")] - pub uid_attribute: String, - - /// Attribute containing the display name of the user. - /// - /// example: "givenName" or "sn" - /// - /// default: "givenName" - #[serde(default = "default_ldap_name_attribute")] - pub name_attribute: String, - - /// Root of the searches for admin users. - /// - /// Defaults to `base_dn` if empty. - /// - /// example: "ou=admins,dc=example,dc=org" - /// - /// default: "" - #[serde(default)] - pub admin_base_dn: String, - - /// The LDAP search filter to find administrative users for continuwuity. - /// - /// If left blank, administrative state must be configured manually for each - /// user. - /// - /// You can use the variable `{username}` that will be replaced by the - /// entered username for more complex filters. - /// - /// example: "(objectClass=conduwuitAdmin)" or "(uid={username})" - /// - /// default: "" - #[serde(default)] - pub admin_filter: String, -} - #[derive(Deserialize, Clone, Debug)] #[serde(transparent)] struct ListeningPort { @@ -2376,7 +2252,7 @@ fn default_tracing_flame_filter() -> String { .to_owned() } -fn default_otlp_filter() -> String { +fn default_jaeger_filter() -> String { cfg!(debug_assertions) .then_some("trace,h2=off") .unwrap_or("info") @@ -2554,9 +2430,3 @@ pub(super) fn default_blurhash_x_component() -> u32 { 4 } pub(super) fn default_blurhash_y_component() -> u32 { 3 } // end recommended & blurhashing defaults - -fn default_ldap_search_filter() -> String { "(objectClass=*)".to_owned() } - -fn default_ldap_uid_attribute() -> String { String::from("uid") } - -fn default_ldap_name_attribute() -> String { String::from("givenName") } diff --git a/src/core/debug.rs b/src/core/debug.rs index c728278d..21a5ada4 100644 --- a/src/core/debug.rs +++ b/src/core/debug.rs @@ -100,7 +100,7 @@ pub fn trap() { #[must_use] pub fn panic_str(p: &Box) -> &'static str { - (**p).downcast_ref::<&str>().copied().unwrap_or_default() + p.downcast_ref::<&str>().copied().unwrap_or_default() } #[inline(always)] diff --git a/src/core/error/mod.rs b/src/core/error/mod.rs index 541af793..e46edf09 100644 --- a/src/core/error/mod.rs +++ b/src/core/error/mod.rs @@ -110,8 +110,6 @@ pub enum Error { InconsistentRoomState(&'static str, ruma::OwnedRoomId), #[error(transparent)] IntoHttp(#[from] ruma::api::error::IntoHttpError), - #[error("{0}")] - Ldap(Cow<'static, str>), #[error(transparent)] Mxc(#[from] ruma::MxcUriError), #[error(transparent)] diff --git a/src/core/info/room_version.rs b/src/core/info/room_version.rs index 54ed8fdc..51d5d3c6 100644 --- a/src/core/info/room_version.rs +++ b/src/core/info/room_version.rs @@ -18,7 +18,7 @@ pub const STABLE_ROOM_VERSIONS: &[RoomVersionId] = &[ /// Experimental, partially supported room versions pub const UNSTABLE_ROOM_VERSIONS: &[RoomVersionId] = - &[RoomVersionId::V3, RoomVersionId::V4, RoomVersionId::V5]; + &[RoomVersionId::V2, RoomVersionId::V3, RoomVersionId::V4, RoomVersionId::V5]; type RoomVersion = (RoomVersionId, RoomVersionStability); diff --git a/src/core/matrix/pdu/count.rs b/src/core/matrix/pdu/count.rs index 7fb12574..b880278f 100644 --- a/src/core/matrix/pdu/count.rs +++ b/src/core/matrix/pdu/count.rs @@ -1,10 +1,6 @@ #![allow(clippy::cast_possible_wrap, clippy::cast_sign_loss, clippy::as_conversions)] -use std::{ - cmp::Ordering, - fmt::{self, Display}, - str::FromStr, -}; +use std::{cmp::Ordering, fmt, fmt::Display, str::FromStr}; use ruma::api::Direction; diff --git a/src/database/Cargo.toml b/src/database/Cargo.toml index d37ca585..9f51f366 100644 --- a/src/database/Cargo.toml +++ b/src/database/Cargo.toml @@ -66,7 +66,6 @@ serde.workspace = true serde_json.workspace = true tokio.workspace = true tracing.workspace = true -ctor.workspace = true [lints] workspace = true diff --git a/src/database/map/get_batch.rs b/src/database/map/get_batch.rs index 539f0c39..e23a8848 100644 --- a/src/database/map/get_batch.rs +++ b/src/database/map/get_batch.rs @@ -19,7 +19,7 @@ where S: Stream + Send + 'a, K: AsRef<[u8]> + Send + Sync + 'a, { - fn get(self, map: &'a Arc) -> impl Stream>> + Send + 'a; + fn get(self, map: &'a Arc) -> impl Stream>> + Send + 'a; } impl<'a, K, S> Get<'a, K, S> for S @@ -29,7 +29,7 @@ where K: AsRef<[u8]> + Send + Sync + 'a, { #[inline] - fn get(self, map: &'a Arc) -> impl Stream>> + Send + 'a { + fn get(self, map: &'a Arc) -> impl Stream>> + Send + 'a { map.get_batch(self) } } @@ -39,7 +39,7 @@ where pub(crate) fn get_batch<'a, S, K>( self: &'a Arc, keys: S, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where S: Stream + Send + 'a, K: AsRef<[u8]> + Send + Sync + 'a, diff --git a/src/database/map/keys.rs b/src/database/map/keys.rs index ac044e91..7ca932a5 100644 --- a/src/database/map/keys.rs +++ b/src/database/map/keys.rs @@ -10,7 +10,7 @@ use super::stream::is_cached; use crate::{keyval, keyval::Key, stream}; #[implement(super::Map)] -pub fn keys<'a, K>(self: &'a Arc) -> impl Stream>> + Send +pub fn keys<'a, K>(self: &'a Arc) -> impl Stream>> + Send where K: Deserialize<'a> + Send, { diff --git a/src/database/map/keys_from.rs b/src/database/map/keys_from.rs index 11245f7b..c9b1717a 100644 --- a/src/database/map/keys_from.rs +++ b/src/database/map/keys_from.rs @@ -15,7 +15,7 @@ use crate::{ pub fn keys_from<'a, K, P>( self: &'a Arc, from: &P, -) -> impl Stream>> + Send + use<'a, K, P> +) -> impl Stream>> + Send + use<'a, K, P> where P: Serialize + ?Sized + Debug, K: Deserialize<'a> + Send, @@ -40,7 +40,7 @@ where pub fn keys_raw_from<'a, K, P>( self: &'a Arc, from: &P, -) -> impl Stream>> + Send + use<'a, K, P> +) -> impl Stream>> + Send + use<'a, K, P> where P: AsRef<[u8]> + ?Sized + Debug + Sync, K: Deserialize<'a> + Send, diff --git a/src/database/map/keys_prefix.rs b/src/database/map/keys_prefix.rs index e6a9457f..09dd79ac 100644 --- a/src/database/map/keys_prefix.rs +++ b/src/database/map/keys_prefix.rs @@ -10,7 +10,7 @@ use crate::keyval::{Key, result_deserialize_key, serialize_key}; pub fn keys_prefix<'a, K, P>( self: &'a Arc, prefix: &P, -) -> impl Stream>> + Send + use<'a, K, P> +) -> impl Stream>> + Send + use<'a, K, P> where P: Serialize + ?Sized + Debug, K: Deserialize<'a> + Send, @@ -37,7 +37,7 @@ where pub fn keys_raw_prefix<'a, K, P>( self: &'a Arc, prefix: &'a P, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, K: Deserialize<'a> + Send + 'a, @@ -50,7 +50,7 @@ where pub fn raw_keys_prefix<'a, P>( self: &'a Arc, prefix: &'a P, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, { diff --git a/src/database/map/qry_batch.rs b/src/database/map/qry_batch.rs index 9da546e6..e42d3e63 100644 --- a/src/database/map/qry_batch.rs +++ b/src/database/map/qry_batch.rs @@ -17,7 +17,7 @@ where S: Stream + Send + 'a, K: Serialize + Debug, { - fn qry(self, map: &'a Arc) -> impl Stream>> + Send + 'a; + fn qry(self, map: &'a Arc) -> impl Stream>> + Send + 'a; } impl<'a, K, S> Qry<'a, K, S> for S @@ -27,7 +27,7 @@ where K: Serialize + Debug + 'a, { #[inline] - fn qry(self, map: &'a Arc) -> impl Stream>> + Send + 'a { + fn qry(self, map: &'a Arc) -> impl Stream>> + Send + 'a { map.qry_batch(self) } } @@ -37,7 +37,7 @@ where pub(crate) fn qry_batch<'a, S, K>( self: &'a Arc, keys: S, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where S: Stream + Send + 'a, K: Serialize + Debug + 'a, diff --git a/src/database/map/rev_keys.rs b/src/database/map/rev_keys.rs index 8f48a17e..c00f3e55 100644 --- a/src/database/map/rev_keys.rs +++ b/src/database/map/rev_keys.rs @@ -10,7 +10,7 @@ use super::rev_stream::is_cached; use crate::{keyval, keyval::Key, stream}; #[implement(super::Map)] -pub fn rev_keys<'a, K>(self: &'a Arc) -> impl Stream>> + Send +pub fn rev_keys<'a, K>(self: &'a Arc) -> impl Stream>> + Send where K: Deserialize<'a> + Send, { diff --git a/src/database/map/rev_keys_from.rs b/src/database/map/rev_keys_from.rs index 021e3b92..04e457dc 100644 --- a/src/database/map/rev_keys_from.rs +++ b/src/database/map/rev_keys_from.rs @@ -15,7 +15,7 @@ use crate::{ pub fn rev_keys_from<'a, K, P>( self: &'a Arc, from: &P, -) -> impl Stream>> + Send + use<'a, K, P> +) -> impl Stream>> + Send + use<'a, K, P> where P: Serialize + ?Sized + Debug, K: Deserialize<'a> + Send, @@ -41,7 +41,7 @@ where pub fn rev_keys_raw_from<'a, K, P>( self: &'a Arc, from: &P, -) -> impl Stream>> + Send + use<'a, K, P> +) -> impl Stream>> + Send + use<'a, K, P> where P: AsRef<[u8]> + ?Sized + Debug + Sync, K: Deserialize<'a> + Send, diff --git a/src/database/map/rev_keys_prefix.rs b/src/database/map/rev_keys_prefix.rs index 5b1459f5..fbe9f9ca 100644 --- a/src/database/map/rev_keys_prefix.rs +++ b/src/database/map/rev_keys_prefix.rs @@ -10,7 +10,7 @@ use crate::keyval::{Key, result_deserialize_key, serialize_key}; pub fn rev_keys_prefix<'a, K, P>( self: &'a Arc, prefix: &P, -) -> impl Stream>> + Send + use<'a, K, P> +) -> impl Stream>> + Send + use<'a, K, P> where P: Serialize + ?Sized + Debug, K: Deserialize<'a> + Send, @@ -37,7 +37,7 @@ where pub fn rev_keys_raw_prefix<'a, K, P>( self: &'a Arc, prefix: &'a P, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, K: Deserialize<'a> + Send + 'a, @@ -50,7 +50,7 @@ where pub fn rev_raw_keys_prefix<'a, P>( self: &'a Arc, prefix: &'a P, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, { diff --git a/src/database/map/rev_stream.rs b/src/database/map/rev_stream.rs index 92d7bac8..789a52e8 100644 --- a/src/database/map/rev_stream.rs +++ b/src/database/map/rev_stream.rs @@ -14,7 +14,7 @@ use crate::{keyval, keyval::KeyVal, stream}; #[implement(super::Map)] pub fn rev_stream<'a, K, V>( self: &'a Arc, -) -> impl Stream>> + Send +) -> impl Stream>> + Send where K: Deserialize<'a> + Send, V: Deserialize<'a> + Send, diff --git a/src/database/map/rev_stream_from.rs b/src/database/map/rev_stream_from.rs index 7fef1b35..a612d2a2 100644 --- a/src/database/map/rev_stream_from.rs +++ b/src/database/map/rev_stream_from.rs @@ -20,7 +20,7 @@ use crate::{ pub fn rev_stream_from<'a, K, V, P>( self: &'a Arc, from: &P, -) -> impl Stream>> + Send + use<'a, K, V, P> +) -> impl Stream>> + Send + use<'a, K, V, P> where P: Serialize + ?Sized + Debug, K: Deserialize<'a> + Send, @@ -55,7 +55,7 @@ where pub fn rev_stream_raw_from<'a, K, V, P>( self: &'a Arc, from: &P, -) -> impl Stream>> + Send + use<'a, K, V, P> +) -> impl Stream>> + Send + use<'a, K, V, P> where P: AsRef<[u8]> + ?Sized + Debug + Sync, K: Deserialize<'a> + Send, diff --git a/src/database/map/rev_stream_prefix.rs b/src/database/map/rev_stream_prefix.rs index 70d4abf7..46dc9247 100644 --- a/src/database/map/rev_stream_prefix.rs +++ b/src/database/map/rev_stream_prefix.rs @@ -14,7 +14,7 @@ use crate::keyval::{KeyVal, result_deserialize, serialize_key}; pub fn rev_stream_prefix<'a, K, V, P>( self: &'a Arc, prefix: &P, -) -> impl Stream>> + Send + use<'a, K, V, P> +) -> impl Stream>> + Send + use<'a, K, V, P> where P: Serialize + ?Sized + Debug, K: Deserialize<'a> + Send, @@ -50,7 +50,7 @@ where pub fn rev_stream_raw_prefix<'a, K, V, P>( self: &'a Arc, prefix: &'a P, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, K: Deserialize<'a> + Send + 'a, @@ -68,7 +68,7 @@ where pub fn rev_raw_stream_prefix<'a, P>( self: &'a Arc, prefix: &'a P, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, { diff --git a/src/database/map/stream.rs b/src/database/map/stream.rs index 736ab268..f7371b6c 100644 --- a/src/database/map/stream.rs +++ b/src/database/map/stream.rs @@ -14,7 +14,7 @@ use crate::{keyval, keyval::KeyVal, stream}; #[implement(super::Map)] pub fn stream<'a, K, V>( self: &'a Arc, -) -> impl Stream>> + Send +) -> impl Stream>> + Send where K: Deserialize<'a> + Send, V: Deserialize<'a> + Send, diff --git a/src/database/map/stream_from.rs b/src/database/map/stream_from.rs index 9acec173..ccf48db6 100644 --- a/src/database/map/stream_from.rs +++ b/src/database/map/stream_from.rs @@ -19,7 +19,7 @@ use crate::{ pub fn stream_from<'a, K, V, P>( self: &'a Arc, from: &P, -) -> impl Stream>> + Send + use<'a, K, V, P> +) -> impl Stream>> + Send + use<'a, K, V, P> where P: Serialize + ?Sized + Debug, K: Deserialize<'a> + Send, @@ -53,7 +53,7 @@ where pub fn stream_raw_from<'a, K, V, P>( self: &'a Arc, from: &P, -) -> impl Stream>> + Send + use<'a, K, V, P> +) -> impl Stream>> + Send + use<'a, K, V, P> where P: AsRef<[u8]> + ?Sized + Debug + Sync, K: Deserialize<'a> + Send, diff --git a/src/database/map/stream_prefix.rs b/src/database/map/stream_prefix.rs index 8210e152..a26478aa 100644 --- a/src/database/map/stream_prefix.rs +++ b/src/database/map/stream_prefix.rs @@ -14,7 +14,7 @@ use crate::keyval::{KeyVal, result_deserialize, serialize_key}; pub fn stream_prefix<'a, K, V, P>( self: &'a Arc, prefix: &P, -) -> impl Stream>> + Send + use<'a, K, V, P> +) -> impl Stream>> + Send + use<'a, K, V, P> where P: Serialize + ?Sized + Debug, K: Deserialize<'a> + Send, @@ -50,7 +50,7 @@ where pub fn stream_raw_prefix<'a, K, V, P>( self: &'a Arc, prefix: &'a P, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, K: Deserialize<'a> + Send + 'a, @@ -68,7 +68,7 @@ where pub fn raw_stream_prefix<'a, P>( self: &'a Arc, prefix: &'a P, -) -> impl Stream>> + Send + 'a +) -> impl Stream>> + Send + 'a where P: AsRef<[u8]> + ?Sized + Debug + Sync + 'a, { diff --git a/src/database/maps.rs b/src/database/maps.rs index da97ef45..214dbf34 100644 --- a/src/database/maps.rs +++ b/src/database/maps.rs @@ -374,10 +374,6 @@ pub(super) static MAPS: &[Descriptor] = &[ name: "userid_masterkeyid", ..descriptor::RANDOM_SMALL }, - Descriptor { - name: "userid_origin", - ..descriptor::RANDOM - }, Descriptor { name: "userid_password", ..descriptor::RANDOM diff --git a/src/database/mod.rs b/src/database/mod.rs index 7932fbcb..ffcefee9 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -3,8 +3,6 @@ extern crate conduwuit_core as conduwuit; extern crate rust_rocksdb as rocksdb; -use ctor::{ctor, dtor}; - conduwuit::mod_ctor! {} conduwuit::mod_dtor! {} conduwuit::rustc_flags_capture! {} diff --git a/src/database/pool.rs b/src/database/pool.rs index 3421f779..285aaf25 100644 --- a/src/database/pool.rs +++ b/src/database/pool.rs @@ -443,7 +443,7 @@ pub(crate) fn into_send_seek(result: stream::State<'_>) -> stream::State<'static unsafe { std::mem::transmute(result) } } -fn into_recv_seek(result: stream::State<'static>) -> stream::State<'static> { +fn into_recv_seek(result: stream::State<'static>) -> stream::State<'_> { // SAFETY: This is to receive the State from the channel; see above. unsafe { std::mem::transmute(result) } } diff --git a/src/database/tests.rs b/src/database/tests.rs index 30562a66..c1a9f47c 100644 --- a/src/database/tests.rs +++ b/src/database/tests.rs @@ -326,7 +326,7 @@ fn ser_array() { } #[test] -#[ignore = "arrayvec deserialization is not implemented (separators)"] +#[ignore] fn de_array() { let a: u64 = 123_456; let b: u64 = 987_654; @@ -358,7 +358,7 @@ fn de_array() { } #[test] -#[ignore = "Nested sequences are not supported"] +#[ignore] fn de_complex() { type Key<'a> = (&'a UserId, ArrayVec, &'a RoomId); diff --git a/src/macros/rustc.rs b/src/macros/rustc.rs index f302b152..cf935fe5 100644 --- a/src/macros/rustc.rs +++ b/src/macros/rustc.rs @@ -13,13 +13,13 @@ pub(super) fn flags_capture(args: TokenStream) -> TokenStream { let ret = quote! { pub static RUSTC_FLAGS: [&str; #flag_len] = [#( #flag ),*]; - #[ctor] + #[conduwuit_core::ctor] fn _set_rustc_flags() { conduwuit_core::info::rustc::FLAGS.lock().insert(#crate_name, &RUSTC_FLAGS); } // static strings have to be yanked on module unload - #[dtor] + #[conduwuit_core::dtor] fn _unset_rustc_flags() { conduwuit_core::info::rustc::FLAGS.lock().remove(#crate_name); } diff --git a/src/main/Cargo.toml b/src/main/Cargo.toml index 388ad503..0d7dd844 100644 --- a/src/main/Cargo.toml +++ b/src/main/Cargo.toml @@ -32,12 +32,12 @@ a cool hard fork of Conduit, a Matrix homeserver written in Rust""" section = "net" priority = "optional" conf-files = ["/etc/conduwuit/conduwuit.toml"] -maintainer-scripts = "../../pkg/debian/" -systemd-units = { unit-name = "conduwuit", start = false, unit-scripts = "../../pkg/" } +maintainer-scripts = "../../debian/" +systemd-units = { unit-name = "conduwuit", start = false } assets = [ - ["../../pkg/debian/README.md", "usr/share/doc/conduwuit/README.Debian", "644"], + ["../../debian/README.md", "usr/share/doc/conduwuit/README.Debian", "644"], ["../../README.md", "usr/share/doc/conduwuit/", "644"], - ["../../target/release/conduwuit", "usr/bin/conduwuit", "755"], + ["../../target/release/conduwuit", "usr/sbin/conduwuit", "755"], ["../../conduwuit-example.toml", "etc/conduwuit/conduwuit.toml", "640"], ] @@ -56,7 +56,6 @@ standard = [ "jemalloc", "jemalloc_conf", "journald", - "ldap", "media_thumbnail", "systemd", "url_preview", @@ -64,7 +63,7 @@ standard = [ ] full = [ "standard", - # "hardened_malloc", # Conflicts with jemalloc + "hardened_malloc", "jemalloc_prof", "perf_measurements", "tokio_console" @@ -115,9 +114,6 @@ jemalloc_stats = [ jemalloc_conf = [ "conduwuit-core/jemalloc_conf", ] -ldap = [ - "conduwuit-api/ldap", -] media_thumbnail = [ "conduwuit-service/media_thumbnail", ] @@ -126,8 +122,7 @@ perf_measurements = [ "dep:tracing-flame", "dep:tracing-opentelemetry", "dep:opentelemetry_sdk", - "dep:opentelemetry-otlp", - "dep:opentelemetry-jaeger-propagator", + "dep:opentelemetry-jaeger", "conduwuit-core/perf_measurements", "conduwuit-core/sentry_telemetry", ] @@ -203,14 +198,11 @@ clap.workspace = true console-subscriber.optional = true console-subscriber.workspace = true const-str.workspace = true -ctor.workspace = true log.workspace = true +opentelemetry-jaeger.optional = true +opentelemetry-jaeger.workspace = true opentelemetry.optional = true opentelemetry.workspace = true -opentelemetry-otlp.optional = true -opentelemetry-otlp.workspace = true -opentelemetry-jaeger-propagator.optional = true -opentelemetry-jaeger-propagator.workspace = true opentelemetry_sdk.optional = true opentelemetry_sdk.workspace = true sentry-tower.optional = true @@ -230,7 +222,6 @@ tracing-subscriber.workspace = true tracing.workspace = true tracing-journald = { workspace = true, optional = true } - [target.'cfg(all(not(target_env = "msvc"), target_os = "linux"))'.dependencies] hardened_malloc-rs.workspace = true hardened_malloc-rs.optional = true diff --git a/src/main/logging.rs b/src/main/logging.rs index 57b56707..b7beb103 100644 --- a/src/main/logging.rs +++ b/src/main/logging.rs @@ -7,8 +7,6 @@ use conduwuit_core::{ log::{ConsoleFormat, ConsoleWriter, LogLevelReloadHandles, capture, fmt_span}, result::UnwrapOrErr, }; -#[cfg(feature = "perf_measurements")] -use opentelemetry::trace::TracerProvider; use tracing_subscriber::{EnvFilter, Layer, Registry, fmt, layer::SubscriberExt, reload}; #[cfg(feature = "perf_measurements")] @@ -89,35 +87,30 @@ pub(crate) fn init( (None, None) }; - let otlp_filter = EnvFilter::try_new(&config.otlp_filter) - .map_err(|e| err!(Config("otlp_filter", "{e}.")))?; + let jaeger_filter = EnvFilter::try_new(&config.jaeger_filter) + .map_err(|e| err!(Config("jaeger_filter", "{e}.")))?; - let otlp_layer = config.allow_otlp.then(|| { + let jaeger_layer = config.allow_jaeger.then(|| { opentelemetry::global::set_text_map_propagator( - opentelemetry_jaeger_propagator::Propagator::new(), + opentelemetry_jaeger::Propagator::new(), ); - let exporter = opentelemetry_otlp::SpanExporter::builder() - .with_http() - .build() - .expect("Failed to create OTLP exporter"); - - let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() - .with_batch_exporter(exporter) - .build(); - - let tracer = provider.tracer(conduwuit_core::name()); + let tracer = opentelemetry_jaeger::new_agent_pipeline() + .with_auto_split_batch(true) + .with_service_name(conduwuit_core::name()) + .install_batch(opentelemetry_sdk::runtime::Tokio) + .expect("jaeger agent pipeline"); let telemetry = tracing_opentelemetry::layer().with_tracer(tracer); - let (otlp_reload_filter, otlp_reload_handle) = - reload::Layer::new(otlp_filter.clone()); - reload_handles.add("otlp", Box::new(otlp_reload_handle)); + let (jaeger_reload_filter, jaeger_reload_handle) = + reload::Layer::new(jaeger_filter.clone()); + reload_handles.add("jaeger", Box::new(jaeger_reload_handle)); - Some(telemetry.with_filter(otlp_reload_filter)) + Some(telemetry.with_filter(jaeger_reload_filter)) }); - let subscriber = subscriber.with(flame_layer).with(otlp_layer); + let subscriber = subscriber.with(flame_layer).with(jaeger_layer); (subscriber, flame_guard) }; diff --git a/src/main/mod.rs b/src/main/mod.rs index ba59549c..7097c67d 100644 --- a/src/main/mod.rs +++ b/src/main/mod.rs @@ -13,7 +13,6 @@ mod sentry; mod server; mod signal; -use ctor::{ctor, dtor}; use server::Server; rustc_flags_capture! {} diff --git a/src/router/Cargo.toml b/src/router/Cargo.toml index 9545c480..9fcb8d6a 100644 --- a/src/router/Cargo.toml +++ b/src/router/Cargo.toml @@ -125,7 +125,6 @@ tokio.workspace = true tower.workspace = true tower-http.workspace = true tracing.workspace = true -ctor.workspace = true [target.'cfg(all(unix, target_os = "linux"))'.dependencies] sd-notify.workspace = true diff --git a/src/router/mod.rs b/src/router/mod.rs index 416ceea7..7038c5df 100644 --- a/src/router/mod.rs +++ b/src/router/mod.rs @@ -12,7 +12,6 @@ use std::{panic::AssertUnwindSafe, pin::Pin, sync::Arc}; use conduwuit::{Error, Result, Server}; use conduwuit_service::Services; -use ctor::{ctor, dtor}; use futures::{Future, FutureExt, TryFutureExt}; conduwuit::mod_ctor! {} diff --git a/src/router/serve/unix.rs b/src/router/serve/unix.rs index 9bb3dd6e..2af17274 100644 --- a/src/router/serve/unix.rs +++ b/src/router/serve/unix.rs @@ -30,7 +30,7 @@ use tower::{Service, ServiceExt}; type MakeService = IntoMakeServiceWithConnectInfo; -const NULL_ADDR: net::SocketAddr = net::SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 0); +const NULL_ADDR: net::SocketAddr = net::SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0); const FINI_POLL_INTERVAL: Duration = Duration::from_millis(750); #[tracing::instrument(skip_all, level = "debug")] diff --git a/src/service/Cargo.toml b/src/service/Cargo.toml index e4abb9bb..fdebd1d7 100644 --- a/src/service/Cargo.toml +++ b/src/service/Cargo.toml @@ -53,9 +53,6 @@ jemalloc_stats = [ "conduwuit-core/jemalloc_stats", "conduwuit-database/jemalloc_stats", ] -ldap = [ - "dep:ldap3" -] media_thumbnail = [ "dep:image", ] @@ -92,8 +89,6 @@ image.workspace = true image.optional = true ipaddress.workspace = true itertools.workspace = true -ldap3.workspace = true -ldap3.optional = true log.workspace = true loole.workspace = true lru-cache.workspace = true @@ -117,7 +112,6 @@ webpage.optional = true blurhash.workspace = true blurhash.optional = true recaptcha-verify = { version = "0.1.5", default-features = false } -ctor.workspace = true [lints] workspace = true diff --git a/src/service/admin/create.rs b/src/service/admin/create.rs index 755673fe..157b4d65 100644 --- a/src/service/admin/create.rs +++ b/src/service/admin/create.rs @@ -38,7 +38,7 @@ pub async fn create_admin_room(services: &Services) -> Result { // Create a user for the server let server_user = services.globals.server_user.as_ref(); - services.users.create(server_user, None, None).await?; + services.users.create(server_user, None)?; let create_content = { use RoomVersionId::*; diff --git a/src/service/appservice/mod.rs b/src/service/appservice/mod.rs index adbf3b6e..7be8a471 100644 --- a/src/service/appservice/mod.rs +++ b/src/service/appservice/mod.rs @@ -4,14 +4,14 @@ mod registration_info; use std::{collections::BTreeMap, iter::IntoIterator, sync::Arc}; use async_trait::async_trait; -use conduwuit::{Err, Result, err, utils::stream::IterStream}; +use conduwuit::{Result, err, utils::stream::IterStream}; use database::Map; use futures::{Future, FutureExt, Stream, TryStreamExt}; use ruma::{RoomAliasId, RoomId, UserId, api::appservice::Registration}; use tokio::sync::{RwLock, RwLockReadGuard}; pub use self::{namespace_regex::NamespaceRegex, registration_info::RegistrationInfo}; -use crate::{Dep, globals, sending, users}; +use crate::{Dep, sending}; pub struct Service { registration_info: RwLock, @@ -20,9 +20,7 @@ pub struct Service { } struct Services { - globals: Dep, sending: Dep, - users: Dep, } struct Data { @@ -37,9 +35,7 @@ impl crate::Service for Service { Ok(Arc::new(Self { registration_info: RwLock::new(BTreeMap::new()), services: Services { - globals: args.depend::("globals"), sending: args.depend::("sending"), - users: args.depend::("users"), }, db: Data { id_appserviceregistrations: args.db["id_appserviceregistrations"].clone(), @@ -48,93 +44,23 @@ impl crate::Service for Service { } async fn worker(self: Arc) -> Result { - // First, collect all appservices to check for token conflicts - let appservices: Vec<(String, Registration)> = self.iter_db_ids().try_collect().await?; + // Inserting registrations into cache + self.iter_db_ids() + .try_for_each(async |appservice| { + self.registration_info + .write() + .await + .insert(appservice.0, appservice.1.try_into()?); - // Check for appservice-to-appservice token conflicts - for i in 0..appservices.len() { - for j in i.saturating_add(1)..appservices.len() { - if appservices[i].1.as_token == appservices[j].1.as_token { - return Err!(Database(error!( - "Token collision detected: Appservices '{}' and '{}' have the same token", - appservices[i].0, appservices[j].0 - ))); - } - } - } - - // Process each appservice - for (id, registration) in appservices { - // During startup, resolve any token collisions in favour of appservices - // by logging out conflicting user devices - if let Ok((user_id, device_id)) = self - .services - .users - .find_from_token(®istration.as_token) - .await - { - conduwuit::warn!( - "Token collision detected during startup: Appservice '{}' token was also \ - used by user '{}' device '{}'. Logging out the user device to resolve \ - conflict.", - id, - user_id.localpart(), - device_id - ); - - self.services - .users - .remove_device(&user_id, &device_id) - .await; - } - - self.start_appservice(id, registration).await?; - } - - Ok(()) + Ok(()) + }) + .await } fn name(&self) -> &str { crate::service::make_name(std::module_path!()) } } impl Service { - /// Starts an appservice, ensuring its sender_localpart user exists and is - /// active. Creates the user if it doesn't exist, or reactivates it if it - /// was deactivated. Then registers the appservice in memory for request - /// handling. - async fn start_appservice(&self, id: String, registration: Registration) -> Result { - let appservice_user_id = UserId::parse_with_server_name( - registration.sender_localpart.as_str(), - self.services.globals.server_name(), - )?; - - if !self.services.users.exists(&appservice_user_id).await { - self.services - .users - .create(&appservice_user_id, None, None) - .await?; - } else if self - .services - .users - .is_deactivated(&appservice_user_id) - .await - .unwrap_or(false) - { - // Reactivate the appservice user if it was accidentally deactivated - self.services - .users - .set_password(&appservice_user_id, None) - .await?; - } - - self.registration_info - .write() - .await - .insert(id, registration.try_into()?); - - Ok(()) - } - /// Registers an appservice and returns the ID to the caller pub async fn register_appservice( &self, @@ -142,40 +68,15 @@ impl Service { appservice_config_body: &str, ) -> Result { //TODO: Check for collisions between exclusive appservice namespaces - - // Check for token collision with other appservices (allow re-registration of - // same appservice) - if let Ok(existing) = self.find_from_token(®istration.as_token).await { - if existing.registration.id != registration.id { - return Err(err!(Request(InvalidParam( - "Cannot register appservice: Token is already used by appservice '{}'. \ - Please generate a different token.", - existing.registration.id - )))); - } - } - - // Prevent token collision with existing user tokens - if self - .services - .users - .find_from_token(®istration.as_token) + self.registration_info + .write() .await - .is_ok() - { - return Err(err!(Request(InvalidParam( - "Cannot register appservice: The provided token is already in use by a user \ - device. Please generate a different token for the appservice." - )))); - } + .insert(registration.id.clone(), registration.clone().try_into()?); self.db .id_appserviceregistrations .insert(®istration.id, appservice_config_body); - self.start_appservice(registration.id.clone(), registration.clone()) - .await?; - Ok(()) } @@ -212,14 +113,12 @@ impl Service { .map(|info| info.registration) } - /// Returns Result to match users::find_from_token for select_ok usage - pub async fn find_from_token(&self, token: &str) -> Result { + pub async fn find_from_token(&self, token: &str) -> Option { self.read() .await .values() .find(|info| info.registration.as_token == token) .cloned() - .ok_or_else(|| err!(Request(NotFound("Appservice token not found")))) } /// Checks if a given user id matches any exclusive appservice regex diff --git a/src/service/emergency/mod.rs b/src/service/emergency/mod.rs index f8ecbb3e..3a61f710 100644 --- a/src/service/emergency/mod.rs +++ b/src/service/emergency/mod.rs @@ -41,11 +41,6 @@ impl crate::Service for Service { return Ok(()); } - if self.services.config.ldap.enable { - warn!("emergency password feature not available with LDAP enabled."); - return Ok(()); - } - self.set_emergency_access().await.inspect_err(|e| { error!("Could not set the configured emergency password for the server user: {e}"); }) @@ -62,8 +57,7 @@ impl Service { self.services .users - .set_password(server_user, self.services.config.emergency_password.as_deref()) - .await?; + .set_password(server_user, self.services.config.emergency_password.as_deref())?; let (ruleset, pwd_set) = match self.services.config.emergency_password { | Some(_) => (Ruleset::server_default(server_user), true), diff --git a/src/service/migrations.rs b/src/service/migrations.rs index 586d6249..cee638ba 100644 --- a/src/service/migrations.rs +++ b/src/service/migrations.rs @@ -215,8 +215,8 @@ async fn db_lt_12(services: &Services) -> Result<()> { for username in &services .users .list_local_users() - .map(ToOwned::to_owned) - .collect::>() + .map(UserId::to_owned) + .collect::>() .await { let user = match UserId::parse_with_server_name(username.as_str(), &services.server.name) @@ -295,8 +295,8 @@ async fn db_lt_13(services: &Services) -> Result<()> { for username in &services .users .list_local_users() - .map(ToOwned::to_owned) - .collect::>() + .map(UserId::to_owned) + .collect::>() .await { let user = match UserId::parse_with_server_name(username.as_str(), &services.server.name) diff --git a/src/service/mod.rs b/src/service/mod.rs index 2ad0ecd2..3d7a3aa9 100644 --- a/src/service/mod.rs +++ b/src/service/mod.rs @@ -33,7 +33,6 @@ pub mod users; extern crate conduwuit_core as conduwuit; extern crate conduwuit_database as database; -use ctor::{ctor, dtor}; pub(crate) use service::{Args, Dep, Service}; pub use crate::services::Services; diff --git a/src/service/presence/mod.rs b/src/service/presence/mod.rs index e7ce64bc..8f646be6 100644 --- a/src/service/presence/mod.rs +++ b/src/service/presence/mod.rs @@ -183,8 +183,8 @@ impl Service { .services .users .list_local_users() - .map(ToOwned::to_owned) - .collect::>() + .map(UserId::to_owned) + .collect::>() .await { let presence = self.db.get_presence(user_id).await; diff --git a/src/service/pusher/mod.rs b/src/service/pusher/mod.rs index 071bf822..baa7a72e 100644 --- a/src/service/pusher/mod.rs +++ b/src/service/pusher/mod.rs @@ -178,7 +178,7 @@ impl Service { pub fn get_pushkeys<'a>( &'a self, sender: &'a UserId, - ) -> impl Stream + Send + 'a { + ) -> impl Stream + Send + 'a { let prefix = (sender, Interfix); self.db .senderkey_pusher diff --git a/src/service/rooms/alias/mod.rs b/src/service/rooms/alias/mod.rs index c627092e..7675efd4 100644 --- a/src/service/rooms/alias/mod.rs +++ b/src/service/rooms/alias/mod.rs @@ -178,7 +178,7 @@ impl Service { pub fn local_aliases_for_room<'a>( &'a self, room_id: &'a RoomId, - ) -> impl Stream + Send + 'a { + ) -> impl Stream + Send + 'a { let prefix = (room_id, Interfix); self.db .aliasid_alias @@ -188,9 +188,7 @@ impl Service { } #[tracing::instrument(skip(self), level = "debug")] - pub fn all_local_aliases<'a>( - &'a self, - ) -> impl Stream + Send + 'a { + pub fn all_local_aliases<'a>(&'a self) -> impl Stream + Send + 'a { self.db .alias_roomid .stream() diff --git a/src/service/rooms/pdu_metadata/data.rs b/src/service/rooms/pdu_metadata/data.rs index 854c6ea0..c1376cb0 100644 --- a/src/service/rooms/pdu_metadata/data.rs +++ b/src/service/rooms/pdu_metadata/data.rs @@ -60,13 +60,10 @@ impl Data { target: ShortEventId, from: PduCount, dir: Direction, - ) -> impl Stream + Send + 'a { - // Query from exact position then filter excludes it (saturating_inc could skip - // events at min/max boundaries) - let from_unsigned = from.into_unsigned(); + ) -> impl Stream + Send + '_ { let mut current = ArrayVec::::new(); current.extend(target.to_be_bytes()); - current.extend(from_unsigned.to_be_bytes()); + current.extend(from.saturating_inc(dir).into_unsigned().to_be_bytes()); let current = current.as_slice(); match dir { | Direction::Forward => self.tofrom_relation.raw_keys_from(current).boxed(), @@ -76,17 +73,6 @@ impl Data { .ready_take_while(move |key| key.starts_with(&target.to_be_bytes())) .map(|to_from| u64_from_u8(&to_from[8..16])) .map(PduCount::from_unsigned) - .ready_filter(move |count| { - if from == PduCount::min() || from == PduCount::max() { - true - } else { - let count_unsigned = count.into_unsigned(); - match dir { - | Direction::Forward => count_unsigned > from_unsigned, - | Direction::Backward => count_unsigned < from_unsigned, - } - } - }) .wide_filter_map(move |shorteventid| async move { let pdu_id: RawPduId = PduId { shortroomid, shorteventid }.into(); diff --git a/src/service/rooms/read_receipt/data.rs b/src/service/rooms/read_receipt/data.rs index 9a2fa70c..62f87948 100644 --- a/src/service/rooms/read_receipt/data.rs +++ b/src/service/rooms/read_receipt/data.rs @@ -65,7 +65,7 @@ impl Data { &'a self, room_id: &'a RoomId, since: u64, - ) -> impl Stream> + Send + 'a { + ) -> impl Stream> + Send + 'a { type Key<'a> = (&'a RoomId, u64, &'a UserId); type KeyVal<'a> = (Key<'a>, CanonicalJsonObject); diff --git a/src/service/rooms/read_receipt/mod.rs b/src/service/rooms/read_receipt/mod.rs index 64081a2c..68ce9b7f 100644 --- a/src/service/rooms/read_receipt/mod.rs +++ b/src/service/rooms/read_receipt/mod.rs @@ -112,7 +112,7 @@ impl Service { &'a self, room_id: &'a RoomId, since: u64, - ) -> impl Stream> + Send + 'a { + ) -> impl Stream> + Send + 'a { self.db.readreceipts_since(room_id, since) } diff --git a/src/service/rooms/search/mod.rs b/src/service/rooms/search/mod.rs index ea2f90af..afe3061b 100644 --- a/src/service/rooms/search/mod.rs +++ b/src/service/rooms/search/mod.rs @@ -104,7 +104,7 @@ pub fn deindex_pdu(&self, shortroomid: ShortRoomId, pdu_id: &RawPduId, message_b pub async fn search_pdus<'a>( &'a self, query: &'a RoomQuery<'a>, -) -> Result<(usize, impl Stream> + Send + 'a)> { +) -> Result<(usize, impl Stream> + Send + '_)> { let pdu_ids: Vec<_> = self.search_pdu_ids(query).await?.collect().await; let filter = &query.criteria.filter; @@ -137,10 +137,10 @@ pub async fn search_pdus<'a>( // result is modeled as a stream such that callers don't have to be refactored // though an additional async/wrap still exists for now #[implement(Service)] -pub async fn search_pdu_ids<'a>( - &'a self, - query: &'a RoomQuery<'_>, -) -> Result + Send + 'a + use<'a>> { +pub async fn search_pdu_ids( + &self, + query: &RoomQuery<'_>, +) -> Result + Send + '_ + use<'_>> { let shortroomid = self.services.short.get_shortroomid(query.room_id).await?; let pdu_ids = self.search_pdu_ids_query_room(query, shortroomid).await; @@ -173,7 +173,7 @@ fn search_pdu_ids_query_words<'a>( &'a self, shortroomid: ShortRoomId, word: &'a str, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + '_ { self.search_pdu_ids_query_word(shortroomid, word) .map(move |key| -> RawPduId { let key = &key[prefix_len(word)..]; @@ -183,11 +183,11 @@ fn search_pdu_ids_query_words<'a>( /// Iterate over raw database results for a word #[implement(Service)] -fn search_pdu_ids_query_word<'a>( - &'a self, +fn search_pdu_ids_query_word( + &self, shortroomid: ShortRoomId, - word: &'a str, -) -> impl Stream> + Send + 'a + use<'a> { + word: &str, +) -> impl Stream> + Send + '_ + use<'_> { // rustc says const'ing this not yet stable let end_id: RawPduId = PduId { shortroomid, diff --git a/src/service/rooms/short/mod.rs b/src/service/rooms/short/mod.rs index 660bb7de..06ff6493 100644 --- a/src/service/rooms/short/mod.rs +++ b/src/service/rooms/short/mod.rs @@ -62,7 +62,7 @@ pub async fn get_or_create_shorteventid(&self, event_id: &EventId) -> ShortEvent pub fn multi_get_or_create_shorteventid<'a, I>( &'a self, event_ids: I, -) -> impl Stream + Send + 'a +) -> impl Stream + Send + '_ where I: Iterator + Clone + Debug + Send + 'a, { diff --git a/src/service/rooms/state/mod.rs b/src/service/rooms/state/mod.rs index 386adf9d..641aa6a9 100644 --- a/src/service/rooms/state/mod.rs +++ b/src/service/rooms/state/mod.rs @@ -388,7 +388,7 @@ impl Service { pub fn get_forward_extremities<'a>( &'a self, room_id: &'a RoomId, - ) -> impl Stream + Send + 'a { + ) -> impl Stream + Send + '_ { let prefix = (room_id, Interfix); self.db diff --git a/src/service/rooms/state_cache/mod.rs b/src/service/rooms/state_cache/mod.rs index 2d8f5cc5..e9845fbf 100644 --- a/src/service/rooms/state_cache/mod.rs +++ b/src/service/rooms/state_cache/mod.rs @@ -144,7 +144,7 @@ pub fn clear_appservice_in_room_cache(&self) { self.appservice_in_room_cache.wri pub fn room_servers<'a>( &'a self, room_id: &'a RoomId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { let prefix = (room_id, Interfix); self.db .roomserverids @@ -167,7 +167,7 @@ pub async fn server_in_room<'a>(&'a self, server: &'a ServerName, room_id: &'a R pub fn server_rooms<'a>( &'a self, server: &'a ServerName, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { let prefix = (server, Interfix); self.db .serverroomids @@ -202,7 +202,7 @@ pub fn get_shared_rooms<'a>( &'a self, user_a: &'a UserId, user_b: &'a UserId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { use conduwuit::utils::set; let a = self.rooms_joined(user_a); @@ -216,7 +216,7 @@ pub fn get_shared_rooms<'a>( pub fn room_members<'a>( &'a self, room_id: &'a RoomId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { let prefix = (room_id, Interfix); self.db .roomuserid_joined @@ -239,7 +239,7 @@ pub async fn room_joined_count(&self, room_id: &RoomId) -> Result { pub fn local_users_in_room<'a>( &'a self, room_id: &'a RoomId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { self.room_members(room_id) .ready_filter(|user| self.services.globals.user_is_local(user)) } @@ -251,7 +251,7 @@ pub fn local_users_in_room<'a>( pub fn active_local_users_in_room<'a>( &'a self, room_id: &'a RoomId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { self.local_users_in_room(room_id) .filter(|user| self.services.users.is_active(user)) } @@ -273,7 +273,7 @@ pub async fn room_invited_count(&self, room_id: &RoomId) -> Result { pub fn room_useroncejoined<'a>( &'a self, room_id: &'a RoomId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { let prefix = (room_id, Interfix); self.db .roomuseroncejoinedids @@ -288,7 +288,7 @@ pub fn room_useroncejoined<'a>( pub fn room_members_invited<'a>( &'a self, room_id: &'a RoomId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { let prefix = (room_id, Interfix); self.db .roomuserid_invitecount @@ -303,7 +303,7 @@ pub fn room_members_invited<'a>( pub fn room_members_knocked<'a>( &'a self, room_id: &'a RoomId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { let prefix = (room_id, Interfix); self.db .roomuserid_knockedcount @@ -347,7 +347,7 @@ pub async fn get_left_count(&self, room_id: &RoomId, user_id: &UserId) -> Result pub fn rooms_joined<'a>( &'a self, user_id: &'a UserId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { self.db .userroomid_joined .keys_raw_prefix(user_id) diff --git a/src/service/rooms/state_cache/update.rs b/src/service/rooms/state_cache/update.rs index 86c1afe7..32c67947 100644 --- a/src/service/rooms/state_cache/update.rs +++ b/src/service/rooms/state_cache/update.rs @@ -49,7 +49,7 @@ pub async fn update_membership( #[allow(clippy::collapsible_if)] if !self.services.globals.user_is_local(user_id) { if !self.services.users.exists(user_id).await { - self.services.users.create(user_id, None, None).await?; + self.services.users.create(user_id, None)?; } } diff --git a/src/service/rooms/state_cache/via.rs b/src/service/rooms/state_cache/via.rs index 24d92a21..a818cc04 100644 --- a/src/service/rooms/state_cache/via.rs +++ b/src/service/rooms/state_cache/via.rs @@ -81,7 +81,7 @@ pub async fn servers_route_via(&self, room_id: &RoomId) -> Result( &'a self, room_id: &'a RoomId, -) -> impl Stream + Send + 'a { +) -> impl Stream + Send + 'a { type KeyVal<'a> = (Ignore, Vec<&'a ServerName>); self.db diff --git a/src/service/rooms/state_compressor/mod.rs b/src/service/rooms/state_compressor/mod.rs index 028c3e51..f7f7d043 100644 --- a/src/service/rooms/state_compressor/mod.rs +++ b/src/service/rooms/state_compressor/mod.rs @@ -452,7 +452,7 @@ async fn get_statediff(&self, shortstatehash: ShortStateHash) -> Result Re .boxed(); while let Some(ref backfill_server) = servers.next().await { - info!("Asking {backfill_server} for backfill in {room_id}"); + info!("Asking {backfill_server} for backfill"); let response = self .services .sending @@ -129,126 +128,10 @@ pub async fn backfill_if_required(&self, room_id: &RoomId, from: PduCount) -> Re } } - warn!("No servers could backfill, but backfill was needed in room {room_id}"); + info!("No servers could backfill, but backfill was needed in room {room_id}"); Ok(()) } -#[implement(super::Service)] -#[tracing::instrument(name = "get_remote_pdu", level = "debug", skip(self))] -pub async fn get_remote_pdu(&self, room_id: &RoomId, event_id: &EventId) -> Result { - let local = self.get_pdu(event_id).await; - if local.is_ok() { - // We already have this PDU, no need to backfill - debug!("We already have {event_id} in {room_id}, no need to backfill."); - return local; - } - debug!("Preparing to fetch event {event_id} in room {room_id} from remote servers."); - // Similar to backfill_if_required, but only for a single PDU - // Fetch a list of servers to try - if self - .services - .state_cache - .room_joined_count(room_id) - .await - .is_ok_and(|count| count <= 1) - && !self - .services - .state_accessor - .is_world_readable(room_id) - .await - { - // Room is empty (1 user or none), there is no one that can backfill - return Err!(Request(NotFound("No one can backfill this PDU, room is empty."))); - } - - let power_levels: RoomPowerLevelsEventContent = self - .services - .state_accessor - .room_state_get_content(room_id, &StateEventType::RoomPowerLevels, "") - .await - .unwrap_or_default(); - - let room_mods = power_levels.users.iter().filter_map(|(user_id, level)| { - if level > &power_levels.users_default && !self.services.globals.user_is_local(user_id) { - Some(user_id.server_name()) - } else { - None - } - }); - - let canonical_room_alias_server = once( - self.services - .state_accessor - .get_canonical_alias(room_id) - .await, - ) - .filter_map(Result::ok) - .map(|alias| alias.server_name().to_owned()) - .stream(); - let mut servers = room_mods - .stream() - .map(ToOwned::to_owned) - .chain(canonical_room_alias_server) - .chain( - self.services - .server - .config - .trusted_servers - .iter() - .map(ToOwned::to_owned) - .stream(), - ) - .ready_filter(|server_name| !self.services.globals.server_is_ours(server_name)) - .filter_map(|server_name| async move { - self.services - .state_cache - .server_in_room(&server_name, room_id) - .await - .then_some(server_name) - }) - .boxed(); - - while let Some(ref backfill_server) = servers.next().await { - info!("Asking {backfill_server} for event {}", event_id); - let value = self - .services - .sending - .send_federation_request(backfill_server, federation::event::get_event::v1::Request { - event_id: event_id.to_owned(), - include_unredacted_content: Some(false), - }) - .await - .and_then(|response| { - serde_json::from_str::(response.pdu.get()).map_err(|e| { - err!(BadServerResponse(debug_warn!( - "Error parsing incoming event {e:?} from {backfill_server}" - ))) - }) - }); - let pdu = match value { - | Ok(value) => { - self.services - .event_handler - .handle_incoming_pdu(backfill_server, room_id, event_id, value, false) - .boxed() - .await?; - debug!("Successfully backfilled {event_id} from {backfill_server}"); - Some(self.get_pdu(event_id).await) - }, - | Err(e) => { - warn!("{backfill_server} failed to provide backfill for room {room_id}: {e}"); - None - }, - }; - if let Some(pdu) = pdu { - debug!("Fetched {event_id} from {backfill_server}"); - return pdu; - } - } - - Err!("No servers could be used to fetch {} in {}.", room_id, event_id) -} - #[implement(super::Service)] #[tracing::instrument(skip(self, pdu), level = "debug")] pub async fn backfill_pdu(&self, origin: &ServerName, pdu: Box) -> Result<()> { diff --git a/src/service/rooms/timeline/create.rs b/src/service/rooms/timeline/create.rs index 6732cd8e..66a35eca 100644 --- a/src/service/rooms/timeline/create.rs +++ b/src/service/rooms/timeline/create.rs @@ -165,6 +165,25 @@ pub async fn create_hash_and_sign_event( return Err!(Request(Forbidden("Event is not authorized."))); } + // Check with the policy server + match self + .services + .event_handler + .ask_policy_server(&pdu, room_id) + .await + { + | Ok(true) => {}, + | Ok(false) => { + return Err!(Request(Forbidden(debug_warn!( + "Policy server marked this event as spam" + )))); + }, + | Err(e) => { + // fail open + warn!("Failed to check event with policy server: {e}"); + }, + } + // Hash and sign let mut pdu_json = utils::to_canonical_object(&pdu).map_err(|e| { err!(Request(BadJson(warn!("Failed to convert PDU to canonical JSON: {e}")))) @@ -203,25 +222,6 @@ pub async fn create_hash_and_sign_event( pdu_json.insert("event_id".into(), CanonicalJsonValue::String(pdu.event_id.clone().into())); - // Check with the policy server - match self - .services - .event_handler - .ask_policy_server(&pdu, room_id) - .await - { - | Ok(true) => {}, - | Ok(false) => { - return Err!(Request(Forbidden(debug_warn!( - "Policy server marked this event as spam" - )))); - }, - | Err(e) => { - // fail open - warn!("Failed to check event with policy server: {e}"); - }, - } - // Generate short event id let _shorteventid = self .services diff --git a/src/service/rooms/timeline/data.rs b/src/service/rooms/timeline/data.rs index 9064df6c..fa10a5c0 100644 --- a/src/service/rooms/timeline/data.rs +++ b/src/service/rooms/timeline/data.rs @@ -3,7 +3,8 @@ use std::{borrow::Borrow, sync::Arc}; use conduwuit::{ Err, PduCount, PduEvent, Result, at, err, result::{LogErr, NotFound}, - utils::{self, stream::TryReadyExt}, + utils, + utils::stream::TryReadyExt, }; use database::{Database, Deserialized, Json, KeyVal, Map}; use futures::{FutureExt, Stream, TryFutureExt, TryStreamExt, future::select_ok, pin_mut}; diff --git a/src/service/users/mod.rs b/src/service/users/mod.rs index 6ddd8d79..d2dfccd9 100644 --- a/src/service/users/mod.rs +++ b/src/service/users/mod.rs @@ -1,19 +1,11 @@ -#[cfg(feature = "ldap")] -use std::collections::HashMap; use std::{collections::BTreeMap, mem, sync::Arc}; -#[cfg(feature = "ldap")] -use conduwuit::result::LogErr; use conduwuit::{ - Err, Error, Result, Server, at, debug_warn, err, is_equal_to, trace, + Err, Error, Result, Server, at, debug_warn, err, trace, utils::{self, ReadyExt, stream::TryIgnore, string::Unquoted}, }; -#[cfg(feature = "ldap")] -use conduwuit_core::{debug, error}; use database::{Deserialized, Ignore, Interfix, Json, Map}; use futures::{Stream, StreamExt, TryFutureExt}; -#[cfg(feature = "ldap")] -use ldap3::{LdapConnAsync, Scope, SearchEntry}; use ruma::{ DeviceId, KeyId, MilliSecondsSinceUnixEpoch, OneTimeKeyAlgorithm, OneTimeKeyId, OneTimeKeyName, OwnedDeviceId, OwnedKeyId, OwnedMxcUri, OwnedUserId, RoomId, UInt, UserId, @@ -27,7 +19,7 @@ use ruma::{ use serde::{Deserialize, Serialize}; use serde_json::json; -use crate::{Dep, account_data, admin, appservice, globals, rooms}; +use crate::{Dep, account_data, admin, globals, rooms}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct UserSuspension { @@ -48,7 +40,6 @@ struct Services { server: Arc, account_data: Dep, admin: Dep, - appservice: Dep, globals: Dep, state_accessor: Dep, state_cache: Dep, @@ -71,7 +62,6 @@ struct Data { userid_displayname: Arc, userid_lastonetimekeyupdate: Arc, userid_masterkeyid: Arc, - userid_origin: Arc, userid_password: Arc, userid_suspension: Arc, userid_selfsigningkeyid: Arc, @@ -86,7 +76,6 @@ impl crate::Service for Service { server: args.server.clone(), account_data: args.depend::("account_data"), admin: args.depend::("admin"), - appservice: args.depend::("appservice"), globals: args.depend::("globals"), state_accessor: args .depend::("rooms::state_accessor"), @@ -109,7 +98,6 @@ impl crate::Service for Service { userid_displayname: args.db["userid_displayname"].clone(), userid_lastonetimekeyupdate: args.db["userid_lastonetimekeyupdate"].clone(), userid_masterkeyid: args.db["userid_masterkeyid"].clone(), - userid_origin: args.db["userid_origin"].clone(), userid_password: args.db["userid_password"].clone(), userid_suspension: args.db["userid_suspension"].clone(), userid_selfsigningkeyid: args.db["userid_selfsigningkeyid"].clone(), @@ -146,21 +134,9 @@ impl Service { } /// Create a new user account on this homeserver. - /// - /// User origin is by default "password" (meaning that it will login using - /// its user_id/password). Users with other origins (currently only "ldap" - /// is available) have special login processes. #[inline] - pub async fn create( - &self, - user_id: &UserId, - password: Option<&str>, - origin: Option<&str>, - ) -> Result<()> { - self.db - .userid_origin - .insert(user_id, origin.unwrap_or("password")); - self.set_password(user_id, password).await + pub fn create(&self, user_id: &UserId, password: Option<&str>) -> Result<()> { + self.set_password(user_id, password) } /// Deactivate account @@ -174,7 +150,7 @@ impl Service { // result in an empty string, so the user will not be able to log in again. // Systems like changing the password without logging in should check if the // account is deactivated. - self.set_password(user_id, None).await?; + self.set_password(user_id, None)?; // TODO: Unhook 3PID Ok(()) @@ -275,34 +251,13 @@ impl Service { .ready_filter_map(|(u, p): (&UserId, &[u8])| (!p.is_empty()).then_some(u)) } - /// Returns the origin of the user (password/LDAP/...). - pub async fn origin(&self, user_id: &UserId) -> Result { - self.db.userid_origin.get(user_id).await.deserialized() - } - /// Returns the password hash for the given user. pub async fn password_hash(&self, user_id: &UserId) -> Result { self.db.userid_password.get(user_id).await.deserialized() } /// Hash and set the user's password to the Argon2 hash - pub async fn set_password(&self, user_id: &UserId, password: Option<&str>) -> Result<()> { - // Cannot change the password of a LDAP user. There are two special cases : - // - a `None` password can be used to deactivate a LDAP user - // - a "*" password is used as the default password of an active LDAP user - if cfg!(feature = "ldap") - && password.is_some_and(|pwd| pwd != "*") - && self - .db - .userid_origin - .get(user_id) - .await - .deserialized::() - .is_ok_and(is_equal_to!("ldap")) - { - return Err!(Request(InvalidParam("Cannot change password of a LDAP user"))); - } - + pub fn set_password(&self, user_id: &UserId, password: Option<&str>) -> Result<()> { password .map(utils::hash::password) .transpose() @@ -422,7 +377,7 @@ impl Service { pub fn all_device_ids<'a>( &'a self, user_id: &'a UserId, - ) -> impl Stream + Send + 'a { + ) -> impl Stream + Send + 'a { let prefix = (user_id, Interfix); self.db .userdeviceid_metadata @@ -436,31 +391,6 @@ impl Service { self.db.userdeviceid_token.qry(&key).await.deserialized() } - /// Generate a unique access token that doesn't collide with existing tokens - pub async fn generate_unique_token(&self) -> String { - loop { - let token = utils::random_string(32); - - // Check for collision with appservice tokens - if self - .services - .appservice - .find_from_token(&token) - .await - .is_ok() - { - continue; - } - - // Check for collision with user tokens - if self.db.token_userdeviceid.get(&token).await.is_ok() { - continue; - } - - return token; - } - } - /// Replaces the access token of one device. pub async fn set_token( &self, @@ -477,19 +407,6 @@ impl Service { ))); } - // Check for token collision with appservices - if self - .services - .appservice - .find_from_token(token) - .await - .is_ok() - { - return Err!(Request(InvalidParam( - "Token conflicts with an existing appservice token" - ))); - } - // Remove old token if let Ok(old_token) = self.db.userdeviceid_token.qry(&key).await { self.db.token_userdeviceid.remove(&old_token); @@ -770,7 +687,7 @@ impl Service { user_id: &'a UserId, from: u64, to: Option, - ) -> impl Stream + Send + 'a { + ) -> impl Stream + Send + 'a { self.keys_changed_user_or_room(user_id.as_str(), from, to) .map(|(user_id, ..)| user_id) } @@ -781,7 +698,7 @@ impl Service { room_id: &'a RoomId, from: u64, to: Option, - ) -> impl Stream + Send + 'a { + ) -> impl Stream + Send + 'a { self.keys_changed_user_or_room(room_id.as_str(), from, to) } @@ -790,7 +707,7 @@ impl Service { user_or_room_id: &'a str, from: u64, to: Option, - ) -> impl Stream + Send + 'a { + ) -> impl Stream + Send + 'a { type KeyVal<'a> = ((&'a str, u64), &'a UserId); let to = to.unwrap_or(u64::MAX); @@ -1175,154 +1092,6 @@ impl Service { self.db.useridprofilekey_value.del(key); } } - - #[cfg(not(feature = "ldap"))] - pub async fn search_ldap(&self, _user_id: &UserId) -> Result> { - Err!(FeatureDisabled("ldap")) - } - - #[cfg(feature = "ldap")] - pub async fn search_ldap(&self, user_id: &UserId) -> Result> { - let localpart = user_id.localpart().to_owned(); - let lowercased_localpart = localpart.to_lowercase(); - - let config = &self.services.server.config.ldap; - let uri = config - .uri - .as_ref() - .ok_or_else(|| err!(Ldap(error!("LDAP URI is not configured."))))?; - - debug!(?uri, "LDAP creating connection..."); - let (conn, mut ldap) = LdapConnAsync::new(uri.as_str()) - .await - .map_err(|e| err!(Ldap(error!(?user_id, "LDAP connection setup error: {e}"))))?; - - let driver = self.services.server.runtime().spawn(async move { - match conn.drive().await { - | Err(e) => error!("LDAP connection error: {e}"), - | Ok(()) => debug!("LDAP connection completed."), - } - }); - - match (&config.bind_dn, &config.bind_password_file) { - | (Some(bind_dn), Some(bind_password_file)) => { - let bind_pw = String::from_utf8(std::fs::read(bind_password_file)?)?; - ldap.simple_bind(bind_dn, bind_pw.trim()) - .await - .and_then(ldap3::LdapResult::success) - .map_err(|e| err!(Ldap(error!("LDAP bind error: {e}"))))?; - }, - | (..) => {}, - } - - let attr = [&config.uid_attribute, &config.name_attribute]; - - let user_filter = &config.filter.replace("{username}", &lowercased_localpart); - - let (entries, _result) = ldap - .search(&config.base_dn, Scope::Subtree, user_filter, &attr) - .await - .and_then(ldap3::SearchResult::success) - .inspect(|(entries, result)| trace!(?entries, ?result, "LDAP Search")) - .map_err(|e| err!(Ldap(error!(?attr, ?user_filter, "LDAP search error: {e}"))))?; - - let mut dns: HashMap = entries - .into_iter() - .filter_map(|entry| { - let search_entry = SearchEntry::construct(entry); - debug!(?search_entry, "LDAP search entry"); - search_entry - .attrs - .get(&config.uid_attribute) - .into_iter() - .chain(search_entry.attrs.get(&config.name_attribute)) - .any(|ids| ids.contains(&localpart) || ids.contains(&lowercased_localpart)) - .then_some((search_entry.dn, false)) - }) - .collect(); - - if !config.admin_filter.is_empty() { - let admin_base_dn = if config.admin_base_dn.is_empty() { - &config.base_dn - } else { - &config.admin_base_dn - }; - - let admin_filter = &config - .admin_filter - .replace("{username}", &lowercased_localpart); - - let (admin_entries, _result) = ldap - .search(admin_base_dn, Scope::Subtree, admin_filter, &attr) - .await - .and_then(ldap3::SearchResult::success) - .inspect(|(entries, result)| trace!(?entries, ?result, "LDAP Admin Search")) - .map_err(|e| { - err!(Ldap(error!(?attr, ?admin_filter, "Ldap admin search error: {e}"))) - })?; - - dns.extend(admin_entries.into_iter().filter_map(|entry| { - let search_entry = SearchEntry::construct(entry); - debug!(?search_entry, "LDAP search entry"); - search_entry - .attrs - .get(&config.uid_attribute) - .into_iter() - .chain(search_entry.attrs.get(&config.name_attribute)) - .any(|ids| ids.contains(&localpart) || ids.contains(&lowercased_localpart)) - .then_some((search_entry.dn, true)) - })); - } - - ldap.unbind() - .await - .map_err(|e| err!(Ldap(error!("LDAP unbind error: {e}"))))?; - - driver.await.log_err().ok(); - - Ok(dns.drain().collect()) - } - - #[cfg(not(feature = "ldap"))] - pub async fn auth_ldap(&self, _user_dn: &str, _password: &str) -> Result { - Err!(FeatureDisabled("ldap")) - } - - #[cfg(feature = "ldap")] - pub async fn auth_ldap(&self, user_dn: &str, password: &str) -> Result { - let config = &self.services.server.config.ldap; - let uri = config - .uri - .as_ref() - .ok_or_else(|| err!(Ldap(error!("LDAP URI is not configured."))))?; - - debug!(?uri, "LDAP creating connection..."); - let (conn, mut ldap) = LdapConnAsync::new(uri.as_str()) - .await - .map_err(|e| err!(Ldap(error!(?user_dn, "LDAP connection setup error: {e}"))))?; - - let driver = self.services.server.runtime().spawn(async move { - match conn.drive().await { - | Err(e) => error!("LDAP connection error: {e}"), - | Ok(()) => debug!("LDAP connection completed."), - } - }); - - ldap.simple_bind(user_dn, password) - .await - .and_then(ldap3::LdapResult::success) - .map_err(|e| { - err!(Request(Forbidden(debug_error!("LDAP authentication error: {e}")))) - })?; - - ldap.unbind() - .await - .map_err(|e| err!(Ldap(error!("LDAP unbind error: {e}"))))?; - - driver.await.log_err().ok(); - - Ok(()) - } } pub fn parse_master_key(