mirror of
https://gitlab.computer.surgery/matrix/grapevine.git
synced 2025-12-16 23:31:24 +01:00
remove documentation, metadata, etc
This drastically reduces the maintenance burden. You may notice the `CODE_OF_CONDUCT.md` is deleted here. This is because I don't feel like updating the relevant parts and I don't think this will ever actually have a community build around it. If that changes for some reason, I'm not opposed to adding a code of conduct again.
This commit is contained in:
parent
c496878afa
commit
d41f0fbf72
55 changed files with 5 additions and 4117 deletions
|
|
@ -1,28 +0,0 @@
|
||||||
# Local build and dev artifacts
|
|
||||||
target
|
|
||||||
tests
|
|
||||||
|
|
||||||
# Docker files
|
|
||||||
Dockerfile*
|
|
||||||
docker-compose*
|
|
||||||
|
|
||||||
# IDE files
|
|
||||||
.vscode
|
|
||||||
.idea
|
|
||||||
*.iml
|
|
||||||
|
|
||||||
# Git folder
|
|
||||||
.git
|
|
||||||
.gitea
|
|
||||||
.gitlab
|
|
||||||
.github
|
|
||||||
|
|
||||||
# Dot files
|
|
||||||
.env
|
|
||||||
.gitignore
|
|
||||||
|
|
||||||
# Toml files
|
|
||||||
rustfmt.toml
|
|
||||||
|
|
||||||
# Documentation
|
|
||||||
#*.md
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
# EditorConfig is awesome: https://EditorConfig.org
|
|
||||||
|
|
||||||
root = true
|
|
||||||
|
|
||||||
[*]
|
|
||||||
charset = utf-8
|
|
||||||
end_of_line = lf
|
|
||||||
tab_width = 4
|
|
||||||
indent_size = 4
|
|
||||||
indent_style = space
|
|
||||||
insert_final_newline = true
|
|
||||||
max_line_length = 120
|
|
||||||
|
|
||||||
[*.nix]
|
|
||||||
indent_size = 2
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
- [ ] I agree to release my code and all other changes of this PR under the Apache-2.0 license
|
|
||||||
11
.github/ISSUE_TEMPLATE/Issue.md
vendored
11
.github/ISSUE_TEMPLATE/Issue.md
vendored
|
|
@ -1,11 +0,0 @@
|
||||||
---
|
|
||||||
name: "Issue with / Feature Request for Conduit"
|
|
||||||
about: "Please file issues on GitLab: https://gitlab.com/famedly/conduit/-/issues/new"
|
|
||||||
title: "CLOSE ME"
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**⚠️ Conduit development does not happen on GitHub. Issues opened here will not be addressed**
|
|
||||||
|
|
||||||
Please open issues on GitLab: https://gitlab.com/famedly/conduit/-/issues/new
|
|
||||||
76
.gitignore
vendored
76
.gitignore
vendored
|
|
@ -1,76 +0,0 @@
|
||||||
# CMake
|
|
||||||
cmake-build-*/
|
|
||||||
|
|
||||||
# IntelliJ
|
|
||||||
.idea/
|
|
||||||
out/
|
|
||||||
*.iml
|
|
||||||
modules.xml
|
|
||||||
*.ipr
|
|
||||||
|
|
||||||
# mpeltonen/sbt-idea plugin
|
|
||||||
.idea_modules/
|
|
||||||
|
|
||||||
# Linux backup files
|
|
||||||
*~
|
|
||||||
|
|
||||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
|
||||||
.fuse_hidden*
|
|
||||||
|
|
||||||
# KDE directory preferences
|
|
||||||
.directory
|
|
||||||
|
|
||||||
# Linux trash folder which might appear on any partition or disk
|
|
||||||
.Trash-*
|
|
||||||
|
|
||||||
# .nfs files are created when an open file is removed but is still being accessed
|
|
||||||
.nfs*
|
|
||||||
|
|
||||||
# Rust
|
|
||||||
/target/
|
|
||||||
|
|
||||||
### vscode ###
|
|
||||||
.vscode/*
|
|
||||||
!.vscode/tasks.json
|
|
||||||
!.vscode/launch.json
|
|
||||||
!.vscode/extensions.json
|
|
||||||
*.code-workspace
|
|
||||||
|
|
||||||
### Windows ###
|
|
||||||
# Windows thumbnail cache files
|
|
||||||
Thumbs.db
|
|
||||||
Thumbs.db:encryptable
|
|
||||||
ehthumbs.db
|
|
||||||
ehthumbs_vista.db
|
|
||||||
|
|
||||||
# Dump file
|
|
||||||
*.stackdump
|
|
||||||
|
|
||||||
# Folder config file
|
|
||||||
[Dd]esktop.ini
|
|
||||||
|
|
||||||
# Recycle Bin used on file shares
|
|
||||||
$RECYCLE.BIN/
|
|
||||||
|
|
||||||
# Windows shortcuts
|
|
||||||
*.lnk
|
|
||||||
|
|
||||||
# Conduit
|
|
||||||
conduit.toml
|
|
||||||
conduit.db
|
|
||||||
|
|
||||||
# Etc.
|
|
||||||
**/*.rs.bk
|
|
||||||
cached_target
|
|
||||||
|
|
||||||
# Nix artifacts
|
|
||||||
/result*
|
|
||||||
|
|
||||||
# Direnv cache
|
|
||||||
/.direnv
|
|
||||||
|
|
||||||
# Gitlab CI cache
|
|
||||||
/.gitlab-ci.d
|
|
||||||
|
|
||||||
# mdbook output
|
|
||||||
public/
|
|
||||||
110
.gitlab-ci.yml
110
.gitlab-ci.yml
|
|
@ -1,31 +1,17 @@
|
||||||
stages:
|
stages:
|
||||||
- ci
|
- ci
|
||||||
- artifacts
|
- artifacts
|
||||||
- publish
|
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
# Makes some things print in color
|
# Makes some things print in color
|
||||||
TERM: ansi
|
TERM: ansi
|
||||||
|
|
||||||
# Avoid duplicate pipelines
|
|
||||||
# See: https://docs.gitlab.com/ee/ci/yaml/workflow.html#switch-between-branch-pipelines-and-merge-request-pipelines
|
|
||||||
workflow:
|
|
||||||
rules:
|
|
||||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
|
||||||
- if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
|
|
||||||
when: never
|
|
||||||
- if: $CI
|
|
||||||
|
|
||||||
before_script:
|
before_script:
|
||||||
# Enable nix-command and flakes
|
# Enable nix-command and flakes
|
||||||
- if command -v nix > /dev/null; then echo "experimental-features = nix-command flakes" >> /etc/nix/nix.conf; fi
|
- if command -v nix > /dev/null; then echo "experimental-features = nix-command flakes" >> /etc/nix/nix.conf; fi
|
||||||
|
|
||||||
# Add our own binary cache
|
# Add our own binary cache
|
||||||
- if command -v nix > /dev/null; then echo "extra-substituters = https://nix.computer.surgery/conduit" >> /etc/nix/nix.conf; fi
|
- if command -v nix > /dev/null && [ -n "$ATTIC_ENDPOINT" ] && [ -n "$ATTIC_CACHE" ]; then echo "extra-substituters = $ATTIC_ENDPOINT/$ATTIC_CACHE" >> /etc/nix/nix.conf; fi
|
||||||
- if command -v nix > /dev/null; then echo "extra-trusted-public-keys = conduit:ZGAf6P6LhNvnoJJ3Me3PRg7tlLSrPxcQ2RiE5LIppjo=" >> /etc/nix/nix.conf; fi
|
|
||||||
|
|
||||||
# Add alternate binary cache
|
|
||||||
- if command -v nix > /dev/null && [ -n "$ATTIC_ENDPOINT" ]; then echo "extra-substituters = $ATTIC_ENDPOINT" >> /etc/nix/nix.conf; fi
|
|
||||||
- if command -v nix > /dev/null && [ -n "$ATTIC_PUBLIC_KEY" ]; then echo "extra-trusted-public-keys = $ATTIC_PUBLIC_KEY" >> /etc/nix/nix.conf; fi
|
- if command -v nix > /dev/null && [ -n "$ATTIC_PUBLIC_KEY" ]; then echo "extra-trusted-public-keys = $ATTIC_PUBLIC_KEY" >> /etc/nix/nix.conf; fi
|
||||||
|
|
||||||
# Add crane binary cache
|
# Add crane binary cache
|
||||||
|
|
@ -54,21 +40,9 @@ ci:
|
||||||
|
|
||||||
- direnv exec . engage
|
- direnv exec . engage
|
||||||
cache:
|
cache:
|
||||||
key: nix
|
|
||||||
paths:
|
paths:
|
||||||
- target
|
- target
|
||||||
- .gitlab-ci.d
|
- .gitlab-ci.d
|
||||||
rules:
|
|
||||||
# CI on upstream runners (only available for maintainers)
|
|
||||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event" && $IS_UPSTREAM_CI == "true"
|
|
||||||
# Manual CI on unprotected branches that are not MRs
|
|
||||||
- if: $CI_PIPELINE_SOURCE != "merge_request_event" && $CI_COMMIT_REF_PROTECTED == "false"
|
|
||||||
when: manual
|
|
||||||
# Manual CI on forks
|
|
||||||
- if: $IS_UPSTREAM_CI != "true"
|
|
||||||
when: manual
|
|
||||||
- if: $CI
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
artifacts:
|
artifacts:
|
||||||
stage: artifacts
|
stage: artifacts
|
||||||
|
|
@ -77,11 +51,6 @@ artifacts:
|
||||||
- ./bin/nix-build-and-cache .#static-x86_64-unknown-linux-musl
|
- ./bin/nix-build-and-cache .#static-x86_64-unknown-linux-musl
|
||||||
- cp result/bin/conduit x86_64-unknown-linux-musl
|
- cp result/bin/conduit x86_64-unknown-linux-musl
|
||||||
|
|
||||||
- mkdir -p target/release
|
|
||||||
- cp result/bin/conduit target/release
|
|
||||||
- direnv exec . cargo deb --no-build
|
|
||||||
- mv target/debian/*.deb x86_64-unknown-linux-musl.deb
|
|
||||||
|
|
||||||
# Since the OCI image package is based on the binary package, this has the
|
# Since the OCI image package is based on the binary package, this has the
|
||||||
# fun side effect of uploading the normal binary too. Conduit users who are
|
# fun side effect of uploading the normal binary too. Conduit users who are
|
||||||
# deploying with Nix can leverage this fact by adding our binary cache to
|
# deploying with Nix can leverage this fact by adding our binary cache to
|
||||||
|
|
@ -98,10 +67,6 @@ artifacts:
|
||||||
|
|
||||||
- ./bin/nix-build-and-cache .#oci-image-aarch64-unknown-linux-musl
|
- ./bin/nix-build-and-cache .#oci-image-aarch64-unknown-linux-musl
|
||||||
- cp result oci-image-arm64v8.tar.gz
|
- cp result oci-image-arm64v8.tar.gz
|
||||||
|
|
||||||
- ./bin/nix-build-and-cache .#book
|
|
||||||
# We can't just copy the symlink, we need to dereference it https://gitlab.com/gitlab-org/gitlab/-/issues/19746
|
|
||||||
- cp -r --dereference result public
|
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
- x86_64-unknown-linux-musl
|
- x86_64-unknown-linux-musl
|
||||||
|
|
@ -109,76 +74,3 @@ artifacts:
|
||||||
- x86_64-unknown-linux-musl.deb
|
- x86_64-unknown-linux-musl.deb
|
||||||
- oci-image-amd64.tar.gz
|
- oci-image-amd64.tar.gz
|
||||||
- oci-image-arm64v8.tar.gz
|
- oci-image-arm64v8.tar.gz
|
||||||
- public
|
|
||||||
rules:
|
|
||||||
# CI required for all MRs
|
|
||||||
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
|
|
||||||
# Optional CI on forks
|
|
||||||
- if: $IS_UPSTREAM_CI != "true"
|
|
||||||
when: manual
|
|
||||||
allow_failure: true
|
|
||||||
- if: $CI
|
|
||||||
interruptible: true
|
|
||||||
|
|
||||||
.push-oci-image:
|
|
||||||
stage: publish
|
|
||||||
image: docker:25.0.0
|
|
||||||
services:
|
|
||||||
- docker:25.0.0-dind
|
|
||||||
variables:
|
|
||||||
IMAGE_SUFFIX_AMD64: amd64
|
|
||||||
IMAGE_SUFFIX_ARM64V8: arm64v8
|
|
||||||
script:
|
|
||||||
- docker load -i oci-image-amd64.tar.gz
|
|
||||||
- IMAGE_ID_AMD64=$(docker images -q conduit:next)
|
|
||||||
- docker load -i oci-image-arm64v8.tar.gz
|
|
||||||
- IMAGE_ID_ARM64V8=$(docker images -q conduit:next)
|
|
||||||
# Tag and push the architecture specific images
|
|
||||||
- docker tag $IMAGE_ID_AMD64 $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_AMD64
|
|
||||||
- docker tag $IMAGE_ID_ARM64V8 $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_ARM64V8
|
|
||||||
- docker push $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_AMD64
|
|
||||||
- docker push $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_ARM64V8
|
|
||||||
# Tag the multi-arch image
|
|
||||||
- docker manifest create $IMAGE_NAME:$CI_COMMIT_SHA --amend $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_AMD64 --amend $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_ARM64V8
|
|
||||||
- docker manifest push $IMAGE_NAME:$CI_COMMIT_SHA
|
|
||||||
# Tag and push the git ref
|
|
||||||
- docker manifest create $IMAGE_NAME:$CI_COMMIT_REF_NAME --amend $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_AMD64 --amend $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_ARM64V8
|
|
||||||
- docker manifest push $IMAGE_NAME:$CI_COMMIT_REF_NAME
|
|
||||||
# Tag git tags as 'latest'
|
|
||||||
- |
|
|
||||||
if [[ -n "$CI_COMMIT_TAG" ]]; then
|
|
||||||
docker manifest create $IMAGE_NAME:latest --amend $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_AMD64 --amend $IMAGE_NAME:$CI_COMMIT_SHA-$IMAGE_SUFFIX_ARM64V8
|
|
||||||
docker manifest push $IMAGE_NAME:latest
|
|
||||||
fi
|
|
||||||
dependencies:
|
|
||||||
- artifacts
|
|
||||||
only:
|
|
||||||
- next
|
|
||||||
- master
|
|
||||||
- tags
|
|
||||||
|
|
||||||
oci-image:push-gitlab:
|
|
||||||
extends: .push-oci-image
|
|
||||||
variables:
|
|
||||||
IMAGE_NAME: $CI_REGISTRY_IMAGE/matrix-conduit
|
|
||||||
before_script:
|
|
||||||
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
|
|
||||||
|
|
||||||
oci-image:push-dockerhub:
|
|
||||||
extends: .push-oci-image
|
|
||||||
variables:
|
|
||||||
IMAGE_NAME: matrixconduit/matrix-conduit
|
|
||||||
before_script:
|
|
||||||
- docker login -u $DOCKER_HUB_USER -p $DOCKER_HUB_PASSWORD
|
|
||||||
|
|
||||||
pages:
|
|
||||||
stage: publish
|
|
||||||
dependencies:
|
|
||||||
- artifacts
|
|
||||||
only:
|
|
||||||
- next
|
|
||||||
script:
|
|
||||||
- "true"
|
|
||||||
artifacts:
|
|
||||||
paths:
|
|
||||||
- public
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
# Nix things
|
|
||||||
.envrc @CobaltCause
|
|
||||||
flake.lock @CobaltCause
|
|
||||||
flake.nix @CobaltCause
|
|
||||||
nix/ @CobaltCause
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
<!--
|
|
||||||
If you're requesting a new feature, that isn't part of this project yet,
|
|
||||||
then please consider filling out a "Feature Request" instead!
|
|
||||||
|
|
||||||
If you need a hand setting up your conduit server, feel free to ask for help in the
|
|
||||||
Conduit Matrix Chat: https://matrix.to/#/#conduit:fachschaften.org.
|
|
||||||
-->
|
|
||||||
|
|
||||||
### Description
|
|
||||||
<!-- What did you do and what happened? Why is that bad? -->
|
|
||||||
|
|
||||||
### System Configuration
|
|
||||||
<!-- Other data that might help us debug this issue, like os, conduit version, database backend -->
|
|
||||||
|
|
||||||
Conduit Version:
|
|
||||||
Database backend (default is sqlite): sqlite
|
|
||||||
|
|
||||||
|
|
||||||
/label ~conduit
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
<!--
|
|
||||||
If you want to report a bug or an error,
|
|
||||||
then please consider filling out a "Bug Report" instead!
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
### Is your feature request related to a problem? Please describe.
|
|
||||||
|
|
||||||
<!-- Eg. I'm always frustrated when [...] -->
|
|
||||||
|
|
||||||
|
|
||||||
### Describe the solution you'd like
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/label ~conduit
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
||||||
|
|
||||||
<!-- Please describe your changes here -->
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
- [ ] I ran `cargo fmt` and `cargo test`
|
|
||||||
- [ ] I agree to release my code and all other changes of this MR under the Apache-2.0 license
|
|
||||||
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Docs: Map markdown to html files
|
|
||||||
- source: /docs/(.+)\.md/
|
|
||||||
public: '\1.html'
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
set -eux
|
|
||||||
|
|
||||||
# --------------------------------------------------------------------- #
|
|
||||||
# #
|
|
||||||
# Configures docker buildx to use a remote server for arm building. #
|
|
||||||
# Expects $SSH_PRIVATE_KEY to be a valid ssh ed25519 private key with #
|
|
||||||
# access to the server $ARM_SERVER_USER@$ARM_SERVER_IP #
|
|
||||||
# #
|
|
||||||
# This is expected to only be used in the official CI/CD pipeline! #
|
|
||||||
# #
|
|
||||||
# Requirements: openssh-client, docker buildx #
|
|
||||||
# Inspired by: https://depot.dev/blog/building-arm-containers #
|
|
||||||
# #
|
|
||||||
# --------------------------------------------------------------------- #
|
|
||||||
|
|
||||||
cat "$BUILD_SERVER_SSH_PRIVATE_KEY" | ssh-add -
|
|
||||||
|
|
||||||
# Test server connections:
|
|
||||||
ssh "$ARM_SERVER_USER@$ARM_SERVER_IP" "uname -a"
|
|
||||||
ssh "$AMD_SERVER_USER@$AMD_SERVER_IP" "uname -a"
|
|
||||||
|
|
||||||
# Connect remote arm64 server for all arm builds:
|
|
||||||
docker buildx create \
|
|
||||||
--name "multi" \
|
|
||||||
--driver "docker-container" \
|
|
||||||
--platform "linux/arm64,linux/arm/v7" \
|
|
||||||
"ssh://$ARM_SERVER_USER@$ARM_SERVER_IP"
|
|
||||||
|
|
||||||
# Connect remote amd64 server for adm64 builds:
|
|
||||||
docker buildx create --append \
|
|
||||||
--name "multi" \
|
|
||||||
--driver "docker-container" \
|
|
||||||
--platform "linux/amd64" \
|
|
||||||
"ssh://$AMD_SERVER_USER@$AMD_SERVER_IP"
|
|
||||||
|
|
||||||
docker buildx use multi
|
|
||||||
11
.vscode/extensions.json
vendored
11
.vscode/extensions.json
vendored
|
|
@ -1,11 +0,0 @@
|
||||||
{
|
|
||||||
"recommendations": [
|
|
||||||
"rust-lang.rust-analyzer",
|
|
||||||
"bungcip.better-toml",
|
|
||||||
"ms-azuretools.vscode-docker",
|
|
||||||
"eamodio.gitlens",
|
|
||||||
"serayuzgur.crates",
|
|
||||||
"vadimcn.vscode-lldb",
|
|
||||||
"timonwong.shellcheck"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
35
.vscode/launch.json
vendored
35
.vscode/launch.json
vendored
|
|
@ -1,35 +0,0 @@
|
||||||
{
|
|
||||||
// Use IntelliSense to learn about possible attributes.
|
|
||||||
// Hover to view descriptions of existing attributes.
|
|
||||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug conduit",
|
|
||||||
"sourceLanguages": ["rust"],
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"build",
|
|
||||||
"--bin=conduit",
|
|
||||||
"--package=conduit"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "conduit",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"env": {
|
|
||||||
"RUST_BACKTRACE": "1",
|
|
||||||
"CONDUIT_CONFIG": "",
|
|
||||||
"CONDUIT_SERVER_NAME": "localhost",
|
|
||||||
"CONDUIT_DATABASE_PATH": "/tmp",
|
|
||||||
"CONDUIT_ADDRESS": "0.0.0.0",
|
|
||||||
"CONDUIT_PORT": "6167"
|
|
||||||
},
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
@ -1,134 +0,0 @@
|
||||||
|
|
||||||
# Contributor Covenant Code of Conduct
|
|
||||||
|
|
||||||
## Our Pledge
|
|
||||||
|
|
||||||
We as members, contributors, and leaders pledge to make participation in our
|
|
||||||
community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
|
||||||
identity and expression, level of experience, education, socio-economic status,
|
|
||||||
nationality, personal appearance, race, caste, color, religion, or sexual
|
|
||||||
identity and orientation.
|
|
||||||
|
|
||||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
|
||||||
diverse, inclusive, and healthy community.
|
|
||||||
|
|
||||||
## Our Standards
|
|
||||||
|
|
||||||
Examples of behavior that contributes to a positive environment for our
|
|
||||||
community include:
|
|
||||||
|
|
||||||
* Demonstrating empathy and kindness toward other people
|
|
||||||
* Being respectful of differing opinions, viewpoints, and experiences
|
|
||||||
* Giving and gracefully accepting constructive feedback
|
|
||||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
|
||||||
and learning from the experience
|
|
||||||
* Focusing on what is best not just for us as individuals, but for the overall
|
|
||||||
community
|
|
||||||
|
|
||||||
Examples of unacceptable behavior include:
|
|
||||||
|
|
||||||
* The use of sexualized language or imagery, and sexual attention or advances of
|
|
||||||
any kind
|
|
||||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
|
||||||
* Publishing others' private information, such as a physical or email address,
|
|
||||||
without their explicit permission
|
|
||||||
* Other conduct which could reasonably be considered inappropriate in a
|
|
||||||
professional setting
|
|
||||||
|
|
||||||
## Enforcement Responsibilities
|
|
||||||
|
|
||||||
Community leaders are responsible for clarifying and enforcing our standards of
|
|
||||||
acceptable behavior and will take appropriate and fair corrective action in
|
|
||||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
|
||||||
or harmful.
|
|
||||||
|
|
||||||
Community leaders have the right and responsibility to remove, edit, or reject
|
|
||||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
|
||||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
|
||||||
decisions when appropriate.
|
|
||||||
|
|
||||||
## Scope
|
|
||||||
|
|
||||||
This Code of Conduct applies within all community spaces, and also applies when
|
|
||||||
an individual is officially representing the community in public spaces.
|
|
||||||
Examples of representing our community include using an official e-mail address,
|
|
||||||
posting via an official social media account, or acting as an appointed
|
|
||||||
representative at an online or offline event.
|
|
||||||
|
|
||||||
## Enforcement
|
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
|
||||||
reported to the community leaders responsible for enforcement over email at
|
|
||||||
coc@koesters.xyz or over Matrix at @timo:conduit.rs.
|
|
||||||
All complaints will be reviewed and investigated promptly and fairly.
|
|
||||||
|
|
||||||
All community leaders are obligated to respect the privacy and security of the
|
|
||||||
reporter of any incident.
|
|
||||||
|
|
||||||
## Enforcement Guidelines
|
|
||||||
|
|
||||||
Community leaders will follow these Community Impact Guidelines in determining
|
|
||||||
the consequences for any action they deem in violation of this Code of Conduct:
|
|
||||||
|
|
||||||
### 1. Correction
|
|
||||||
|
|
||||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
|
||||||
unprofessional or unwelcome in the community.
|
|
||||||
|
|
||||||
**Consequence**: A private, written warning from community leaders, providing
|
|
||||||
clarity around the nature of the violation and an explanation of why the
|
|
||||||
behavior was inappropriate. A public apology may be requested.
|
|
||||||
|
|
||||||
### 2. Warning
|
|
||||||
|
|
||||||
**Community Impact**: A violation through a single incident or series of
|
|
||||||
actions.
|
|
||||||
|
|
||||||
**Consequence**: A warning with consequences for continued behavior. No
|
|
||||||
interaction with the people involved, including unsolicited interaction with
|
|
||||||
those enforcing the Code of Conduct, for a specified period of time. This
|
|
||||||
includes avoiding interactions in community spaces as well as external channels
|
|
||||||
like social media. Violating these terms may lead to a temporary or permanent
|
|
||||||
ban.
|
|
||||||
|
|
||||||
### 3. Temporary Ban
|
|
||||||
|
|
||||||
**Community Impact**: A serious violation of community standards, including
|
|
||||||
sustained inappropriate behavior.
|
|
||||||
|
|
||||||
**Consequence**: A temporary ban from any sort of interaction or public
|
|
||||||
communication with the community for a specified period of time. No public or
|
|
||||||
private interaction with the people involved, including unsolicited interaction
|
|
||||||
with those enforcing the Code of Conduct, is allowed during this period.
|
|
||||||
Violating these terms may lead to a permanent ban.
|
|
||||||
|
|
||||||
### 4. Permanent Ban
|
|
||||||
|
|
||||||
**Community Impact**: Demonstrating a pattern of violation of community
|
|
||||||
standards, including sustained inappropriate behavior, harassment of an
|
|
||||||
individual, or aggression toward or disparagement of classes of individuals.
|
|
||||||
|
|
||||||
**Consequence**: A permanent ban from any sort of public interaction within the
|
|
||||||
community.
|
|
||||||
|
|
||||||
## Attribution
|
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
|
||||||
version 2.1, available at
|
|
||||||
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
|
||||||
|
|
||||||
Community Impact Guidelines were inspired by
|
|
||||||
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
|
||||||
|
|
||||||
For answers to common questions about this code of conduct, see the FAQ at
|
|
||||||
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
|
|
||||||
[https://www.contributor-covenant.org/translations][translations].
|
|
||||||
|
|
||||||
[homepage]: https://www.contributor-covenant.org
|
|
||||||
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
|
||||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
|
||||||
[FAQ]: https://www.contributor-covenant.org/faq
|
|
||||||
[translations]: https://www.contributor-covenant.org/translations
|
|
||||||
|
|
||||||
77
Cargo.toml
77
Cargo.toml
|
|
@ -13,68 +13,38 @@ str_to_string = "warn"
|
||||||
name = "conduit"
|
name = "conduit"
|
||||||
description = "A Matrix homeserver written in Rust"
|
description = "A Matrix homeserver written in Rust"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
authors = ["timokoesters <timo@koesters.xyz>"]
|
|
||||||
homepage = "https://conduit.rs"
|
|
||||||
repository = "https://gitlab.com/famedly/conduit"
|
|
||||||
readme = "README.md"
|
|
||||||
version = "0.7.0"
|
version = "0.7.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# See also `rust-toolchain.toml`
|
# See also `rust-toolchain.toml`
|
||||||
rust-version = "1.75.0"
|
rust-version = "1.75.0"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
||||||
|
|
||||||
[lints]
|
[lints]
|
||||||
workspace = true
|
workspace = true
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Web framework
|
|
||||||
axum = { version = "0.6.18", default-features = false, features = ["form", "headers", "http1", "http2", "json", "matched-path"] }
|
axum = { version = "0.6.18", default-features = false, features = ["form", "headers", "http1", "http2", "json", "matched-path"] }
|
||||||
axum-server = { version = "0.5.1", features = ["tls-rustls"] }
|
axum-server = { version = "0.5.1", features = ["tls-rustls"] }
|
||||||
tower = { version = "0.4.13", features = ["util"] }
|
tower = { version = "0.4.13", features = ["util"] }
|
||||||
tower-http = { version = "0.4.1", features = ["add-extension", "cors", "sensitive-headers", "trace", "util"] }
|
tower-http = { version = "0.4.1", features = ["add-extension", "cors", "sensitive-headers", "trace", "util"] }
|
||||||
|
|
||||||
# Used for matrix spec type definitions and helpers
|
|
||||||
#ruma = { version = "0.4.0", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-pre-spec", "unstable-exhaustive-types"] }
|
|
||||||
ruma = { git = "https://github.com/ruma/ruma", rev = "5495b85aa311c2805302edb0a7de40399e22b397", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-msc3575", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
|
ruma = { git = "https://github.com/ruma/ruma", rev = "5495b85aa311c2805302edb0a7de40399e22b397", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-msc3575", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
|
||||||
#ruma = { git = "https://github.com/timokoesters/ruma", rev = "4ec9c69bb7e09391add2382b3ebac97b6e8f4c64", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-msc3575", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
|
|
||||||
#ruma = { path = "../ruma/crates/ruma", features = ["compat", "rand", "appservice-api-c", "client-api", "federation-api", "push-gateway-api-c", "state-res", "unstable-msc2448", "unstable-msc3575", "unstable-exhaustive-types", "ring-compat", "unstable-unspecified" ] }
|
|
||||||
|
|
||||||
# Async runtime and utilities
|
|
||||||
tokio = { version = "1.28.1", features = ["fs", "macros", "signal", "sync"] }
|
tokio = { version = "1.28.1", features = ["fs", "macros", "signal", "sync"] }
|
||||||
|
|
||||||
# Used for the http request / response body type for Ruma endpoints used with reqwest
|
|
||||||
bytes = "1.4.0"
|
bytes = "1.4.0"
|
||||||
http = "0.2.9"
|
http = "0.2.9"
|
||||||
# Used for ruma wrapper
|
|
||||||
serde_json = { version = "1.0.96", features = ["raw_value"] }
|
serde_json = { version = "1.0.96", features = ["raw_value"] }
|
||||||
# Used for appservice registration files
|
|
||||||
serde_yaml = "0.9.21"
|
serde_yaml = "0.9.21"
|
||||||
# Used for pdu definition
|
|
||||||
serde = { version = "1.0.163", features = ["rc"] }
|
serde = { version = "1.0.163", features = ["rc"] }
|
||||||
# Used for secure identifiers
|
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
# Used to hash passwords
|
|
||||||
rust-argon2 = "1.0.0"
|
rust-argon2 = "1.0.0"
|
||||||
# Used to send requests
|
|
||||||
hyper = "0.14.26"
|
hyper = "0.14.26"
|
||||||
reqwest = { version = "0.11.18", default-features = false, features = ["rustls-tls-native-roots", "socks"] }
|
reqwest = { version = "0.11.18", default-features = false, features = ["rustls-tls-native-roots", "socks"] }
|
||||||
# Used for conduit::Error type
|
|
||||||
thiserror = "1.0.40"
|
thiserror = "1.0.40"
|
||||||
# Used to generate thumbnails for images
|
|
||||||
image = { version = "0.24.6", default-features = false, features = ["jpeg", "png", "gif"] }
|
image = { version = "0.24.6", default-features = false, features = ["jpeg", "png", "gif"] }
|
||||||
# Used to encode server public key
|
|
||||||
base64 = "0.21.2"
|
base64 = "0.21.2"
|
||||||
# Used when hashing the state
|
|
||||||
ring = "0.17.7"
|
ring = "0.17.7"
|
||||||
# Used when querying the SRV record of other servers
|
|
||||||
trust-dns-resolver = "0.22.0"
|
trust-dns-resolver = "0.22.0"
|
||||||
# Used to find matching events for appservices
|
|
||||||
regex = "1.8.1"
|
regex = "1.8.1"
|
||||||
# jwt jsonwebtokens
|
|
||||||
jsonwebtoken = "9.2.0"
|
jsonwebtoken = "9.2.0"
|
||||||
# Performance measurements
|
|
||||||
tracing = { version = "0.1.37", features = [] }
|
tracing = { version = "0.1.37", features = [] }
|
||||||
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
|
tracing-subscriber = { version = "0.3.17", features = ["env-filter"] }
|
||||||
tracing-flame = "0.2.0"
|
tracing-flame = "0.2.0"
|
||||||
|
|
@ -84,24 +54,16 @@ tracing-opentelemetry = "0.18.0"
|
||||||
lru-cache = "0.1.2"
|
lru-cache = "0.1.2"
|
||||||
rusqlite = { version = "0.29.0", optional = true, features = ["bundled"] }
|
rusqlite = { version = "0.29.0", optional = true, features = ["bundled"] }
|
||||||
parking_lot = { version = "0.12.1", optional = true }
|
parking_lot = { version = "0.12.1", optional = true }
|
||||||
# crossbeam = { version = "0.8.2", optional = true }
|
|
||||||
num_cpus = "1.15.0"
|
num_cpus = "1.15.0"
|
||||||
# Used for ruma wrapper
|
|
||||||
serde_html_form = "0.2.0"
|
serde_html_form = "0.2.0"
|
||||||
|
|
||||||
thread_local = "1.1.7"
|
thread_local = "1.1.7"
|
||||||
# used for TURN server authentication
|
|
||||||
hmac = "0.12.1"
|
hmac = "0.12.1"
|
||||||
sha-1 = "0.10.1"
|
sha-1 = "0.10.1"
|
||||||
# used for conduit's CLI and admin room command parsing
|
|
||||||
clap = { version = "4.3.0", default-features = false, features = ["std", "derive", "help", "usage", "error-context", "string"] }
|
clap = { version = "4.3.0", default-features = false, features = ["std", "derive", "help", "usage", "error-context", "string"] }
|
||||||
futures-util = { version = "0.3.28", default-features = false }
|
futures-util = { version = "0.3.28", default-features = false }
|
||||||
# Used for reading the configuration from conduit.toml & environment variables
|
|
||||||
figment = { version = "0.10.8", features = ["env", "toml"] }
|
figment = { version = "0.10.8", features = ["env", "toml"] }
|
||||||
|
|
||||||
tikv-jemallocator = { version = "0.5.0", features = ["unprefixed_malloc_on_supported_platforms"], optional = true }
|
tikv-jemallocator = { version = "0.5.0", features = ["unprefixed_malloc_on_supported_platforms"], optional = true }
|
||||||
async-trait = "0.1.68"
|
async-trait = "0.1.68"
|
||||||
|
|
||||||
sd-notify = { version = "0.4.1", optional = true }
|
sd-notify = { version = "0.4.1", optional = true }
|
||||||
|
|
||||||
[dependencies.rocksdb]
|
[dependencies.rocksdb]
|
||||||
|
|
@ -124,42 +86,3 @@ backend_rocksdb = ["rocksdb"]
|
||||||
jemalloc = ["tikv-jemallocator"]
|
jemalloc = ["tikv-jemallocator"]
|
||||||
sqlite = ["rusqlite", "parking_lot", "tokio/signal"]
|
sqlite = ["rusqlite", "parking_lot", "tokio/signal"]
|
||||||
systemd = ["sd-notify"]
|
systemd = ["sd-notify"]
|
||||||
|
|
||||||
[package.metadata.deb]
|
|
||||||
name = "matrix-conduit"
|
|
||||||
maintainer = "Paul van Tilburg <paul@luon.net>"
|
|
||||||
copyright = "2020, Timo Kösters <timo@koesters.xyz>"
|
|
||||||
license-file = ["LICENSE", "3"]
|
|
||||||
depends = "$auto, ca-certificates"
|
|
||||||
extended-description = """\
|
|
||||||
A fast Matrix homeserver that is optimized for smaller, personal servers, \
|
|
||||||
instead of a server that has high scalability."""
|
|
||||||
section = "net"
|
|
||||||
priority = "optional"
|
|
||||||
assets = [
|
|
||||||
["debian/README.md", "usr/share/doc/matrix-conduit/README.Debian", "644"],
|
|
||||||
["README.md", "usr/share/doc/matrix-conduit/", "644"],
|
|
||||||
["target/release/conduit", "usr/sbin/matrix-conduit", "755"],
|
|
||||||
]
|
|
||||||
conf-files = [
|
|
||||||
"/etc/matrix-conduit/conduit.toml"
|
|
||||||
]
|
|
||||||
maintainer-scripts = "debian/"
|
|
||||||
systemd-units = { unit-name = "matrix-conduit" }
|
|
||||||
|
|
||||||
[profile.dev]
|
|
||||||
lto = 'off'
|
|
||||||
incremental = true
|
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
lto = 'thin'
|
|
||||||
incremental = true
|
|
||||||
codegen-units=32
|
|
||||||
# If you want to make flamegraphs, enable debug info:
|
|
||||||
# debug = true
|
|
||||||
|
|
||||||
# For releases also try to max optimizations for dependencies:
|
|
||||||
[profile.release.build-override]
|
|
||||||
opt-level = 3
|
|
||||||
[profile.release.package."*"]
|
|
||||||
opt-level = 3
|
|
||||||
|
|
|
||||||
77
README.md
77
README.md
|
|
@ -1,77 +0,0 @@
|
||||||
# Conduit
|
|
||||||
|
|
||||||
<!-- ANCHOR: catchphrase -->
|
|
||||||
### A Matrix homeserver written in Rust
|
|
||||||
<!-- ANCHOR_END: catchphrase -->
|
|
||||||
|
|
||||||
Please visit the [Conduit documentation](https://famedly.gitlab.io/conduit) for more information.
|
|
||||||
Alternatively you can open [docs/introduction.md](docs/introduction.md) in this repository.
|
|
||||||
|
|
||||||
<!-- ANCHOR: body -->
|
|
||||||
#### What is Matrix?
|
|
||||||
|
|
||||||
[Matrix](https://matrix.org) is an open network for secure and decentralized
|
|
||||||
communication. Users from every Matrix homeserver can chat with users from all
|
|
||||||
other Matrix servers. You can even use bridges (also called Matrix appservices)
|
|
||||||
to communicate with users outside of Matrix, like a community on Discord.
|
|
||||||
|
|
||||||
#### What is the goal?
|
|
||||||
|
|
||||||
An efficient Matrix homeserver that's easy to set up and just works. You can install
|
|
||||||
it on a mini-computer like the Raspberry Pi to host Matrix for your family,
|
|
||||||
friends or company.
|
|
||||||
|
|
||||||
#### Can I try it out?
|
|
||||||
|
|
||||||
Yes! You can test our Conduit instance by opening a client that supports registration tokens such as [Element web](https://app.element.io/), [Nheko](https://matrix.org/ecosystem/clients/nheko/) or [SchildiChat web](https://app.schildi.chat/) and registering on the `conduit.rs` homeserver. The registration token is "for_testing_only". Don't share personal information. Once you have registered, you can use any other [Matrix client](https://matrix.org/ecosystem/clients) to login.
|
|
||||||
|
|
||||||
Server hosting for conduit.rs is donated by the Matrix.org Foundation.
|
|
||||||
|
|
||||||
#### What is the current status?
|
|
||||||
|
|
||||||
Conduit is Beta, meaning you can join and participate in most
|
|
||||||
Matrix rooms, but not all features are supported and you might run into bugs
|
|
||||||
from time to time.
|
|
||||||
|
|
||||||
There are still a few important features missing:
|
|
||||||
|
|
||||||
- E2EE emoji comparison over federation (E2EE chat works)
|
|
||||||
- Outgoing read receipts, typing, presence over federation (incoming works)
|
|
||||||
<!-- ANCHOR_END: body -->
|
|
||||||
|
|
||||||
<!-- ANCHOR: footer -->
|
|
||||||
#### How can I contribute?
|
|
||||||
|
|
||||||
1. Look for an issue you would like to work on and make sure no one else is currently working on it.
|
|
||||||
2. Tell us that you are working on the issue (comment on the issue or chat in
|
|
||||||
[#conduit:fachschaften.org](https://matrix.to/#/#conduit:fachschaften.org)). If it is more complicated, please explain your approach and ask questions.
|
|
||||||
3. Fork the repo, create a new branch and push commits.
|
|
||||||
4. Submit a MR
|
|
||||||
|
|
||||||
#### Contact
|
|
||||||
|
|
||||||
If you have any questions, feel free to
|
|
||||||
- Ask in `#conduit:fachschaften.org` on Matrix
|
|
||||||
- Write an E-Mail to `conduit@koesters.xyz`
|
|
||||||
- Send an direct message to `@timokoesters:fachschaften.org` on Matrix
|
|
||||||
- [Open an issue on GitLab](https://gitlab.com/famedly/conduit/-/issues/new)
|
|
||||||
|
|
||||||
#### Thanks to
|
|
||||||
|
|
||||||
Thanks to FUTO, Famedly, Prototype Fund (DLR and German BMBF) and all individuals for financially supporting this project.
|
|
||||||
|
|
||||||
Thanks to the contributors to Conduit and all libraries we use, for example:
|
|
||||||
|
|
||||||
- Ruma: A clean library for the Matrix Spec in Rust
|
|
||||||
- axum: A modular web framework
|
|
||||||
|
|
||||||
#### Donate
|
|
||||||
|
|
||||||
- Liberapay: <https://liberapay.com/timokoesters/>
|
|
||||||
- Bitcoin: `bc1qnnykf986tw49ur7wx9rpw2tevpsztvar5x8w4n`
|
|
||||||
|
|
||||||
#### Logo
|
|
||||||
|
|
||||||
- Lightning Bolt Logo: <https://github.com/mozilla/fxemoji/blob/gh-pages/svgs/nature/u26A1-bolt.svg>
|
|
||||||
- Logo License: <https://github.com/mozilla/fxemoji/blob/gh-pages/LICENSE.md>
|
|
||||||
<!-- ANCHOR_END: footer -->
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
# Path to Complement's source code
|
|
||||||
COMPLEMENT_SRC="$1"
|
|
||||||
|
|
||||||
# A `.jsonl` file to write test logs to
|
|
||||||
LOG_FILE="$2"
|
|
||||||
|
|
||||||
# A `.jsonl` file to write test results to
|
|
||||||
RESULTS_FILE="$3"
|
|
||||||
|
|
||||||
OCI_IMAGE="complement-conduit:dev"
|
|
||||||
|
|
||||||
env \
|
|
||||||
-C "$(git rev-parse --show-toplevel)" \
|
|
||||||
docker build \
|
|
||||||
--tag "$OCI_IMAGE" \
|
|
||||||
--file complement/Dockerfile \
|
|
||||||
.
|
|
||||||
|
|
||||||
# It's okay (likely, even) that `go test` exits nonzero
|
|
||||||
set +o pipefail
|
|
||||||
env \
|
|
||||||
-C "$COMPLEMENT_SRC" \
|
|
||||||
COMPLEMENT_BASE_IMAGE="$OCI_IMAGE" \
|
|
||||||
go test -json ./tests | tee "$LOG_FILE"
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
# Post-process the results into an easy-to-compare format
|
|
||||||
cat "$LOG_FILE" | jq -c '
|
|
||||||
select(
|
|
||||||
(.Action == "pass" or .Action == "fail" or .Action == "skip")
|
|
||||||
and .Test != null
|
|
||||||
) | {Action: .Action, Test: .Test}
|
|
||||||
' | sort > "$RESULTS_FILE"
|
|
||||||
|
|
@ -11,14 +11,14 @@ nix build "$@"
|
||||||
if [ ! -z ${ATTIC_TOKEN+x} ]; then
|
if [ ! -z ${ATTIC_TOKEN+x} ]; then
|
||||||
nix run --inputs-from . attic -- \
|
nix run --inputs-from . attic -- \
|
||||||
login \
|
login \
|
||||||
conduit \
|
"$ATTIC_SERVER" \
|
||||||
"${ATTIC_ENDPOINT:-https://nix.computer.surgery/conduit}" \
|
"$ATTIC_ENDPOINT" \
|
||||||
"$ATTIC_TOKEN"
|
"$ATTIC_TOKEN"
|
||||||
|
|
||||||
# Push the target installable and its build dependencies
|
# Push the target installable and its build dependencies
|
||||||
nix run --inputs-from . attic -- \
|
nix run --inputs-from . attic -- \
|
||||||
push \
|
push \
|
||||||
conduit \
|
"$ATTIC_SERVER:$ATTIC_CACHE" \
|
||||||
"$(nix path-info "$INSTALLABLE" --derivation)" \
|
"$(nix path-info "$INSTALLABLE" --derivation)" \
|
||||||
"$(nix path-info "$INSTALLABLE")"
|
"$(nix path-info "$INSTALLABLE")"
|
||||||
else
|
else
|
||||||
|
|
|
||||||
18
book.toml
18
book.toml
|
|
@ -1,18 +0,0 @@
|
||||||
[book]
|
|
||||||
title = "Conduit"
|
|
||||||
description = "Conduit is a simple, fast and reliable chat server for the Matrix protocol"
|
|
||||||
language = "en"
|
|
||||||
multilingual = false
|
|
||||||
src = "docs"
|
|
||||||
|
|
||||||
[build]
|
|
||||||
build-dir = "public"
|
|
||||||
create-missing = true
|
|
||||||
|
|
||||||
[output.html]
|
|
||||||
git-repository-url = "https://gitlab.com/famedly/conduit"
|
|
||||||
edit-url-template = "https://gitlab.com/famedly/conduit/-/edit/next/{path}"
|
|
||||||
git-repository-icon = "fa-git-square"
|
|
||||||
|
|
||||||
[output.html.search]
|
|
||||||
limit-results = 15
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
FROM rust:1.75.0
|
|
||||||
|
|
||||||
WORKDIR /workdir
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
libclang-dev
|
|
||||||
|
|
||||||
COPY Cargo.toml Cargo.toml
|
|
||||||
COPY Cargo.lock Cargo.lock
|
|
||||||
COPY src src
|
|
||||||
RUN cargo build --release \
|
|
||||||
&& mv target/release/conduit conduit \
|
|
||||||
&& rm -rf target
|
|
||||||
|
|
||||||
# Install caddy
|
|
||||||
RUN apt-get update \
|
|
||||||
&& apt-get install -y \
|
|
||||||
debian-keyring \
|
|
||||||
debian-archive-keyring \
|
|
||||||
apt-transport-https \
|
|
||||||
curl \
|
|
||||||
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/testing/gpg.key' \
|
|
||||||
| gpg --dearmor -o /usr/share/keyrings/caddy-testing-archive-keyring.gpg \
|
|
||||||
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/testing/debian.deb.txt' \
|
|
||||||
| tee /etc/apt/sources.list.d/caddy-testing.list \
|
|
||||||
&& apt-get update \
|
|
||||||
&& apt-get install -y caddy
|
|
||||||
|
|
||||||
COPY conduit-example.toml conduit.toml
|
|
||||||
COPY complement/caddy.json caddy.json
|
|
||||||
|
|
||||||
ENV SERVER_NAME=localhost
|
|
||||||
ENV CONDUIT_CONFIG=/workdir/conduit.toml
|
|
||||||
|
|
||||||
RUN sed -i "s/port = 6167/port = 8008/g" conduit.toml
|
|
||||||
RUN echo "log = \"warn,_=off\"" >> conduit.toml
|
|
||||||
RUN sed -i "s/address = \"127.0.0.1\"/address = \"0.0.0.0\"/g" conduit.toml
|
|
||||||
|
|
||||||
EXPOSE 8008 8448
|
|
||||||
|
|
||||||
CMD uname -a && \
|
|
||||||
sed -i "s/#server_name = \"your.server.name\"/server_name = \"${SERVER_NAME}\"/g" conduit.toml && \
|
|
||||||
sed -i "s/your.server.name/${SERVER_NAME}/g" caddy.json && \
|
|
||||||
caddy start --config caddy.json > /dev/null && \
|
|
||||||
/workdir/conduit
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
# Complement
|
|
||||||
|
|
||||||
## What's that?
|
|
||||||
|
|
||||||
Have a look at [its repository](https://github.com/matrix-org/complement).
|
|
||||||
|
|
||||||
## How do I use it with Conduit?
|
|
||||||
|
|
||||||
The script at [`../bin/complement`](../bin/complement) has automation for this.
|
|
||||||
It takes a few command line arguments, you can read the script to find out what
|
|
||||||
those are.
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
||||||
{
|
|
||||||
"logging": {
|
|
||||||
"logs": {
|
|
||||||
"default": {
|
|
||||||
"level": "WARN"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"apps": {
|
|
||||||
"http": {
|
|
||||||
"https_port": 8448,
|
|
||||||
"servers": {
|
|
||||||
"srv0": {
|
|
||||||
"listen": [":8448"],
|
|
||||||
"routes": [{
|
|
||||||
"match": [{
|
|
||||||
"host": ["your.server.name"]
|
|
||||||
}],
|
|
||||||
"handle": [{
|
|
||||||
"handler": "subroute",
|
|
||||||
"routes": [{
|
|
||||||
"handle": [{
|
|
||||||
"handler": "reverse_proxy",
|
|
||||||
"upstreams": [{
|
|
||||||
"dial": "127.0.0.1:8008"
|
|
||||||
}]
|
|
||||||
}]
|
|
||||||
}]
|
|
||||||
}],
|
|
||||||
"terminal": true
|
|
||||||
}],
|
|
||||||
"tls_connection_policies": [{
|
|
||||||
"match": {
|
|
||||||
"sni": ["your.server.name"]
|
|
||||||
}
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pki": {
|
|
||||||
"certificate_authorities": {
|
|
||||||
"local": {
|
|
||||||
"name": "Complement CA",
|
|
||||||
"root": {
|
|
||||||
"certificate": "/complement/ca/ca.crt",
|
|
||||||
"private_key": "/complement/ca/ca.key"
|
|
||||||
},
|
|
||||||
"intermediate": {
|
|
||||||
"certificate": "/complement/ca/ca.crt",
|
|
||||||
"private_key": "/complement/ca/ca.key"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tls": {
|
|
||||||
"automation": {
|
|
||||||
"policies": [{
|
|
||||||
"subjects": ["your.server.name"],
|
|
||||||
"issuers": [{
|
|
||||||
"module": "internal"
|
|
||||||
}],
|
|
||||||
"on_demand": true
|
|
||||||
}, {
|
|
||||||
"issuers": [{
|
|
||||||
"module": "internal",
|
|
||||||
"ca": "local"
|
|
||||||
}]
|
|
||||||
}]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
# =============================================================================
|
|
||||||
# This is the official example config for Conduit.
|
|
||||||
# If you use it for your server, you will need to adjust it to your own needs.
|
|
||||||
# At the very least, change the server_name field!
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
[global]
|
|
||||||
# The server_name is the pretty name of this server. It is used as a suffix for user
|
|
||||||
# and room ids. Examples: matrix.org, conduit.rs
|
|
||||||
|
|
||||||
# The Conduit server needs all /_matrix/ requests to be reachable at
|
|
||||||
# https://your.server.name/ on port 443 (client-server) and 8448 (federation).
|
|
||||||
|
|
||||||
# If that's not possible for you, you can create /.well-known files to redirect
|
|
||||||
# requests. See
|
|
||||||
# https://matrix.org/docs/spec/client_server/latest#get-well-known-matrix-client
|
|
||||||
# and
|
|
||||||
# https://matrix.org/docs/spec/server_server/r0.1.4#get-well-known-matrix-server
|
|
||||||
# for more information
|
|
||||||
|
|
||||||
# YOU NEED TO EDIT THIS
|
|
||||||
#server_name = "your.server.name"
|
|
||||||
|
|
||||||
# This is the only directory where Conduit will save its data
|
|
||||||
database_path = "/var/lib/matrix-conduit/"
|
|
||||||
database_backend = "rocksdb"
|
|
||||||
|
|
||||||
# The port Conduit will be running on. You need to set up a reverse proxy in
|
|
||||||
# your web server (e.g. apache or nginx), so all requests to /_matrix on port
|
|
||||||
# 443 and 8448 will be forwarded to the Conduit instance running on this port
|
|
||||||
# Docker users: Don't change this, you'll need to map an external port to this.
|
|
||||||
port = 6167
|
|
||||||
|
|
||||||
# Max size for uploads
|
|
||||||
max_request_size = 20_000_000 # in bytes
|
|
||||||
|
|
||||||
# Enables registration. If set to false, no users can register on this server.
|
|
||||||
allow_registration = true
|
|
||||||
|
|
||||||
# A static registration token that new users will have to provide when creating
|
|
||||||
# an account. YOU NEED TO EDIT THIS.
|
|
||||||
# - Insert a password that users will have to enter on registration
|
|
||||||
# - Start the line with '#' to remove the condition
|
|
||||||
registration_token = ""
|
|
||||||
|
|
||||||
allow_federation = true
|
|
||||||
allow_check_for_updates = true
|
|
||||||
|
|
||||||
# Enable the display name lightning bolt on registration.
|
|
||||||
enable_lightning_bolt = true
|
|
||||||
|
|
||||||
# Servers listed here will be used to gather public keys of other servers.
|
|
||||||
# Generally, copying this exactly should be enough. (Currently, Conduit doesn't
|
|
||||||
# support batched key requests, so this list should only contain Synapse
|
|
||||||
# servers.)
|
|
||||||
trusted_servers = ["matrix.org"]
|
|
||||||
|
|
||||||
#max_concurrent_requests = 100 # How many requests Conduit sends to other servers at the same time
|
|
||||||
|
|
||||||
# Controls the log verbosity. See also [here][0].
|
|
||||||
#
|
|
||||||
# [0]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
|
|
||||||
#log = "..."
|
|
||||||
|
|
||||||
address = "127.0.0.1" # This makes sure Conduit can only be reached using the reverse proxy
|
|
||||||
#address = "0.0.0.0" # If Conduit is running in a container, make sure the reverse proxy (ie. Traefik) can reach it.
|
|
||||||
37
debian/README.md
vendored
37
debian/README.md
vendored
|
|
@ -1,37 +0,0 @@
|
||||||
Conduit for Debian
|
|
||||||
==================
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
Information about downloading, building and deploying the Debian package, see
|
|
||||||
the "Installing Conduit" section in the Deploying docs.
|
|
||||||
All following sections until "Setting up the Reverse Proxy" be ignored because
|
|
||||||
this is handled automatically by the packaging.
|
|
||||||
|
|
||||||
Configuration
|
|
||||||
-------------
|
|
||||||
|
|
||||||
When installed, Debconf generates the configuration of the homeserver
|
|
||||||
(host)name, the address and port it listens on. This configuration ends up in
|
|
||||||
`/etc/matrix-conduit/conduit.toml`.
|
|
||||||
|
|
||||||
You can tweak more detailed settings by uncommenting and setting the variables
|
|
||||||
in `/etc/matrix-conduit/conduit.toml`. This involves settings such as the maximum
|
|
||||||
file size for download/upload, enabling federation, etc.
|
|
||||||
|
|
||||||
Running
|
|
||||||
-------
|
|
||||||
|
|
||||||
The package uses the `matrix-conduit.service` systemd unit file to start and
|
|
||||||
stop Conduit. It loads the configuration file mentioned above to set up the
|
|
||||||
environment before running the server.
|
|
||||||
|
|
||||||
This package assumes by default that Conduit will be placed behind a reverse
|
|
||||||
proxy such as Apache or nginx. This default deployment entails just listening
|
|
||||||
on `127.0.0.1` and the free port `6167` and is reachable via a client using the URL
|
|
||||||
<http://localhost:6167>.
|
|
||||||
|
|
||||||
At a later stage this packaging may support also setting up TLS and running
|
|
||||||
stand-alone. In this case, however, you need to set up some certificates and
|
|
||||||
renewal, for it to work properly.
|
|
||||||
17
debian/config
vendored
17
debian/config
vendored
|
|
@ -1,17 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# Source debconf library.
|
|
||||||
. /usr/share/debconf/confmodule
|
|
||||||
|
|
||||||
# Ask for the Matrix homeserver name, address and port.
|
|
||||||
db_input high matrix-conduit/hostname || true
|
|
||||||
db_go
|
|
||||||
|
|
||||||
db_input low matrix-conduit/address || true
|
|
||||||
db_go
|
|
||||||
|
|
||||||
db_input medium matrix-conduit/port || true
|
|
||||||
db_go
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
47
debian/matrix-conduit.service
vendored
47
debian/matrix-conduit.service
vendored
|
|
@ -1,47 +0,0 @@
|
||||||
[Unit]
|
|
||||||
Description=Conduit Matrix homeserver
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
DynamicUser=yes
|
|
||||||
User=_matrix-conduit
|
|
||||||
Group=_matrix-conduit
|
|
||||||
Type=simple
|
|
||||||
|
|
||||||
AmbientCapabilities=
|
|
||||||
CapabilityBoundingSet=
|
|
||||||
LockPersonality=yes
|
|
||||||
MemoryDenyWriteExecute=yes
|
|
||||||
NoNewPrivileges=yes
|
|
||||||
ProtectClock=yes
|
|
||||||
ProtectControlGroups=yes
|
|
||||||
ProtectHome=yes
|
|
||||||
ProtectHostname=yes
|
|
||||||
ProtectKernelLogs=yes
|
|
||||||
ProtectKernelModules=yes
|
|
||||||
ProtectKernelTunables=yes
|
|
||||||
ProtectSystem=strict
|
|
||||||
PrivateDevices=yes
|
|
||||||
PrivateMounts=yes
|
|
||||||
PrivateTmp=yes
|
|
||||||
PrivateUsers=yes
|
|
||||||
RemoveIPC=yes
|
|
||||||
RestrictAddressFamilies=AF_INET AF_INET6
|
|
||||||
RestrictNamespaces=yes
|
|
||||||
RestrictRealtime=yes
|
|
||||||
RestrictSUIDSGID=yes
|
|
||||||
SystemCallArchitectures=native
|
|
||||||
SystemCallFilter=@system-service
|
|
||||||
SystemCallErrorNumber=EPERM
|
|
||||||
StateDirectory=matrix-conduit
|
|
||||||
|
|
||||||
Environment="CONDUIT_CONFIG=/etc/matrix-conduit/conduit.toml"
|
|
||||||
|
|
||||||
ExecStart=/usr/sbin/matrix-conduit
|
|
||||||
Restart=on-failure
|
|
||||||
RestartSec=10
|
|
||||||
StartLimitInterval=1m
|
|
||||||
StartLimitBurst=5
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
104
debian/postinst
vendored
104
debian/postinst
vendored
|
|
@ -1,104 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
. /usr/share/debconf/confmodule
|
|
||||||
|
|
||||||
CONDUIT_CONFIG_PATH=/etc/matrix-conduit
|
|
||||||
CONDUIT_CONFIG_FILE="${CONDUIT_CONFIG_PATH}/conduit.toml"
|
|
||||||
CONDUIT_DATABASE_PATH=/var/lib/matrix-conduit/
|
|
||||||
|
|
||||||
case "$1" in
|
|
||||||
configure)
|
|
||||||
# Create the `_matrix-conduit` user if it does not exist yet.
|
|
||||||
if ! getent passwd _matrix-conduit > /dev/null ; then
|
|
||||||
echo 'Adding system user for the Conduit Matrix homeserver' 1>&2
|
|
||||||
adduser --system --group --quiet \
|
|
||||||
--home "$CONDUIT_DATABASE_PATH" \
|
|
||||||
--disabled-login \
|
|
||||||
--force-badname \
|
|
||||||
_matrix-conduit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create the database path if it does not exist yet and fix up ownership
|
|
||||||
# and permissions.
|
|
||||||
mkdir -p "$CONDUIT_DATABASE_PATH"
|
|
||||||
chown _matrix-conduit "$CONDUIT_DATABASE_PATH"
|
|
||||||
chmod 700 "$CONDUIT_DATABASE_PATH"
|
|
||||||
|
|
||||||
if [ ! -e "$CONDUIT_CONFIG_FILE" ]; then
|
|
||||||
# Write the debconf values in the config.
|
|
||||||
db_get matrix-conduit/hostname
|
|
||||||
CONDUIT_SERVER_NAME="$RET"
|
|
||||||
db_get matrix-conduit/address
|
|
||||||
CONDUIT_ADDRESS="$RET"
|
|
||||||
db_get matrix-conduit/port
|
|
||||||
CONDUIT_PORT="$RET"
|
|
||||||
mkdir -p "$CONDUIT_CONFIG_PATH"
|
|
||||||
cat > "$CONDUIT_CONFIG_FILE" << EOF
|
|
||||||
[global]
|
|
||||||
# The server_name is the pretty name of this server. It is used as a suffix for
|
|
||||||
# user and room ids. Examples: matrix.org, conduit.rs
|
|
||||||
|
|
||||||
# The Conduit server needs all /_matrix/ requests to be reachable at
|
|
||||||
# https://your.server.name/ on port 443 (client-server) and 8448 (federation).
|
|
||||||
|
|
||||||
# If that's not possible for you, you can create /.well-known files to redirect
|
|
||||||
# requests. See
|
|
||||||
# https://matrix.org/docs/spec/client_server/latest#get-well-known-matrix-client
|
|
||||||
# and
|
|
||||||
# https://matrix.org/docs/spec/server_server/r0.1.4#get-well-known-matrix-server
|
|
||||||
# for more information
|
|
||||||
|
|
||||||
server_name = "${CONDUIT_SERVER_NAME}"
|
|
||||||
|
|
||||||
# This is the only directory where Conduit will save its data.
|
|
||||||
database_path = "${CONDUIT_DATABASE_PATH}"
|
|
||||||
database_backend = "rocksdb"
|
|
||||||
|
|
||||||
# The address Conduit will be listening on.
|
|
||||||
# By default the server listens on address 0.0.0.0. Change this to 127.0.0.1 to
|
|
||||||
# only listen on the localhost when using a reverse proxy.
|
|
||||||
address = "${CONDUIT_ADDRESS}"
|
|
||||||
|
|
||||||
# The port Conduit will be running on. You need to set up a reverse proxy in
|
|
||||||
# your web server (e.g. apache or nginx), so all requests to /_matrix on port
|
|
||||||
# 443 and 8448 will be forwarded to the Conduit instance running on this port
|
|
||||||
# Docker users: Don't change this, you'll need to map an external port to this.
|
|
||||||
port = ${CONDUIT_PORT}
|
|
||||||
|
|
||||||
# Max size for uploads
|
|
||||||
max_request_size = 20_000_000 # in bytes
|
|
||||||
|
|
||||||
# Enables registration. If set to false, no users can register on this server.
|
|
||||||
allow_registration = true
|
|
||||||
|
|
||||||
# A static registration token that new users will have to provide when creating
|
|
||||||
# an account.
|
|
||||||
# - Insert a password that users will have to enter on registration
|
|
||||||
# - Start the line with '#' to remove the condition
|
|
||||||
#registration_token = ""
|
|
||||||
|
|
||||||
allow_federation = true
|
|
||||||
allow_check_for_updates = true
|
|
||||||
|
|
||||||
# Enable the display name lightning bolt on registration.
|
|
||||||
enable_lightning_bolt = true
|
|
||||||
|
|
||||||
# Servers listed here will be used to gather public keys of other servers.
|
|
||||||
# Generally, copying this exactly should be enough. (Currently, Conduit doesn't
|
|
||||||
# support batched key requests, so this list should only contain Synapse
|
|
||||||
# servers.)
|
|
||||||
trusted_servers = ["matrix.org"]
|
|
||||||
|
|
||||||
#max_concurrent_requests = 100 # How many requests Conduit sends to other servers at the same time
|
|
||||||
|
|
||||||
# Controls the log verbosity. See also [here][0].
|
|
||||||
#
|
|
||||||
# [0]: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
|
|
||||||
#log = "..."
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
27
debian/postrm
vendored
27
debian/postrm
vendored
|
|
@ -1,27 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
set -e
|
|
||||||
|
|
||||||
. /usr/share/debconf/confmodule
|
|
||||||
|
|
||||||
CONDUIT_CONFIG_PATH=/etc/matrix-conduit
|
|
||||||
CONDUIT_DATABASE_PATH=/var/lib/matrix-conduit
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
purge)
|
|
||||||
# Remove debconf changes from the db
|
|
||||||
db_purge
|
|
||||||
|
|
||||||
# Per https://www.debian.org/doc/debian-policy/ch-files.html#behavior
|
|
||||||
# "configuration files must be preserved when the package is removed, and
|
|
||||||
# only deleted when the package is purged."
|
|
||||||
if [ -d "$CONDUIT_CONFIG_PATH" ]; then
|
|
||||||
rm -r "$CONDUIT_CONFIG_PATH"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "$CONDUIT_DATABASE_PATH" ]; then
|
|
||||||
rm -r "$CONDUIT_DATABASE_PATH"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
#DEBHELPER#
|
|
||||||
21
debian/templates
vendored
21
debian/templates
vendored
|
|
@ -1,21 +0,0 @@
|
||||||
Template: matrix-conduit/hostname
|
|
||||||
Type: string
|
|
||||||
Default: localhost
|
|
||||||
Description: The server (host)name of the Matrix homeserver
|
|
||||||
This is the hostname the homeserver will be reachable at via a client.
|
|
||||||
.
|
|
||||||
If set to "localhost", you can connect with a client locally and clients
|
|
||||||
from other hosts and also other homeservers will not be able to reach you!
|
|
||||||
|
|
||||||
Template: matrix-conduit/address
|
|
||||||
Type: string
|
|
||||||
Default: 127.0.0.1
|
|
||||||
Description: The listen address of the Matrix homeserver
|
|
||||||
This is the address the homeserver will listen on. Leave it set to 127.0.0.1
|
|
||||||
when using a reverse proxy.
|
|
||||||
|
|
||||||
Template: matrix-conduit/port
|
|
||||||
Type: string
|
|
||||||
Default: 6167
|
|
||||||
Description: The port of the Matrix homeserver
|
|
||||||
This port is most often just accessed by a reverse proxy.
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
# syntax=docker/dockerfile:1
|
|
||||||
# ---------------------------------------------------------------------------------------------------------
|
|
||||||
# This Dockerfile is intended to be built as part of Conduit's CI pipeline.
|
|
||||||
# It does not build Conduit in Docker, but just copies the matching build artifact from the build jobs.
|
|
||||||
#
|
|
||||||
# It is mostly based on the normal Conduit Dockerfile, but adjusted in a few places to maximise caching.
|
|
||||||
# Credit's for the original Dockerfile: Weasy666.
|
|
||||||
# ---------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
FROM docker.io/alpine:3.16.0@sha256:4ff3ca91275773af45cb4b0834e12b7eb47d1c18f770a0b151381cd227f4c253 AS runner
|
|
||||||
|
|
||||||
|
|
||||||
# Standard port on which Conduit launches.
|
|
||||||
# You still need to map the port when using the docker command or docker-compose.
|
|
||||||
EXPOSE 6167
|
|
||||||
|
|
||||||
# Users are expected to mount a volume to this directory:
|
|
||||||
ARG DEFAULT_DB_PATH=/var/lib/matrix-conduit
|
|
||||||
|
|
||||||
ENV CONDUIT_PORT=6167 \
|
|
||||||
CONDUIT_ADDRESS="0.0.0.0" \
|
|
||||||
CONDUIT_DATABASE_PATH=${DEFAULT_DB_PATH} \
|
|
||||||
CONDUIT_CONFIG=''
|
|
||||||
# └─> Set no config file to do all configuration with env vars
|
|
||||||
|
|
||||||
# Conduit needs:
|
|
||||||
# ca-certificates: for https
|
|
||||||
# iproute2: for `ss` for the healthcheck script
|
|
||||||
RUN apk add --no-cache \
|
|
||||||
ca-certificates \
|
|
||||||
iproute2
|
|
||||||
|
|
||||||
ARG CREATED
|
|
||||||
ARG VERSION
|
|
||||||
ARG GIT_REF
|
|
||||||
# Labels according to https://github.com/opencontainers/image-spec/blob/master/annotations.md
|
|
||||||
# including a custom label specifying the build command
|
|
||||||
LABEL org.opencontainers.image.created=${CREATED} \
|
|
||||||
org.opencontainers.image.authors="Conduit Contributors" \
|
|
||||||
org.opencontainers.image.title="Conduit" \
|
|
||||||
org.opencontainers.image.version=${VERSION} \
|
|
||||||
org.opencontainers.image.vendor="Conduit Contributors" \
|
|
||||||
org.opencontainers.image.description="A Matrix homeserver written in Rust" \
|
|
||||||
org.opencontainers.image.url="https://conduit.rs/" \
|
|
||||||
org.opencontainers.image.revision=${GIT_REF} \
|
|
||||||
org.opencontainers.image.source="https://gitlab.com/famedly/conduit.git" \
|
|
||||||
org.opencontainers.image.licenses="Apache-2.0" \
|
|
||||||
org.opencontainers.image.documentation="https://gitlab.com/famedly/conduit" \
|
|
||||||
org.opencontainers.image.ref.name=""
|
|
||||||
|
|
||||||
|
|
||||||
# Test if Conduit is still alive, uses the same endpoint as Element
|
|
||||||
COPY ./docker/healthcheck.sh /srv/conduit/healthcheck.sh
|
|
||||||
HEALTHCHECK --start-period=5s --interval=5s CMD ./healthcheck.sh
|
|
||||||
|
|
||||||
# Improve security: Don't run stuff as root, that does not need to run as root:
|
|
||||||
# Most distros also use 1000:1000 for the first real user, so this should resolve volume mounting problems.
|
|
||||||
ARG USER_ID=1000
|
|
||||||
ARG GROUP_ID=1000
|
|
||||||
RUN set -x ; \
|
|
||||||
deluser --remove-home www-data ; \
|
|
||||||
addgroup -S -g ${GROUP_ID} conduit 2>/dev/null ; \
|
|
||||||
adduser -S -u ${USER_ID} -D -H -h /srv/conduit -G conduit -g conduit conduit 2>/dev/null ; \
|
|
||||||
addgroup conduit conduit 2>/dev/null && exit 0 ; exit 1
|
|
||||||
|
|
||||||
# Change ownership of Conduit files to conduit user and group
|
|
||||||
RUN chown -cR conduit:conduit /srv/conduit && \
|
|
||||||
chmod +x /srv/conduit/healthcheck.sh && \
|
|
||||||
mkdir -p ${DEFAULT_DB_PATH} && \
|
|
||||||
chown -cR conduit:conduit ${DEFAULT_DB_PATH}
|
|
||||||
|
|
||||||
# Change user to conduit
|
|
||||||
USER conduit
|
|
||||||
# Set container home directory
|
|
||||||
WORKDIR /srv/conduit
|
|
||||||
|
|
||||||
# Run Conduit and print backtraces on panics
|
|
||||||
ENV RUST_BACKTRACE=1
|
|
||||||
ENTRYPOINT [ "/srv/conduit/conduit" ]
|
|
||||||
|
|
||||||
# Depending on the target platform (e.g. "linux/arm/v7", "linux/arm64/v8", or "linux/amd64")
|
|
||||||
# copy the matching binary into this docker image
|
|
||||||
ARG TARGETPLATFORM
|
|
||||||
COPY --chown=conduit:conduit ./$TARGETPLATFORM /srv/conduit/conduit
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# If the config file does not contain a default port and the CONDUIT_PORT env is not set, create
|
|
||||||
# try to get port from process list
|
|
||||||
if [ -z "${CONDUIT_PORT}" ]; then
|
|
||||||
CONDUIT_PORT=$(ss -tlpn | grep conduit | grep -m1 -o ':[0-9]*' | grep -m1 -o '[0-9]*')
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If CONDUIT_ADDRESS is not set try to get the address from the process list
|
|
||||||
if [ -z "${CONDUIT_ADDRESS}" ]; then
|
|
||||||
CONDUIT_ADDRESS=$(ss -tlpn | awk -F ' +|:' '/conduit/ { print $4 }')
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The actual health check.
|
|
||||||
# We try to first get a response on HTTP and when that fails on HTTPS and when that fails, we exit with code 1.
|
|
||||||
# TODO: Change this to a single wget call. Do we have a config value that we can check for that?
|
|
||||||
wget --no-verbose --tries=1 --spider "http://${CONDUIT_ADDRESS}:${CONDUIT_PORT}/_matrix/client/versions" || \
|
|
||||||
wget --no-verbose --tries=1 --spider "https://${CONDUIT_ADDRESS}:${CONDUIT_PORT}/_matrix/client/versions" || \
|
|
||||||
exit 1
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
# Summary
|
|
||||||
|
|
||||||
- [Introduction](introduction.md)
|
|
||||||
|
|
||||||
- [Configuration](configuration.md)
|
|
||||||
- [Deploying](deploying.md)
|
|
||||||
- [Generic](deploying/generic.md)
|
|
||||||
- [Debian](deploying/debian.md)
|
|
||||||
- [Docker](deploying/docker.md)
|
|
||||||
- [NixOS](deploying/nixos.md)
|
|
||||||
- [TURN](turn.md)
|
|
||||||
- [Appservices](appservices.md)
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
# Setting up Appservices
|
|
||||||
|
|
||||||
## Getting help
|
|
||||||
|
|
||||||
If you run into any problems while setting up an Appservice, write an email to `timo@koesters.xyz`, ask us in [#conduit:fachschaften.org](https://matrix.to/#/#conduit:fachschaften.org) or [open an issue on GitLab](https://gitlab.com/famedly/conduit/-/issues/new).
|
|
||||||
|
|
||||||
## Set up the appservice - general instructions
|
|
||||||
|
|
||||||
Follow whatever instructions are given by the appservice. This usually includes
|
|
||||||
downloading, changing its config (setting domain, homeserver url, port etc.)
|
|
||||||
and later starting it.
|
|
||||||
|
|
||||||
At some point the appservice guide should ask you to add a registration yaml
|
|
||||||
file to the homeserver. In Synapse you would do this by adding the path to the
|
|
||||||
homeserver.yaml, but in Conduit you can do this from within Matrix:
|
|
||||||
|
|
||||||
First, go into the #admins room of your homeserver. The first person that
|
|
||||||
registered on the homeserver automatically joins it. Then send a message into
|
|
||||||
the room like this:
|
|
||||||
|
|
||||||
@conduit:your.server.name: register-appservice
|
|
||||||
```
|
|
||||||
paste
|
|
||||||
the
|
|
||||||
contents
|
|
||||||
of
|
|
||||||
the
|
|
||||||
yaml
|
|
||||||
registration
|
|
||||||
here
|
|
||||||
```
|
|
||||||
|
|
||||||
You can confirm it worked by sending a message like this:
|
|
||||||
`@conduit:your.server.name: list-appservices`
|
|
||||||
|
|
||||||
The @conduit bot should answer with `Appservices (1): your-bridge`
|
|
||||||
|
|
||||||
Then you are done. Conduit will send messages to the appservices and the
|
|
||||||
appservice can send requests to the homeserver. You don't need to restart
|
|
||||||
Conduit, but if it doesn't work, restarting while the appservice is running
|
|
||||||
could help.
|
|
||||||
|
|
||||||
## Appservice-specific instructions
|
|
||||||
|
|
||||||
### Remove an appservice
|
|
||||||
|
|
||||||
To remove an appservice go to your admin room and execute
|
|
||||||
|
|
||||||
`@conduit:your.server.name: unregister-appservice <name>`
|
|
||||||
|
|
||||||
where `<name>` one of the output of `list-appservices`.
|
|
||||||
|
|
||||||
### Tested appservices
|
|
||||||
|
|
||||||
These appservices have been tested and work with Conduit without any extra steps:
|
|
||||||
|
|
||||||
- [matrix-appservice-discord](https://github.com/Half-Shot/matrix-appservice-discord)
|
|
||||||
- [mautrix-hangouts](https://github.com/mautrix/hangouts/)
|
|
||||||
- [mautrix-telegram](https://github.com/mautrix/telegram/)
|
|
||||||
- [mautrix-signal](https://github.com/mautrix/signal/) from version `0.2.2` forward.
|
|
||||||
- [heisenbridge](https://github.com/hifi/heisenbridge/)
|
|
||||||
|
|
@ -1,110 +0,0 @@
|
||||||
# Configuration
|
|
||||||
|
|
||||||
**Conduit** is configured using a TOML file. The configuration file is loaded from the path specified by the `CONDUIT_CONFIG` environment variable.
|
|
||||||
|
|
||||||
> **Note:** The configuration file is required to run Conduit. If the `CONDUIT_CONFIG` environment variable is not set, Conduit will exit with an error.
|
|
||||||
|
|
||||||
> **Note:** If you update the configuration file, you must restart Conduit for the changes to take effect
|
|
||||||
|
|
||||||
Conduit's configuration file is divided into the following sections:
|
|
||||||
|
|
||||||
- [Global](#global)
|
|
||||||
- [TLS](#tls)
|
|
||||||
- [Proxy](#proxy)
|
|
||||||
|
|
||||||
|
|
||||||
## Global
|
|
||||||
|
|
||||||
The `global` section contains the following fields:
|
|
||||||
|
|
||||||
> **Note:** The `*` symbol indicates that the field is required, and the values in **parentheses** are the possible values
|
|
||||||
|
|
||||||
| Field | Type | Description | Default |
|
|
||||||
| --- | --- | --- | --- |
|
|
||||||
| `address` | `string` | The address to bind to | `"127.0.0.1"` |
|
|
||||||
| `port` | `integer` | The port to bind to | `8000` |
|
|
||||||
| `tls` | `table` | See the [TLS configuration](#tls) | N/A |
|
|
||||||
| `server_name`_*_ | `string` | The server name | N/A |
|
|
||||||
| `database_backend`_*_ | `string` | The database backend to use (`"rocksdb"` *recommended*, `"sqlite"`) | N/A |
|
|
||||||
| `database_path`_*_ | `string` | The path to the database file/dir | N/A |
|
|
||||||
| `db_cache_capacity_mb` | `float` | The cache capacity, in MB | `300.0` |
|
|
||||||
| `enable_lightning_bolt` | `boolean` | Add `⚡️` emoji to end of user's display name | `true` |
|
|
||||||
| `allow_check_for_updates` | `boolean` | Allow Conduit to check for updates | `true` |
|
|
||||||
| `conduit_cache_capacity_modifier` | `float` | The value to multiply the default cache capacity by | `1.0` |
|
|
||||||
| `rocksdb_max_open_files` | `integer` | The maximum number of open files | `1000` |
|
|
||||||
| `pdu_cache_capacity` | `integer` | The maximum number of Persisted Data Units (PDUs) to cache | `150000` |
|
|
||||||
| `cleanup_second_interval` | `integer` | How often conduit should clean up the database, in seconds | `60` |
|
|
||||||
| `max_request_size` | `integer` | The maximum request size, in bytes | `20971520` (20 MiB) |
|
|
||||||
| `max_concurrent_requests` | `integer` | The maximum number of concurrent requests | `100` |
|
|
||||||
| `max_fetch_prev_events` | `integer` | The maximum number of previous events to fetch per request if conduit notices events are missing | `100` |
|
|
||||||
| `allow_registration` | `boolean` | Opens your homeserver to public registration | `false` |
|
|
||||||
| `registration_token` | `string` | The token users need to have when registering to your homeserver | N/A |
|
|
||||||
| `allow_encryption` | `boolean` | Allow users to enable encryption in their rooms | `true` |
|
|
||||||
| `allow_federation` | `boolean` | Allow federation with other servers | `true` |
|
|
||||||
| `allow_room_creation` | `boolean` | Allow users to create rooms | `true` |
|
|
||||||
| `allow_unstable_room_versions` | `boolean` | Allow users to create and join rooms with unstable versions | `true` |
|
|
||||||
| `default_room_version` | `string` | The default room version (`"6"`-`"10"`)| `"10"` |
|
|
||||||
| `allow_jaeger` | `boolean` | Allow Jaeger tracing | `false` |
|
|
||||||
| `tracing_flame` | `boolean` | Enable flame tracing | `false` |
|
|
||||||
| `proxy` | `table` | See the [Proxy configuration](#proxy) | N/A |
|
|
||||||
| `jwt_secret` | `string` | The secret used in the JWT to enable JWT login without it a 400 error will be returned | N/A |
|
|
||||||
| `trusted_servers` | `array` | The list of trusted servers to gather public keys of offline servers | `["matrix.org"]` |
|
|
||||||
| `log` | `string` | The log verbosity to use | `"warn"` |
|
|
||||||
| `turn_username` | `string` | The TURN username | `""` |
|
|
||||||
| `turn_password` | `string` | The TURN password | `""` |
|
|
||||||
| `turn_uris` | `array` | The TURN URIs | `[]` |
|
|
||||||
| `turn_secret` | `string` | The TURN secret | `""` |
|
|
||||||
| `turn_ttl` | `integer` | The TURN TTL in seconds | `86400` |
|
|
||||||
| `emergency_password` | `string` | Set a password to login as the `conduit` user in case of emergency | N/A |
|
|
||||||
|
|
||||||
|
|
||||||
### TLS
|
|
||||||
The `tls` table contains the following fields:
|
|
||||||
- `certs`: The path to the public PEM certificate
|
|
||||||
- `key`: The path to the PEM private key
|
|
||||||
|
|
||||||
#### Example
|
|
||||||
```toml
|
|
||||||
[global.tls]
|
|
||||||
certs = "/path/to/cert.pem"
|
|
||||||
key = "/path/to/key.pem"
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
### Proxy
|
|
||||||
You can choose what requests conduit should proxy (if any). The `proxy` table contains the following fields
|
|
||||||
|
|
||||||
#### Global
|
|
||||||
The global option will proxy all outgoing requests. The `global` table contains the following fields:
|
|
||||||
- `url`: The URL of the proxy server
|
|
||||||
##### Example
|
|
||||||
```toml
|
|
||||||
[global.proxy.global]
|
|
||||||
url = "https://example.com"
|
|
||||||
```
|
|
||||||
|
|
||||||
#### By domain
|
|
||||||
An array of tables that contain the following fields:
|
|
||||||
- `url`: The URL of the proxy server
|
|
||||||
- `include`: Domains that should be proxied (assumed to be `["*"]` if unset)
|
|
||||||
- `exclude`: Domains that should not be proxied (takes precedent over `include`)
|
|
||||||
|
|
||||||
Both `include` and `exclude` allow for glob pattern matching.
|
|
||||||
##### Example
|
|
||||||
In this example, all requests to domains ending in `.onion` and `matrix.secretly-an-onion-domain.xyz`
|
|
||||||
will be proxied via `socks://localhost:9050`, except for domains ending in `.myspecial.onion`. You can add as many `by_domain` tables as you need.
|
|
||||||
```toml
|
|
||||||
[[global.proxy.by_domain]]
|
|
||||||
url = "socks5://localhost:9050"
|
|
||||||
include = ["*.onion", "matrix.secretly-an-onion-domain.xyz"]
|
|
||||||
exclude = ["*.clearnet.onion"]
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
> **Note:** The following example is a minimal configuration file. You should replace the values with your own.
|
|
||||||
|
|
||||||
```toml
|
|
||||||
[global]
|
|
||||||
{{#include ../conduit-example.toml:22:}}
|
|
||||||
```
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
# Deploying
|
|
||||||
|
|
||||||
This chapter describes various ways to deploy Conduit.
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
{{#include ../../debian/README.md}}
|
|
||||||
|
|
@ -1,69 +0,0 @@
|
||||||
# Conduit - Behind Traefik Reverse Proxy
|
|
||||||
version: '3'
|
|
||||||
|
|
||||||
services:
|
|
||||||
homeserver:
|
|
||||||
### If you already built the Conduit image with 'docker build' or want to use the Docker Hub image,
|
|
||||||
### then you are ready to go.
|
|
||||||
image: matrixconduit/matrix-conduit:latest
|
|
||||||
### If you want to build a fresh image from the sources, then comment the image line and uncomment the
|
|
||||||
### build lines. If you want meaningful labels in your built Conduit image, you should run docker-compose like this:
|
|
||||||
### CREATED=$(date -u +'%Y-%m-%dT%H:%M:%SZ') VERSION=$(grep -m1 -o '[0-9].[0-9].[0-9]' Cargo.toml) docker-compose up -d
|
|
||||||
# build:
|
|
||||||
# context: .
|
|
||||||
# args:
|
|
||||||
# CREATED: '2021-03-16T08:18:27Z'
|
|
||||||
# VERSION: '0.1.0'
|
|
||||||
# LOCAL: 'false'
|
|
||||||
# GIT_REF: origin/master
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- db:/var/lib/matrix-conduit/
|
|
||||||
networks:
|
|
||||||
- proxy
|
|
||||||
environment:
|
|
||||||
CONDUIT_SERVER_NAME: your.server.name # EDIT THIS
|
|
||||||
CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/
|
|
||||||
CONDUIT_DATABASE_BACKEND: rocksdb
|
|
||||||
CONDUIT_PORT: 6167
|
|
||||||
CONDUIT_MAX_REQUEST_SIZE: 20_000_000 # in bytes, ~20 MB
|
|
||||||
CONDUIT_ALLOW_REGISTRATION: 'true'
|
|
||||||
#CONDUIT_REGISTRATION_TOKEN: '' # require password for registration
|
|
||||||
CONDUIT_ALLOW_FEDERATION: 'true'
|
|
||||||
CONDUIT_ALLOW_CHECK_FOR_UPDATES: 'true'
|
|
||||||
CONDUIT_TRUSTED_SERVERS: '["matrix.org"]'
|
|
||||||
#CONDUIT_MAX_CONCURRENT_REQUESTS: 100
|
|
||||||
CONDUIT_ADDRESS: 0.0.0.0
|
|
||||||
CONDUIT_CONFIG: '' # Ignore this
|
|
||||||
|
|
||||||
# We need some way to server the client and server .well-known json. The simplest way is to use a nginx container
|
|
||||||
# to serve those two as static files. If you want to use a different way, delete or comment the below service, here
|
|
||||||
# and in the docker-compose override file.
|
|
||||||
well-known:
|
|
||||||
image: nginx:latest
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- ./nginx/matrix.conf:/etc/nginx/conf.d/matrix.conf # the config to serve the .well-known/matrix files
|
|
||||||
- ./nginx/www:/var/www/ # location of the client and server .well-known-files
|
|
||||||
### Uncomment if you want to use your own Element-Web App.
|
|
||||||
### Note: You need to provide a config.json for Element and you also need a second
|
|
||||||
### Domain or Subdomain for the communication between Element and Conduit
|
|
||||||
### Config-Docs: https://github.com/vector-im/element-web/blob/develop/docs/config.md
|
|
||||||
# element-web:
|
|
||||||
# image: vectorim/element-web:latest
|
|
||||||
# restart: unless-stopped
|
|
||||||
# volumes:
|
|
||||||
# - ./element_config.json:/app/config.json
|
|
||||||
# networks:
|
|
||||||
# - proxy
|
|
||||||
# depends_on:
|
|
||||||
# - homeserver
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
db:
|
|
||||||
|
|
||||||
networks:
|
|
||||||
# This is the network Traefik listens to, if your network has a different
|
|
||||||
# name, don't forget to change it here and in the docker-compose.override.yml
|
|
||||||
proxy:
|
|
||||||
external: true
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
# Conduit - Traefik Reverse Proxy Labels
|
|
||||||
version: '3'
|
|
||||||
|
|
||||||
services:
|
|
||||||
homeserver:
|
|
||||||
labels:
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.docker.network=proxy" # Change this to the name of your Traefik docker proxy network
|
|
||||||
|
|
||||||
- "traefik.http.routers.to-conduit.rule=Host(`<SUBDOMAIN>.<DOMAIN>`)" # Change to the address on which Conduit is hosted
|
|
||||||
- "traefik.http.routers.to-conduit.tls=true"
|
|
||||||
- "traefik.http.routers.to-conduit.tls.certresolver=letsencrypt"
|
|
||||||
- "traefik.http.routers.to-conduit.middlewares=cors-headers@docker"
|
|
||||||
|
|
||||||
- "traefik.http.middlewares.cors-headers.headers.accessControlAllowOriginList=*"
|
|
||||||
- "traefik.http.middlewares.cors-headers.headers.accessControlAllowHeaders=Origin, X-Requested-With, Content-Type, Accept, Authorization"
|
|
||||||
- "traefik.http.middlewares.cors-headers.headers.accessControlAllowMethods=GET, POST, PUT, DELETE, OPTIONS"
|
|
||||||
|
|
||||||
# We need some way to server the client and server .well-known json. The simplest way is to use a nginx container
|
|
||||||
# to serve those two as static files. If you want to use a different way, delete or comment the below service, here
|
|
||||||
# and in the docker-compose file.
|
|
||||||
well-known:
|
|
||||||
labels:
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.docker.network=proxy"
|
|
||||||
|
|
||||||
- "traefik.http.routers.to-matrix-wellknown.rule=Host(`<SUBDOMAIN>.<DOMAIN>`) && PathPrefix(`/.well-known/matrix`)"
|
|
||||||
- "traefik.http.routers.to-matrix-wellknown.tls=true"
|
|
||||||
- "traefik.http.routers.to-matrix-wellknown.tls.certresolver=letsencrypt"
|
|
||||||
- "traefik.http.routers.to-matrix-wellknown.middlewares=cors-headers@docker"
|
|
||||||
|
|
||||||
- "traefik.http.middlewares.cors-headers.headers.accessControlAllowOriginList=*"
|
|
||||||
- "traefik.http.middlewares.cors-headers.headers.accessControlAllowHeaders=Origin, X-Requested-With, Content-Type, Accept, Authorization"
|
|
||||||
- "traefik.http.middlewares.cors-headers.headers.accessControlAllowMethods=GET, POST, PUT, DELETE, OPTIONS"
|
|
||||||
|
|
||||||
|
|
||||||
### Uncomment this if you uncommented Element-Web App in the docker-compose.yml
|
|
||||||
# element-web:
|
|
||||||
# labels:
|
|
||||||
# - "traefik.enable=true"
|
|
||||||
# - "traefik.docker.network=proxy" # Change this to the name of your Traefik docker proxy network
|
|
||||||
|
|
||||||
# - "traefik.http.routers.to-element-web.rule=Host(`<SUBDOMAIN>.<DOMAIN>`)" # Change to the address on which Element-Web is hosted
|
|
||||||
# - "traefik.http.routers.to-element-web.tls=true"
|
|
||||||
# - "traefik.http.routers.to-element-web.tls.certresolver=letsencrypt"
|
|
||||||
|
|
@ -1,96 +0,0 @@
|
||||||
# Conduit - Behind Traefik Reverse Proxy
|
|
||||||
version: '3'
|
|
||||||
|
|
||||||
services:
|
|
||||||
homeserver:
|
|
||||||
### If you already built the Conduit image with 'docker build' or want to use the Docker Hub image,
|
|
||||||
### then you are ready to go.
|
|
||||||
image: matrixconduit/matrix-conduit:latest
|
|
||||||
### If you want to build a fresh image from the sources, then comment the image line and uncomment the
|
|
||||||
### build lines. If you want meaningful labels in your built Conduit image, you should run docker-compose like this:
|
|
||||||
### CREATED=$(date -u +'%Y-%m-%dT%H:%M:%SZ') VERSION=$(grep -m1 -o '[0-9].[0-9].[0-9]' Cargo.toml) docker-compose up -d
|
|
||||||
# build:
|
|
||||||
# context: .
|
|
||||||
# args:
|
|
||||||
# CREATED: '2021-03-16T08:18:27Z'
|
|
||||||
# VERSION: '0.1.0'
|
|
||||||
# LOCAL: 'false'
|
|
||||||
# GIT_REF: origin/master
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- db:/srv/conduit/.local/share/conduit
|
|
||||||
### Uncomment if you want to use conduit.toml to configure Conduit
|
|
||||||
### Note: Set env vars will override conduit.toml values
|
|
||||||
# - ./conduit.toml:/srv/conduit/conduit.toml
|
|
||||||
networks:
|
|
||||||
- proxy
|
|
||||||
environment:
|
|
||||||
CONDUIT_SERVER_NAME: localhost:6167 # replace with your own name
|
|
||||||
CONDUIT_TRUSTED_SERVERS: '["matrix.org"]'
|
|
||||||
CONDUIT_ALLOW_REGISTRATION : 'true'
|
|
||||||
### Uncomment and change values as desired
|
|
||||||
# CONDUIT_ADDRESS: 0.0.0.0
|
|
||||||
# CONDUIT_PORT: 6167
|
|
||||||
# CONDUIT_REGISTRATION_TOKEN: '' # require password for registration
|
|
||||||
# CONDUIT_CONFIG: '/srv/conduit/conduit.toml' # if you want to configure purely by env vars, set this to an empty string ''
|
|
||||||
# Available levels are: error, warn, info, debug, trace - more info at: https://docs.rs/env_logger/*/env_logger/#enabling-logging
|
|
||||||
# CONDUIT_ALLOW_ENCRYPTION: 'true'
|
|
||||||
# CONDUIT_ALLOW_FEDERATION: 'true'
|
|
||||||
# CONDUIT_ALLOW_CHECK_FOR_UPDATES: 'true'
|
|
||||||
# CONDUIT_DATABASE_PATH: /srv/conduit/.local/share/conduit
|
|
||||||
# CONDUIT_MAX_REQUEST_SIZE: 20_000_000 # in bytes, ~20 MB
|
|
||||||
|
|
||||||
# We need some way to server the client and server .well-known json. The simplest way is to use a nginx container
|
|
||||||
# to serve those two as static files. If you want to use a different way, delete or comment the below service, here
|
|
||||||
# and in the docker-compose override file.
|
|
||||||
well-known:
|
|
||||||
image: nginx:latest
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- ./nginx/matrix.conf:/etc/nginx/conf.d/matrix.conf # the config to serve the .well-known/matrix files
|
|
||||||
- ./nginx/www:/var/www/ # location of the client and server .well-known-files
|
|
||||||
|
|
||||||
### Uncomment if you want to use your own Element-Web App.
|
|
||||||
### Note: You need to provide a config.json for Element and you also need a second
|
|
||||||
### Domain or Subdomain for the communication between Element and Conduit
|
|
||||||
### Config-Docs: https://github.com/vector-im/element-web/blob/develop/docs/config.md
|
|
||||||
# element-web:
|
|
||||||
# image: vectorim/element-web:latest
|
|
||||||
# restart: unless-stopped
|
|
||||||
# volumes:
|
|
||||||
# - ./element_config.json:/app/config.json
|
|
||||||
# networks:
|
|
||||||
# - proxy
|
|
||||||
# depends_on:
|
|
||||||
# - homeserver
|
|
||||||
|
|
||||||
traefik:
|
|
||||||
image: "traefik:latest"
|
|
||||||
container_name: "traefik"
|
|
||||||
restart: "unless-stopped"
|
|
||||||
ports:
|
|
||||||
- "80:80"
|
|
||||||
- "443:443"
|
|
||||||
volumes:
|
|
||||||
- "/var/run/docker.sock:/var/run/docker.sock"
|
|
||||||
# - "./traefik_config:/etc/traefik"
|
|
||||||
- "acme:/etc/traefik/acme"
|
|
||||||
labels:
|
|
||||||
- "traefik.enable=true"
|
|
||||||
|
|
||||||
# middleware redirect
|
|
||||||
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
|
|
||||||
# global redirect to https
|
|
||||||
- "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)"
|
|
||||||
- "traefik.http.routers.redirs.entrypoints=http"
|
|
||||||
- "traefik.http.routers.redirs.middlewares=redirect-to-https"
|
|
||||||
|
|
||||||
networks:
|
|
||||||
- proxy
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
db:
|
|
||||||
acme:
|
|
||||||
|
|
||||||
networks:
|
|
||||||
proxy:
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
||||||
# Conduit
|
|
||||||
version: '3'
|
|
||||||
|
|
||||||
services:
|
|
||||||
homeserver:
|
|
||||||
### If you already built the Conduit image with 'docker build' or want to use a registry image,
|
|
||||||
### then you are ready to go.
|
|
||||||
image: matrixconduit/matrix-conduit:latest
|
|
||||||
### If you want to build a fresh image from the sources, then comment the image line and uncomment the
|
|
||||||
### build lines. If you want meaningful labels in your built Conduit image, you should run docker-compose like this:
|
|
||||||
### CREATED=$(date -u +'%Y-%m-%dT%H:%M:%SZ') VERSION=$(grep -m1 -o '[0-9].[0-9].[0-9]' Cargo.toml) docker-compose up -d
|
|
||||||
# build:
|
|
||||||
# context: .
|
|
||||||
# args:
|
|
||||||
# CREATED: '2021-03-16T08:18:27Z'
|
|
||||||
# VERSION: '0.1.0'
|
|
||||||
# LOCAL: 'false'
|
|
||||||
# GIT_REF: origin/master
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- 8448:6167
|
|
||||||
volumes:
|
|
||||||
- db:/var/lib/matrix-conduit/
|
|
||||||
environment:
|
|
||||||
CONDUIT_SERVER_NAME: your.server.name # EDIT THIS
|
|
||||||
CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/
|
|
||||||
CONDUIT_DATABASE_BACKEND: rocksdb
|
|
||||||
CONDUIT_PORT: 6167
|
|
||||||
CONDUIT_MAX_REQUEST_SIZE: 20_000_000 # in bytes, ~20 MB
|
|
||||||
CONDUIT_ALLOW_REGISTRATION: 'true'
|
|
||||||
CONDUIT_ALLOW_FEDERATION: 'true'
|
|
||||||
CONDUIT_ALLOW_CHECK_FOR_UPDATES: 'true'
|
|
||||||
CONDUIT_TRUSTED_SERVERS: '["matrix.org"]'
|
|
||||||
#CONDUIT_MAX_CONCURRENT_REQUESTS: 100
|
|
||||||
CONDUIT_ADDRESS: 0.0.0.0
|
|
||||||
CONDUIT_CONFIG: '' # Ignore this
|
|
||||||
#
|
|
||||||
### Uncomment if you want to use your own Element-Web App.
|
|
||||||
### Note: You need to provide a config.json for Element and you also need a second
|
|
||||||
### Domain or Subdomain for the communication between Element and Conduit
|
|
||||||
### Config-Docs: https://github.com/vector-im/element-web/blob/develop/docs/config.md
|
|
||||||
# element-web:
|
|
||||||
# image: vectorim/element-web:latest
|
|
||||||
# restart: unless-stopped
|
|
||||||
# ports:
|
|
||||||
# - 8009:80
|
|
||||||
# volumes:
|
|
||||||
# - ./element_config.json:/app/config.json
|
|
||||||
# depends_on:
|
|
||||||
# - homeserver
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
db:
|
|
||||||
|
|
@ -1,216 +0,0 @@
|
||||||
# Conduit for Docker
|
|
||||||
|
|
||||||
> **Note:** To run and use Conduit you should probably use it with a Domain or Subdomain behind a reverse proxy (like Nginx, Traefik, Apache, ...) with a Lets Encrypt certificate.
|
|
||||||
|
|
||||||
## Docker
|
|
||||||
|
|
||||||
To run Conduit with Docker you can either build the image yourself or pull it from a registry.
|
|
||||||
|
|
||||||
|
|
||||||
### Use a registry
|
|
||||||
|
|
||||||
OCI images for Conduit are available in the registries listed below. We recommend using the image tagged as `latest` from GitLab's own registry.
|
|
||||||
|
|
||||||
| Registry | Image | Size | Notes |
|
|
||||||
| --------------- | --------------------------------------------------------------- | ----------------------------- | ---------------------- |
|
|
||||||
| GitLab Registry | [registry.gitlab.com/famedly/conduit/matrix-conduit:latest][gl] | ![Image Size][shield-latest] | Stable image. |
|
|
||||||
| Docker Hub | [docker.io/matrixconduit/matrix-conduit:latest][dh] | ![Image Size][shield-latest] | Stable image. |
|
|
||||||
| GitLab Registry | [registry.gitlab.com/famedly/conduit/matrix-conduit:next][gl] | ![Image Size][shield-next] | Development version. |
|
|
||||||
| Docker Hub | [docker.io/matrixconduit/matrix-conduit:next][dh] | ![Image Size][shield-next] | Development version. |
|
|
||||||
|
|
||||||
|
|
||||||
[dh]: https://hub.docker.com/r/matrixconduit/matrix-conduit
|
|
||||||
[gl]: https://gitlab.com/famedly/conduit/container_registry/2497937
|
|
||||||
[shield-latest]: https://img.shields.io/docker/image-size/matrixconduit/matrix-conduit/latest
|
|
||||||
[shield-next]: https://img.shields.io/docker/image-size/matrixconduit/matrix-conduit/next
|
|
||||||
|
|
||||||
|
|
||||||
Use
|
|
||||||
```bash
|
|
||||||
docker image pull <link>
|
|
||||||
```
|
|
||||||
to pull it to your machine.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Build using a dockerfile
|
|
||||||
|
|
||||||
The Dockerfile provided by Conduit has two stages, each of which creates an image.
|
|
||||||
|
|
||||||
1. **Builder:** Builds the binary from local context or by cloning a git revision from the official repository.
|
|
||||||
2. **Runner:** Copies the built binary from **Builder** and sets up the runtime environment, like creating a volume to persist the database and applying the correct permissions.
|
|
||||||
|
|
||||||
To build the image you can use the following command
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker build --tag matrixconduit/matrix-conduit:latest .
|
|
||||||
```
|
|
||||||
|
|
||||||
which also will tag the resulting image as `matrixconduit/matrix-conduit:latest`.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Run
|
|
||||||
|
|
||||||
When you have the image you can simply run it with
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run -d -p 8448:6167 \
|
|
||||||
-v db:/var/lib/matrix-conduit/ \
|
|
||||||
-e CONDUIT_SERVER_NAME="your.server.name" \
|
|
||||||
-e CONDUIT_DATABASE_BACKEND="rocksdb" \
|
|
||||||
-e CONDUIT_ALLOW_REGISTRATION=true \
|
|
||||||
-e CONDUIT_ALLOW_FEDERATION=true \
|
|
||||||
-e CONDUIT_MAX_REQUEST_SIZE="20_000_000" \
|
|
||||||
-e CONDUIT_TRUSTED_SERVERS="[\"matrix.org\"]" \
|
|
||||||
-e CONDUIT_MAX_CONCURRENT_REQUESTS="100" \
|
|
||||||
--name conduit <link>
|
|
||||||
```
|
|
||||||
|
|
||||||
or you can use [docker-compose](#docker-compose).
|
|
||||||
|
|
||||||
The `-d` flag lets the container run in detached mode. You now need to supply a `conduit.toml` config file, an example can be found [here](../configuration.md).
|
|
||||||
You can pass in different env vars to change config values on the fly. You can even configure Conduit completely by using env vars, but for that you need
|
|
||||||
to pass `-e CONDUIT_CONFIG=""` into your container. For an overview of possible values, please take a look at the `docker-compose.yml` file.
|
|
||||||
|
|
||||||
If you just want to test Conduit for a short time, you can use the `--rm` flag, which will clean up everything related to your container after you stop it.
|
|
||||||
|
|
||||||
### Docker-compose
|
|
||||||
|
|
||||||
If the `docker run` command is not for you or your setup, you can also use one of the provided `docker-compose` files.
|
|
||||||
|
|
||||||
Depending on your proxy setup, you can use one of the following files;
|
|
||||||
- If you already have a `traefik` instance set up, use [`docker-compose.for-traefik.yml`](docker-compose.for-traefik.yml)
|
|
||||||
- If you don't have a `traefik` instance set up (or any other reverse proxy), use [`docker-compose.with-traefik.yml`](docker-compose.with-traefik.yml)
|
|
||||||
- For any other reverse proxy, use [`docker-compose.yml`](docker-compose.yml)
|
|
||||||
|
|
||||||
When picking the traefik-related compose file, rename it so it matches `docker-compose.yml`, and
|
|
||||||
rename the override file to `docker-compose.override.yml`. Edit the latter with the values you want
|
|
||||||
for your server.
|
|
||||||
Additional info about deploying Conduit can be found [here](generic.md).
|
|
||||||
|
|
||||||
### Build
|
|
||||||
|
|
||||||
To build the Conduit image with docker-compose, you first need to open and modify the `docker-compose.yml` file. There you need to comment the `image:` option and uncomment the `build:` option. Then call docker-compose with:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose up
|
|
||||||
```
|
|
||||||
|
|
||||||
This will also start the container right afterwards, so if want it to run in detached mode, you also should use the `-d` flag.
|
|
||||||
|
|
||||||
### Run
|
|
||||||
|
|
||||||
If you already have built the image or want to use one from the registries, you can just start the container and everything else in the compose file in detached mode with:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
> **Note:** Don't forget to modify and adjust the compose file to your needs.
|
|
||||||
|
|
||||||
### Use Traefik as Proxy
|
|
||||||
|
|
||||||
As a container user, you probably know about Traefik. It is a easy to use reverse proxy for making
|
|
||||||
containerized app and services available through the web. With the two provided files,
|
|
||||||
[`docker-compose.for-traefik.yml`](docker-compose.for-traefik.yml) (or
|
|
||||||
[`docker-compose.with-traefik.yml`](docker-compose.with-traefik.yml)) and
|
|
||||||
[`docker-compose.override.yml`](docker-compose.override.yml), it is equally easy to deploy
|
|
||||||
and use Conduit, with a little caveat. If you already took a look at the files, then you should have
|
|
||||||
seen the `well-known` service, and that is the little caveat. Traefik is simply a proxy and
|
|
||||||
loadbalancer and is not able to serve any kind of content, but for Conduit to federate, we need to
|
|
||||||
either expose ports `443` and `8448` or serve two endpoints `.well-known/matrix/client` and
|
|
||||||
`.well-known/matrix/server`.
|
|
||||||
|
|
||||||
With the service `well-known` we use a single `nginx` container that will serve those two files.
|
|
||||||
|
|
||||||
So...step by step:
|
|
||||||
|
|
||||||
1. Copy [`docker-compose.for-traefik.yml`](docker-compose.for-traefik.yml) (or
|
|
||||||
[`docker-compose.with-traefik.yml`](docker-compose.with-traefik.yml)) and [`docker-compose.override.yml`](docker-compose.override.yml) from the repository and remove `.for-traefik` (or `.with-traefik`) from the filename.
|
|
||||||
2. Open both files and modify/adjust them to your needs. Meaning, change the `CONDUIT_SERVER_NAME` and the volume host mappings according to your needs.
|
|
||||||
3. Create the `conduit.toml` config file, an example can be found [here](../configuration.md), or set `CONDUIT_CONFIG=""` and configure Conduit per env vars.
|
|
||||||
4. Uncomment the `element-web` service if you want to host your own Element Web Client and create a `element_config.json`.
|
|
||||||
5. Create the files needed by the `well-known` service.
|
|
||||||
|
|
||||||
- `./nginx/matrix.conf` (relative to the compose file, you can change this, but then also need to change the volume mapping)
|
|
||||||
|
|
||||||
```nginx
|
|
||||||
server {
|
|
||||||
server_name <SUBDOMAIN>.<DOMAIN>;
|
|
||||||
listen 80 default_server;
|
|
||||||
|
|
||||||
location /.well-known/matrix/server {
|
|
||||||
return 200 '{"m.server": "<SUBDOMAIN>.<DOMAIN>:443"}';
|
|
||||||
types { } default_type "application/json; charset=utf-8";
|
|
||||||
}
|
|
||||||
|
|
||||||
location /.well-known/matrix/client {
|
|
||||||
return 200 '{"m.homeserver": {"base_url": "https://<SUBDOMAIN>.<DOMAIN>"}}';
|
|
||||||
types { } default_type "application/json; charset=utf-8";
|
|
||||||
add_header "Access-Control-Allow-Origin" *;
|
|
||||||
}
|
|
||||||
|
|
||||||
location / {
|
|
||||||
return 404;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
6. Run `docker-compose up -d`
|
|
||||||
7. Connect to your homeserver with your preferred client and create a user. You should do this immediately after starting Conduit, because the first created user is the admin.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Voice communication
|
|
||||||
|
|
||||||
In order to make or receive calls, a TURN server is required. Conduit suggests using [Coturn](https://github.com/coturn/coturn) for this purpose, which is also available as a Docker image. Before proceeding with the software installation, it is essential to have the necessary configurations in place.
|
|
||||||
|
|
||||||
### Configuration
|
|
||||||
|
|
||||||
Create a configuration file called `coturn.conf` containing:
|
|
||||||
|
|
||||||
```conf
|
|
||||||
use-auth-secret
|
|
||||||
static-auth-secret=<a secret key>
|
|
||||||
realm=<your server domain>
|
|
||||||
```
|
|
||||||
A common way to generate a suitable alphanumeric secret key is by using `pwgen -s 64 1`.
|
|
||||||
|
|
||||||
These same values need to be set in conduit. You can either modify conduit.toml to include these lines:
|
|
||||||
```
|
|
||||||
turn_uris = ["turn:<your server domain>?transport=udp", "turn:<your server domain>?transport=tcp"]
|
|
||||||
turn_secret = "<secret key from coturn configuration>"
|
|
||||||
```
|
|
||||||
or append the following to the docker environment variables dependig on which configuration method you used earlier:
|
|
||||||
```yml
|
|
||||||
CONDUIT_TURN_URIS: '["turn:<your server domain>?transport=udp", "turn:<your server domain>?transport=tcp"]'
|
|
||||||
CONDUIT_TURN_SECRET: "<secret key from coturn configuration>"
|
|
||||||
```
|
|
||||||
Restart Conduit to apply these changes.
|
|
||||||
|
|
||||||
### Run
|
|
||||||
Run the [Coturn](https://hub.docker.com/r/coturn/coturn) image using
|
|
||||||
```bash
|
|
||||||
docker run -d --network=host -v $(pwd)/coturn.conf:/etc/coturn/turnserver.conf coturn/coturn
|
|
||||||
```
|
|
||||||
|
|
||||||
or docker-compose. For the latter, paste the following section into a file called `docker-compose.yml`
|
|
||||||
and run `docker-compose up -d` in the same directory.
|
|
||||||
|
|
||||||
```yml
|
|
||||||
version: 3
|
|
||||||
services:
|
|
||||||
turn:
|
|
||||||
container_name: coturn-server
|
|
||||||
image: docker.io/coturn/coturn
|
|
||||||
restart: unless-stopped
|
|
||||||
network_mode: "host"
|
|
||||||
volumes:
|
|
||||||
- ./coturn.conf:/etc/coturn/turnserver.conf
|
|
||||||
```
|
|
||||||
|
|
||||||
To understand why the host networking mode is used and explore alternative configuration options, please visit the following link: https://github.com/coturn/coturn/blob/master/docker/coturn/README.md.
|
|
||||||
For security recommendations see Synapse's [Coturn documentation](https://github.com/matrix-org/synapse/blob/develop/docs/setup/turn/coturn.md#configuration).
|
|
||||||
|
|
||||||
|
|
@ -1,292 +0,0 @@
|
||||||
# Generic deployment documentation
|
|
||||||
|
|
||||||
> ## Getting help
|
|
||||||
>
|
|
||||||
> If you run into any problems while setting up Conduit, write an email to `conduit@koesters.xyz`, ask us
|
|
||||||
> in `#conduit:fachschaften.org` or [open an issue on GitLab](https://gitlab.com/famedly/conduit/-/issues/new).
|
|
||||||
|
|
||||||
## Installing Conduit
|
|
||||||
|
|
||||||
Although you might be able to compile Conduit for Windows, we do recommend running it on a Linux server. We therefore
|
|
||||||
only offer Linux binaries.
|
|
||||||
|
|
||||||
You may simply download the binary that fits your machine. Run `uname -m` to see what you need. Now copy the appropriate url:
|
|
||||||
|
|
||||||
**Stable versions:**
|
|
||||||
|
|
||||||
| CPU Architecture | Download stable version |
|
|
||||||
| ------------------------------------------- | --------------------------------------------------------------- |
|
|
||||||
| x84_64 / amd64 (Most servers and computers) | [Binary][x84_64-glibc-master] / [.deb][x84_64-glibc-master-deb] |
|
|
||||||
| armv7 (e.g. Raspberry Pi by default) | [Binary][armv7-glibc-master] / [.deb][armv7-glibc-master-deb] |
|
|
||||||
| armv8 / aarch64 | [Binary][armv8-glibc-master] / [.deb][armv8-glibc-master-deb] |
|
|
||||||
|
|
||||||
These builds were created on and linked against the glibc version shipped with Debian bullseye.
|
|
||||||
If you use a system with an older glibc version (e.g. RHEL8), you might need to compile Conduit yourself.
|
|
||||||
|
|
||||||
[x84_64-glibc-master]: https://gitlab.com/famedly/conduit/-/jobs/artifacts/master/raw/build-output/linux_amd64/conduit?job=docker:master
|
|
||||||
[armv7-glibc-master]: https://gitlab.com/famedly/conduit/-/jobs/artifacts/master/raw/build-output/linux_arm_v7/conduit?job=docker:master
|
|
||||||
[armv8-glibc-master]: https://gitlab.com/famedly/conduit/-/jobs/artifacts/master/raw/build-output/linux_arm64/conduit?job=docker:master
|
|
||||||
[x84_64-glibc-master-deb]: https://gitlab.com/famedly/conduit/-/jobs/artifacts/master/raw/build-output/linux_amd64/conduit.deb?job=docker:master
|
|
||||||
[armv7-glibc-master-deb]: https://gitlab.com/famedly/conduit/-/jobs/artifacts/master/raw/build-output/linux_arm_v7/conduit.deb?job=docker:master
|
|
||||||
[armv8-glibc-master-deb]: https://gitlab.com/famedly/conduit/-/jobs/artifacts/master/raw/build-output/linux_arm64/conduit.deb?job=docker:master
|
|
||||||
|
|
||||||
**Latest versions:**
|
|
||||||
|
|
||||||
| Target | Type | Download |
|
|
||||||
|-|-|-|
|
|
||||||
| `x86_64-unknown-linux-musl` | Statically linked Debian package | [link](https://gitlab.com/api/v4/projects/famedly%2Fconduit/jobs/artifacts/next/raw/x86_64-unknown-linux-musl.deb?job=artifacts) |
|
|
||||||
| `x86_64-unknown-linux-musl` | Statically linked binary | [link](https://gitlab.com/api/v4/projects/famedly%2Fconduit/jobs/artifacts/next/raw/x86_64-unknown-linux-musl?job=artifacts) |
|
|
||||||
| `aarch64-unknown-linux-musl` | Statically linked binary | [link](https://gitlab.com/api/v4/projects/famedly%2Fconduit/jobs/artifacts/next/raw/aarch64-unknown-linux-musl?job=artifacts) |
|
|
||||||
| `x86_64-unknown-linux-gnu` | OCI image | [link](https://gitlab.com/api/v4/projects/famedly%2Fconduit/jobs/artifacts/next/raw/oci-image-amd64.tar.gz?job=artifacts) |
|
|
||||||
| `aarch64-unknown-linux-musl` | OCI image | [link](https://gitlab.com/api/v4/projects/famedly%2Fconduit/jobs/artifacts/next/raw/oci-image-arm64v8.tar.gz?job=artifacts) |
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ sudo wget -O /usr/local/bin/matrix-conduit <url>
|
|
||||||
$ sudo chmod +x /usr/local/bin/matrix-conduit
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternatively, you may compile the binary yourself. First, install any dependencies:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Debian
|
|
||||||
$ sudo apt install libclang-dev build-essential
|
|
||||||
|
|
||||||
# RHEL
|
|
||||||
$ sudo dnf install clang
|
|
||||||
```
|
|
||||||
Then, `cd` into the source tree of conduit-next and run:
|
|
||||||
```bash
|
|
||||||
$ cargo build --release
|
|
||||||
```
|
|
||||||
|
|
||||||
## Adding a Conduit user
|
|
||||||
|
|
||||||
While Conduit can run as any user it is usually better to use dedicated users for different services. This also allows
|
|
||||||
you to make sure that the file permissions are correctly set up.
|
|
||||||
|
|
||||||
In Debian or RHEL, you can use this command to create a Conduit user:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo adduser --system conduit --group --disabled-login --no-create-home
|
|
||||||
```
|
|
||||||
|
|
||||||
## Forwarding ports in the firewall or the router
|
|
||||||
|
|
||||||
Conduit uses the ports 443 and 8448 both of which need to be open in the firewall.
|
|
||||||
|
|
||||||
If Conduit runs behind a router or in a container and has a different public IP address than the host system these public ports need to be forwarded directly or indirectly to the port mentioned in the config.
|
|
||||||
|
|
||||||
## Optional: Avoid port 8448
|
|
||||||
|
|
||||||
If Conduit runs behind Cloudflare reverse proxy, which doesn't support port 8448 on free plans, [delegation](https://matrix-org.github.io/synapse/latest/delegate.html) can be set up to have federation traffic routed to port 443:
|
|
||||||
```apache
|
|
||||||
# .well-known delegation on Apache
|
|
||||||
<Files "/.well-known/matrix/server">
|
|
||||||
ErrorDocument 200 '{"m.server": "your.server.name:443"}'
|
|
||||||
Header always set Content-Type application/json
|
|
||||||
Header always set Access-Control-Allow-Origin *
|
|
||||||
</Files>
|
|
||||||
```
|
|
||||||
[SRV DNS record](https://spec.matrix.org/latest/server-server-api/#resolving-server-names) delegation is also [possible](https://www.cloudflare.com/en-gb/learning/dns/dns-records/dns-srv-record/).
|
|
||||||
|
|
||||||
## Setting up a systemd service
|
|
||||||
|
|
||||||
Now we'll set up a systemd service for Conduit, so it's easy to start/stop Conduit and set it to autostart when your
|
|
||||||
server reboots. Simply paste the default systemd service you can find below into
|
|
||||||
`/etc/systemd/system/conduit.service`.
|
|
||||||
|
|
||||||
```systemd
|
|
||||||
[Unit]
|
|
||||||
Description=Conduit Matrix Server
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Environment="CONDUIT_CONFIG=/etc/matrix-conduit/conduit.toml"
|
|
||||||
User=conduit
|
|
||||||
Group=conduit
|
|
||||||
Restart=always
|
|
||||||
ExecStart=/usr/local/bin/matrix-conduit
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, run
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ sudo systemctl daemon-reload
|
|
||||||
```
|
|
||||||
|
|
||||||
## Creating the Conduit configuration file
|
|
||||||
|
|
||||||
Now we need to create the Conduit's config file in
|
|
||||||
`/etc/matrix-conduit/conduit.toml`. Paste in the contents of
|
|
||||||
[`conduit-example.toml`](../configuration.md) **and take a moment to read it.
|
|
||||||
You need to change at least the server name.**
|
|
||||||
You can also choose to use a different database backend, but right now only `rocksdb` and `sqlite` are recommended.
|
|
||||||
|
|
||||||
## Setting the correct file permissions
|
|
||||||
|
|
||||||
As we are using a Conduit specific user we need to allow it to read the config. To do that you can run this command on
|
|
||||||
Debian or RHEL:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo chown -R root:root /etc/matrix-conduit
|
|
||||||
sudo chmod 755 /etc/matrix-conduit
|
|
||||||
```
|
|
||||||
|
|
||||||
If you use the default database path you also need to run this:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo mkdir -p /var/lib/matrix-conduit/
|
|
||||||
sudo chown -R conduit:conduit /var/lib/matrix-conduit/
|
|
||||||
sudo chmod 700 /var/lib/matrix-conduit/
|
|
||||||
```
|
|
||||||
|
|
||||||
## Setting up the Reverse Proxy
|
|
||||||
|
|
||||||
This depends on whether you use Apache, Caddy, Nginx or another web server.
|
|
||||||
|
|
||||||
### Apache
|
|
||||||
|
|
||||||
Create `/etc/apache2/sites-enabled/050-conduit.conf` and copy-and-paste this:
|
|
||||||
|
|
||||||
```apache
|
|
||||||
# Requires mod_proxy and mod_proxy_http
|
|
||||||
#
|
|
||||||
# On Apache instance compiled from source,
|
|
||||||
# paste into httpd-ssl.conf or httpd.conf
|
|
||||||
|
|
||||||
Listen 8448
|
|
||||||
|
|
||||||
<VirtualHost *:443 *:8448>
|
|
||||||
|
|
||||||
ServerName your.server.name # EDIT THIS
|
|
||||||
|
|
||||||
AllowEncodedSlashes NoDecode
|
|
||||||
ProxyPass /_matrix/ http://127.0.0.1:6167/_matrix/ timeout=300 nocanon
|
|
||||||
ProxyPassReverse /_matrix/ http://127.0.0.1:6167/_matrix/
|
|
||||||
|
|
||||||
</VirtualHost>
|
|
||||||
```
|
|
||||||
|
|
||||||
**You need to make some edits again.** When you are done, run
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Debian
|
|
||||||
$ sudo systemctl reload apache2
|
|
||||||
|
|
||||||
# Installed from source
|
|
||||||
$ sudo apachectl -k graceful
|
|
||||||
```
|
|
||||||
|
|
||||||
### Caddy
|
|
||||||
|
|
||||||
Create `/etc/caddy/conf.d/conduit_caddyfile` and enter this (substitute for your server name).
|
|
||||||
|
|
||||||
```caddy
|
|
||||||
your.server.name, your.server.name:8448 {
|
|
||||||
reverse_proxy /_matrix/* 127.0.0.1:6167
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
That's it! Just start or enable the service and you're set.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ sudo systemctl enable caddy
|
|
||||||
```
|
|
||||||
|
|
||||||
### Nginx
|
|
||||||
|
|
||||||
If you use Nginx and not Apache, add the following server section inside the http section of `/etc/nginx/nginx.conf`
|
|
||||||
|
|
||||||
```nginx
|
|
||||||
server {
|
|
||||||
listen 443 ssl http2;
|
|
||||||
listen [::]:443 ssl http2;
|
|
||||||
listen 8448 ssl http2;
|
|
||||||
listen [::]:8448 ssl http2;
|
|
||||||
server_name your.server.name; # EDIT THIS
|
|
||||||
merge_slashes off;
|
|
||||||
|
|
||||||
# Nginx defaults to only allow 1MB uploads
|
|
||||||
# Increase this to allow posting large files such as videos
|
|
||||||
client_max_body_size 20M;
|
|
||||||
|
|
||||||
location /_matrix/ {
|
|
||||||
proxy_pass http://127.0.0.1:6167;
|
|
||||||
proxy_set_header Host $http_host;
|
|
||||||
proxy_buffering off;
|
|
||||||
proxy_read_timeout 5m;
|
|
||||||
}
|
|
||||||
|
|
||||||
ssl_certificate /etc/letsencrypt/live/your.server.name/fullchain.pem; # EDIT THIS
|
|
||||||
ssl_certificate_key /etc/letsencrypt/live/your.server.name/privkey.pem; # EDIT THIS
|
|
||||||
ssl_trusted_certificate /etc/letsencrypt/live/your.server.name/chain.pem; # EDIT THIS
|
|
||||||
include /etc/letsencrypt/options-ssl-nginx.conf;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**You need to make some edits again.** When you are done, run
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ sudo systemctl reload nginx
|
|
||||||
```
|
|
||||||
|
|
||||||
## SSL Certificate
|
|
||||||
|
|
||||||
If you chose Caddy as your web proxy SSL certificates are handled automatically and you can skip this step.
|
|
||||||
|
|
||||||
The easiest way to get an SSL certificate, if you don't have one already, is to [install](https://certbot.eff.org/instructions) `certbot` and run this:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# To use ECC for the private key,
|
|
||||||
# paste into /etc/letsencrypt/cli.ini:
|
|
||||||
# key-type = ecdsa
|
|
||||||
# elliptic-curve = secp384r1
|
|
||||||
|
|
||||||
$ sudo certbot -d your.server.name
|
|
||||||
```
|
|
||||||
[Automated renewal](https://eff-certbot.readthedocs.io/en/stable/using.html#automated-renewals) is usually preconfigured.
|
|
||||||
|
|
||||||
If using Cloudflare, configure instead the edge and origin certificates in dashboard. In case you’re already running a website on the same Apache server, you can just copy-and-paste the SSL configuration from your main virtual host on port 443 into the above-mentioned vhost.
|
|
||||||
|
|
||||||
## You're done!
|
|
||||||
|
|
||||||
Now you can start Conduit with:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ sudo systemctl start conduit
|
|
||||||
```
|
|
||||||
|
|
||||||
Set it to start automatically when your system boots with:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ sudo systemctl enable conduit
|
|
||||||
```
|
|
||||||
|
|
||||||
## How do I know it works?
|
|
||||||
|
|
||||||
You can open [a Matrix client](https://matrix.org/ecosystem/clients), enter your homeserver and try to register. If you are using a registration token, use [Element web](https://app.element.io/), [Nheko](https://matrix.org/ecosystem/clients/nheko/) or [SchildiChat web](https://app.schildi.chat/), as they support this feature.
|
|
||||||
|
|
||||||
You can also use these commands as a quick health check.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ curl https://your.server.name/_matrix/client/versions
|
|
||||||
|
|
||||||
# If using port 8448
|
|
||||||
$ curl https://your.server.name:8448/_matrix/client/versions
|
|
||||||
```
|
|
||||||
|
|
||||||
- To check if your server can talk with other homeservers, you can use the [Matrix Federation Tester](https://federationtester.matrix.org/).
|
|
||||||
If you can register but cannot join federated rooms check your config again and also check if the port 8448 is open and forwarded correctly.
|
|
||||||
|
|
||||||
# What's next?
|
|
||||||
|
|
||||||
## Audio/Video calls
|
|
||||||
|
|
||||||
For Audio/Video call functionality see the [TURN Guide](../turn.md).
|
|
||||||
|
|
||||||
## Appservices
|
|
||||||
|
|
||||||
If you want to set up an appservice, take a look at the [Appservice Guide](../appservices.md).
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
# Conduit for NixOS
|
|
||||||
|
|
||||||
Conduit can be acquired by Nix from various places:
|
|
||||||
|
|
||||||
* The `flake.nix` at the root of the repo
|
|
||||||
* The `default.nix` at the root of the repo
|
|
||||||
* From Nixpkgs
|
|
||||||
|
|
||||||
The `flake.nix` and `default.nix` do not (currently) provide a NixOS module, so
|
|
||||||
(for now) [`services.matrix-conduit`][module] from Nixpkgs should be used to
|
|
||||||
configure Conduit.
|
|
||||||
|
|
||||||
If you want to run the latest code, you should get Conduit from the `flake.nix`
|
|
||||||
or `default.nix` and set [`services.matrix-conduit.package`][package]
|
|
||||||
appropriately.
|
|
||||||
|
|
||||||
[module]: https://search.nixos.org/options?channel=unstable&query=services.matrix-conduit
|
|
||||||
[package]: https://search.nixos.org/options?channel=unstable&query=services.matrix-conduit.package
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
# Conduit
|
|
||||||
|
|
||||||
{{#include ../README.md:catchphrase}}
|
|
||||||
|
|
||||||
{{#include ../README.md:body}}
|
|
||||||
|
|
||||||
#### How can I deploy my own?
|
|
||||||
|
|
||||||
- [Deployment options](deploying.md)
|
|
||||||
|
|
||||||
If you want to connect an Appservice to Conduit, take a look at the [appservices documentation](appservices.md).
|
|
||||||
|
|
||||||
{{#include ../README.md:footer}}
|
|
||||||
25
docs/turn.md
25
docs/turn.md
|
|
@ -1,25 +0,0 @@
|
||||||
# Setting up TURN/STURN
|
|
||||||
|
|
||||||
## General instructions
|
|
||||||
|
|
||||||
* It is assumed you have a [Coturn server](https://github.com/coturn/coturn) up and running. See [Synapse reference implementation](https://github.com/matrix-org/synapse/blob/develop/docs/turn-howto.md).
|
|
||||||
|
|
||||||
## Edit/Add a few settings to your existing conduit.toml
|
|
||||||
|
|
||||||
```
|
|
||||||
# Refer to your Coturn settings.
|
|
||||||
# `your.turn.url` has to match the REALM setting of your Coturn as well as `transport`.
|
|
||||||
turn_uris = ["turn:your.turn.url?transport=udp", "turn:your.turn.url?transport=tcp"]
|
|
||||||
|
|
||||||
# static-auth-secret of your turnserver
|
|
||||||
turn_secret = "ADD SECRET HERE"
|
|
||||||
|
|
||||||
# If you have your TURN server configured to use a username and password
|
|
||||||
# you can provide these information too. In this case comment out `turn_secret above`!
|
|
||||||
#turn_username = ""
|
|
||||||
#turn_password = ""
|
|
||||||
```
|
|
||||||
|
|
||||||
## Apply settings
|
|
||||||
|
|
||||||
Restart Conduit.
|
|
||||||
10
engage.toml
10
engage.toml
|
|
@ -30,11 +30,6 @@ name = "cargo-clippy"
|
||||||
group = "versions"
|
group = "versions"
|
||||||
script = "cargo clippy -- --version"
|
script = "cargo clippy -- --version"
|
||||||
|
|
||||||
[[task]]
|
|
||||||
name = "lychee"
|
|
||||||
group = "versions"
|
|
||||||
script = "lychee --version"
|
|
||||||
|
|
||||||
[[task]]
|
[[task]]
|
||||||
name = "cargo-fmt"
|
name = "cargo-fmt"
|
||||||
group = "lints"
|
group = "lints"
|
||||||
|
|
@ -56,11 +51,6 @@ name = "cargo-clippy"
|
||||||
group = "lints"
|
group = "lints"
|
||||||
script = "cargo clippy --workspace --all-targets --color=always -- -D warnings"
|
script = "cargo clippy --workspace --all-targets --color=always -- -D warnings"
|
||||||
|
|
||||||
[[task]]
|
|
||||||
name = "lychee"
|
|
||||||
group = "lints"
|
|
||||||
script = "lychee --offline docs"
|
|
||||||
|
|
||||||
[[task]]
|
[[task]]
|
||||||
name = "cargo"
|
name = "cargo"
|
||||||
group = "tests"
|
group = "tests"
|
||||||
|
|
|
||||||
45
flake.nix
45
flake.nix
|
|
@ -203,35 +203,6 @@
|
||||||
packages = {
|
packages = {
|
||||||
default = package pkgsHost;
|
default = package pkgsHost;
|
||||||
oci-image = mkOciImage pkgsHost self.packages.${system}.default;
|
oci-image = mkOciImage pkgsHost self.packages.${system}.default;
|
||||||
|
|
||||||
book =
|
|
||||||
let
|
|
||||||
package = self.packages.${system}.default;
|
|
||||||
in
|
|
||||||
pkgsHost.stdenv.mkDerivation {
|
|
||||||
pname = "${package.pname}-book";
|
|
||||||
version = package.version;
|
|
||||||
|
|
||||||
src = nix-filter {
|
|
||||||
root = ./.;
|
|
||||||
include = [
|
|
||||||
"book.toml"
|
|
||||||
"conduit-example.toml"
|
|
||||||
"README.md"
|
|
||||||
"debian/README.md"
|
|
||||||
"docs"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
nativeBuildInputs = (with pkgsHost; [
|
|
||||||
mdbook
|
|
||||||
]);
|
|
||||||
|
|
||||||
buildPhase = ''
|
|
||||||
mdbook build
|
|
||||||
mv public $out
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
builtins.listToAttrs
|
builtins.listToAttrs
|
||||||
|
|
@ -290,22 +261,6 @@
|
||||||
toolchain
|
toolchain
|
||||||
] ++ (with pkgsHost; [
|
] ++ (with pkgsHost; [
|
||||||
engage
|
engage
|
||||||
|
|
||||||
# Needed for producing Debian packages
|
|
||||||
cargo-deb
|
|
||||||
|
|
||||||
# Needed for Complement
|
|
||||||
go
|
|
||||||
olm
|
|
||||||
|
|
||||||
# Needed for our script for Complement
|
|
||||||
jq
|
|
||||||
|
|
||||||
# Needed for finding broken markdown links
|
|
||||||
lychee
|
|
||||||
|
|
||||||
# Useful for editing the book locally
|
|
||||||
mdbook
|
|
||||||
]);
|
]);
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ pub static SERVICES: RwLock<Option<&'static Services>> = RwLock::new(None);
|
||||||
|
|
||||||
// Not async due to services() being used in many closures, and async closures are not stable as of writing
|
// Not async due to services() being used in many closures, and async closures are not stable as of writing
|
||||||
// This is the case for every other occurence of sync Mutex/RwLock, except for database related ones, where
|
// This is the case for every other occurence of sync Mutex/RwLock, except for database related ones, where
|
||||||
// the current maintainer (Timo) has asked to not modify those
|
// the previous maintainer has asked to not modify those
|
||||||
pub fn services() -> &'static Services {
|
pub fn services() -> &'static Services {
|
||||||
SERVICES
|
SERVICES
|
||||||
.read()
|
.read()
|
||||||
|
|
|
||||||
|
|
@ -1,866 +0,0 @@
|
||||||
reg GET /register yields a set of flows
|
|
||||||
reg POST /register can create a user
|
|
||||||
reg POST /register downcases capitals in usernames
|
|
||||||
reg POST /register returns the same device_id as that in the request
|
|
||||||
reg POST /register rejects registration of usernames with '!'
|
|
||||||
reg POST /register rejects registration of usernames with '"'
|
|
||||||
reg POST /register rejects registration of usernames with ':'
|
|
||||||
reg POST /register rejects registration of usernames with '?'
|
|
||||||
reg POST /register rejects registration of usernames with '\'
|
|
||||||
reg POST /register rejects registration of usernames with '@'
|
|
||||||
reg POST /register rejects registration of usernames with '['
|
|
||||||
reg POST /register rejects registration of usernames with ']'
|
|
||||||
reg POST /register rejects registration of usernames with '{'
|
|
||||||
reg POST /register rejects registration of usernames with '|'
|
|
||||||
reg POST /register rejects registration of usernames with '}'
|
|
||||||
reg POST /register rejects registration of usernames with '£'
|
|
||||||
reg POST /register rejects registration of usernames with 'é'
|
|
||||||
reg POST /register rejects registration of usernames with '\n'
|
|
||||||
reg POST /register rejects registration of usernames with '''
|
|
||||||
reg POST /r0/admin/register with shared secret
|
|
||||||
reg POST /r0/admin/register admin with shared secret
|
|
||||||
reg POST /r0/admin/register with shared secret downcases capitals
|
|
||||||
reg POST /r0/admin/register with shared secret disallows symbols
|
|
||||||
reg POST rejects invalid utf-8 in JSON
|
|
||||||
log GET /login yields a set of flows
|
|
||||||
log POST /login can log in as a user
|
|
||||||
log POST /login returns the same device_id as that in the request
|
|
||||||
log POST /login can log in as a user with just the local part of the id
|
|
||||||
log POST /login as non-existing user is rejected
|
|
||||||
log POST /login wrong password is rejected
|
|
||||||
log Interactive authentication types include SSO
|
|
||||||
log Can perform interactive authentication with SSO
|
|
||||||
log The user must be consistent through an interactive authentication session with SSO
|
|
||||||
log The operation must be consistent through an interactive authentication session
|
|
||||||
v1s GET /events initially
|
|
||||||
v1s GET /initialSync initially
|
|
||||||
csa Version responds 200 OK with valid structure
|
|
||||||
pro PUT /profile/:user_id/displayname sets my name
|
|
||||||
pro GET /profile/:user_id/displayname publicly accessible
|
|
||||||
pro PUT /profile/:user_id/avatar_url sets my avatar
|
|
||||||
pro GET /profile/:user_id/avatar_url publicly accessible
|
|
||||||
dev GET /device/{deviceId}
|
|
||||||
dev GET /device/{deviceId} gives a 404 for unknown devices
|
|
||||||
dev GET /devices
|
|
||||||
dev PUT /device/{deviceId} updates device fields
|
|
||||||
dev PUT /device/{deviceId} gives a 404 for unknown devices
|
|
||||||
dev DELETE /device/{deviceId}
|
|
||||||
dev DELETE /device/{deviceId} requires UI auth user to match device owner
|
|
||||||
dev DELETE /device/{deviceId} with no body gives a 401
|
|
||||||
dev The deleted device must be consistent through an interactive auth session
|
|
||||||
dev Users receive device_list updates for their own devices
|
|
||||||
pre GET /presence/:user_id/status fetches initial status
|
|
||||||
pre PUT /presence/:user_id/status updates my presence
|
|
||||||
crm POST /createRoom makes a public room
|
|
||||||
crm POST /createRoom makes a private room
|
|
||||||
crm POST /createRoom makes a private room with invites
|
|
||||||
crm POST /createRoom makes a room with a name
|
|
||||||
crm POST /createRoom makes a room with a topic
|
|
||||||
syn Can /sync newly created room
|
|
||||||
crm POST /createRoom creates a room with the given version
|
|
||||||
crm POST /createRoom rejects attempts to create rooms with numeric versions
|
|
||||||
crm POST /createRoom rejects attempts to create rooms with unknown versions
|
|
||||||
crm POST /createRoom ignores attempts to set the room version via creation_content
|
|
||||||
mem GET /rooms/:room_id/state/m.room.member/:user_id fetches my membership
|
|
||||||
mem GET /rooms/:room_id/state/m.room.member/:user_id?format=event fetches my membership event
|
|
||||||
rst GET /rooms/:room_id/state/m.room.power_levels fetches powerlevels
|
|
||||||
mem GET /rooms/:room_id/joined_members fetches my membership
|
|
||||||
v1s GET /rooms/:room_id/initialSync fetches initial sync state
|
|
||||||
pub GET /publicRooms lists newly-created room
|
|
||||||
ali GET /directory/room/:room_alias yields room ID
|
|
||||||
mem GET /joined_rooms lists newly-created room
|
|
||||||
rst POST /rooms/:room_id/state/m.room.name sets name
|
|
||||||
rst GET /rooms/:room_id/state/m.room.name gets name
|
|
||||||
rst POST /rooms/:room_id/state/m.room.topic sets topic
|
|
||||||
rst GET /rooms/:room_id/state/m.room.topic gets topic
|
|
||||||
rst GET /rooms/:room_id/state fetches entire room state
|
|
||||||
crm POST /createRoom with creation content
|
|
||||||
ali PUT /directory/room/:room_alias creates alias
|
|
||||||
nsp GET /rooms/:room_id/aliases lists aliases
|
|
||||||
jon POST /rooms/:room_id/join can join a room
|
|
||||||
jon POST /join/:room_alias can join a room
|
|
||||||
jon POST /join/:room_id can join a room
|
|
||||||
jon POST /join/:room_id can join a room with custom content
|
|
||||||
jon POST /join/:room_alias can join a room with custom content
|
|
||||||
lev POST /rooms/:room_id/leave can leave a room
|
|
||||||
inv POST /rooms/:room_id/invite can send an invite
|
|
||||||
ban POST /rooms/:room_id/ban can ban a user
|
|
||||||
snd POST /rooms/:room_id/send/:event_type sends a message
|
|
||||||
snd PUT /rooms/:room_id/send/:event_type/:txn_id sends a message
|
|
||||||
snd PUT /rooms/:room_id/send/:event_type/:txn_id deduplicates the same txn id
|
|
||||||
get GET /rooms/:room_id/messages returns a message
|
|
||||||
get GET /rooms/:room_id/messages lazy loads members correctly
|
|
||||||
typ PUT /rooms/:room_id/typing/:user_id sets typing notification
|
|
||||||
typ Typing notifications don't leak (3 subtests)
|
|
||||||
rst GET /rooms/:room_id/state/m.room.power_levels can fetch levels
|
|
||||||
rst PUT /rooms/:room_id/state/m.room.power_levels can set levels
|
|
||||||
rst PUT power_levels should not explode if the old power levels were empty
|
|
||||||
rst Both GET and PUT work
|
|
||||||
rct POST /rooms/:room_id/receipt can create receipts
|
|
||||||
red POST /rooms/:room_id/read_markers can create read marker
|
|
||||||
med POST /media/r0/upload can create an upload
|
|
||||||
med GET /media/r0/download can fetch the value again
|
|
||||||
cap GET /capabilities is present and well formed for registered user
|
|
||||||
cap GET /r0/capabilities is not public
|
|
||||||
reg Register with a recaptcha
|
|
||||||
reg registration is idempotent, without username specified
|
|
||||||
reg registration is idempotent, with username specified
|
|
||||||
reg registration remembers parameters
|
|
||||||
reg registration accepts non-ascii passwords
|
|
||||||
reg registration with inhibit_login inhibits login
|
|
||||||
reg User signups are forbidden from starting with '_'
|
|
||||||
reg Can register using an email address
|
|
||||||
log Can login with 3pid and password using m.login.password
|
|
||||||
log login types include SSO
|
|
||||||
log /login/cas/redirect redirects if the old m.login.cas login type is listed
|
|
||||||
log Can login with new user via CAS
|
|
||||||
lox Can logout current device
|
|
||||||
lox Can logout all devices
|
|
||||||
lox Request to logout with invalid an access token is rejected
|
|
||||||
lox Request to logout without an access token is rejected
|
|
||||||
log After changing password, can't log in with old password
|
|
||||||
log After changing password, can log in with new password
|
|
||||||
log After changing password, existing session still works
|
|
||||||
log After changing password, a different session no longer works by default
|
|
||||||
log After changing password, different sessions can optionally be kept
|
|
||||||
psh Pushers created with a different access token are deleted on password change
|
|
||||||
psh Pushers created with a the same access token are not deleted on password change
|
|
||||||
acc Can deactivate account
|
|
||||||
acc Can't deactivate account with wrong password
|
|
||||||
acc After deactivating account, can't log in with password
|
|
||||||
acc After deactivating account, can't log in with an email
|
|
||||||
v1s initialSync sees my presence status
|
|
||||||
pre Presence change reports an event to myself
|
|
||||||
pre Friends presence changes reports events
|
|
||||||
crm Room creation reports m.room.create to myself
|
|
||||||
crm Room creation reports m.room.member to myself
|
|
||||||
rst Setting room topic reports m.room.topic to myself
|
|
||||||
v1s Global initialSync
|
|
||||||
v1s Global initialSync with limit=0 gives no messages
|
|
||||||
v1s Room initialSync
|
|
||||||
v1s Room initialSync with limit=0 gives no messages
|
|
||||||
rst Setting state twice is idempotent
|
|
||||||
jon Joining room twice is idempotent
|
|
||||||
syn New room members see their own join event
|
|
||||||
v1s New room members see existing users' presence in room initialSync
|
|
||||||
syn Existing members see new members' join events
|
|
||||||
syn Existing members see new members' presence
|
|
||||||
v1s All room members see all room members' presence in global initialSync
|
|
||||||
f,jon Remote users can join room by alias
|
|
||||||
syn New room members see their own join event
|
|
||||||
v1s New room members see existing members' presence in room initialSync
|
|
||||||
syn Existing members see new members' join events
|
|
||||||
syn Existing members see new member's presence
|
|
||||||
v1s New room members see first user's profile information in global initialSync
|
|
||||||
v1s New room members see first user's profile information in per-room initialSync
|
|
||||||
f,jon Remote users may not join unfederated rooms
|
|
||||||
syn Local room members see posted message events
|
|
||||||
v1s Fetching eventstream a second time doesn't yield the message again
|
|
||||||
syn Local non-members don't see posted message events
|
|
||||||
get Local room members can get room messages
|
|
||||||
f,syn Remote room members also see posted message events
|
|
||||||
f,get Remote room members can get room messages
|
|
||||||
get Message history can be paginated
|
|
||||||
f,get Message history can be paginated over federation
|
|
||||||
eph Ephemeral messages received from clients are correctly expired
|
|
||||||
ali Room aliases can contain Unicode
|
|
||||||
f,ali Remote room alias queries can handle Unicode
|
|
||||||
ali Canonical alias can be set
|
|
||||||
ali Canonical alias can include alt_aliases
|
|
||||||
ali Regular users can add and delete aliases in the default room configuration
|
|
||||||
ali Regular users can add and delete aliases when m.room.aliases is restricted
|
|
||||||
ali Deleting a non-existent alias should return a 404
|
|
||||||
ali Users can't delete other's aliases
|
|
||||||
ali Users with sufficient power-level can delete other's aliases
|
|
||||||
ali Can delete canonical alias
|
|
||||||
ali Alias creators can delete alias with no ops
|
|
||||||
ali Alias creators can delete canonical alias with no ops
|
|
||||||
ali Only room members can list aliases of a room
|
|
||||||
inv Can invite users to invite-only rooms
|
|
||||||
inv Uninvited users cannot join the room
|
|
||||||
inv Invited user can reject invite
|
|
||||||
f,inv Invited user can reject invite over federation
|
|
||||||
f,inv Invited user can reject invite over federation several times
|
|
||||||
inv Invited user can reject invite for empty room
|
|
||||||
f,inv Invited user can reject invite over federation for empty room
|
|
||||||
inv Invited user can reject local invite after originator leaves
|
|
||||||
inv Invited user can see room metadata
|
|
||||||
f,inv Remote invited user can see room metadata
|
|
||||||
inv Users cannot invite themselves to a room
|
|
||||||
inv Users cannot invite a user that is already in the room
|
|
||||||
ban Banned user is kicked and may not rejoin until unbanned
|
|
||||||
f,ban Remote banned user is kicked and may not rejoin until unbanned
|
|
||||||
ban 'ban' event respects room powerlevel
|
|
||||||
plv setting 'm.room.name' respects room powerlevel
|
|
||||||
plv setting 'm.room.power_levels' respects room powerlevel (2 subtests)
|
|
||||||
plv Unprivileged users can set m.room.topic if it only needs level 0
|
|
||||||
plv Users cannot set ban powerlevel higher than their own (2 subtests)
|
|
||||||
plv Users cannot set kick powerlevel higher than their own (2 subtests)
|
|
||||||
plv Users cannot set redact powerlevel higher than their own (2 subtests)
|
|
||||||
v1s Check that event streams started after a client joined a room work (SYT-1)
|
|
||||||
v1s Event stream catches up fully after many messages
|
|
||||||
xxx POST /rooms/:room_id/redact/:event_id as power user redacts message
|
|
||||||
xxx POST /rooms/:room_id/redact/:event_id as original message sender redacts message
|
|
||||||
xxx POST /rooms/:room_id/redact/:event_id as random user does not redact message
|
|
||||||
xxx POST /redact disallows redaction of event in different room
|
|
||||||
xxx Redaction of a redaction redacts the redaction reason
|
|
||||||
v1s A departed room is still included in /initialSync (SPEC-216)
|
|
||||||
v1s Can get rooms/{roomId}/initialSync for a departed room (SPEC-216)
|
|
||||||
rst Can get rooms/{roomId}/state for a departed room (SPEC-216)
|
|
||||||
mem Can get rooms/{roomId}/members for a departed room (SPEC-216)
|
|
||||||
get Can get rooms/{roomId}/messages for a departed room (SPEC-216)
|
|
||||||
rst Can get 'm.room.name' state for a departed room (SPEC-216)
|
|
||||||
syn Getting messages going forward is limited for a departed room (SPEC-216)
|
|
||||||
3pd Can invite existing 3pid
|
|
||||||
3pd Can invite existing 3pid with no ops into a private room
|
|
||||||
3pd Can invite existing 3pid in createRoom
|
|
||||||
3pd Can invite unbound 3pid
|
|
||||||
f,3pd Can invite unbound 3pid over federation
|
|
||||||
3pd Can invite unbound 3pid with no ops into a private room
|
|
||||||
f,3pd Can invite unbound 3pid over federation with no ops into a private room
|
|
||||||
f,3pd Can invite unbound 3pid over federation with users from both servers
|
|
||||||
3pd Can accept unbound 3pid invite after inviter leaves
|
|
||||||
3pd Can accept third party invite with /join
|
|
||||||
3pd 3pid invite join with wrong but valid signature are rejected
|
|
||||||
3pd 3pid invite join valid signature but revoked keys are rejected
|
|
||||||
3pd 3pid invite join valid signature but unreachable ID server are rejected
|
|
||||||
gst Guest user cannot call /events globally
|
|
||||||
gst Guest users can join guest_access rooms
|
|
||||||
gst Guest users can send messages to guest_access rooms if joined
|
|
||||||
gst Guest user calling /events doesn't tightloop
|
|
||||||
gst Guest users are kicked from guest_access rooms on revocation of guest_access
|
|
||||||
gst Guest user can set display names
|
|
||||||
gst Guest users are kicked from guest_access rooms on revocation of guest_access over federation
|
|
||||||
gst Guest user can upgrade to fully featured user
|
|
||||||
gst Guest user cannot upgrade other users
|
|
||||||
pub GET /publicRooms lists rooms
|
|
||||||
pub GET /publicRooms includes avatar URLs
|
|
||||||
gst Guest users can accept invites to private rooms over federation
|
|
||||||
gst Guest users denied access over federation if guest access prohibited
|
|
||||||
mem Room members can override their displayname on a room-specific basis
|
|
||||||
mem Room members can join a room with an overridden displayname
|
|
||||||
mem Users cannot kick users from a room they are not in
|
|
||||||
mem Users cannot kick users who have already left a room
|
|
||||||
typ Typing notification sent to local room members
|
|
||||||
f,typ Typing notifications also sent to remote room members
|
|
||||||
typ Typing can be explicitly stopped
|
|
||||||
rct Read receipts are visible to /initialSync
|
|
||||||
rct Read receipts are sent as events
|
|
||||||
rct Receipts must be m.read
|
|
||||||
pro displayname updates affect room member events
|
|
||||||
pro avatar_url updates affect room member events
|
|
||||||
gst m.room.history_visibility == "world_readable" allows/forbids appropriately for Guest users
|
|
||||||
gst m.room.history_visibility == "shared" allows/forbids appropriately for Guest users
|
|
||||||
gst m.room.history_visibility == "invited" allows/forbids appropriately for Guest users
|
|
||||||
gst m.room.history_visibility == "joined" allows/forbids appropriately for Guest users
|
|
||||||
gst m.room.history_visibility == "default" allows/forbids appropriately for Guest users
|
|
||||||
gst Guest non-joined user cannot call /events on shared room
|
|
||||||
gst Guest non-joined user cannot call /events on invited room
|
|
||||||
gst Guest non-joined user cannot call /events on joined room
|
|
||||||
gst Guest non-joined user cannot call /events on default room
|
|
||||||
gst Guest non-joined user can call /events on world_readable room
|
|
||||||
gst Guest non-joined users can get state for world_readable rooms
|
|
||||||
gst Guest non-joined users can get individual state for world_readable rooms
|
|
||||||
gst Guest non-joined users cannot room initalSync for non-world_readable rooms
|
|
||||||
gst Guest non-joined users can room initialSync for world_readable rooms
|
|
||||||
gst Guest non-joined users can get individual state for world_readable rooms after leaving
|
|
||||||
gst Guest non-joined users cannot send messages to guest_access rooms if not joined
|
|
||||||
gst Guest users can sync from world_readable guest_access rooms if joined
|
|
||||||
gst Guest users can sync from shared guest_access rooms if joined
|
|
||||||
gst Guest users can sync from invited guest_access rooms if joined
|
|
||||||
gst Guest users can sync from joined guest_access rooms if joined
|
|
||||||
gst Guest users can sync from default guest_access rooms if joined
|
|
||||||
ath m.room.history_visibility == "world_readable" allows/forbids appropriately for Real users
|
|
||||||
ath m.room.history_visibility == "shared" allows/forbids appropriately for Real users
|
|
||||||
ath m.room.history_visibility == "invited" allows/forbids appropriately for Real users
|
|
||||||
ath m.room.history_visibility == "joined" allows/forbids appropriately for Real users
|
|
||||||
ath m.room.history_visibility == "default" allows/forbids appropriately for Real users
|
|
||||||
ath Real non-joined user cannot call /events on shared room
|
|
||||||
ath Real non-joined user cannot call /events on invited room
|
|
||||||
ath Real non-joined user cannot call /events on joined room
|
|
||||||
ath Real non-joined user cannot call /events on default room
|
|
||||||
ath Real non-joined user can call /events on world_readable room
|
|
||||||
ath Real non-joined users can get state for world_readable rooms
|
|
||||||
ath Real non-joined users can get individual state for world_readable rooms
|
|
||||||
ath Real non-joined users cannot room initalSync for non-world_readable rooms
|
|
||||||
ath Real non-joined users can room initialSync for world_readable rooms
|
|
||||||
ath Real non-joined users can get individual state for world_readable rooms after leaving
|
|
||||||
ath Real non-joined users cannot send messages to guest_access rooms if not joined
|
|
||||||
ath Real users can sync from world_readable guest_access rooms if joined
|
|
||||||
ath Real users can sync from shared guest_access rooms if joined
|
|
||||||
ath Real users can sync from invited guest_access rooms if joined
|
|
||||||
ath Real users can sync from joined guest_access rooms if joined
|
|
||||||
ath Real users can sync from default guest_access rooms if joined
|
|
||||||
ath Only see history_visibility changes on boundaries
|
|
||||||
f,ath Backfill works correctly with history visibility set to joined
|
|
||||||
fgt Forgotten room messages cannot be paginated
|
|
||||||
fgt Forgetting room does not show up in v2 /sync
|
|
||||||
fgt Can forget room you've been kicked from
|
|
||||||
fgt Can't forget room you're still in
|
|
||||||
fgt Can re-join room if re-invited
|
|
||||||
ath Only original members of the room can see messages from erased users
|
|
||||||
mem /joined_rooms returns only joined rooms
|
|
||||||
mem /joined_members return joined members
|
|
||||||
ctx /context/ on joined room works
|
|
||||||
ctx /context/ on non world readable room does not work
|
|
||||||
ctx /context/ returns correct number of events
|
|
||||||
ctx /context/ with lazy_load_members filter works
|
|
||||||
get /event/ on joined room works
|
|
||||||
get /event/ on non world readable room does not work
|
|
||||||
get /event/ does not allow access to events before the user joined
|
|
||||||
mem Can get rooms/{roomId}/members
|
|
||||||
mem Can get rooms/{roomId}/members at a given point
|
|
||||||
mem Can filter rooms/{roomId}/members
|
|
||||||
upg /upgrade creates a new room
|
|
||||||
upg /upgrade should preserve room visibility for public rooms
|
|
||||||
upg /upgrade should preserve room visibility for private rooms
|
|
||||||
upg /upgrade copies >100 power levels to the new room
|
|
||||||
upg /upgrade copies the power levels to the new room
|
|
||||||
upg /upgrade preserves the power level of the upgrading user in old and new rooms
|
|
||||||
upg /upgrade copies important state to the new room
|
|
||||||
upg /upgrade copies ban events to the new room
|
|
||||||
upg local user has push rules copied to upgraded room
|
|
||||||
f,upg remote user has push rules copied to upgraded room
|
|
||||||
upg /upgrade moves aliases to the new room
|
|
||||||
upg /upgrade moves remote aliases to the new room
|
|
||||||
upg /upgrade preserves direct room state
|
|
||||||
upg /upgrade preserves room federation ability
|
|
||||||
upg /upgrade restricts power levels in the old room
|
|
||||||
upg /upgrade restricts power levels in the old room when the old PLs are unusual
|
|
||||||
upg /upgrade to an unknown version is rejected
|
|
||||||
upg /upgrade is rejected if the user can't send state events
|
|
||||||
upg /upgrade of a bogus room fails gracefully
|
|
||||||
upg Cannot send tombstone event that points to the same room
|
|
||||||
f,upg Local and remote users' homeservers remove a room from their public directory on upgrade
|
|
||||||
rst Name/topic keys are correct
|
|
||||||
f,pub Can get remote public room list
|
|
||||||
pub Can paginate public room list
|
|
||||||
pub Can search public room list
|
|
||||||
syn Can create filter
|
|
||||||
syn Can download filter
|
|
||||||
syn Can sync
|
|
||||||
syn Can sync a joined room
|
|
||||||
syn Full state sync includes joined rooms
|
|
||||||
syn Newly joined room is included in an incremental sync
|
|
||||||
syn Newly joined room has correct timeline in incremental sync
|
|
||||||
syn Newly joined room includes presence in incremental sync
|
|
||||||
syn Get presence for newly joined members in incremental sync
|
|
||||||
syn Can sync a room with a single message
|
|
||||||
syn Can sync a room with a message with a transaction id
|
|
||||||
syn A message sent after an initial sync appears in the timeline of an incremental sync.
|
|
||||||
syn A filtered timeline reaches its limit
|
|
||||||
syn Syncing a new room with a large timeline limit isn't limited
|
|
||||||
syn A full_state incremental update returns only recent timeline
|
|
||||||
syn A prev_batch token can be used in the v1 messages API
|
|
||||||
syn A next_batch token can be used in the v1 messages API
|
|
||||||
syn User sees their own presence in a sync
|
|
||||||
syn User is offline if they set_presence=offline in their sync
|
|
||||||
syn User sees updates to presence from other users in the incremental sync.
|
|
||||||
syn State is included in the timeline in the initial sync
|
|
||||||
f,syn State from remote users is included in the state in the initial sync
|
|
||||||
syn Changes to state are included in an incremental sync
|
|
||||||
syn Changes to state are included in an gapped incremental sync
|
|
||||||
f,syn State from remote users is included in the timeline in an incremental sync
|
|
||||||
syn A full_state incremental update returns all state
|
|
||||||
syn When user joins a room the state is included in the next sync
|
|
||||||
syn A change to displayname should not result in a full state sync
|
|
||||||
syn A change to displayname should appear in incremental /sync
|
|
||||||
syn When user joins a room the state is included in a gapped sync
|
|
||||||
syn When user joins and leaves a room in the same batch, the full state is still included in the next sync
|
|
||||||
syn Current state appears in timeline in private history
|
|
||||||
syn Current state appears in timeline in private history with many messages before
|
|
||||||
syn Current state appears in timeline in private history with many messages after
|
|
||||||
syn Rooms a user is invited to appear in an initial sync
|
|
||||||
syn Rooms a user is invited to appear in an incremental sync
|
|
||||||
syn Newly joined room is included in an incremental sync after invite
|
|
||||||
syn Sync can be polled for updates
|
|
||||||
syn Sync is woken up for leaves
|
|
||||||
syn Left rooms appear in the leave section of sync
|
|
||||||
syn Newly left rooms appear in the leave section of incremental sync
|
|
||||||
syn We should see our own leave event, even if history_visibility is restricted (SYN-662)
|
|
||||||
syn We should see our own leave event when rejecting an invite, even if history_visibility is restricted (riot-web/3462)
|
|
||||||
syn Newly left rooms appear in the leave section of gapped sync
|
|
||||||
syn Previously left rooms don't appear in the leave section of sync
|
|
||||||
syn Left rooms appear in the leave section of full state sync
|
|
||||||
syn Archived rooms only contain history from before the user left
|
|
||||||
syn Banned rooms appear in the leave section of sync
|
|
||||||
syn Newly banned rooms appear in the leave section of incremental sync
|
|
||||||
syn Newly banned rooms appear in the leave section of incremental sync
|
|
||||||
syn Typing events appear in initial sync
|
|
||||||
syn Typing events appear in incremental sync
|
|
||||||
syn Typing events appear in gapped sync
|
|
||||||
syn Read receipts appear in initial v2 /sync
|
|
||||||
syn New read receipts appear in incremental v2 /sync
|
|
||||||
syn Can pass a JSON filter as a query parameter
|
|
||||||
syn Can request federation format via the filter
|
|
||||||
syn Read markers appear in incremental v2 /sync
|
|
||||||
syn Read markers appear in initial v2 /sync
|
|
||||||
syn Read markers can be updated
|
|
||||||
syn Lazy loading parameters in the filter are strictly boolean
|
|
||||||
syn The only membership state included in an initial sync is for all the senders in the timeline
|
|
||||||
syn The only membership state included in an incremental sync is for senders in the timeline
|
|
||||||
syn The only membership state included in a gapped incremental sync is for senders in the timeline
|
|
||||||
syn Gapped incremental syncs include all state changes
|
|
||||||
syn Old leaves are present in gapped incremental syncs
|
|
||||||
syn Leaves are present in non-gapped incremental syncs
|
|
||||||
syn Old members are included in gappy incr LL sync if they start speaking
|
|
||||||
syn Members from the gap are included in gappy incr LL sync
|
|
||||||
syn We don't send redundant membership state across incremental syncs by default
|
|
||||||
syn We do send redundant membership state across incremental syncs if asked
|
|
||||||
syn Unnamed room comes with a name summary
|
|
||||||
syn Named room comes with just joined member count summary
|
|
||||||
syn Room summary only has 5 heroes
|
|
||||||
syn Room summary counts change when membership changes
|
|
||||||
rmv User can create and send/receive messages in a room with version 1
|
|
||||||
rmv User can create and send/receive messages in a room with version 1 (2 subtests)
|
|
||||||
rmv local user can join room with version 1
|
|
||||||
rmv User can invite local user to room with version 1
|
|
||||||
rmv remote user can join room with version 1
|
|
||||||
rmv User can invite remote user to room with version 1
|
|
||||||
rmv Remote user can backfill in a room with version 1
|
|
||||||
rmv Can reject invites over federation for rooms with version 1
|
|
||||||
rmv Can receive redactions from regular users over federation in room version 1
|
|
||||||
rmv User can create and send/receive messages in a room with version 2
|
|
||||||
rmv User can create and send/receive messages in a room with version 2 (2 subtests)
|
|
||||||
rmv local user can join room with version 2
|
|
||||||
rmv User can invite local user to room with version 2
|
|
||||||
rmv remote user can join room with version 2
|
|
||||||
rmv User can invite remote user to room with version 2
|
|
||||||
rmv Remote user can backfill in a room with version 2
|
|
||||||
rmv Can reject invites over federation for rooms with version 2
|
|
||||||
rmv Can receive redactions from regular users over federation in room version 2
|
|
||||||
rmv User can create and send/receive messages in a room with version 3
|
|
||||||
rmv User can create and send/receive messages in a room with version 3 (2 subtests)
|
|
||||||
rmv local user can join room with version 3
|
|
||||||
rmv User can invite local user to room with version 3
|
|
||||||
rmv remote user can join room with version 3
|
|
||||||
rmv User can invite remote user to room with version 3
|
|
||||||
rmv Remote user can backfill in a room with version 3
|
|
||||||
rmv Can reject invites over federation for rooms with version 3
|
|
||||||
rmv Can receive redactions from regular users over federation in room version 3
|
|
||||||
rmv User can create and send/receive messages in a room with version 4
|
|
||||||
rmv User can create and send/receive messages in a room with version 4 (2 subtests)
|
|
||||||
rmv local user can join room with version 4
|
|
||||||
rmv User can invite local user to room with version 4
|
|
||||||
rmv remote user can join room with version 4
|
|
||||||
rmv User can invite remote user to room with version 4
|
|
||||||
rmv Remote user can backfill in a room with version 4
|
|
||||||
rmv Can reject invites over federation for rooms with version 4
|
|
||||||
rmv Can receive redactions from regular users over federation in room version 4
|
|
||||||
rmv User can create and send/receive messages in a room with version 5
|
|
||||||
rmv User can create and send/receive messages in a room with version 5 (2 subtests)
|
|
||||||
rmv local user can join room with version 5
|
|
||||||
rmv User can invite local user to room with version 5
|
|
||||||
rmv remote user can join room with version 5
|
|
||||||
rmv User can invite remote user to room with version 5
|
|
||||||
rmv Remote user can backfill in a room with version 5
|
|
||||||
rmv Can reject invites over federation for rooms with version 5
|
|
||||||
rmv Can receive redactions from regular users over federation in room version 5
|
|
||||||
rmv User can create and send/receive messages in a room with version 6
|
|
||||||
rmv User can create and send/receive messages in a room with version 6 (2 subtests)
|
|
||||||
rmv local user can join room with version 6
|
|
||||||
rmv User can invite local user to room with version 6
|
|
||||||
rmv remote user can join room with version 6
|
|
||||||
rmv User can invite remote user to room with version 6
|
|
||||||
rmv Remote user can backfill in a room with version 6
|
|
||||||
rmv Can reject invites over federation for rooms with version 6
|
|
||||||
rmv Can receive redactions from regular users over federation in room version 6
|
|
||||||
rmv Inbound federation rejects invites which include invalid JSON for room version 6
|
|
||||||
rmv Outbound federation rejects invite response which include invalid JSON for room version 6
|
|
||||||
rmv Inbound federation rejects invite rejections which include invalid JSON for room version 6
|
|
||||||
rmv Server rejects invalid JSON in a version 6 room
|
|
||||||
pre Presence changes are reported to local room members
|
|
||||||
f,pre Presence changes are also reported to remote room members
|
|
||||||
pre Presence changes to UNAVAILABLE are reported to local room members
|
|
||||||
f,pre Presence changes to UNAVAILABLE are reported to remote room members
|
|
||||||
v1s Newly created users see their own presence in /initialSync (SYT-34)
|
|
||||||
dvk Can upload device keys
|
|
||||||
dvk Should reject keys claiming to belong to a different user
|
|
||||||
dvk Can query device keys using POST
|
|
||||||
dvk Can query specific device keys using POST
|
|
||||||
dvk query for user with no keys returns empty key dict
|
|
||||||
dvk Can claim one time key using POST
|
|
||||||
f,dvk Can query remote device keys using POST
|
|
||||||
f,dvk Can claim remote one time key using POST
|
|
||||||
dvk Local device key changes appear in v2 /sync
|
|
||||||
dvk Local new device changes appear in v2 /sync
|
|
||||||
dvk Local delete device changes appear in v2 /sync
|
|
||||||
dvk Local update device changes appear in v2 /sync
|
|
||||||
dvk Can query remote device keys using POST after notification
|
|
||||||
f,dev Device deletion propagates over federation
|
|
||||||
f,dev If remote user leaves room, changes device and rejoins we see update in sync
|
|
||||||
f,dev If remote user leaves room we no longer receive device updates
|
|
||||||
dvk Local device key changes appear in /keys/changes
|
|
||||||
dvk New users appear in /keys/changes
|
|
||||||
f,dvk If remote user leaves room, changes device and rejoins we see update in /keys/changes
|
|
||||||
dvk Get left notifs in sync and /keys/changes when other user leaves
|
|
||||||
dvk Get left notifs for other users in sync and /keys/changes when user leaves
|
|
||||||
f,dvk If user leaves room, remote user changes device and rejoins we see update in /sync and /keys/changes
|
|
||||||
dkb Can create backup version
|
|
||||||
dkb Can update backup version
|
|
||||||
dkb Responds correctly when backup is empty
|
|
||||||
dkb Can backup keys
|
|
||||||
dkb Can update keys with better versions
|
|
||||||
dkb Will not update keys with worse versions
|
|
||||||
dkb Will not back up to an old backup version
|
|
||||||
dkb Can delete backup
|
|
||||||
dkb Deleted & recreated backups are empty
|
|
||||||
dkb Can create more than 10 backup versions
|
|
||||||
xsk Can upload self-signing keys
|
|
||||||
xsk Fails to upload self-signing keys with no auth
|
|
||||||
xsk Fails to upload self-signing key without master key
|
|
||||||
xsk Changing master key notifies local users
|
|
||||||
xsk Changing user-signing key notifies local users
|
|
||||||
f,xsk can fetch self-signing keys over federation
|
|
||||||
f,xsk uploading self-signing key notifies over federation
|
|
||||||
f,xsk uploading signed devices gets propagated over federation
|
|
||||||
tag Can add tag
|
|
||||||
tag Can remove tag
|
|
||||||
tag Can list tags for a room
|
|
||||||
v1s Tags appear in the v1 /events stream
|
|
||||||
v1s Tags appear in the v1 /initalSync
|
|
||||||
v1s Tags appear in the v1 room initial sync
|
|
||||||
tag Tags appear in an initial v2 /sync
|
|
||||||
tag Newly updated tags appear in an incremental v2 /sync
|
|
||||||
tag Deleted tags appear in an incremental v2 /sync
|
|
||||||
tag local user has tags copied to the new room
|
|
||||||
f,tag remote user has tags copied to the new room
|
|
||||||
sch Can search for an event by body
|
|
||||||
sch Can get context around search results
|
|
||||||
sch Can back-paginate search results
|
|
||||||
sch Search works across an upgraded room and its predecessor
|
|
||||||
sch Search results with rank ordering do not include redacted events
|
|
||||||
sch Search results with recent ordering do not include redacted events
|
|
||||||
acc Can add account data
|
|
||||||
acc Can add account data to room
|
|
||||||
acc Can get account data without syncing
|
|
||||||
acc Can get room account data without syncing
|
|
||||||
v1s Latest account data comes down in /initialSync
|
|
||||||
v1s Latest account data comes down in room initialSync
|
|
||||||
v1s Account data appears in v1 /events stream
|
|
||||||
v1s Room account data appears in v1 /events stream
|
|
||||||
acc Latest account data appears in v2 /sync
|
|
||||||
acc New account data appears in incremental v2 /sync
|
|
||||||
oid Can generate a openid access_token that can be exchanged for information about a user
|
|
||||||
oid Invalid openid access tokens are rejected
|
|
||||||
oid Requests to userinfo without access tokens are rejected
|
|
||||||
std Can send a message directly to a device using PUT /sendToDevice
|
|
||||||
std Can recv a device message using /sync
|
|
||||||
std Can recv device messages until they are acknowledged
|
|
||||||
std Device messages with the same txn_id are deduplicated
|
|
||||||
std Device messages wake up /sync
|
|
||||||
std Can recv device messages over federation
|
|
||||||
fsd Device messages over federation wake up /sync
|
|
||||||
std Can send messages with a wildcard device id
|
|
||||||
std Can send messages with a wildcard device id to two devices
|
|
||||||
std Wildcard device messages wake up /sync
|
|
||||||
fsd Wildcard device messages over federation wake up /sync
|
|
||||||
adm /whois
|
|
||||||
nsp /purge_history
|
|
||||||
nsp /purge_history by ts
|
|
||||||
nsp Can backfill purged history
|
|
||||||
nsp Shutdown room
|
|
||||||
ign Ignore user in existing room
|
|
||||||
ign Ignore invite in full sync
|
|
||||||
ign Ignore invite in incremental sync
|
|
||||||
fky Checking local federation server
|
|
||||||
fky Federation key API allows unsigned requests for keys
|
|
||||||
fky Federation key API can act as a notary server via a GET request
|
|
||||||
fky Federation key API can act as a notary server via a POST request
|
|
||||||
fky Key notary server should return an expired key if it can't find any others
|
|
||||||
fky Key notary server must not overwrite a valid key with a spurious result from the origin server
|
|
||||||
fqu Non-numeric ports in server names are rejected
|
|
||||||
fqu Outbound federation can query profile data
|
|
||||||
fqu Inbound federation can query profile data
|
|
||||||
fqu Outbound federation can query room alias directory
|
|
||||||
fqu Inbound federation can query room alias directory
|
|
||||||
fsj Outbound federation can query v1 /send_join
|
|
||||||
fsj Outbound federation can query v2 /send_join
|
|
||||||
fmj Outbound federation passes make_join failures through to the client
|
|
||||||
fsj Inbound federation can receive v1 /send_join
|
|
||||||
fsj Inbound federation can receive v2 /send_join
|
|
||||||
fmj Inbound /v1/make_join rejects remote attempts to join local users to rooms
|
|
||||||
fsj Inbound /v1/send_join rejects incorrectly-signed joins
|
|
||||||
fsj Inbound /v1/send_join rejects joins from other servers
|
|
||||||
fau Inbound federation rejects remote attempts to kick local users to rooms
|
|
||||||
frv Inbound federation rejects attempts to join v1 rooms from servers without v1 support
|
|
||||||
frv Inbound federation rejects attempts to join v2 rooms from servers lacking version support
|
|
||||||
frv Inbound federation rejects attempts to join v2 rooms from servers only supporting v1
|
|
||||||
frv Inbound federation accepts attempts to join v2 rooms from servers with support
|
|
||||||
frv Outbound federation correctly handles unsupported room versions
|
|
||||||
frv A pair of servers can establish a join in a v2 room
|
|
||||||
fsj Outbound federation rejects send_join responses with no m.room.create event
|
|
||||||
frv Outbound federation rejects m.room.create events with an unknown room version
|
|
||||||
fsj Event with an invalid signature in the send_join response should not cause room join to fail
|
|
||||||
fsj Inbound: send_join rejects invalid JSON for room version 6
|
|
||||||
fed Outbound federation can send events
|
|
||||||
fed Inbound federation can receive events
|
|
||||||
fed Inbound federation can receive redacted events
|
|
||||||
fed Ephemeral messages received from servers are correctly expired
|
|
||||||
fed Events whose auth_events are in the wrong room do not mess up the room state
|
|
||||||
fed Inbound federation can return events
|
|
||||||
fed Inbound federation redacts events from erased users
|
|
||||||
fme Outbound federation can request missing events
|
|
||||||
fme Inbound federation can return missing events for world_readable visibility
|
|
||||||
fme Inbound federation can return missing events for shared visibility
|
|
||||||
fme Inbound federation can return missing events for invite visibility
|
|
||||||
fme Inbound federation can return missing events for joined visibility
|
|
||||||
fme outliers whose auth_events are in a different room are correctly rejected
|
|
||||||
fbk Outbound federation can backfill events
|
|
||||||
fbk Inbound federation can backfill events
|
|
||||||
fbk Backfill checks the events requested belong to the room
|
|
||||||
fbk Backfilled events whose prev_events are in a different room do not allow cross-room back-pagination
|
|
||||||
fiv Outbound federation can send invites via v1 API
|
|
||||||
fiv Outbound federation can send invites via v2 API
|
|
||||||
fiv Inbound federation can receive invites via v1 API
|
|
||||||
fiv Inbound federation can receive invites via v2 API
|
|
||||||
fiv Inbound federation can receive invite and reject when remote replies with a 403
|
|
||||||
fiv Inbound federation can receive invite and reject when remote replies with a 500
|
|
||||||
fiv Inbound federation can receive invite and reject when remote is unreachable
|
|
||||||
fiv Inbound federation rejects invites which are not signed by the sender
|
|
||||||
fiv Inbound federation can receive invite rejections
|
|
||||||
fiv Inbound federation rejects incorrectly-signed invite rejections
|
|
||||||
fsl Inbound /v1/send_leave rejects leaves from other servers
|
|
||||||
fst Inbound federation can get state for a room
|
|
||||||
fst Inbound federation of state requires event_id as a mandatory paramater
|
|
||||||
fst Inbound federation can get state_ids for a room
|
|
||||||
fst Inbound federation of state_ids requires event_id as a mandatory paramater
|
|
||||||
fst Federation rejects inbound events where the prev_events cannot be found
|
|
||||||
fst Room state at a rejected message event is the same as its predecessor
|
|
||||||
fst Room state at a rejected state event is the same as its predecessor
|
|
||||||
fst Outbound federation requests missing prev_events and then asks for /state_ids and resolves the state
|
|
||||||
fst Federation handles empty auth_events in state_ids sanely
|
|
||||||
fst Getting state checks the events requested belong to the room
|
|
||||||
fst Getting state IDs checks the events requested belong to the room
|
|
||||||
fst Should not be able to take over the room by pretending there is no PL event
|
|
||||||
fpb Inbound federation can get public room list
|
|
||||||
fed Outbound federation sends receipts
|
|
||||||
fed Inbound federation rejects receipts from wrong remote
|
|
||||||
fed Inbound federation ignores redactions from invalid servers room > v3
|
|
||||||
fed An event which redacts an event in a different room should be ignored
|
|
||||||
fed An event which redacts itself should be ignored
|
|
||||||
fed A pair of events which redact each other should be ignored
|
|
||||||
fdk Local device key changes get to remote servers
|
|
||||||
fdk Server correctly handles incoming m.device_list_update
|
|
||||||
fdk Server correctly resyncs when client query keys and there is no remote cache
|
|
||||||
fdk Server correctly resyncs when server leaves and rejoins a room
|
|
||||||
fdk Local device key changes get to remote servers with correct prev_id
|
|
||||||
fdk Device list doesn't change if remote server is down
|
|
||||||
fdk If a device list update goes missing, the server resyncs on the next one
|
|
||||||
fst Name/topic keys are correct
|
|
||||||
fau Remote servers cannot set power levels in rooms without existing powerlevels
|
|
||||||
fau Remote servers should reject attempts by non-creators to set the power levels
|
|
||||||
fau Inbound federation rejects typing notifications from wrong remote
|
|
||||||
fau Users cannot set notifications powerlevel higher than their own
|
|
||||||
fed Forward extremities remain so even after the next events are populated as outliers
|
|
||||||
fau Banned servers cannot send events
|
|
||||||
fau Banned servers cannot /make_join
|
|
||||||
fau Banned servers cannot /send_join
|
|
||||||
fau Banned servers cannot /make_leave
|
|
||||||
fau Banned servers cannot /send_leave
|
|
||||||
fau Banned servers cannot /invite
|
|
||||||
fau Banned servers cannot get room state
|
|
||||||
fau Banned servers cannot get room state ids
|
|
||||||
fau Banned servers cannot backfill
|
|
||||||
fau Banned servers cannot /event_auth
|
|
||||||
fau Banned servers cannot get missing events
|
|
||||||
fau Server correctly handles transactions that break edu limits
|
|
||||||
fau Inbound federation correctly soft fails events
|
|
||||||
fau Inbound federation accepts a second soft-failed event
|
|
||||||
fau Inbound federation correctly handles soft failed events as extremities
|
|
||||||
med Can upload with Unicode file name
|
|
||||||
med Can download with Unicode file name locally
|
|
||||||
f,med Can download with Unicode file name over federation
|
|
||||||
med Alternative server names do not cause a routing loop
|
|
||||||
med Can download specifying a different Unicode file name
|
|
||||||
med Can upload without a file name
|
|
||||||
med Can download without a file name locally
|
|
||||||
f,med Can download without a file name over federation
|
|
||||||
med Can upload with ASCII file name
|
|
||||||
med Can download file 'ascii'
|
|
||||||
med Can download file 'name with spaces'
|
|
||||||
med Can download file 'name;with;semicolons'
|
|
||||||
med Can download specifying a different ASCII file name
|
|
||||||
med Can send image in room message
|
|
||||||
med Can fetch images in room
|
|
||||||
med POSTed media can be thumbnailed
|
|
||||||
f,med Remote media can be thumbnailed
|
|
||||||
med Test URL preview
|
|
||||||
med Can read configuration endpoint
|
|
||||||
nsp Can quarantine media in rooms
|
|
||||||
udr User appears in user directory
|
|
||||||
udr User in private room doesn't appear in user directory
|
|
||||||
udr User joining then leaving public room appears and dissappears from directory
|
|
||||||
udr Users appear/disappear from directory when join_rules are changed
|
|
||||||
udr Users appear/disappear from directory when history_visibility are changed
|
|
||||||
udr Users stay in directory when join_rules are changed but history_visibility is world_readable
|
|
||||||
f,udr User in remote room doesn't appear in user directory after server left room
|
|
||||||
udr User directory correctly update on display name change
|
|
||||||
udr User in shared private room does appear in user directory
|
|
||||||
udr User in shared private room does appear in user directory until leave
|
|
||||||
udr User in dir while user still shares private rooms
|
|
||||||
nsp Create group
|
|
||||||
nsp Add group rooms
|
|
||||||
nsp Remove group rooms
|
|
||||||
nsp Get local group profile
|
|
||||||
nsp Get local group users
|
|
||||||
nsp Add/remove local group rooms
|
|
||||||
nsp Get local group summary
|
|
||||||
nsp Get remote group profile
|
|
||||||
nsp Get remote group users
|
|
||||||
nsp Add/remove remote group rooms
|
|
||||||
nsp Get remote group summary
|
|
||||||
nsp Add local group users
|
|
||||||
nsp Remove self from local group
|
|
||||||
nsp Remove other from local group
|
|
||||||
nsp Add remote group users
|
|
||||||
nsp Remove self from remote group
|
|
||||||
nsp Listing invited users of a remote group when not a member returns a 403
|
|
||||||
nsp Add group category
|
|
||||||
nsp Remove group category
|
|
||||||
nsp Get group categories
|
|
||||||
nsp Add group role
|
|
||||||
nsp Remove group role
|
|
||||||
nsp Get group roles
|
|
||||||
nsp Add room to group summary
|
|
||||||
nsp Adding room to group summary keeps room_id when fetching rooms in group
|
|
||||||
nsp Adding multiple rooms to group summary have correct order
|
|
||||||
nsp Remove room from group summary
|
|
||||||
nsp Add room to group summary with category
|
|
||||||
nsp Remove room from group summary with category
|
|
||||||
nsp Add user to group summary
|
|
||||||
nsp Adding multiple users to group summary have correct order
|
|
||||||
nsp Remove user from group summary
|
|
||||||
nsp Add user to group summary with role
|
|
||||||
nsp Remove user from group summary with role
|
|
||||||
nsp Local group invites come down sync
|
|
||||||
nsp Group creator sees group in sync
|
|
||||||
nsp Group creator sees group in initial sync
|
|
||||||
nsp Get/set local group publicity
|
|
||||||
nsp Bulk get group publicity
|
|
||||||
nsp Joinability comes down summary
|
|
||||||
nsp Set group joinable and join it
|
|
||||||
nsp Group is not joinable by default
|
|
||||||
nsp Group is joinable over federation
|
|
||||||
nsp Room is transitioned on local and remote groups upon room upgrade
|
|
||||||
3pd Can bind 3PID via home server
|
|
||||||
3pd Can bind and unbind 3PID via homeserver
|
|
||||||
3pd Can unbind 3PID via homeserver when bound out of band
|
|
||||||
3pd 3PIDs are unbound after account deactivation
|
|
||||||
3pd Can bind and unbind 3PID via /unbind by specifying the identity server
|
|
||||||
3pd Can bind and unbind 3PID via /unbind without specifying the identity server
|
|
||||||
app AS can create a user
|
|
||||||
app AS can create a user with an underscore
|
|
||||||
app AS can create a user with inhibit_login
|
|
||||||
app AS cannot create users outside its own namespace
|
|
||||||
app Regular users cannot register within the AS namespace
|
|
||||||
app AS can make room aliases
|
|
||||||
app Regular users cannot create room aliases within the AS namespace
|
|
||||||
app AS-ghosted users can use rooms via AS
|
|
||||||
app AS-ghosted users can use rooms themselves
|
|
||||||
app Ghost user must register before joining room
|
|
||||||
app AS can set avatar for ghosted users
|
|
||||||
app AS can set displayname for ghosted users
|
|
||||||
app AS can't set displayname for random users
|
|
||||||
app Inviting an AS-hosted user asks the AS server
|
|
||||||
app Accesing an AS-hosted room alias asks the AS server
|
|
||||||
app Events in rooms with AS-hosted room aliases are sent to AS server
|
|
||||||
app AS user (not ghost) can join room without registering
|
|
||||||
app AS user (not ghost) can join room without registering, with user_id query param
|
|
||||||
app HS provides query metadata
|
|
||||||
app HS can provide query metadata on a single protocol
|
|
||||||
app HS will proxy request for 3PU mapping
|
|
||||||
app HS will proxy request for 3PL mapping
|
|
||||||
app AS can publish rooms in their own list
|
|
||||||
app AS and main public room lists are separate
|
|
||||||
app AS can deactivate a user
|
|
||||||
psh Test that a message is pushed
|
|
||||||
psh Invites are pushed
|
|
||||||
psh Rooms with names are correctly named in pushed
|
|
||||||
psh Rooms with canonical alias are correctly named in pushed
|
|
||||||
psh Rooms with many users are correctly pushed
|
|
||||||
psh Don't get pushed for rooms you've muted
|
|
||||||
psh Rejected events are not pushed
|
|
||||||
psh Can add global push rule for room
|
|
||||||
psh Can add global push rule for sender
|
|
||||||
psh Can add global push rule for content
|
|
||||||
psh Can add global push rule for override
|
|
||||||
psh Can add global push rule for underride
|
|
||||||
psh Can add global push rule for content
|
|
||||||
psh New rules appear before old rules by default
|
|
||||||
psh Can add global push rule before an existing rule
|
|
||||||
psh Can add global push rule after an existing rule
|
|
||||||
psh Can delete a push rule
|
|
||||||
psh Can disable a push rule
|
|
||||||
psh Adding the same push rule twice is idempotent
|
|
||||||
psh Messages that notify from another user increment unread notification count
|
|
||||||
psh Messages that highlight from another user increment unread highlight count
|
|
||||||
psh Can change the actions of default rules
|
|
||||||
psh Changing the actions of an unknown default rule fails with 404
|
|
||||||
psh Can change the actions of a user specified rule
|
|
||||||
psh Changing the actions of an unknown rule fails with 404
|
|
||||||
psh Can fetch a user's pushers
|
|
||||||
psh Push rules come down in an initial /sync
|
|
||||||
psh Adding a push rule wakes up an incremental /sync
|
|
||||||
psh Disabling a push rule wakes up an incremental /sync
|
|
||||||
psh Enabling a push rule wakes up an incremental /sync
|
|
||||||
psh Setting actions for a push rule wakes up an incremental /sync
|
|
||||||
psh Can enable/disable default rules
|
|
||||||
psh Enabling an unknown default rule fails with 404
|
|
||||||
psh Test that rejected pushers are removed.
|
|
||||||
psh Notifications can be viewed with GET /notifications
|
|
||||||
psh Trying to add push rule with no scope fails with 400
|
|
||||||
psh Trying to add push rule with invalid scope fails with 400
|
|
||||||
psh Trying to add push rule with missing template fails with 400
|
|
||||||
psh Trying to add push rule with missing rule_id fails with 400
|
|
||||||
psh Trying to add push rule with empty rule_id fails with 400
|
|
||||||
psh Trying to add push rule with invalid template fails with 400
|
|
||||||
psh Trying to add push rule with rule_id with slashes fails with 400
|
|
||||||
psh Trying to add push rule with override rule without conditions fails with 400
|
|
||||||
psh Trying to add push rule with underride rule without conditions fails with 400
|
|
||||||
psh Trying to add push rule with condition without kind fails with 400
|
|
||||||
psh Trying to add push rule with content rule without pattern fails with 400
|
|
||||||
psh Trying to add push rule with no actions fails with 400
|
|
||||||
psh Trying to add push rule with invalid action fails with 400
|
|
||||||
psh Trying to add push rule with invalid attr fails with 400
|
|
||||||
psh Trying to add push rule with invalid value for enabled fails with 400
|
|
||||||
psh Trying to get push rules with no trailing slash fails with 400
|
|
||||||
psh Trying to get push rules with scope without trailing slash fails with 400
|
|
||||||
psh Trying to get push rules with template without tailing slash fails with 400
|
|
||||||
psh Trying to get push rules with unknown scope fails with 400
|
|
||||||
psh Trying to get push rules with unknown template fails with 400
|
|
||||||
psh Trying to get push rules with unknown attribute fails with 400
|
|
||||||
psh Trying to get push rules with unknown rule_id fails with 404
|
|
||||||
psh Rooms with names are correctly named in pushes
|
|
||||||
v1s GET /initialSync with non-numeric 'limit'
|
|
||||||
v1s GET /events with non-numeric 'limit'
|
|
||||||
v1s GET /events with negative 'limit'
|
|
||||||
v1s GET /events with non-numeric 'timeout'
|
|
||||||
ath Event size limits
|
|
||||||
syn Check creating invalid filters returns 4xx
|
|
||||||
f,pre New federated private chats get full presence information (SYN-115)
|
|
||||||
pre Left room members do not cause problems for presence
|
|
||||||
crm Rooms can be created with an initial invite list (SYN-205) (1 subtests)
|
|
||||||
typ Typing notifications don't leak
|
|
||||||
ban Non-present room members cannot ban others
|
|
||||||
psh Getting push rules doesn't corrupt the cache SYN-390
|
|
||||||
inv Test that we can be reinvited to a room we created
|
|
||||||
syn Multiple calls to /sync should not cause 500 errors
|
|
||||||
gst Guest user can call /events on another world_readable room (SYN-606)
|
|
||||||
gst Real user can call /events on another world_readable room (SYN-606)
|
|
||||||
gst Events come down the correct room
|
|
||||||
pub Asking for a remote rooms list, but supplying the local server's name, returns the local rooms list
|
|
||||||
std Can send a to-device message to two users which both receive it using /sync
|
|
||||||
fme Outbound federation will ignore a missing event with bad JSON for room version 6
|
|
||||||
fbk Outbound federation rejects backfill containing invalid JSON for events in room version 6
|
|
||||||
jso Invalid JSON integers
|
|
||||||
jso Invalid JSON floats
|
|
||||||
jso Invalid JSON special values
|
|
||||||
inv Can invite users to invite-only rooms (2 subtests)
|
|
||||||
plv setting 'm.room.name' respects room powerlevel (2 subtests)
|
|
||||||
psh Messages that notify from another user increment notification_count
|
|
||||||
psh Messages that org.matrix.msc2625.mark_unread from another user increment org.matrix.msc2625.unread_count
|
|
||||||
dvk Can claim one time key using POST (2 subtests)
|
|
||||||
fdk Can query remote device keys using POST (1 subtests)
|
|
||||||
fdk Can claim remote one time key using POST (2 subtests)
|
|
||||||
fmj Inbound /make_join rejects attempts to join rooms where all users have left
|
|
||||||
|
|
@ -1,266 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
|
|
||||||
from __future__ import division
|
|
||||||
import argparse
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Usage: $ ./are-we-synapse-yet.py [-v] results.tap
|
|
||||||
# This script scans a results.tap file from Dendrite's CI process and spits out
|
|
||||||
# a rating of how close we are to Synapse parity, based purely on SyTests.
|
|
||||||
# The main complexity is grouping tests sensibly into features like 'Registration'
|
|
||||||
# and 'Federation'. Then it just checks the ones which are passing and calculates
|
|
||||||
# percentages for each group. Produces results like:
|
|
||||||
#
|
|
||||||
# Client-Server APIs: 29% (196/666 tests)
|
|
||||||
# -------------------
|
|
||||||
# Registration : 62% (20/32 tests)
|
|
||||||
# Login : 7% (1/15 tests)
|
|
||||||
# V1 CS APIs : 10% (3/30 tests)
|
|
||||||
# ...
|
|
||||||
#
|
|
||||||
# or in verbose mode:
|
|
||||||
#
|
|
||||||
# Client-Server APIs: 29% (196/666 tests)
|
|
||||||
# -------------------
|
|
||||||
# Registration : 62% (20/32 tests)
|
|
||||||
# ✓ GET /register yields a set of flows
|
|
||||||
# ✓ POST /register can create a user
|
|
||||||
# ✓ POST /register downcases capitals in usernames
|
|
||||||
# ...
|
|
||||||
#
|
|
||||||
# You can also tack `-v` on to see exactly which tests each category falls under.
|
|
||||||
|
|
||||||
test_mappings = {
|
|
||||||
"nsp": "Non-Spec API",
|
|
||||||
"unk": "Unknown API (no group specified)",
|
|
||||||
"app": "Application Services API",
|
|
||||||
"f": "Federation", # flag to mark test involves federation
|
|
||||||
|
|
||||||
"federation_apis": {
|
|
||||||
"fky": "Key API",
|
|
||||||
"fsj": "send_join API",
|
|
||||||
"fmj": "make_join API",
|
|
||||||
"fsl": "send_leave API",
|
|
||||||
"fiv": "Invite API",
|
|
||||||
"fqu": "Query API",
|
|
||||||
"frv": "room versions",
|
|
||||||
"fau": "Auth",
|
|
||||||
"fbk": "Backfill API",
|
|
||||||
"fme": "get_missing_events API",
|
|
||||||
"fst": "State APIs",
|
|
||||||
"fpb": "Public Room API",
|
|
||||||
"fdk": "Device Key APIs",
|
|
||||||
"fed": "Federation API",
|
|
||||||
"fsd": "Send-to-Device APIs",
|
|
||||||
},
|
|
||||||
|
|
||||||
"client_apis": {
|
|
||||||
"reg": "Registration",
|
|
||||||
"log": "Login",
|
|
||||||
"lox": "Logout",
|
|
||||||
"v1s": "V1 CS APIs",
|
|
||||||
"csa": "Misc CS APIs",
|
|
||||||
"pro": "Profile",
|
|
||||||
"dev": "Devices",
|
|
||||||
"dvk": "Device Keys",
|
|
||||||
"dkb": "Device Key Backup",
|
|
||||||
"xsk": "Cross-signing Keys",
|
|
||||||
"pre": "Presence",
|
|
||||||
"crm": "Create Room",
|
|
||||||
"syn": "Sync API",
|
|
||||||
"rmv": "Room Versions",
|
|
||||||
"rst": "Room State APIs",
|
|
||||||
"pub": "Public Room APIs",
|
|
||||||
"mem": "Room Membership",
|
|
||||||
"ali": "Room Aliases",
|
|
||||||
"jon": "Joining Rooms",
|
|
||||||
"lev": "Leaving Rooms",
|
|
||||||
"inv": "Inviting users to Rooms",
|
|
||||||
"ban": "Banning users",
|
|
||||||
"snd": "Sending events",
|
|
||||||
"get": "Getting events for Rooms",
|
|
||||||
"rct": "Receipts",
|
|
||||||
"red": "Read markers",
|
|
||||||
"med": "Media APIs",
|
|
||||||
"cap": "Capabilities API",
|
|
||||||
"typ": "Typing API",
|
|
||||||
"psh": "Push APIs",
|
|
||||||
"acc": "Account APIs",
|
|
||||||
"eph": "Ephemeral Events",
|
|
||||||
"plv": "Power Levels",
|
|
||||||
"xxx": "Redaction",
|
|
||||||
"3pd": "Third-Party ID APIs",
|
|
||||||
"gst": "Guest APIs",
|
|
||||||
"ath": "Room Auth",
|
|
||||||
"fgt": "Forget APIs",
|
|
||||||
"ctx": "Context APIs",
|
|
||||||
"upg": "Room Upgrade APIs",
|
|
||||||
"tag": "Tagging APIs",
|
|
||||||
"sch": "Search APIs",
|
|
||||||
"oid": "OpenID API",
|
|
||||||
"std": "Send-to-Device APIs",
|
|
||||||
"adm": "Server Admin API",
|
|
||||||
"ign": "Ignore Users",
|
|
||||||
"udr": "User Directory APIs",
|
|
||||||
"jso": "Enforced canonical JSON",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# optional 'not ' with test number then anything but '#'
|
|
||||||
re_testname = re.compile(r"^(not )?ok [0-9]+ ([^#]+)")
|
|
||||||
|
|
||||||
# Parses lines like the following:
|
|
||||||
#
|
|
||||||
# SUCCESS: ok 3 POST /register downcases capitals in usernames
|
|
||||||
# FAIL: not ok 54 (expected fail) POST /createRoom creates a room with the given version
|
|
||||||
# SKIP: ok 821 Multiple calls to /sync should not cause 500 errors # skip lack of can_post_room_receipts
|
|
||||||
# EXPECT FAIL: not ok 822 (expected fail) Guest user can call /events on another world_readable room (SYN-606) # TODO expected fail
|
|
||||||
#
|
|
||||||
# Only SUCCESS lines are treated as success, the rest are not implemented.
|
|
||||||
#
|
|
||||||
# Returns a dict like:
|
|
||||||
# { name: "...", ok: True }
|
|
||||||
def parse_test_line(line):
|
|
||||||
if not line.startswith("ok ") and not line.startswith("not ok "):
|
|
||||||
return
|
|
||||||
re_match = re_testname.match(line)
|
|
||||||
test_name = re_match.groups()[1].replace("(expected fail) ", "").strip()
|
|
||||||
test_pass = False
|
|
||||||
if line.startswith("ok ") and not "# skip " in line:
|
|
||||||
test_pass = True
|
|
||||||
return {
|
|
||||||
"name": test_name,
|
|
||||||
"ok": test_pass,
|
|
||||||
}
|
|
||||||
|
|
||||||
# Prints the stats for a complete section.
|
|
||||||
# header_name => "Client-Server APIs"
|
|
||||||
# gid_to_tests => { gid: { <name>: True|False }}
|
|
||||||
# gid_to_name => { gid: "Group Name" }
|
|
||||||
# verbose => True|False
|
|
||||||
# Produces:
|
|
||||||
# Client-Server APIs: 29% (196/666 tests)
|
|
||||||
# -------------------
|
|
||||||
# Registration : 62% (20/32 tests)
|
|
||||||
# Login : 7% (1/15 tests)
|
|
||||||
# V1 CS APIs : 10% (3/30 tests)
|
|
||||||
# ...
|
|
||||||
# or in verbose mode:
|
|
||||||
# Client-Server APIs: 29% (196/666 tests)
|
|
||||||
# -------------------
|
|
||||||
# Registration : 62% (20/32 tests)
|
|
||||||
# ✓ GET /register yields a set of flows
|
|
||||||
# ✓ POST /register can create a user
|
|
||||||
# ✓ POST /register downcases capitals in usernames
|
|
||||||
# ...
|
|
||||||
def print_stats(header_name, gid_to_tests, gid_to_name, verbose):
|
|
||||||
subsections = [] # Registration: 100% (13/13 tests)
|
|
||||||
subsection_test_names = {} # 'subsection name': ["✓ Test 1", "✓ Test 2", "× Test 3"]
|
|
||||||
total_passing = 0
|
|
||||||
total_tests = 0
|
|
||||||
for gid, tests in gid_to_tests.items():
|
|
||||||
group_total = len(tests)
|
|
||||||
if group_total == 0:
|
|
||||||
continue
|
|
||||||
group_passing = 0
|
|
||||||
test_names_and_marks = []
|
|
||||||
for name, passing in tests.items():
|
|
||||||
if passing:
|
|
||||||
group_passing += 1
|
|
||||||
test_names_and_marks.append(f"{'✓' if passing else '×'} {name}")
|
|
||||||
|
|
||||||
total_tests += group_total
|
|
||||||
total_passing += group_passing
|
|
||||||
pct = "{0:.0f}%".format(group_passing/group_total * 100)
|
|
||||||
line = "%s: %s (%d/%d tests)" % (gid_to_name[gid].ljust(25, ' '), pct.rjust(4, ' '), group_passing, group_total)
|
|
||||||
subsections.append(line)
|
|
||||||
subsection_test_names[line] = test_names_and_marks
|
|
||||||
|
|
||||||
pct = "{0:.0f}%".format(total_passing/total_tests * 100)
|
|
||||||
print("%s: %s (%d/%d tests)" % (header_name, pct, total_passing, total_tests))
|
|
||||||
print("-" * (len(header_name)+1))
|
|
||||||
for line in subsections:
|
|
||||||
print(" %s" % (line,))
|
|
||||||
if verbose:
|
|
||||||
for test_name_and_pass_mark in subsection_test_names[line]:
|
|
||||||
print(" %s" % (test_name_and_pass_mark,))
|
|
||||||
print("")
|
|
||||||
print("")
|
|
||||||
|
|
||||||
def main(results_tap_path, verbose):
|
|
||||||
# Load up test mappings
|
|
||||||
test_name_to_group_id = {}
|
|
||||||
fed_tests = set()
|
|
||||||
client_tests = set()
|
|
||||||
with open("./are-we-synapse-yet.list", "r") as f:
|
|
||||||
for line in f.readlines():
|
|
||||||
test_name = " ".join(line.split(" ")[1:]).strip()
|
|
||||||
groups = line.split(" ")[0].split(",")
|
|
||||||
for gid in groups:
|
|
||||||
if gid == "f" or gid in test_mappings["federation_apis"]:
|
|
||||||
fed_tests.add(test_name)
|
|
||||||
else:
|
|
||||||
client_tests.add(test_name)
|
|
||||||
if gid == "f":
|
|
||||||
continue # we expect another group ID
|
|
||||||
test_name_to_group_id[test_name] = gid
|
|
||||||
|
|
||||||
# parse results.tap
|
|
||||||
summary = {
|
|
||||||
"client": {
|
|
||||||
# gid: {
|
|
||||||
# test_name: OK
|
|
||||||
# }
|
|
||||||
},
|
|
||||||
"federation": {
|
|
||||||
# gid: {
|
|
||||||
# test_name: OK
|
|
||||||
# }
|
|
||||||
},
|
|
||||||
"appservice": {
|
|
||||||
"app": {},
|
|
||||||
},
|
|
||||||
"nonspec": {
|
|
||||||
"nsp": {},
|
|
||||||
"unk": {}
|
|
||||||
},
|
|
||||||
}
|
|
||||||
with open(results_tap_path, "r") as f:
|
|
||||||
for line in f.readlines():
|
|
||||||
test_result = parse_test_line(line)
|
|
||||||
if not test_result:
|
|
||||||
continue
|
|
||||||
name = test_result["name"]
|
|
||||||
group_id = test_name_to_group_id.get(name)
|
|
||||||
if not group_id:
|
|
||||||
summary["nonspec"]["unk"][name] = test_result["ok"]
|
|
||||||
if group_id == "nsp":
|
|
||||||
summary["nonspec"]["nsp"][name] = test_result["ok"]
|
|
||||||
elif group_id == "app":
|
|
||||||
summary["appservice"]["app"][name] = test_result["ok"]
|
|
||||||
elif group_id in test_mappings["federation_apis"]:
|
|
||||||
group = summary["federation"].get(group_id, {})
|
|
||||||
group[name] = test_result["ok"]
|
|
||||||
summary["federation"][group_id] = group
|
|
||||||
elif group_id in test_mappings["client_apis"]:
|
|
||||||
group = summary["client"].get(group_id, {})
|
|
||||||
group[name] = test_result["ok"]
|
|
||||||
summary["client"][group_id] = group
|
|
||||||
|
|
||||||
print("Are We Synapse Yet?")
|
|
||||||
print("===================")
|
|
||||||
print("")
|
|
||||||
print_stats("Non-Spec APIs", summary["nonspec"], test_mappings, verbose)
|
|
||||||
print_stats("Client-Server APIs", summary["client"], test_mappings["client_apis"], verbose)
|
|
||||||
print_stats("Federation APIs", summary["federation"], test_mappings["federation_apis"], verbose)
|
|
||||||
print_stats("Application Services APIs", summary["appservice"], test_mappings, verbose)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
parser = argparse.ArgumentParser()
|
|
||||||
parser.add_argument("tap_file", help="path to results.tap")
|
|
||||||
parser.add_argument("-v", action="store_true", help="show individual test names in output")
|
|
||||||
args = parser.parse_args()
|
|
||||||
main(args.tap_file, args.v)
|
|
||||||
|
|
@ -1,105 +0,0 @@
|
||||||
#! /bin/bash
|
|
||||||
#
|
|
||||||
# Parses a results.tap file from SyTest output and a file containing test names (a test whitelist)
|
|
||||||
# and checks whether a test name that exists in the whitelist (that should pass), failed or not.
|
|
||||||
#
|
|
||||||
# An optional blacklist file can be added, also containing test names, where if a test name is
|
|
||||||
# present, the script will not error even if the test is in the whitelist file and failed
|
|
||||||
#
|
|
||||||
# For each of these files, lines starting with '#' are ignored.
|
|
||||||
#
|
|
||||||
# Usage ./show-expected-fail-tests.sh results.tap whitelist [blacklist]
|
|
||||||
|
|
||||||
results_file=$1
|
|
||||||
whitelist_file=$2
|
|
||||||
blacklist_file=$3
|
|
||||||
|
|
||||||
fail_build=0
|
|
||||||
|
|
||||||
if [ $# -lt 2 ]; then
|
|
||||||
echo "Usage: $0 results.tap whitelist [blacklist]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f "$results_file" ]; then
|
|
||||||
echo "ERROR: Specified results file '${results_file}' doesn't exist."
|
|
||||||
fail_build=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f "$whitelist_file" ]; then
|
|
||||||
echo "ERROR: Specified test whitelist '${whitelist_file}' doesn't exist."
|
|
||||||
fail_build=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
blacklisted_tests=()
|
|
||||||
|
|
||||||
# Check if a blacklist file was provided
|
|
||||||
if [ $# -eq 3 ]; then
|
|
||||||
# Read test blacklist file
|
|
||||||
if [ ! -f "$blacklist_file" ]; then
|
|
||||||
echo "ERROR: Specified test blacklist file '${blacklist_file}' doesn't exist."
|
|
||||||
fail_build=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Read each line, ignoring those that start with '#'
|
|
||||||
blacklisted_tests=""
|
|
||||||
search_non_comments=$(grep -v '^#' ${blacklist_file})
|
|
||||||
while read -r line ; do
|
|
||||||
# Record the blacklisted test name
|
|
||||||
blacklisted_tests+=("${line}")
|
|
||||||
done <<< "${search_non_comments}" # This allows us to edit blacklisted_tests in the while loop
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ "$fail_build" = 0 ] || exit 1
|
|
||||||
|
|
||||||
passed_but_expected_fail=$(grep ' # TODO passed but expected fail' ${results_file} | sed -E 's/^ok [0-9]+ (\(expected fail\) )?//' | sed -E 's/( \([0-9]+ subtests\))? # TODO passed but expected fail$//')
|
|
||||||
tests_to_add=""
|
|
||||||
already_in_whitelist=""
|
|
||||||
|
|
||||||
while read -r test_name; do
|
|
||||||
# Ignore empty lines
|
|
||||||
[ "${test_name}" = "" ] && continue
|
|
||||||
|
|
||||||
grep "^${test_name}" "${whitelist_file}" > /dev/null 2>&1
|
|
||||||
if [ "$?" != "0" ]; then
|
|
||||||
# Check if this test name is blacklisted
|
|
||||||
if printf '%s\n' "${blacklisted_tests[@]}" | grep -q -P "^${test_name}$"; then
|
|
||||||
# Don't notify about this test
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Append this test_name to the existing list
|
|
||||||
tests_to_add="${tests_to_add}${test_name}\n"
|
|
||||||
fail_build=1
|
|
||||||
else
|
|
||||||
already_in_whitelist="${already_in_whitelist}${test_name}\n"
|
|
||||||
fi
|
|
||||||
done <<< "${passed_but_expected_fail}"
|
|
||||||
|
|
||||||
# TODO: Check that the same test doesn't exist in both the whitelist and blacklist
|
|
||||||
# TODO: Check that the same test doesn't appear twice in the whitelist|blacklist
|
|
||||||
|
|
||||||
# Trim test output strings
|
|
||||||
tests_to_add=$(IFS=$'\n' echo "${tests_to_add[*]%%'\n'}")
|
|
||||||
already_in_whitelist=$(IFS=$'\n' echo "${already_in_whitelist[*]%%'\n'}")
|
|
||||||
|
|
||||||
# Format output with markdown for buildkite annotation rendering purposes
|
|
||||||
if [ -n "${tests_to_add}" ] && [ -n "${already_in_whitelist}" ]; then
|
|
||||||
echo "### 📜 SyTest Whitelist Maintenance"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${tests_to_add}" ]; then
|
|
||||||
echo "**ERROR**: The following tests passed but are not present in \`$2\`. Please append them to the file:"
|
|
||||||
echo "\`\`\`"
|
|
||||||
echo -e "${tests_to_add}"
|
|
||||||
echo "\`\`\`"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "${already_in_whitelist}" ]; then
|
|
||||||
echo "**WARN**: Tests in the whitelist still marked as **expected fail**:"
|
|
||||||
echo "\`\`\`"
|
|
||||||
echo -e "${already_in_whitelist}"
|
|
||||||
echo "\`\`\`"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exit ${fail_build}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
# This test checks for a room-alias key in the response which is not in the spec, we must add it back in whitelist when https://github.com/matrix-org/sytest/pull/880 is merged
|
|
||||||
POST /createRoom makes a public room
|
|
||||||
# These fails because they use a endpoint which is not in the spec, we must add them back in whitelist when https://github.com/matrix-org/sytest/issues/878 is closed
|
|
||||||
POST /createRoom makes a room with a name
|
|
||||||
POST /createRoom makes a room with a topic
|
|
||||||
Can /sync newly created room
|
|
||||||
POST /createRoom ignores attempts to set the room version via creation_content
|
|
||||||
|
|
@ -1,516 +0,0 @@
|
||||||
/event/ does not allow access to events before the user joined
|
|
||||||
/event/ on joined room works
|
|
||||||
/event/ on non world readable room does not work
|
|
||||||
/joined_members return joined members
|
|
||||||
/joined_rooms returns only joined rooms
|
|
||||||
/whois
|
|
||||||
3pid invite join valid signature but revoked keys are rejected
|
|
||||||
3pid invite join valid signature but unreachable ID server are rejected
|
|
||||||
3pid invite join with wrong but valid signature are rejected
|
|
||||||
A change to displayname should appear in incremental /sync
|
|
||||||
A full_state incremental update returns all state
|
|
||||||
A full_state incremental update returns only recent timeline
|
|
||||||
A message sent after an initial sync appears in the timeline of an incremental sync.
|
|
||||||
A next_batch token can be used in the v1 messages API
|
|
||||||
A pair of events which redact each other should be ignored
|
|
||||||
A pair of servers can establish a join in a v2 room
|
|
||||||
A prev_batch token can be used in the v1 messages API
|
|
||||||
AS can create a user
|
|
||||||
AS can create a user with an underscore
|
|
||||||
AS can create a user with inhibit_login
|
|
||||||
AS can set avatar for ghosted users
|
|
||||||
AS can set displayname for ghosted users
|
|
||||||
AS can't set displayname for random users
|
|
||||||
AS cannot create users outside its own namespace
|
|
||||||
AS user (not ghost) can join room without registering
|
|
||||||
AS user (not ghost) can join room without registering, with user_id query param
|
|
||||||
After changing password, a different session no longer works by default
|
|
||||||
After changing password, can log in with new password
|
|
||||||
After changing password, can't log in with old password
|
|
||||||
After changing password, different sessions can optionally be kept
|
|
||||||
After changing password, existing session still works
|
|
||||||
After deactivating account, can't log in with an email
|
|
||||||
After deactivating account, can't log in with password
|
|
||||||
Alias creators can delete alias with no ops
|
|
||||||
Alias creators can delete canonical alias with no ops
|
|
||||||
Alternative server names do not cause a routing loop
|
|
||||||
An event which redacts an event in a different room should be ignored
|
|
||||||
An event which redacts itself should be ignored
|
|
||||||
Asking for a remote rooms list, but supplying the local server's name, returns the local rooms list
|
|
||||||
Backfill checks the events requested belong to the room
|
|
||||||
Backfill works correctly with history visibility set to joined
|
|
||||||
Backfilled events whose prev_events are in a different room do not allow cross-room back-pagination
|
|
||||||
Banned servers cannot /event_auth
|
|
||||||
Banned servers cannot /invite
|
|
||||||
Banned servers cannot /make_join
|
|
||||||
Banned servers cannot /make_leave
|
|
||||||
Banned servers cannot /send_join
|
|
||||||
Banned servers cannot /send_leave
|
|
||||||
Banned servers cannot backfill
|
|
||||||
Banned servers cannot get missing events
|
|
||||||
Banned servers cannot get room state
|
|
||||||
Banned servers cannot get room state ids
|
|
||||||
Banned servers cannot send events
|
|
||||||
Banned user is kicked and may not rejoin until unbanned
|
|
||||||
Both GET and PUT work
|
|
||||||
Can /sync newly created room
|
|
||||||
Can add account data
|
|
||||||
Can add account data to room
|
|
||||||
Can add tag
|
|
||||||
Can claim one time key using POST
|
|
||||||
Can claim remote one time key using POST
|
|
||||||
Can create filter
|
|
||||||
Can deactivate account
|
|
||||||
Can delete canonical alias
|
|
||||||
Can download file 'ascii'
|
|
||||||
Can download file 'name with spaces'
|
|
||||||
Can download file 'name;with;semicolons'
|
|
||||||
Can download filter
|
|
||||||
Can download specifying a different ASCII file name
|
|
||||||
Can download specifying a different Unicode file name
|
|
||||||
Can download with Unicode file name locally
|
|
||||||
Can download with Unicode file name over federation
|
|
||||||
Can download without a file name locally
|
|
||||||
Can download without a file name over federation
|
|
||||||
Can forget room you've been kicked from
|
|
||||||
Can get 'm.room.name' state for a departed room (SPEC-216)
|
|
||||||
Can get account data without syncing
|
|
||||||
Can get remote public room list
|
|
||||||
Can get room account data without syncing
|
|
||||||
Can get rooms/{roomId}/members
|
|
||||||
Can get rooms/{roomId}/members for a departed room (SPEC-216)
|
|
||||||
Can get rooms/{roomId}/state for a departed room (SPEC-216)
|
|
||||||
Can invite users to invite-only rooms
|
|
||||||
Can list tags for a room
|
|
||||||
Can logout all devices
|
|
||||||
Can logout current device
|
|
||||||
Can paginate public room list
|
|
||||||
Can pass a JSON filter as a query parameter
|
|
||||||
Can query device keys using POST
|
|
||||||
Can query remote device keys using POST
|
|
||||||
Can query specific device keys using POST
|
|
||||||
Can re-join room if re-invited
|
|
||||||
Can read configuration endpoint
|
|
||||||
Can receive redactions from regular users over federation in room version 1
|
|
||||||
Can receive redactions from regular users over federation in room version 2
|
|
||||||
Can receive redactions from regular users over federation in room version 3
|
|
||||||
Can receive redactions from regular users over federation in room version 4
|
|
||||||
Can receive redactions from regular users over federation in room version 5
|
|
||||||
Can receive redactions from regular users over federation in room version 6
|
|
||||||
Can recv a device message using /sync
|
|
||||||
Can recv a device message using /sync
|
|
||||||
Can recv device messages over federation
|
|
||||||
Can recv device messages until they are acknowledged
|
|
||||||
Can recv device messages until they are acknowledged
|
|
||||||
Can reject invites over federation for rooms with version 1
|
|
||||||
Can reject invites over federation for rooms with version 2
|
|
||||||
Can reject invites over federation for rooms with version 3
|
|
||||||
Can reject invites over federation for rooms with version 4
|
|
||||||
Can reject invites over federation for rooms with version 5
|
|
||||||
Can reject invites over federation for rooms with version 6
|
|
||||||
Can remove tag
|
|
||||||
Can search public room list
|
|
||||||
Can send a message directly to a device using PUT /sendToDevice
|
|
||||||
Can send a message directly to a device using PUT /sendToDevice
|
|
||||||
Can send a to-device message to two users which both receive it using /sync
|
|
||||||
Can send image in room message
|
|
||||||
Can send messages with a wildcard device id
|
|
||||||
Can send messages with a wildcard device id
|
|
||||||
Can send messages with a wildcard device id to two devices
|
|
||||||
Can send messages with a wildcard device id to two devices
|
|
||||||
Can sync
|
|
||||||
Can sync a joined room
|
|
||||||
Can sync a room with a message with a transaction id
|
|
||||||
Can sync a room with a single message
|
|
||||||
Can upload device keys
|
|
||||||
Can upload with ASCII file name
|
|
||||||
Can upload with Unicode file name
|
|
||||||
Can upload without a file name
|
|
||||||
Can't deactivate account with wrong password
|
|
||||||
Can't forget room you're still in
|
|
||||||
Changes to state are included in an gapped incremental sync
|
|
||||||
Changes to state are included in an incremental sync
|
|
||||||
Changing the actions of an unknown default rule fails with 404
|
|
||||||
Changing the actions of an unknown rule fails with 404
|
|
||||||
Checking local federation server
|
|
||||||
Creators can delete alias
|
|
||||||
Current state appears in timeline in private history
|
|
||||||
Current state appears in timeline in private history with many messages before
|
|
||||||
DELETE /device/{deviceId}
|
|
||||||
DELETE /device/{deviceId} requires UI auth user to match device owner
|
|
||||||
DELETE /device/{deviceId} with no body gives a 401
|
|
||||||
Deleted tags appear in an incremental v2 /sync
|
|
||||||
Deleting a non-existent alias should return a 404
|
|
||||||
Device list doesn't change if remote server is down
|
|
||||||
Device messages over federation wake up /sync
|
|
||||||
Device messages wake up /sync
|
|
||||||
Device messages wake up /sync
|
|
||||||
Device messages with the same txn_id are deduplicated
|
|
||||||
Device messages with the same txn_id are deduplicated
|
|
||||||
Enabling an unknown default rule fails with 404
|
|
||||||
Event size limits
|
|
||||||
Event with an invalid signature in the send_join response should not cause room join to fail
|
|
||||||
Events come down the correct room
|
|
||||||
Events whose auth_events are in the wrong room do not mess up the room state
|
|
||||||
Existing members see new members' join events
|
|
||||||
Federation key API allows unsigned requests for keys
|
|
||||||
Federation key API can act as a notary server via a GET request
|
|
||||||
Federation key API can act as a notary server via a POST request
|
|
||||||
Federation rejects inbound events where the prev_events cannot be found
|
|
||||||
Fetching eventstream a second time doesn't yield the message again
|
|
||||||
Forgetting room does not show up in v2 /sync
|
|
||||||
Full state sync includes joined rooms
|
|
||||||
GET /capabilities is present and well formed for registered user
|
|
||||||
GET /device/{deviceId}
|
|
||||||
GET /device/{deviceId} gives a 404 for unknown devices
|
|
||||||
GET /devices
|
|
||||||
GET /directory/room/:room_alias yields room ID
|
|
||||||
GET /events initially
|
|
||||||
GET /events with negative 'limit'
|
|
||||||
GET /events with non-numeric 'limit'
|
|
||||||
GET /events with non-numeric 'timeout'
|
|
||||||
GET /initialSync initially
|
|
||||||
GET /joined_rooms lists newly-created room
|
|
||||||
GET /login yields a set of flows
|
|
||||||
GET /media/r0/download can fetch the value again
|
|
||||||
GET /profile/:user_id/avatar_url publicly accessible
|
|
||||||
GET /profile/:user_id/displayname publicly accessible
|
|
||||||
GET /publicRooms includes avatar URLs
|
|
||||||
GET /publicRooms lists newly-created room
|
|
||||||
GET /publicRooms lists rooms
|
|
||||||
GET /r0/capabilities is not public
|
|
||||||
GET /register yields a set of flows
|
|
||||||
GET /rooms/:room_id/joined_members fetches my membership
|
|
||||||
GET /rooms/:room_id/messages returns a message
|
|
||||||
GET /rooms/:room_id/state fetches entire room state
|
|
||||||
GET /rooms/:room_id/state/m.room.member/:user_id fetches my membership
|
|
||||||
GET /rooms/:room_id/state/m.room.member/:user_id?format=event fetches my membership event
|
|
||||||
GET /rooms/:room_id/state/m.room.name gets name
|
|
||||||
GET /rooms/:room_id/state/m.room.power_levels can fetch levels
|
|
||||||
GET /rooms/:room_id/state/m.room.power_levels fetches powerlevels
|
|
||||||
GET /rooms/:room_id/state/m.room.topic gets topic
|
|
||||||
Get left notifs for other users in sync and /keys/changes when user leaves
|
|
||||||
Getting messages going forward is limited for a departed room (SPEC-216)
|
|
||||||
Getting push rules doesn't corrupt the cache SYN-390
|
|
||||||
Getting state IDs checks the events requested belong to the room
|
|
||||||
Getting state checks the events requested belong to the room
|
|
||||||
Ghost user must register before joining room
|
|
||||||
Guest non-joined user cannot call /events on default room
|
|
||||||
Guest non-joined user cannot call /events on invited room
|
|
||||||
Guest non-joined user cannot call /events on joined room
|
|
||||||
Guest non-joined user cannot call /events on shared room
|
|
||||||
Guest non-joined users can get individual state for world_readable rooms
|
|
||||||
Guest non-joined users can get individual state for world_readable rooms after leaving
|
|
||||||
Guest non-joined users can get state for world_readable rooms
|
|
||||||
Guest non-joined users cannot room initalSync for non-world_readable rooms
|
|
||||||
Guest non-joined users cannot send messages to guest_access rooms if not joined
|
|
||||||
Guest user can set display names
|
|
||||||
Guest user cannot call /events globally
|
|
||||||
Guest user cannot upgrade other users
|
|
||||||
Guest users can accept invites to private rooms over federation
|
|
||||||
Guest users can join guest_access rooms
|
|
||||||
Guest users can send messages to guest_access rooms if joined
|
|
||||||
If a device list update goes missing, the server resyncs on the next one
|
|
||||||
If remote user leaves room we no longer receive device updates
|
|
||||||
If remote user leaves room, changes device and rejoins we see update in /keys/changes
|
|
||||||
If remote user leaves room, changes device and rejoins we see update in sync
|
|
||||||
Inbound /make_join rejects attempts to join rooms where all users have left
|
|
||||||
Inbound /v1/make_join rejects remote attempts to join local users to rooms
|
|
||||||
Inbound /v1/send_join rejects incorrectly-signed joins
|
|
||||||
Inbound /v1/send_join rejects joins from other servers
|
|
||||||
Inbound /v1/send_leave rejects leaves from other servers
|
|
||||||
Inbound federation accepts a second soft-failed event
|
|
||||||
Inbound federation accepts attempts to join v2 rooms from servers with support
|
|
||||||
Inbound federation can backfill events
|
|
||||||
Inbound federation can get public room list
|
|
||||||
Inbound federation can get state for a room
|
|
||||||
Inbound federation can get state_ids for a room
|
|
||||||
Inbound federation can query profile data
|
|
||||||
Inbound federation can query room alias directory
|
|
||||||
Inbound federation can receive events
|
|
||||||
Inbound federation can receive invites via v1 API
|
|
||||||
Inbound federation can receive invites via v2 API
|
|
||||||
Inbound federation can receive redacted events
|
|
||||||
Inbound federation can receive v1 /send_join
|
|
||||||
Inbound federation can receive v2 /send_join
|
|
||||||
Inbound federation can return events
|
|
||||||
Inbound federation can return missing events for invite visibility
|
|
||||||
Inbound federation can return missing events for world_readable visibility
|
|
||||||
Inbound federation correctly soft fails events
|
|
||||||
Inbound federation of state requires event_id as a mandatory paramater
|
|
||||||
Inbound federation of state_ids requires event_id as a mandatory paramater
|
|
||||||
Inbound federation rejects attempts to join v1 rooms from servers without v1 support
|
|
||||||
Inbound federation rejects attempts to join v2 rooms from servers lacking version support
|
|
||||||
Inbound federation rejects attempts to join v2 rooms from servers only supporting v1
|
|
||||||
Inbound federation rejects invite rejections which include invalid JSON for room version 6
|
|
||||||
Inbound federation rejects invites which include invalid JSON for room version 6
|
|
||||||
Inbound federation rejects receipts from wrong remote
|
|
||||||
Inbound federation rejects remote attempts to join local users to rooms
|
|
||||||
Inbound federation rejects remote attempts to kick local users to rooms
|
|
||||||
Inbound federation rejects typing notifications from wrong remote
|
|
||||||
Inbound: send_join rejects invalid JSON for room version 6
|
|
||||||
Invalid JSON floats
|
|
||||||
Invalid JSON integers
|
|
||||||
Invalid JSON special values
|
|
||||||
Invited user can reject invite
|
|
||||||
Invited user can reject invite over federation
|
|
||||||
Invited user can reject invite over federation for empty room
|
|
||||||
Invited user can reject invite over federation several times
|
|
||||||
Invited user can see room metadata
|
|
||||||
Inviting an AS-hosted user asks the AS server
|
|
||||||
Lazy loading parameters in the filter are strictly boolean
|
|
||||||
Left rooms appear in the leave section of full state sync
|
|
||||||
Local delete device changes appear in v2 /sync
|
|
||||||
Local device key changes appear in /keys/changes
|
|
||||||
Local device key changes appear in v2 /sync
|
|
||||||
Local device key changes get to remote servers
|
|
||||||
Local new device changes appear in v2 /sync
|
|
||||||
Local non-members don't see posted message events
|
|
||||||
Local room members can get room messages
|
|
||||||
Local room members see posted message events
|
|
||||||
Local update device changes appear in v2 /sync
|
|
||||||
Local users can peek by room alias
|
|
||||||
Local users can peek into world_readable rooms by room ID
|
|
||||||
Message history can be paginated
|
|
||||||
Message history can be paginated over federation
|
|
||||||
Name/topic keys are correct
|
|
||||||
New account data appears in incremental v2 /sync
|
|
||||||
New read receipts appear in incremental v2 /sync
|
|
||||||
New room members see their own join event
|
|
||||||
New users appear in /keys/changes
|
|
||||||
Newly banned rooms appear in the leave section of incremental sync
|
|
||||||
Newly joined room is included in an incremental sync
|
|
||||||
Newly joined room is included in an incremental sync after invite
|
|
||||||
Newly left rooms appear in the leave section of gapped sync
|
|
||||||
Newly left rooms appear in the leave section of incremental sync
|
|
||||||
Newly updated tags appear in an incremental v2 /sync
|
|
||||||
Non-numeric ports in server names are rejected
|
|
||||||
Outbound federation can backfill events
|
|
||||||
Outbound federation can query profile data
|
|
||||||
Outbound federation can query room alias directory
|
|
||||||
Outbound federation can query v1 /send_join
|
|
||||||
Outbound federation can query v2 /send_join
|
|
||||||
Outbound federation can request missing events
|
|
||||||
Outbound federation can send events
|
|
||||||
Outbound federation can send invites via v1 API
|
|
||||||
Outbound federation can send invites via v2 API
|
|
||||||
Outbound federation can send room-join requests
|
|
||||||
Outbound federation correctly handles unsupported room versions
|
|
||||||
Outbound federation passes make_join failures through to the client
|
|
||||||
Outbound federation rejects backfill containing invalid JSON for events in room version 6
|
|
||||||
Outbound federation rejects m.room.create events with an unknown room version
|
|
||||||
Outbound federation rejects send_join responses with no m.room.create event
|
|
||||||
Outbound federation sends receipts
|
|
||||||
Outbound federation will ignore a missing event with bad JSON for room version 6
|
|
||||||
POST /createRoom creates a room with the given version
|
|
||||||
POST /createRoom ignores attempts to set the room version via creation_content
|
|
||||||
POST /createRoom makes a private room
|
|
||||||
POST /createRoom makes a private room with invites
|
|
||||||
POST /createRoom makes a public room
|
|
||||||
POST /createRoom makes a room with a name
|
|
||||||
POST /createRoom makes a room with a topic
|
|
||||||
POST /createRoom rejects attempts to create rooms with numeric versions
|
|
||||||
POST /createRoom rejects attempts to create rooms with unknown versions
|
|
||||||
POST /createRoom with creation content
|
|
||||||
POST /join/:room_alias can join a room
|
|
||||||
POST /join/:room_alias can join a room with custom content
|
|
||||||
POST /join/:room_id can join a room
|
|
||||||
POST /join/:room_id can join a room with custom content
|
|
||||||
POST /login as non-existing user is rejected
|
|
||||||
POST /login can log in as a user
|
|
||||||
POST /login can log in as a user with just the local part of the id
|
|
||||||
POST /login returns the same device_id as that in the request
|
|
||||||
POST /login wrong password is rejected
|
|
||||||
POST /media/r0/upload can create an upload
|
|
||||||
POST /redact disallows redaction of event in different room
|
|
||||||
POST /register allows registration of usernames with '-'
|
|
||||||
POST /register allows registration of usernames with '.'
|
|
||||||
POST /register allows registration of usernames with '/'
|
|
||||||
POST /register allows registration of usernames with '3'
|
|
||||||
POST /register allows registration of usernames with '='
|
|
||||||
POST /register allows registration of usernames with '_'
|
|
||||||
POST /register allows registration of usernames with 'q'
|
|
||||||
POST /register can create a user
|
|
||||||
POST /register downcases capitals in usernames
|
|
||||||
POST /register rejects registration of usernames with '!'
|
|
||||||
POST /register rejects registration of usernames with '"'
|
|
||||||
POST /register rejects registration of usernames with '''
|
|
||||||
POST /register rejects registration of usernames with ':'
|
|
||||||
POST /register rejects registration of usernames with '?'
|
|
||||||
POST /register rejects registration of usernames with '@'
|
|
||||||
POST /register rejects registration of usernames with '['
|
|
||||||
POST /register rejects registration of usernames with '\'
|
|
||||||
POST /register rejects registration of usernames with '\n'
|
|
||||||
POST /register rejects registration of usernames with ']'
|
|
||||||
POST /register rejects registration of usernames with '{'
|
|
||||||
POST /register rejects registration of usernames with '|'
|
|
||||||
POST /register rejects registration of usernames with '}'
|
|
||||||
POST /register rejects registration of usernames with '£'
|
|
||||||
POST /register rejects registration of usernames with 'é'
|
|
||||||
POST /register returns the same device_id as that in the request
|
|
||||||
POST /rooms/:room_id/ban can ban a user
|
|
||||||
POST /rooms/:room_id/invite can send an invite
|
|
||||||
POST /rooms/:room_id/join can join a room
|
|
||||||
POST /rooms/:room_id/leave can leave a room
|
|
||||||
POST /rooms/:room_id/read_markers can create read marker
|
|
||||||
POST /rooms/:room_id/receipt can create receipts
|
|
||||||
POST /rooms/:room_id/redact/:event_id as original message sender redacts message
|
|
||||||
POST /rooms/:room_id/redact/:event_id as power user redacts message
|
|
||||||
POST /rooms/:room_id/redact/:event_id as random user does not redact message
|
|
||||||
POST /rooms/:room_id/send/:event_type sends a message
|
|
||||||
POST /rooms/:room_id/state/m.room.name sets name
|
|
||||||
POST /rooms/:room_id/state/m.room.topic sets topic
|
|
||||||
POST /rooms/:room_id/upgrade can upgrade a room version
|
|
||||||
POST rejects invalid utf-8 in JSON
|
|
||||||
POSTed media can be thumbnailed
|
|
||||||
PUT /device/{deviceId} gives a 404 for unknown devices
|
|
||||||
PUT /device/{deviceId} updates device fields
|
|
||||||
PUT /directory/room/:room_alias creates alias
|
|
||||||
PUT /profile/:user_id/avatar_url sets my avatar
|
|
||||||
PUT /profile/:user_id/displayname sets my name
|
|
||||||
PUT /rooms/:room_id/send/:event_type/:txn_id deduplicates the same txn id
|
|
||||||
PUT /rooms/:room_id/send/:event_type/:txn_id sends a message
|
|
||||||
PUT /rooms/:room_id/state/m.room.power_levels can set levels
|
|
||||||
PUT /rooms/:room_id/typing/:user_id sets typing notification
|
|
||||||
PUT power_levels should not explode if the old power levels were empty
|
|
||||||
Peeked rooms only turn up in the sync for the device who peeked them
|
|
||||||
Previously left rooms don't appear in the leave section of sync
|
|
||||||
Push rules come down in an initial /sync
|
|
||||||
Read markers appear in incremental v2 /sync
|
|
||||||
Read markers appear in initial v2 /sync
|
|
||||||
Read markers can be updated
|
|
||||||
Read receipts appear in initial v2 /sync
|
|
||||||
Real non-joined user cannot call /events on default room
|
|
||||||
Real non-joined user cannot call /events on invited room
|
|
||||||
Real non-joined user cannot call /events on joined room
|
|
||||||
Real non-joined user cannot call /events on shared room
|
|
||||||
Real non-joined users can get individual state for world_readable rooms
|
|
||||||
Real non-joined users can get individual state for world_readable rooms after leaving
|
|
||||||
Real non-joined users can get state for world_readable rooms
|
|
||||||
Real non-joined users cannot room initalSync for non-world_readable rooms
|
|
||||||
Real non-joined users cannot send messages to guest_access rooms if not joined
|
|
||||||
Receipts must be m.read
|
|
||||||
Redaction of a redaction redacts the redaction reason
|
|
||||||
Regular users can add and delete aliases in the default room configuration
|
|
||||||
Regular users can add and delete aliases when m.room.aliases is restricted
|
|
||||||
Regular users cannot create room aliases within the AS namespace
|
|
||||||
Regular users cannot register within the AS namespace
|
|
||||||
Remote media can be thumbnailed
|
|
||||||
Remote room alias queries can handle Unicode
|
|
||||||
Remote room members also see posted message events
|
|
||||||
Remote room members can get room messages
|
|
||||||
Remote user can backfill in a room with version 1
|
|
||||||
Remote user can backfill in a room with version 2
|
|
||||||
Remote user can backfill in a room with version 3
|
|
||||||
Remote user can backfill in a room with version 4
|
|
||||||
Remote user can backfill in a room with version 5
|
|
||||||
Remote user can backfill in a room with version 6
|
|
||||||
Remote users can join room by alias
|
|
||||||
Remote users may not join unfederated rooms
|
|
||||||
Request to logout with invalid an access token is rejected
|
|
||||||
Request to logout without an access token is rejected
|
|
||||||
Room aliases can contain Unicode
|
|
||||||
Room creation reports m.room.create to myself
|
|
||||||
Room creation reports m.room.member to myself
|
|
||||||
Room members can join a room with an overridden displayname
|
|
||||||
Room members can override their displayname on a room-specific basis
|
|
||||||
Room state at a rejected message event is the same as its predecessor
|
|
||||||
Room state at a rejected state event is the same as its predecessor
|
|
||||||
Rooms a user is invited to appear in an incremental sync
|
|
||||||
Rooms a user is invited to appear in an initial sync
|
|
||||||
Rooms can be created with an initial invite list (SYN-205)
|
|
||||||
Server correctly handles incoming m.device_list_update
|
|
||||||
Server correctly handles transactions that break edu limits
|
|
||||||
Server correctly resyncs when client query keys and there is no remote cache
|
|
||||||
Server correctly resyncs when server leaves and rejoins a room
|
|
||||||
Server rejects invalid JSON in a version 6 room
|
|
||||||
Setting room topic reports m.room.topic to myself
|
|
||||||
Should not be able to take over the room by pretending there is no PL event
|
|
||||||
Should reject keys claiming to belong to a different user
|
|
||||||
State from remote users is included in the state in the initial sync
|
|
||||||
State from remote users is included in the timeline in an incremental sync
|
|
||||||
State is included in the timeline in the initial sync
|
|
||||||
Sync can be polled for updates
|
|
||||||
Sync is woken up for leaves
|
|
||||||
Syncing a new room with a large timeline limit isn't limited
|
|
||||||
Tags appear in an initial v2 /sync
|
|
||||||
Trying to get push rules with unknown rule_id fails with 404
|
|
||||||
Typing can be explicitly stopped
|
|
||||||
Typing events appear in gapped sync
|
|
||||||
Typing events appear in incremental sync
|
|
||||||
Typing events appear in initial sync
|
|
||||||
Typing notification sent to local room members
|
|
||||||
Typing notifications also sent to remote room members
|
|
||||||
Typing notifications don't leak
|
|
||||||
Uninvited users cannot join the room
|
|
||||||
Unprivileged users can set m.room.topic if it only needs level 0
|
|
||||||
User appears in user directory
|
|
||||||
User in private room doesn't appear in user directory
|
|
||||||
User joining then leaving public room appears and dissappears from directory
|
|
||||||
User in shared private room does appear in user directory until leave
|
|
||||||
User can create and send/receive messages in a room with version 1
|
|
||||||
User can create and send/receive messages in a room with version 2
|
|
||||||
User can create and send/receive messages in a room with version 3
|
|
||||||
User can create and send/receive messages in a room with version 4
|
|
||||||
User can create and send/receive messages in a room with version 5
|
|
||||||
User can create and send/receive messages in a room with version 6
|
|
||||||
User can invite local user to room with version 1
|
|
||||||
User can invite local user to room with version 2
|
|
||||||
User can invite local user to room with version 3
|
|
||||||
User can invite local user to room with version 4
|
|
||||||
User can invite local user to room with version 5
|
|
||||||
User can invite local user to room with version 6
|
|
||||||
User can invite remote user to room with version 1
|
|
||||||
User can invite remote user to room with version 2
|
|
||||||
User can invite remote user to room with version 3
|
|
||||||
User can invite remote user to room with version 4
|
|
||||||
User can invite remote user to room with version 5
|
|
||||||
User can invite remote user to room with version 6
|
|
||||||
User directory correctly update on display name change
|
|
||||||
User in dir while user still shares private rooms
|
|
||||||
User in shared private room does appear in user directory
|
|
||||||
User is offline if they set_presence=offline in their sync
|
|
||||||
User signups are forbidden from starting with '_'
|
|
||||||
Users can't delete other's aliases
|
|
||||||
Users cannot invite a user that is already in the room
|
|
||||||
Users cannot invite themselves to a room
|
|
||||||
Users cannot kick users from a room they are not in
|
|
||||||
Users cannot kick users who have already left a room
|
|
||||||
Users cannot set ban powerlevel higher than their own
|
|
||||||
Users cannot set kick powerlevel higher than their own
|
|
||||||
Users cannot set notifications powerlevel higher than their own
|
|
||||||
Users cannot set redact powerlevel higher than their own
|
|
||||||
Users receive device_list updates for their own devices
|
|
||||||
Users with sufficient power-level can delete other's aliases
|
|
||||||
Version responds 200 OK with valid structure
|
|
||||||
We can't peek into rooms with invited history_visibility
|
|
||||||
We can't peek into rooms with joined history_visibility
|
|
||||||
We can't peek into rooms with shared history_visibility
|
|
||||||
We don't send redundant membership state across incremental syncs by default
|
|
||||||
We should see our own leave event when rejecting an invite, even if history_visibility is restricted (riot-web/3462)
|
|
||||||
We should see our own leave event, even if history_visibility is restricted (SYN-662)
|
|
||||||
Wildcard device messages over federation wake up /sync
|
|
||||||
Wildcard device messages wake up /sync
|
|
||||||
Wildcard device messages wake up /sync
|
|
||||||
avatar_url updates affect room member events
|
|
||||||
displayname updates affect room member events
|
|
||||||
local user can join room with version 1
|
|
||||||
local user can join room with version 2
|
|
||||||
local user can join room with version 3
|
|
||||||
local user can join room with version 4
|
|
||||||
local user can join room with version 5
|
|
||||||
local user can join room with version 6
|
|
||||||
m.room.history_visibility == "joined" allows/forbids appropriately for Guest users
|
|
||||||
m.room.history_visibility == "joined" allows/forbids appropriately for Real users
|
|
||||||
m.room.history_visibility == "world_readable" allows/forbids appropriately for Guest users
|
|
||||||
m.room.history_visibility == "world_readable" allows/forbids appropriately for Real users
|
|
||||||
query for user with no keys returns empty key dict
|
|
||||||
remote user can join room with version 1
|
|
||||||
remote user can join room with version 2
|
|
||||||
remote user can join room with version 3
|
|
||||||
remote user can join room with version 4
|
|
||||||
remote user can join room with version 5
|
|
||||||
remote user can join room with version 6
|
|
||||||
setting 'm.room.name' respects room powerlevel
|
|
||||||
setting 'm.room.power_levels' respects room powerlevel
|
|
||||||
Federation publicRoom Name/topic keys are correct
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
||||||
[global]
|
|
||||||
|
|
||||||
# Server runs in same container as tests do, so localhost is fine
|
|
||||||
server_name = "localhost"
|
|
||||||
|
|
||||||
# With a bit of luck /tmp is a RAM disk, so that the file system does not become the bottleneck while testing
|
|
||||||
database_path = "/tmp"
|
|
||||||
|
|
||||||
# All the other settings are left at their defaults:
|
|
||||||
port = 6167
|
|
||||||
max_request_size = 20_000_000
|
|
||||||
allow_registration = true
|
|
||||||
trusted_servers = ["matrix.org"]
|
|
||||||
address = "127.0.0.1"
|
|
||||||
proxy = "none"
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue