Compare commits

..

4 commits

Author SHA1 Message Date
nexy7574
7a6be9a28b
WIP: implement user_may_invite callback 2025-04-24 02:35:46 +01:00
Tom Foster
62d7c74c9e Suggested community guidelines changes 2025-04-23 21:48:08 +00:00
nexy7574
c842a1a5ff Bump ruwuma to 652cc48 2025-04-23 21:46:53 +00:00
nexy7574
41cf118a24 Inject reason into federated leave request membership 2025-04-23 21:46:31 +00:00
24 changed files with 163 additions and 489 deletions

View file

@ -1,49 +0,0 @@
on:
- workflow-dispatch
- push
jobs:
build:
runs-on: ubuntu-latest
container:
image: alpine:edge
steps:
- name: set up dependencies
run: |
apk update
apk upgrade
apk add nodejs git alpine-sdk
- uses: actions/checkout@v4
name: checkout the alpine dir
with:
sparse-checkout: "alpine/"
# - uses: actions/checkout@v4
# name: checkout the rest in the alpine dir
# with:
# path: 'alpine/continuwuity'
- name: set up user
run: adduser -DG abuild ci
- name: set up keys
run: |
pwd
mkdir ~/.abuild
echo "${{ secrets.abuild_privkey }}" > ~/.abuild/ci@continuwuity.rsa
echo "${{ secrets.abuild_pubkey }}" > ~/.abuild/ci@continuwuity.rsa.pub
echo $HOME
echo 'PACKAGER_PRIVKEY="/root/.abuild/ci@continuwuity.rsa"' > ~/.abuild/abuild.conf
ls ~/.abuild
- name: go go gadget abuild
run: |
cd alpine
# modify the APKBUILD to use the current branch instead of the release
# note that it seems to require the repo to be public (as you'll get
# a 404 even if the token is provided)
export ARCHIVE_URL="${{ github.server_url }}/${{ github.repository }}/archive/${{ github.ref_name }}.tar.gz"
echo $ARCHIVE_URL
sed -i '/^source=/c\source="'"$ARCHIVE_URL" APKBUILD
abuild -F checksum
abuild -Fr

View file

@ -57,17 +57,17 @@ jobs:
run: npm install --save-dev wrangler@latest run: npm install --save-dev wrangler@latest
- name: Deploy to Cloudflare Pages (Production) - name: Deploy to Cloudflare Pages (Production)
if: github.ref == 'refs/heads/main' && vars.CLOUDFLARE_PROJECT_NAME != '' if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }}
uses: https://github.com/cloudflare/wrangler-action@v3 uses: https://github.com/cloudflare/wrangler-action@v3
with: with:
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: pages deploy ./public --branch="main" --commit-dirty=true --project-name="${{ vars.CLOUDFLARE_PROJECT_NAME }}" command: pages deploy ./public --branch=main --commit-dirty=true --project-name=${{ vars.CLOUDFLARE_PROJECT_NAME }}"
- name: Deploy to Cloudflare Pages (Preview) - name: Deploy to Cloudflare Pages (Preview)
if: github.ref != 'refs/heads/main' && vars.CLOUDFLARE_PROJECT_NAME != '' if: ${{ github.event_name != 'push' || github.ref != 'refs/heads/main' }}
uses: https://github.com/cloudflare/wrangler-action@v3 uses: https://github.com/cloudflare/wrangler-action@v3
with: with:
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: pages deploy ./public --branch="${{ github.head_ref || github.ref_name }}" --commit-dirty=true --project-name="${{ vars.CLOUDFLARE_PROJECT_NAME }}" command: pages deploy ./public --branch=${{ github.head_ref }} --commit-dirty=true --project-name=${{ vars.CLOUDFLARE_PROJECT_NAME }}"

View file

@ -1,127 +0,0 @@
name: Deploy Element Web
on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:
concurrency:
group: "element-${{ github.ref }}"
cancel-in-progress: true
jobs:
build-and-deploy:
name: Build and Deploy Element Web
runs-on: ubuntu-latest
steps:
- name: Setup Node.js
uses: https://code.forgejo.org/actions/setup-node@v4
with:
node-version: "20"
- name: Clone, setup, and build Element Web
run: |
echo "Cloning Element Web..."
git clone https://github.com/maunium/element-web
cd element-web
git checkout develop
git pull
echo "Cloning matrix-js-sdk..."
git clone https://github.com/matrix-org/matrix-js-sdk.git
echo "Installing Yarn..."
npm install -g yarn
echo "Installing dependencies..."
yarn install
echo "Preparing build environment..."
mkdir -p .home
echo "Cleaning up specific node_modules paths..."
rm -rf node_modules/@types/eslint-scope/ matrix-*-sdk/node_modules/@types/eslint-scope || echo "Cleanup paths not found, continuing."
echo "Getting matrix-js-sdk commit hash..."
cd matrix-js-sdk
jsver=$(git rev-parse HEAD)
jsver=${jsver:0:12}
cd ..
echo "matrix-js-sdk version hash: $jsver"
echo "Getting element-web commit hash..."
ver=$(git rev-parse HEAD)
ver=${ver:0:12}
echo "element-web version hash: $ver"
chmod +x ./build-sh
export VERSION="$ver-js-$jsver"
echo "Building Element Web version: $VERSION"
./build-sh
echo "Checking for build output..."
ls -la webapp/
- name: Create config.json
run: |
cat <<EOF > ./element-web/webapp/config.json
{
"default_server_name": "continuwuity.org",
"default_server_config": {
"m.homeserver": {
"base_url": "https://matrix.continuwuity.org"
}
},
"default_country_code": "GB",
"default_theme": "dark",
"mobile_guide_toast": false,
"show_labs_settings": true,
"room_directory": [
"continuwuity.org",
"matrixrooms.info"
],
"settings_defaults": {
"UIFeature.urlPreviews": true,
"UIFeature.feedback": false,
"UIFeature.voip": false,
"UIFeature.shareQrCode": false,
"UIFeature.shareSocial": false,
"UIFeature.locationSharing": false,
"enableSyntaxHighlightLanguageDetection": true
},
"features": {
"feature_pinning": true,
"feature_custom_themes": true
}
}
EOF
echo "Created ./element-web/webapp/config.json"
cat ./element-web/webapp/config.json
- name: Upload Artifact
uses: https://code.forgejo.org/actions/upload-artifact@v3
with:
name: element-web
path: ./element-web/webapp/
retention-days: 14
- name: Install Wrangler
run: npm install --save-dev wrangler@latest
- name: Deploy to Cloudflare Pages (Production)
if: github.ref == 'refs/heads/main' && vars.CLOUDFLARE_PROJECT_NAME != ''
uses: https://github.com/cloudflare/wrangler-action@v3
with:
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: pages deploy ./element-web/webapp --branch="main" --commit-dirty=true --project-name="${{ vars.CLOUDFLARE_PROJECT_NAME }}-element"
- name: Deploy to Cloudflare Pages (Preview)
if: github.ref != 'refs/heads/main' && vars.CLOUDFLARE_PROJECT_NAME != ''
uses: https://github.com/cloudflare/wrangler-action@v3
with:
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
command: pages deploy ./element-web/webapp --branch="${{ github.head_ref || github.ref_name }}" --commit-dirty=true --project-name="${{ vars.CLOUDFLARE_PROJECT_NAME }}-element"

View file

@ -1,25 +1,24 @@
name: Release Docker Image name: Release Docker Image
concurrency: concurrency:
group: "release-image-${{ github.ref }}" group: "release-image-${{ github.ref }}"
on: on:
pull_request: pull_request:
push: push:
paths-ignore: paths-ignore:
- "*.md" - '.gitlab-ci.yml'
- "**/*.md" - '.gitignore'
- ".gitlab-ci.yml" - 'renovate.json'
- ".gitignore" - 'debian/**'
- "renovate.json" - 'docker/**'
- "debian/**" - 'docs/**'
- "docker/**"
- "docs/**"
# Allows you to run this workflow manually from the Actions tab # Allows you to run this workflow manually from the Actions tab
workflow_dispatch: workflow_dispatch:
env: env:
BUILTIN_REGISTRY: forgejo.ellis.link BUILTIN_REGISTRY: forgejo.ellis.link
BUILTIN_REGISTRY_ENABLED: "${{ ((vars.BUILTIN_REGISTRY_USER && secrets.BUILTIN_REGISTRY_PASSWORD) || (github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false)) && 'true' || 'false' }}" BUILTIN_REGISTRY_ENABLED: "${{ ((vars.BUILTIN_REGISTRY_USER && secrets.BUILTIN_REGISTRY_PASSWORD) || (github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false)) && 'true' || 'false' }}"
jobs: jobs:
define-variables: define-variables:
@ -38,7 +37,7 @@ jobs:
script: | script: |
const githubRepo = '${{ github.repository }}'.toLowerCase() const githubRepo = '${{ github.repository }}'.toLowerCase()
const repoId = githubRepo.split('/')[1] const repoId = githubRepo.split('/')[1]
core.setOutput('github_repository', githubRepo) core.setOutput('github_repository', githubRepo)
const builtinImage = '${{ env.BUILTIN_REGISTRY }}/' + githubRepo const builtinImage = '${{ env.BUILTIN_REGISTRY }}/' + githubRepo
let images = [] let images = []
@ -49,7 +48,7 @@ jobs:
core.setOutput('images_list', images.join(",")) core.setOutput('images_list', images.join(","))
const platforms = ['linux/amd64', 'linux/arm64'] const platforms = ['linux/amd64', 'linux/arm64']
core.setOutput('build_matrix', JSON.stringify({ core.setOutput('build_matrix', JSON.stringify({
platform: platforms, platform: platforms,
include: platforms.map(platform => { return { include: platforms.map(platform => { return {
platform, platform,
slug: platform.replace('/', '-') slug: platform.replace('/', '-')
@ -66,15 +65,22 @@ jobs:
attestations: write attestations: write
id-token: write id-token: write
strategy: strategy:
matrix: matrix: {
{ "include": [
"include": {
[ "platform": "linux/amd64",
{ "platform": "linux/amd64", "slug": "linux-amd64" }, "slug": "linux-amd64"
{ "platform": "linux/arm64", "slug": "linux-arm64" }, },
], {
"platform": ["linux/amd64", "linux/arm64"], "platform": "linux/arm64",
} "slug": "linux-arm64"
}
],
"platform": [
"linux/amd64",
"linux/arm64"
]
}
steps: steps:
- name: Echo strategy - name: Echo strategy
run: echo '${{ toJSON(fromJSON(needs.define-variables.outputs.build_matrix)) }}' run: echo '${{ toJSON(fromJSON(needs.define-variables.outputs.build_matrix)) }}'
@ -99,9 +105,9 @@ jobs:
- name: Login to builtin registry - name: Login to builtin registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: ${{ env.BUILTIN_REGISTRY }} registry: ${{ env.BUILTIN_REGISTRY }}
username: ${{ vars.BUILTIN_REGISTRY_USER || github.actor }} username: ${{ vars.BUILTIN_REGISTRY_USER || github.actor }}
password: ${{ secrets.BUILTIN_REGISTRY_PASSWORD || secrets.GITHUB_TOKEN }} password: ${{ secrets.BUILTIN_REGISTRY_PASSWORD || secrets.GITHUB_TOKEN }}
# This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels. # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.
- name: Extract metadata (labels, annotations) for Docker - name: Extract metadata (labels, annotations) for Docker
@ -159,7 +165,7 @@ jobs:
run: | run: |
mkdir -p /tmp/digests mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}" digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}" touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest - name: Upload digest
uses: forgejo/upload-artifact@v4 uses: forgejo/upload-artifact@v4
@ -168,7 +174,7 @@ jobs:
path: /tmp/digests/* path: /tmp/digests/*
if-no-files-found: error if-no-files-found: error
retention-days: 1 retention-days: 1
merge: merge:
runs-on: dind runs-on: dind
container: ghcr.io/catthehacker/ubuntu:act-latest container: ghcr.io/catthehacker/ubuntu:act-latest
@ -184,9 +190,9 @@ jobs:
- name: Login to builtin registry - name: Login to builtin registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
registry: ${{ env.BUILTIN_REGISTRY }} registry: ${{ env.BUILTIN_REGISTRY }}
username: ${{ vars.BUILTIN_REGISTRY_USER || github.actor }} username: ${{ vars.BUILTIN_REGISTRY_USER || github.actor }}
password: ${{ secrets.BUILTIN_REGISTRY_PASSWORD || secrets.GITHUB_TOKEN }} password: ${{ secrets.BUILTIN_REGISTRY_PASSWORD || secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
@ -205,7 +211,7 @@ jobs:
images: ${{needs.define-variables.outputs.images}} images: ${{needs.define-variables.outputs.images}}
# default labels & annotations: https://github.com/docker/metadata-action/blob/master/src/meta.ts#L509 # default labels & annotations: https://github.com/docker/metadata-action/blob/master/src/meta.ts#L509
env: env:
DOCKER_METADATA_ANNOTATIONS_LEVELS: index DOCKER_METADATA_ANNOTATIONS_LEVELS: index
- name: Create manifest list and push - name: Create manifest list and push
working-directory: /tmp/digests working-directory: /tmp/digests

View file

@ -1,3 +1,4 @@
# Contributor Covenant Code of Conduct # Contributor Covenant Code of Conduct
## Our Pledge ## Our Pledge
@ -59,7 +60,8 @@ representative at an online or offline event.
## Enforcement ## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement over Matrix at [#continuwuity:continuwuity.org](https://matrix.to/#/#continuwuity:continuwuity.org) or email at <tom@tcpip.uk>, <jade@continuwuity.org> and <nex@continuwuity.org> respectively. reported to the community leaders responsible for enforcement over email at
<strawberry@puppygock.gay> or over Matrix at @strawberry:puppygock.gay.
All complaints will be reviewed and investigated promptly and fairly. All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the All community leaders are obligated to respect the privacy and security of the

View file

@ -4,7 +4,7 @@ This page is for about contributing to conduwuit. The
[development](./development.md) page may be of interest for you as well. [development](./development.md) page may be of interest for you as well.
If you would like to work on an [issue][issues] that is not assigned, preferably If you would like to work on an [issue][issues] that is not assigned, preferably
ask in the Matrix room first at [#continuwuity:continuwuity.org][continuwuity-matrix], ask in the Matrix room first at [#conduwuit:puppygock.gay][conduwuit-matrix],
and comment on it. and comment on it.
### Linting and Formatting ### Linting and Formatting
@ -23,9 +23,9 @@ suggestion, allow the lint and mention that in a comment.
### Running CI tests locally ### Running CI tests locally
continuwuity's CI for tests, linting, formatting, audit, etc use conduwuit's CI for tests, linting, formatting, audit, etc use
[`engage`][engage]. engage can be installed from nixpkgs or `cargo install [`engage`][engage]. engage can be installed from nixpkgs or `cargo install
engage`. continuwuity's Nix flake devshell has the nixpkgs engage with `direnv`. engage`. conduwuit's Nix flake devshell has the nixpkgs engage with `direnv`.
Use `engage --help` for more usage details. Use `engage --help` for more usage details.
To test, format, lint, etc that CI would do, install engage, allow the `.envrc` To test, format, lint, etc that CI would do, install engage, allow the `.envrc`
@ -111,28 +111,33 @@ applies here.
### Creating pull requests ### Creating pull requests
Please try to keep contributions to the Forgejo Instance. While the mirrors of continuwuity Please try to keep contributions to the GitHub. While the mirrors of conduwuit
allow for pull/merge requests, there is no guarantee the maintainers will see them in a timely allow for pull/merge requests, there is no guarantee I will see them in a timely
manner. Additionally, please mark WIP or unfinished or incomplete PRs as drafts. manner. Additionally, please mark WIP or unfinished or incomplete PRs as drafts.
This prevents us from having to ping once in a while to double check the status This prevents me from having to ping once in a while to double check the status
of it, especially when the CI completed successfully and everything so it of it, especially when the CI completed successfully and everything so it
*looks* done. *looks* done.
If you open a pull request on one of the mirrors, it is your responsibility to
inform me about its existence. In the future I may try to solve this with more
repo bots in the conduwuit Matrix room. There is no mailing list or email-patch
support on the sr.ht mirror, but if you'd like to email me a git patch you can
do so at `strawberry@puppygock.gay`.
Direct all PRs/MRs to the `main` branch. Direct all PRs/MRs to the `main` branch.
By sending a pull request or patch, you are agreeing that your changes are By sending a pull request or patch, you are agreeing that your changes are
allowed to be licenced under the Apache-2.0 licence and all of your conduct is allowed to be licenced under the Apache-2.0 licence and all of your conduct is
in line with the Contributor's Covenant, and continuwuity's Code of Conduct. in line with the Contributor's Covenant, and conduwuit's Code of Conduct.
Contribution by users who violate either of these code of conducts will not have Contribution by users who violate either of these code of conducts will not have
their contributions accepted. This includes users who have been banned from their contributions accepted. This includes users who have been banned from
continuwuityMatrix rooms for Code of Conduct violations. conduwuit Matrix rooms for Code of Conduct violations.
[issues]: https://forgejo.ellis.link/continuwuation/continuwuity/issues [issues]: https://github.com/girlbossceo/conduwuit/issues
[continuwuity-matrix]: https://matrix.to/#/#continuwuity:continuwuity.org [conduwuit-matrix]: https://matrix.to/#/#conduwuit:puppygock.gay
[complement]: https://github.com/matrix-org/complement/ [complement]: https://github.com/matrix-org/complement/
[engage.toml]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/engage.toml [engage.toml]: https://github.com/girlbossceo/conduwuit/blob/main/engage.toml
[engage]: https://charles.page.computer.surgery/engage/ [engage]: https://charles.page.computer.surgery/engage/
[sytest]: https://github.com/matrix-org/sytest/ [sytest]: https://github.com/matrix-org/sytest/
[cargo-deb]: https://github.com/kornelski/cargo-deb [cargo-deb]: https://github.com/kornelski/cargo-deb
@ -141,4 +146,4 @@ continuwuityMatrix rooms for Code of Conduct violations.
[cargo-audit]: https://github.com/RustSec/rustsec/tree/main/cargo-audit [cargo-audit]: https://github.com/RustSec/rustsec/tree/main/cargo-audit
[direnv]: https://direnv.net/ [direnv]: https://direnv.net/
[mdbook]: https://rust-lang.github.io/mdBook/ [mdbook]: https://rust-lang.github.io/mdBook/
[documentation.yml]: https://forgejo.ellis.link/continuwuation/continuwuity/src/branch/main/.forgejo/workflows/documentation.yml [documentation.yml]: https://github.com/girlbossceo/conduwuit/blob/main/.github/workflows/documentation.yml

22
Cargo.lock generated
View file

@ -3652,7 +3652,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma" name = "ruma"
version = "0.10.1" version = "0.10.1"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"assign", "assign",
"js_int", "js_int",
@ -3672,7 +3672,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-appservice-api" name = "ruma-appservice-api"
version = "0.10.0" version = "0.10.0"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"js_int", "js_int",
"ruma-common", "ruma-common",
@ -3684,7 +3684,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-client-api" name = "ruma-client-api"
version = "0.18.0" version = "0.18.0"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"assign", "assign",
@ -3707,7 +3707,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-common" name = "ruma-common"
version = "0.13.0" version = "0.13.0"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"base64 0.22.1", "base64 0.22.1",
@ -3739,7 +3739,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-events" name = "ruma-events"
version = "0.28.1" version = "0.28.1"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"as_variant", "as_variant",
"indexmap 2.8.0", "indexmap 2.8.0",
@ -3764,7 +3764,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-federation-api" name = "ruma-federation-api"
version = "0.9.0" version = "0.9.0"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"bytes", "bytes",
"headers", "headers",
@ -3786,7 +3786,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-identifiers-validation" name = "ruma-identifiers-validation"
version = "0.9.5" version = "0.9.5"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"js_int", "js_int",
"thiserror 2.0.12", "thiserror 2.0.12",
@ -3795,7 +3795,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-identity-service-api" name = "ruma-identity-service-api"
version = "0.9.0" version = "0.9.0"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"js_int", "js_int",
"ruma-common", "ruma-common",
@ -3805,7 +3805,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-macros" name = "ruma-macros"
version = "0.13.0" version = "0.13.0"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"proc-macro-crate", "proc-macro-crate",
@ -3820,7 +3820,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-push-gateway-api" name = "ruma-push-gateway-api"
version = "0.9.0" version = "0.9.0"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"js_int", "js_int",
"ruma-common", "ruma-common",
@ -3832,7 +3832,7 @@ dependencies = [
[[package]] [[package]]
name = "ruma-signatures" name = "ruma-signatures"
version = "0.15.0" version = "0.15.0"
source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=d6870a7fb7f6cccff63f7fd0ff6c581bad80e983#d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" source = "git+https://forgejo.ellis.link/continuwuation/ruwuma?rev=b3cb85becae3c1ecabe2c93138312ebb3632b728#b3cb85becae3c1ecabe2c93138312ebb3632b728"
dependencies = [ dependencies = [
"base64 0.22.1", "base64 0.22.1",
"ed25519-dalek", "ed25519-dalek",

View file

@ -350,7 +350,7 @@ version = "0.1.2"
[workspace.dependencies.ruma] [workspace.dependencies.ruma]
git = "https://forgejo.ellis.link/continuwuation/ruwuma" git = "https://forgejo.ellis.link/continuwuation/ruwuma"
#branch = "conduwuit-changes" #branch = "conduwuit-changes"
rev = "d6870a7fb7f6cccff63f7fd0ff6c581bad80e983" rev = "b3cb85becae3c1ecabe2c93138312ebb3632b728"
features = [ features = [
"compat", "compat",
"rand", "rand",

View file

@ -1,63 +0,0 @@
# Contributor: magmaus3 <maia@magmaus3.eu.org>
# Maintainer: magmaus3 <maia@magmaus3.eu.org>
pkgname=continuwuity
# abuild doesn't like the format of v0.5.0-rc.5, so i had to change it
# see https://wiki.alpinelinux.org/wiki/Package_policies
pkgver=0.5.0_rc5
pkgrel=0
pkgdesc="a continuwuation of a very cool, featureful fork of conduit"
url="https://continuwuity.org/"
arch="all"
license="Apache-2.0"
depends="liburing"
# cargo version on alpine v3.21 is too old to use the 2024 edition
# i recommend either building everything on edge, or adding
# the edge repo as a tag
makedepends="cargo liburing-dev clang-dev linux-headers"
checkdepends=""
install="$pkgname.pre-install"
subpackages="$pkgname-openrc"
source="https://forgejo.ellis.link/continuwuation/continuwuity/archive/v0.5.0-rc.5.tar.gz
continuwuity.initd
continuwuity.confd
"
builddir="$srcdir/continuwuity"
options="net !check"
prepare() {
default_prepare
cd $srcdir/continuwuity
# add the default database path to the config (commented out)
cat conduwuit-example.toml \
| sed '/#database_path/ s:$: "/var/lib/continuwuity":' \
> "$srcdir"/continuwuity.toml
cargo fetch --target="$CTARGET" --locked
}
build() {
cargo build --frozen --release --all-features
}
check() {
# TODO: make sure the tests work
#cargo test --frozen
return
}
package() {
cd $srcdir
install -Dm755 continuwuity/target/release/conduwuit "$pkgdir"/usr/bin/continuwuity
install -Dm644 "$srcdir"/continuwuity.toml -t "$pkgdir"/etc/continuwuity
install -Dm755 "$srcdir"/continuwuity.initd "$pkgdir"/etc/init.d/continuwuity
install -Dm644 "$srcdir"/continuwuity.confd "$pkgdir"/etc/conf.d/continuwuity
}
sha512sums="
66f6da5e98b6f7bb8c1082500101d5c87b1b79955c139b44c6ef5123919fb05feb0dffc669a3af1bc8d571ddb9f3576660f08dc10a6b19eab6db9e391175436a v0.5.0-rc.5.tar.gz
0482674be24740496d70da256d4121c5a5e3b749f2445d2bbe0e8991f1449de052724f8427da21a6f55574bc53eac9ca1e47e5012b4c13049b2b39044734d80d continuwuity.initd
38e2576278b450d16ba804dd8f4a128f18cd793e6c3ce55aedee1e186905755b31ee23baaa6586b1ab0e25a1f29bf1ea86bfaae4185b0cb1a29203726a199426 continuwuity.confd
"

View file

@ -1,7 +0,0 @@
# building
1. [set up your build
environment](https://wiki.alpinelinux.org/wiki/Include:Setup_your_system_and_account_for_building_packages)
2. run `abuild` (or `abuild -K` if you want to keep the source directory to make
rebuilding faster)

View file

@ -1,3 +0,0 @@
supervisor=supervise-daemon
export CONTINUWUITY_CONFIG=/etc/continuwuity/continuwuity.toml

View file

@ -1,19 +0,0 @@
#!/sbin/openrc-run
command="/usr/bin/continuwuity"
command_user="continuwuity:continuwuity"
command_args="--config ${CONTINUWUITY_CONFIG=/etc/continuwuity/continuwuity.toml}"
command_background=true
pidfile="/run/$RC_SVCNAME.pid"
output_log="/var/log/continuwuity.log"
error_log="/var/log/continuwuity.log"
depend() {
need net
}
start_pre() {
checkpath -d -m 0755 -o "$command_user" /var/lib/continuwuity
checkpath -f -m 0644 -o "$command_user" "$output_log"
}

View file

@ -1,4 +0,0 @@
#!/bin/sh
addgroup -S continuwuity 2>/dev/null
adduser -S -D -H -h /var/lib/continuwuity -s /sbin/nologin -G continuwuity -g continuwuity continuwuity 2>/dev/null
exit 0

View file

@ -116,7 +116,7 @@
# `https://continuwuity.org/.well-known/continuwuity/announcements` for any new # `https://continuwuity.org/.well-known/continuwuity/announcements` for any new
# announcements or major updates. This is not an update check endpoint. # announcements or major updates. This is not an update check endpoint.
# #
#allow_announcements_check = true #allow_announcements_check =
# Set this to any float value to multiply conduwuit's in-memory LRU caches # Set this to any float value to multiply conduwuit's in-memory LRU caches
# with such as "auth_chain_cache_capacity". # with such as "auth_chain_cache_capacity".
@ -967,9 +967,9 @@
#rocksdb_compaction_ioprio_idle = true #rocksdb_compaction_ioprio_idle = true
# Enables RocksDB compaction. You should never ever have to set this # Enables RocksDB compaction. You should never ever have to set this
# option to false. If you for some reason find yourself needing to use # option to false. If you for some reason find yourself needing to use this
# this option as part of troubleshooting or a bug, please reach out to us # option as part of troubleshooting or a bug, please reach out to us in
# in the conduwuit Matrix room with information and details. # the conduwuit Matrix room with information and details.
# #
# Disabling compaction will lead to a significantly bloated and # Disabling compaction will lead to a significantly bloated and
# explosively large database, gradually poor performance, unnecessarily # explosively large database, gradually poor performance, unnecessarily
@ -1182,13 +1182,23 @@
# #
#prune_missing_media = false #prune_missing_media = false
# Vector list of regex patterns of server names that conduwuit will refuse
# to download remote media from.
#
# example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"]
#
#prevent_media_downloads_from = []
# List of forbidden server names via regex patterns that we will block # List of forbidden server names via regex patterns that we will block
# incoming AND outgoing federation with, and block client room joins / # incoming AND outgoing federation with, and block client room joins /
# remote user invites. # remote user invites.
# #
# Additionally, it will hide messages from these servers for all users
# on this server.
#
# Note that your messages can still make it to forbidden servers through # Note that your messages can still make it to forbidden servers through
# backfilling. Events we receive from forbidden servers via backfill # backfilling. Events we receive from forbidden servers via backfill will
# from servers we *do* federate with will be stored in the database. # be stored in the database, but will not be sent to the client.
# #
# This check is applied on the room ID, room alias, sender server name, # This check is applied on the room ID, room alias, sender server name,
# sender user's server name, inbound federation X-Matrix origin, and # sender user's server name, inbound federation X-Matrix origin, and
@ -1197,7 +1207,7 @@
# You can set this to ["*"] to block all servers by default, and then # You can set this to ["*"] to block all servers by default, and then
# use `allowed_remote_server_names` to allow only specific servers. # use `allowed_remote_server_names` to allow only specific servers.
# #
# example: ["badserver\\.tld$", "badphrase", "19dollarfortnitecards"] # example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"]
# #
#forbidden_remote_server_names = [] #forbidden_remote_server_names = []
@ -1206,17 +1216,10 @@
# #
# This option has no effect if `forbidden_remote_server_names` is empty. # This option has no effect if `forbidden_remote_server_names` is empty.
# #
# example: ["goodserver\\.tld$", "goodphrase"] # example: ["goodserver\.tld$", "goodphrase"]
# #
#allowed_remote_server_names = [] #allowed_remote_server_names = []
# Vector list of regex patterns of server names that conduwuit will refuse
# to download remote media from.
#
# example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"]
#
#prevent_media_downloads_from = []
# List of forbidden server names via regex patterns that we will block all # List of forbidden server names via regex patterns that we will block all
# outgoing federated room directory requests for. Useful for preventing # outgoing federated room directory requests for. Useful for preventing
# our users from wandering into bad servers or spaces. # our users from wandering into bad servers or spaces.
@ -1225,29 +1228,6 @@
# #
#forbidden_remote_room_directory_server_names = [] #forbidden_remote_room_directory_server_names = []
# Vector list of regex patterns of server names that conduwuit will not
# send messages to the client from.
#
# Note that there is no way for clients to receive messages once a server
# has become unignored without doing a full sync. This is a protocol
# limitation with the current sync protocols. This means this is somewhat
# of a nuclear option.
#
# example: ["reallybadserver\.tld$", "reallybadphrase",
# "69dollarfortnitecards"]
#
#ignore_messages_from_server_names = []
# Send messages from users that the user has ignored to the client.
#
# There is no way for clients to receive messages sent while a user was
# ignored without doing a full sync. This is a protocol limitation with
# the current sync protocols. Disabling this option will move
# responsibility of ignoring messages to the client, which can avoid this
# limitation.
#
#send_messages_from_ignored_users_to_client = false
# Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you # Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you
# do not want conduwuit to send outbound requests to. Defaults to # do not want conduwuit to send outbound requests to. Defaults to
# RFC1918, unroutable, loopback, multicast, and testnet addresses for # RFC1918, unroutable, loopback, multicast, and testnet addresses for

View file

@ -3,7 +3,7 @@ Description=conduwuit Matrix homeserver
Wants=network-online.target Wants=network-online.target
After=network-online.target After=network-online.target
Alias=matrix-conduwuit.service Alias=matrix-conduwuit.service
Documentation=https://continuwuity.org/ Documentation=https://conduwuit.puppyirl.gay/
[Service] [Service]
DynamicUser=yes DynamicUser=yes

View file

@ -1855,10 +1855,7 @@ pub async fn leave_room(
// Ask a remote server if we don't have this room and are not knocking on it // Ask a remote server if we don't have this room and are not knocking on it
if dont_have_room.and(not_knocked).await { if dont_have_room.and(not_knocked).await {
if let Err(e) = remote_leave_room(services, user_id, room_id, reason.clone()) if let Err(e) = remote_leave_room(services, user_id, room_id, reason.clone()).boxed().await {
.boxed()
.await
{
warn!(%user_id, "Failed to leave room {room_id} remotely: {e}"); warn!(%user_id, "Failed to leave room {room_id} remotely: {e}");
// Don't tell the client about this error // Don't tell the client about this error
} }

View file

@ -1,5 +1,3 @@
use core::panic;
use axum::extract::State; use axum::extract::State;
use conduwuit::{ use conduwuit::{
Err, Result, at, Err, Result, at,
@ -134,6 +132,8 @@ pub(crate) async fn get_message_events_route(
.take(limit) .take(limit)
.collect() .collect()
.await; .await;
// let appservice_id = body.appservice_info.map(|appservice|
// appservice.registration.id);
let lazy_loading_context = lazy_loading::Context { let lazy_loading_context = lazy_loading::Context {
user_id: sender_user, user_id: sender_user,
@ -143,7 +143,7 @@ pub(crate) async fn get_message_events_route(
if let Some(registration) = body.appservice_info.as_ref() { if let Some(registration) = body.appservice_info.as_ref() {
<&DeviceId>::from(registration.registration.id.as_str()) <&DeviceId>::from(registration.registration.id.as_str())
} else { } else {
panic!("No device_id provided and no appservice registration found, this should be unreachable"); <&DeviceId>::from("")
}, },
}, },
room_id, room_id,
@ -275,12 +275,10 @@ pub(crate) async fn is_ignored_pdu(
let ignored_server = services let ignored_server = services
.moderation .moderation
.is_remote_server_ignored(pdu.sender().server_name()); .is_remote_server_forbidden(pdu.sender().server_name());
if ignored_type if ignored_type
&& (ignored_server && (ignored_server || services.users.user_is_ignored(&pdu.sender, user_id).await)
|| (!services.config.send_messages_from_ignored_users_to_client
&& services.users.user_is_ignored(&pdu.sender, user_id).await))
{ {
return true; return true;
} }

View file

@ -614,31 +614,24 @@ fn custom_room_id_check(services: &Services, custom_room_id: &str) -> Result<Own
"Custom room ID contains an unexpected `:` which is not allowed.", "Custom room ID contains an unexpected `:` which is not allowed.",
)); ));
} }
} else if custom_room_id.starts_with('!') { } else if custom_room_id.starts_with('!'){
return Err(Error::BadRequest( return Err(Error::BadRequest(
ErrorKind::InvalidParam, ErrorKind::InvalidParam,
"Room ID is prefixed with !, but is not fully qualified. You likely did not want \ "Room ID is prefixed with !, but is not fully qualified. You likely did not want this."));
this.",
));
} else { } else {
room_id = format!("!{custom_room_id}:{server_name}"); room_id = format!("!{custom_room_id}:{server_name}");
} }
OwnedRoomId::parse(room_id) OwnedRoomId::parse(room_id)
.map_err(Into::into) .map_err(Into::into)
.and_then(|full_room_id| { .and_then(
if full_room_id |full_room_id| {
.server_name() if full_room_id.server_name().expect("failed to extract server name from room ID") != server_name {
.expect("failed to extract server name from room ID") Err(Error::BadRequest(ErrorKind::InvalidParam, "Custom room ID must be on this server."))
!= server_name } else {
{ Ok(full_room_id)
Err(Error::BadRequest( }
ErrorKind::InvalidParam,
"Custom room ID must be on this server.",
))
} else {
Ok(full_room_id)
} }
}) )
.inspect(|full_room_id| { .inspect(|full_room_id| {
debug_info!(?full_room_id, "Full custom room ID"); debug_info!(?full_room_id, "Full custom room ID");
}) })

View file

@ -4,13 +4,8 @@ use base64::{Engine as _, engine::general_purpose};
use conduwuit::{ use conduwuit::{
Err, Error, PduEvent, Result, err, pdu::gen_event_id, utils, utils::hash::sha256, warn, Err, Error, PduEvent, Result, err, pdu::gen_event_id, utils, utils::hash::sha256, warn,
}; };
use ruma::{ use ruma::{CanonicalJsonValue, OwnedUserId, UserId, api::{client::error::ErrorKind, federation::membership::create_invite}, events::room::member::{MembershipState, RoomMemberEventContent}, serde::JsonObject, RoomId, OwnedRoomId};
CanonicalJsonValue, OwnedUserId, UserId, use ruma::api::OutgoingRequest;
api::{client::error::ErrorKind, federation::membership::create_invite},
events::room::member::{MembershipState, RoomMemberEventContent},
serde::JsonObject,
};
use crate::Ruma; use crate::Ruma;
/// # `PUT /_matrix/federation/v2/invite/{roomId}/{eventId}` /// # `PUT /_matrix/federation/v2/invite/{roomId}/{eventId}`
@ -113,6 +108,22 @@ pub(crate) async fn create_invite_route(
invite_state.push(pdu.to_stripped_state_event()); invite_state.push(pdu.to_stripped_state_event());
// Check the invite against any user_may_invite callbacks
// let mut user_may_invite = UserMayInvitePayload {
// inviter: sender.to_owned(),
// invitee: invited_user,
// room_id: body.room_id.clone(),
// };
for appservice in services.appservice.read().await.values() {
if let Some(callbacks) = &appservice.registration.callbacks {
if callbacks.user_may_invite.is_some() {
// let resp = services.sending.send_appservice_request(appservice.registration.clone(),
// &user_may_invite
// );
}
}
}
// If we are active in the room, the remote server will notify us about the // If we are active in the room, the remote server will notify us about the
// join/invite through /send. If we are not in the room, we need to manually // join/invite through /send. If we are not in the room, we need to manually
// record the invited state for client /sync through update_membership(), and // record the invited state for client /sync through update_membership(), and

View file

@ -163,8 +163,6 @@ pub struct Config {
/// If enabled, conduwuit will send a simple GET request periodically to /// If enabled, conduwuit will send a simple GET request periodically to
/// `https://continuwuity.org/.well-known/continuwuity/announcements` for any new /// `https://continuwuity.org/.well-known/continuwuity/announcements` for any new
/// announcements or major updates. This is not an update check endpoint. /// announcements or major updates. This is not an update check endpoint.
///
/// default: true
#[serde(alias = "allow_check_for_updates", default = "true_fn")] #[serde(alias = "allow_check_for_updates", default = "true_fn")]
pub allow_announcements_check: bool, pub allow_announcements_check: bool,
@ -1132,9 +1130,9 @@ pub struct Config {
pub rocksdb_compaction_ioprio_idle: bool, pub rocksdb_compaction_ioprio_idle: bool,
/// Enables RocksDB compaction. You should never ever have to set this /// Enables RocksDB compaction. You should never ever have to set this
/// option to false. If you for some reason find yourself needing to use /// option to false. If you for some reason find yourself needing to use this
/// this option as part of troubleshooting or a bug, please reach out to us /// option as part of troubleshooting or a bug, please reach out to us in
/// in the conduwuit Matrix room with information and details. /// the conduwuit Matrix room with information and details.
/// ///
/// Disabling compaction will lead to a significantly bloated and /// Disabling compaction will lead to a significantly bloated and
/// explosively large database, gradually poor performance, unnecessarily /// explosively large database, gradually poor performance, unnecessarily
@ -1359,13 +1357,25 @@ pub struct Config {
#[serde(default)] #[serde(default)]
pub prune_missing_media: bool, pub prune_missing_media: bool,
/// Vector list of regex patterns of server names that conduwuit will refuse
/// to download remote media from.
///
/// example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"]
///
/// default: []
#[serde(default, with = "serde_regex")]
pub prevent_media_downloads_from: RegexSet,
/// List of forbidden server names via regex patterns that we will block /// List of forbidden server names via regex patterns that we will block
/// incoming AND outgoing federation with, and block client room joins / /// incoming AND outgoing federation with, and block client room joins /
/// remote user invites. /// remote user invites.
/// ///
/// Additionally, it will hide messages from these servers for all users
/// on this server.
///
/// Note that your messages can still make it to forbidden servers through /// Note that your messages can still make it to forbidden servers through
/// backfilling. Events we receive from forbidden servers via backfill /// backfilling. Events we receive from forbidden servers via backfill will
/// from servers we *do* federate with will be stored in the database. /// be stored in the database, but will not be sent to the client.
/// ///
/// This check is applied on the room ID, room alias, sender server name, /// This check is applied on the room ID, room alias, sender server name,
/// sender user's server name, inbound federation X-Matrix origin, and /// sender user's server name, inbound federation X-Matrix origin, and
@ -1374,7 +1384,7 @@ pub struct Config {
/// You can set this to ["*"] to block all servers by default, and then /// You can set this to ["*"] to block all servers by default, and then
/// use `allowed_remote_server_names` to allow only specific servers. /// use `allowed_remote_server_names` to allow only specific servers.
/// ///
/// example: ["badserver\\.tld$", "badphrase", "19dollarfortnitecards"] /// example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"]
/// ///
/// default: [] /// default: []
#[serde(default, with = "serde_regex")] #[serde(default, with = "serde_regex")]
@ -1385,21 +1395,12 @@ pub struct Config {
/// ///
/// This option has no effect if `forbidden_remote_server_names` is empty. /// This option has no effect if `forbidden_remote_server_names` is empty.
/// ///
/// example: ["goodserver\\.tld$", "goodphrase"] /// example: ["goodserver\.tld$", "goodphrase"]
/// ///
/// default: [] /// default: []
#[serde(default, with = "serde_regex")] #[serde(default, with = "serde_regex")]
pub allowed_remote_server_names: RegexSet, pub allowed_remote_server_names: RegexSet,
/// Vector list of regex patterns of server names that conduwuit will refuse
/// to download remote media from.
///
/// example: ["badserver\.tld$", "badphrase", "19dollarfortnitecards"]
///
/// default: []
#[serde(default, with = "serde_regex")]
pub prevent_media_downloads_from: RegexSet,
/// List of forbidden server names via regex patterns that we will block all /// List of forbidden server names via regex patterns that we will block all
/// outgoing federated room directory requests for. Useful for preventing /// outgoing federated room directory requests for. Useful for preventing
/// our users from wandering into bad servers or spaces. /// our users from wandering into bad servers or spaces.
@ -1410,31 +1411,6 @@ pub struct Config {
#[serde(default, with = "serde_regex")] #[serde(default, with = "serde_regex")]
pub forbidden_remote_room_directory_server_names: RegexSet, pub forbidden_remote_room_directory_server_names: RegexSet,
/// Vector list of regex patterns of server names that conduwuit will not
/// send messages to the client from.
///
/// Note that there is no way for clients to receive messages once a server
/// has become unignored without doing a full sync. This is a protocol
/// limitation with the current sync protocols. This means this is somewhat
/// of a nuclear option.
///
/// example: ["reallybadserver\.tld$", "reallybadphrase",
/// "69dollarfortnitecards"]
///
/// default: []
#[serde(default, with = "serde_regex")]
pub ignore_messages_from_server_names: RegexSet,
/// Send messages from users that the user has ignored to the client.
///
/// There is no way for clients to receive messages sent while a user was
/// ignored without doing a full sync. This is a protocol limitation with
/// the current sync protocols. Disabling this option will move
/// responsibility of ignoring messages to the client, which can avoid this
/// limitation.
#[serde(default)]
pub send_messages_from_ignored_users_to_client: bool,
/// Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you /// Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you
/// do not want conduwuit to send outbound requests to. Defaults to /// do not want conduwuit to send outbound requests to. Defaults to
/// RFC1918, unroutable, loopback, multicast, and testnet addresses for /// RFC1918, unroutable, loopback, multicast, and testnet addresses for

View file

@ -38,7 +38,7 @@ struct GetMembership {
membership: MembershipState, membership: MembershipState,
} }
#[derive(Deserialize, Debug)] #[derive(Deserialize)]
struct RoomMemberContentFields { struct RoomMemberContentFields {
membership: Option<Raw<MembershipState>>, membership: Option<Raw<MembershipState>>,
join_authorised_via_users_server: Option<Raw<OwnedUserId>>, join_authorised_via_users_server: Option<Raw<OwnedUserId>>,
@ -149,9 +149,9 @@ where
Incoming: Event + Send + Sync, Incoming: Event + Send + Sync,
{ {
debug!( debug!(
event_id = format!("{}", incoming_event.event_id()), "auth_check beginning for {} ({})",
event_type = format!("{}", incoming_event.event_type()), incoming_event.event_id(),
"auth_check beginning" incoming_event.event_type()
); );
// [synapse] check that all the events are in the same room as `incoming_event` // [synapse] check that all the events are in the same room as `incoming_event`
@ -383,15 +383,10 @@ where
let sender_membership_event_content: RoomMemberContentFields = let sender_membership_event_content: RoomMemberContentFields =
from_json_str(sender_member_event.content().get())?; from_json_str(sender_member_event.content().get())?;
let Some(membership_state) = sender_membership_event_content.membership else { let membership_state = sender_membership_event_content
warn!( .membership
sender_membership_event_content = format!("{sender_membership_event_content:?}"), .expect("we should test before that this field exists")
event_id = format!("{}", incoming_event.event_id()), .deserialize()?;
"Sender membership event content missing membership field"
);
return Err(Error::InvalidPdu("Missing membership field".to_owned()));
};
let membership_state = membership_state.deserialize()?;
if !matches!(membership_state, MembershipState::Join) { if !matches!(membership_state, MembershipState::Join) {
warn!("sender's membership is not join"); warn!("sender's membership is not join");

View file

@ -36,7 +36,6 @@ assets = [
[features] [features]
default = [ default = [
"blurhashing",
"brotli_compression", "brotli_compression",
"element_hacks", "element_hacks",
"gzip_compression", "gzip_compression",

View file

@ -1,57 +1,38 @@
use std::sync::Arc; use std::sync::Arc;
use conduwuit::{Result, implement}; use conduwuit::{Result, Server, implement};
use ruma::ServerName; use ruma::ServerName;
use crate::{Dep, config};
pub struct Service { pub struct Service {
services: Services, services: Services,
} }
struct Services { struct Services {
// pub server: Arc<Server>, pub server: Arc<Server>,
pub config: Dep<config::Service>,
} }
impl crate::Service for Service { impl crate::Service for Service {
fn build(args: crate::Args<'_>) -> Result<Arc<Self>> { fn build(args: crate::Args<'_>) -> Result<Arc<Self>> {
Ok(Arc::new(Self { Ok(Arc::new(Self {
services: Services { services: Services { server: args.server.clone() },
// server: args.server.clone(),
config: args.depend::<config::Service>("config"),
},
})) }))
} }
fn name(&self) -> &str { crate::service::make_name(std::module_path!()) } fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
} }
#[implement(Service)]
#[must_use]
pub fn is_remote_server_ignored(&self, server_name: &ServerName) -> bool {
// We must never block federating with ourselves
if server_name == self.services.config.server_name {
return false;
}
self.services
.config
.ignore_messages_from_server_names
.is_match(server_name.host())
}
#[implement(Service)] #[implement(Service)]
#[must_use] #[must_use]
pub fn is_remote_server_forbidden(&self, server_name: &ServerName) -> bool { pub fn is_remote_server_forbidden(&self, server_name: &ServerName) -> bool {
// We must never block federating with ourselves // We must never block federating with ourselves
if server_name == self.services.config.server_name { if server_name == self.services.server.config.server_name {
return false; return false;
} }
// Check if server is explicitly allowed // Check if server is explicitly allowed
if self if self
.services .services
.server
.config .config
.allowed_remote_server_names .allowed_remote_server_names
.is_match(server_name.host()) .is_match(server_name.host())
@ -61,6 +42,7 @@ pub fn is_remote_server_forbidden(&self, server_name: &ServerName) -> bool {
// Check if server is explicitly forbidden // Check if server is explicitly forbidden
self.services self.services
.server
.config .config
.forbidden_remote_server_names .forbidden_remote_server_names
.is_match(server_name.host()) .is_match(server_name.host())
@ -74,6 +56,7 @@ pub fn is_remote_server_room_directory_forbidden(&self, server_name: &ServerName
self.is_remote_server_forbidden(server_name) self.is_remote_server_forbidden(server_name)
|| self || self
.services .services
.server
.config .config
.forbidden_remote_room_directory_server_names .forbidden_remote_room_directory_server_names
.is_match(server_name.host()) .is_match(server_name.host())
@ -87,6 +70,7 @@ pub fn is_remote_server_media_downloads_forbidden(&self, server_name: &ServerNam
self.is_remote_server_forbidden(server_name) self.is_remote_server_forbidden(server_name)
|| self || self
.services .services
.server
.config .config
.prevent_media_downloads_from .prevent_media_downloads_from
.is_match(server_name.host()) .is_match(server_name.host())

View file

@ -577,7 +577,7 @@ impl Service {
self.db self.db
.userid_usersigningkeyid .userid_usersigningkeyid
.raw_put(user_id, user_signing_key_key); .put(user_id, user_signing_key_key);
} }
if notify { if notify {