use lib.makeScope and files to organize packages

Some of the improvements here include:

* rocksdb can actually use jemalloc now instead of just pulling in a
  second rocksdb for no reason
* "complement-runtime" factored back out into shell file
* complement image no longer uses `mkDerivation` for `copyToRoot`
  because that's what `buildEnv` is for
* complement image no longer sets `SERVER_NAME`, complement already does
  that
* all packages were factored out into `callPackage`-able files for use
  with a custom `lib.makeScope pkgs.newScope`
* new version of `mkPackage` has options that are easier to use and
  override such as `features`
This commit is contained in:
Charles Hall 2024-04-21 15:28:35 -07:00 committed by June
parent 36774322e1
commit 63fe828120
17 changed files with 466 additions and 2681 deletions

39
bin/complement Executable file
View file

@ -0,0 +1,39 @@
#!/usr/bin/env bash
set -euo pipefail
# Path to Complement's source code
#
# The `COMPLEMENT_SRC` environment variable is set in the Nix dev shell, which
# points to a store path containing the Complement source code. It's likely you
# want to just pass that as the first argument to use it here.
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"
pushd "$(git rev-parse --show-toplevel)" > /dev/null
nix build .#complement
docker load < result
popd > /dev/null
# It's okay (likely, even) that `go test` exits nonzero
set +o pipefail
env \
-C "$COMPLEMENT_SRC" \
COMPLEMENT_BASE_IMAGE="$OCI_IMAGE" \
go test -timeout 1h -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"

View file

@ -11,3 +11,5 @@
- [NixOS](deploying/nixos.md)
- [TURN](turn.md)
- [Appservices](appservices.md)
- [Development](development.md)
- [Testing](development/testing.md)

4
docs/development.md Normal file
View file

@ -0,0 +1,4 @@
# Development
Information about developing the project. If you are only interested in using
it, you can safely ignore this section.

View file

@ -0,0 +1,17 @@
# Testing
## Complement
Have a look at [Complement's repository][complement] for an explanation of what
it is.
To test against Complement, with Nix and direnv installed and set up, you can
either:
* Run `complement "$COMPLEMENT_SRC" ./path/to/logs.jsonl ./path/to/results.jsonl`
to build a Complement image, run the tests, and output the logs and results
to the specified paths
* Run `nix build .#complement` from the root of the repository to just build a
Complement image
[complement]: https://github.com/matrix-org/complement

361
flake.nix
View file

@ -16,14 +16,6 @@
let
pkgsHost = inputs.nixpkgs.legacyPackages.${system};
rocksdb' = pkgs: (pkgs.rocksdb.overrideAttrs (old: {
version = "9.1.0";
src = inputs.rocksdb;
}));
# Nix-accessible `Cargo.toml`
cargoToml = builtins.fromTOML (builtins.readFile ./Cargo.toml);
# The Rust toolchain to use
toolchain = inputs.fenix.packages.${system}.fromToolchainFile {
file = ./rust-toolchain.toml;
@ -32,286 +24,45 @@
sha256 = "sha256-SXRtAuO4IqNOQq+nLbrsDFbVk+3aVA8NNpSZsKlVH/8=";
};
builder = pkgs:
((inputs.crane.mkLib pkgs).overrideToolchain toolchain).buildPackage;
scope = pkgs: pkgs.lib.makeScope pkgs.newScope (self: {
book = self.callPackage ./nix/pkgs/book {};
complement = self.callPackage ./nix/pkgs/complement {};
craneLib = ((inputs.crane.mkLib pkgs).overrideToolchain toolchain);
inherit inputs;
main = self.callPackage ./nix/pkgs/main {};
oci-image = self.callPackage ./nix/pkgs/oci-image {};
rocksdb = pkgs.rocksdb.overrideAttrs (old: {
src = inputs.rocksdb;
version = pkgs.lib.removePrefix
"v"
(builtins.fromJSON (builtins.readFile ./flake.lock))
.nodes.rocksdb.original.ref;
});
});
nativeBuildInputs = pkgs: let
darwin = if pkgs.stdenv.isDarwin then [ pkgs.libiconv ] else [];
in [
# bindgen needs the build platform's libclang. Apparently due to
# "splicing weirdness", pkgs.rustPlatform.bindgenHook on its own doesn't
# quite do the right thing here.
pkgs.pkgsBuildHost.rustPlatform.bindgenHook
] ++ darwin;
env = pkgs: {
CONDUIT_VERSION_EXTRA = inputs.self.shortRev or inputs.self.dirtyShortRev;
ROCKSDB_INCLUDE_DIR = "${rocksdb' pkgs}/include";
ROCKSDB_LIB_DIR = "${rocksdb' pkgs}/lib";
}
// pkgs.lib.optionalAttrs pkgs.stdenv.hostPlatform.isStatic {
ROCKSDB_STATIC = "";
}
// {
CARGO_BUILD_RUSTFLAGS = let inherit (pkgs) lib stdenv; in
lib.concatStringsSep " " ([ ]
++ lib.optionals
# This disables PIE for static builds, which isn't great in terms
# of security. Unfortunately, my hand is forced because nixpkgs'
# `libstdc++.a` is built without `-fPIE`, which precludes us from
# leaving PIE enabled.
stdenv.hostPlatform.isStatic
[ "-C" "relocation-model=static" ]
++ lib.optionals
(stdenv.buildPlatform.config != stdenv.hostPlatform.config)
[ "-l" "c" ]
++ lib.optionals
# This check has to match the one [here][0]. We only need to set
# these flags when using a different linker. Don't ask me why,
# though, because I don't know. All I know is it breaks otherwise.
#
# [0]: https://github.com/NixOS/nixpkgs/blob/5cdb38bb16c6d0a38779db14fcc766bc1b2394d6/pkgs/build-support/rust/lib/default.nix#L37-L40
(
# Nixpkgs doesn't check for x86_64 here but we do, because I
# observed a failure building statically for x86_64 without
# including it here. Linkers are weird.
(stdenv.hostPlatform.isAarch64 || stdenv.hostPlatform.isx86_64)
&& stdenv.hostPlatform.isStatic
&& !stdenv.isDarwin
&& !stdenv.cc.bintools.isLLVM
)
[
"-l"
"stdc++"
"-L"
"${stdenv.cc.cc.lib}/${stdenv.hostPlatform.config}/lib"
]
);
}
# What follows is stolen from [here][0]. Its purpose is to properly
# configure compilers and linkers for various stages of the build, and
# even covers the case of build scripts that need native code compiled and
# run on the build platform (I think).
#
# [0]: https://github.com/NixOS/nixpkgs/blob/5cdb38bb16c6d0a38779db14fcc766bc1b2394d6/pkgs/build-support/rust/lib/default.nix#L57-L80
// (
let
inherit (pkgs.rust.lib) envVars;
in
pkgs.lib.optionalAttrs
(pkgs.stdenv.targetPlatform.rust.rustcTarget
!= pkgs.stdenv.hostPlatform.rust.rustcTarget)
(
let
inherit (pkgs.stdenv.targetPlatform.rust) cargoEnvVarTarget;
in
{
"CC_${cargoEnvVarTarget}" = envVars.ccForTarget;
"CXX_${cargoEnvVarTarget}" = envVars.cxxForTarget;
"CARGO_TARGET_${cargoEnvVarTarget}_LINKER" =
envVars.linkerForTarget;
}
)
// (
let
inherit (pkgs.stdenv.hostPlatform.rust) cargoEnvVarTarget rustcTarget;
in
{
"CC_${cargoEnvVarTarget}" = envVars.ccForHost;
"CXX_${cargoEnvVarTarget}" = envVars.cxxForHost;
"CARGO_TARGET_${cargoEnvVarTarget}_LINKER" = envVars.linkerForHost;
CARGO_BUILD_TARGET = rustcTarget;
}
)
// (
let
inherit (pkgs.stdenv.buildPlatform.rust) cargoEnvVarTarget;
in
{
"CC_${cargoEnvVarTarget}" = envVars.ccForBuild;
"CXX_${cargoEnvVarTarget}" = envVars.cxxForBuild;
"CARGO_TARGET_${cargoEnvVarTarget}_LINKER" = envVars.linkerForBuild;
HOST_CC = "${pkgs.pkgsBuildHost.stdenv.cc}/bin/cc";
HOST_CXX = "${pkgs.pkgsBuildHost.stdenv.cc}/bin/c++";
}
)
);
mkPackage = pkgs: allocator: cargoArgs: profile: builder pkgs {
src = inputs.nix-filter {
root = ./.;
include = [
"src"
"Cargo.toml"
"Cargo.lock"
];
};
rocksdb' = (if allocator == "jemalloc" then (pkgs.rocksdb.override { enableJemalloc = true; }) else (rocksdb' pkgs));
# This is redundant with CI
doCheck = false;
env = env pkgs;
nativeBuildInputs = nativeBuildInputs pkgs;
cargoExtraArgs = cargoArgs
+ (if allocator == "jemalloc" then " --features jemalloc" else "")
+ (if allocator == "hmalloc" then " --features hardened_malloc" else "")
;
meta.mainProgram = cargoToml.package.name;
CARGO_PROFILE = profile;
};
mkOciImage = pkgs: package:
pkgs.dockerTools.buildLayeredImage {
name = package.pname;
tag = "main";
# Debian makes builds reproducible through using the HEAD commit's date
created = "@${toString inputs.self.lastModified}";
contents = [
pkgs.dockerTools.caCertificates
];
config = {
# Use the `tini` init system so that signals (e.g. ctrl+c/SIGINT)
# are handled as expected
Entrypoint = if !pkgs.stdenv.isDarwin then [
"${pkgs.lib.getExe' pkgs.tini "tini"}"
"--"
] else [];
Cmd = [
"${pkgs.lib.getExe package}"
];
};
};
createComplementRuntime = pkgs: image: let
script = pkgs.writeShellScriptBin "run.sh"
''
export PATH=${pkgs.lib.makeBinPath [ pkgs.olm pkgs.gcc ]}
${pkgs.lib.getExe pkgs.docker} load < ${image}
set +o pipefail
/usr/bin/env -C "${inputs.complement}" COMPLEMENT_BASE_IMAGE="complement-conduit:dev" ${pkgs.lib.getExe pkgs.go} test -json ${inputs.complement}/tests | ${pkgs.toybox}/bin/tee $1
set -o pipefail
# Post-process the results into an easy-to-compare format
${pkgs.coreutils}/bin/cat "$1" | ${pkgs.lib.getExe pkgs.jq} -c '
select(
(.Action == "pass" or .Action == "fail" or .Action == "skip")
and .Test != null
) | {Action: .Action, Test: .Test}
' | ${pkgs.coreutils}/bin/sort > "$2"
'';
in script;
createComplementImage = pkgs: let
conduwuit = mkPackage pkgs "jemalloc" "--features=axum_dual_protocol" "dev";
in pkgs.dockerTools.buildImage {
name = "complement-conduit";
tag = "dev";
copyToRoot = pkgs.stdenv.mkDerivation {
name = "complement_data";
src = inputs.nix-filter {
root = ./.;
include = [
"tests/complement/conduwuit-complement.toml"
"tests/complement/v3.ext"
];
};
phases = [ "unpackPhase" "installPhase" ];
installPhase = ''
mkdir -p $out/conduwuit/data
cp $src/tests/complement/conduwuit-complement.toml $out/conduwuit/conduit.toml
cp $src/tests/complement/v3.ext $out/v3.ext
'';
};
config = {
Cmd = [
"${pkgs.bash}/bin/sh"
"-c"
''
echo "Starting server as $SERVER_NAME" &&
export CONDUIT_SERVER_NAME=$SERVER_NAME CONDUIT_WELL_KNOWN_SERVER="$SERVER_NAME:8448" CONDUIT_WELL_KNOWN_SERVER="$SERVER_NAME:8008" &&
${pkgs.lib.getExe pkgs.openssl} genrsa -out /conduwuit/private_key.key 2048 &&
${pkgs.lib.getExe pkgs.openssl} req -new -sha256 -key /conduwuit/private_key.key -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=$SERVER_NAME" -out /conduwuit/signing_request.csr &&
echo "DNS.1 = $SERVER_NAME" >> /v3.ext &&
echo "IP.1 = $(${pkgs.lib.getExe pkgs.gawk} 'END{print $1}' /etc/hosts)" >> /v3.ext &&
${pkgs.lib.getExe pkgs.openssl} x509 -req -extfile /v3.ext -in /conduwuit/signing_request.csr -CA /complement/ca/ca.crt -CAkey /complement/ca/ca.key -CAcreateserial -out /conduwuit/certificate.crt -days 1 -sha256 &&
${pkgs.lib.getExe conduwuit}
''
];
Entrypoint = if !pkgs.stdenv.isDarwin then [
"${pkgs.lib.getExe' pkgs.tini "tini"}"
"--"
] else [];
Env = [
"SSL_CERT_FILE=/complement/ca/ca.crt"
"SERVER_NAME=localhost"
"CONDUIT_CONFIG=/conduwuit/conduit.toml"
];
ExposedPorts = {
"8008/tcp" = {};
"8448/tcp" = {};
};
};
};
scopeHost = (scope pkgsHost);
in
{
packages = {
default = mkPackage pkgsHost null "" "release";
jemalloc = mkPackage pkgsHost "jemalloc" "" "release";
hmalloc = mkPackage pkgsHost "hmalloc" "" "release";
oci-image = mkOciImage pkgsHost inputs.self.packages.${system}.default;
oci-image-jemalloc =
mkOciImage pkgsHost inputs.self.packages.${system}.jemalloc;
oci-image-hmalloc =
mkOciImage pkgsHost inputs.self.packages.${system}.hmalloc;
default = scopeHost.main;
jemalloc = scopeHost.main.override { features = ["jemalloc"]; };
hmalloc = scopeHost.main.override { features = ["hardened_malloc"]; };
book =
let
package = inputs.self.packages.${system}.default;
in
pkgsHost.stdenv.mkDerivation {
pname = "${package.pname}-book";
version = package.version;
src = inputs.nix-filter {
root = ./.;
include = [
"book.toml"
"conduwuit-example.toml"
"README.md"
"debian/README.md"
"docs"
];
};
nativeBuildInputs = (with pkgsHost; [
mdbook
]);
buildPhase = ''
mdbook build
mv public $out
'';
oci-image = scopeHost.oci-image;
oci-image-jemalloc = scopeHost.oci-image.override {
main = scopeHost.main.override {
features = ["jemalloc"];
};
complement-image = createComplementImage pkgsHost;
complement-runtime = createComplementRuntime pkgsHost inputs.self.outputs.packages.${system}.complement-image;
};
oci-image-hmalloc = scopeHost.oci-image.override {
main = scopeHost.main.override {
features = ["hardened_malloc"];
};
};
book = scopeHost.book;
complement = scopeHost.complement;
}
//
builtins.listToAttrs
@ -327,48 +78,55 @@
config = crossSystem;
};
}).pkgsStatic;
scopeCrossStatic = scope pkgsCrossStatic;
in
[
# An output for a statically-linked binary
{
name = binaryName;
value = mkPackage pkgsCrossStatic null "" "release";
value = scopeCrossStatic.main;
}
# An output for a statically-linked binary with jemalloc
{
name = "${binaryName}-jemalloc";
value = mkPackage pkgsCrossStatic "jemalloc" "" "release";
value = scopeCrossStatic.main.override {
features = ["jemalloc"];
};
}
# An output for a statically-linked binary with hardened_malloc
{
name = "${binaryName}-hmalloc";
value = mkPackage pkgsCrossStatic "hmalloc" "" "release";
value = scopeCrossStatic.main.override {
features = ["hardened_malloc"];
};
}
# An output for an OCI image based on that binary
{
name = "oci-image-${crossSystem}";
value = mkOciImage
pkgsCrossStatic
inputs.self.packages.${system}.${binaryName};
value = scopeCrossStatic.oci-image;
}
# An output for an OCI image based on that binary with jemalloc
{
name = "oci-image-${crossSystem}-jemalloc";
value = mkOciImage
pkgsCrossStatic
inputs.self.packages.${system}."${binaryName}-jemalloc";
value = scopeCrossStatic.oci-image.override {
main = scopeCrossStatic.main.override {
features = ["jemalloc"];
};
};
}
# An output for an OCI image based on that binary with hardened_malloc
{
name = "oci-image-${crossSystem}-hmalloc";
value = mkOciImage
pkgsCrossStatic
inputs.self.packages.${system}."${binaryName}-hmalloc";
value = scopeCrossStatic.oci-image.override {
main = scopeCrossStatic.main.override {
features = ["hardened_malloc"];
};
};
}
]
)
@ -380,15 +138,19 @@
);
devShells.default = pkgsHost.mkShell {
env = env pkgsHost // {
env = scopeHost.main.env // {
# Rust Analyzer needs to be able to find the path to default crate
# sources, and it can read this environment variable to do so. The
# `rust-src` component is required in order for this to work.
RUST_SRC_PATH = "${toolchain}/lib/rustlib/src/rust/library";
# Convenient way to access a pinned version of Complement's source
# code.
COMPLEMENT_SRC = inputs.complement.outPath;
};
# Development tools
nativeBuildInputs = nativeBuildInputs pkgsHost ++ [
packages = [
# Always use nightly rustfmt because most of its options are unstable
#
# This needs to come before `toolchain` in this list, otherwise
@ -396,7 +158,8 @@
inputs.fenix.packages.${system}.latest.rustfmt
toolchain
] ++ (with pkgsHost; [
]
++ (with pkgsHost; [
engage
# Needed for producing Debian packages
@ -414,7 +177,9 @@
# Useful for editing the book locally
mdbook
]);
])
++
scopeHost.main.nativeBuildInputs;
};
});
}

31
nix/pkgs/book/default.nix Normal file
View file

@ -0,0 +1,31 @@
{ inputs
# Dependencies
, main
, mdbook
, stdenv
}:
stdenv.mkDerivation {
inherit (main) pname version;
src = inputs.nix-filter {
root = inputs.self;
include = [
"book.toml"
"conduwuit-example.toml"
"README.md"
"debian/README.md"
"docs"
];
};
nativeBuildInputs = [
mdbook
];
buildPhase = ''
mdbook build
mv public $out
'';
}

View file

@ -0,0 +1,19 @@
[global]
address = "0.0.0.0"
allow_device_name_federation = true
allow_guest_registration = true
allow_public_room_directory_over_federation = true
allow_public_room_directory_without_auth = true
allow_registration = true
allow_unstable_room_versions = true
database_backend = "rocksdb"
database_path = "/database"
log = "trace"
port = [8008, 8448]
trusted_servers = []
yes_i_am_very_very_sure_i_want_an_open_registration_server_prone_to_abuse = true
[global.tls]
certs = "/certificate.crt"
dual_protocol = true
key = "/private_key.key"

View file

@ -0,0 +1,92 @@
# Dependencies
{ bashInteractive
, buildEnv
, coreutils
, dockerTools
, gawk
, lib
, main
, openssl
, stdenv
, tini
, writeShellScriptBin
}:
let
main' = main.override {
profile = "dev";
features = ["axum_dual_protocol"];
};
start = writeShellScriptBin "start" ''
set -euxo pipefail
${lib.getExe openssl} genrsa -out private_key.key 2048
${lib.getExe openssl} req \
-new \
-sha256 \
-key private_key.key \
-subj "/C=US/ST=CA/O=MyOrg, Inc./CN=$SERVER_NAME" \
-out signing_request.csr
cp ${./v3.ext} v3.ext
echo "DNS.1 = $SERVER_NAME" >> v3.ext
echo "IP.1 = $(${lib.getExe gawk} 'END{print $1}' /etc/hosts)" \
>> v3.ext
${lib.getExe openssl} x509 \
-req \
-extfile v3.ext \
-in signing_request.csr \
-CA /complement/ca/ca.crt \
-CAkey /complement/ca/ca.key \
-CAcreateserial \
-out certificate.crt \
-days 1 \
-sha256
${lib.getExe' coreutils "env"} \
CONDUIT_SERVER_NAME="$SERVER_NAME" \
CONDUIT_WELL_KNOWN_SERVER="$SERVER_NAME:8448" \
CONDUIT_WELL_KNOWN_SERVER="$SERVER_NAME:8008" \
${lib.getExe main'}
'';
in
dockerTools.buildImage {
name = "complement-${main.pname}";
tag = "dev";
copyToRoot = buildEnv {
name = "root";
pathsToLink = [
"/bin"
];
paths = [
bashInteractive
coreutils
main'
start
];
};
config = {
Cmd = [
"${lib.getExe start}"
];
Entrypoint = if !stdenv.isDarwin
# Use the `tini` init system so that signals (e.g. ctrl+c/SIGINT)
# are handled as expected
then [ "${lib.getExe' tini "tini"}" "--" ]
else [];
Env = [
"SSL_CERT_FILE=/complement/ca/ca.crt"
"CONDUIT_CONFIG=${./config.toml}"
];
ExposedPorts = {
"8008/tcp" = {};
"8448/tcp" = {};
};
};
}

View file

@ -0,0 +1,100 @@
{ lib
, pkgsBuildHost
, rust
, stdenv
}:
lib.optionalAttrs stdenv.hostPlatform.isStatic {
ROCKSDB_STATIC = "";
}
//
{
CARGO_BUILD_RUSTFLAGS =
lib.concatStringsSep
" "
([]
# This disables PIE for static builds, which isn't great in terms
# of security. Unfortunately, my hand is forced because nixpkgs'
# `libstdc++.a` is built without `-fPIE`, which precludes us from
# leaving PIE enabled.
++ lib.optionals
stdenv.hostPlatform.isStatic
[ "-C" "relocation-model=static" ]
++ lib.optionals
(stdenv.buildPlatform.config != stdenv.hostPlatform.config)
[ "-l" "c" ]
++ lib.optionals
# This check has to match the one [here][0]. We only need to set
# these flags when using a different linker. Don't ask me why,
# though, because I don't know. All I know is it breaks otherwise.
#
# [0]: https://github.com/NixOS/nixpkgs/blob/5cdb38bb16c6d0a38779db14fcc766bc1b2394d6/pkgs/build-support/rust/lib/default.nix#L37-L40
(
# Nixpkgs doesn't check for x86_64 here but we do, because I
# observed a failure building statically for x86_64 without
# including it here. Linkers are weird.
(stdenv.hostPlatform.isAarch64 || stdenv.hostPlatform.isx86_64)
&& stdenv.hostPlatform.isStatic
&& !stdenv.isDarwin
&& !stdenv.cc.bintools.isLLVM
)
[
"-l"
"stdc++"
"-L"
"${stdenv.cc.cc.lib}/${stdenv.hostPlatform.config}/lib"
]
);
}
# What follows is stolen from [here][0]. Its purpose is to properly
# configure compilers and linkers for various stages of the build, and
# even covers the case of build scripts that need native code compiled and
# run on the build platform (I think).
#
# [0]: https://github.com/NixOS/nixpkgs/blob/5cdb38bb16c6d0a38779db14fcc766bc1b2394d6/pkgs/build-support/rust/lib/default.nix#L57-L80
//
(
let
inherit (rust.lib) envVars;
in
lib.optionalAttrs
(stdenv.targetPlatform.rust.rustcTarget
!= stdenv.hostPlatform.rust.rustcTarget)
(
let
inherit (stdenv.targetPlatform.rust) cargoEnvVarTarget;
in
{
"CC_${cargoEnvVarTarget}" = envVars.ccForTarget;
"CXX_${cargoEnvVarTarget}" = envVars.cxxForTarget;
"CARGO_TARGET_${cargoEnvVarTarget}_LINKER" =
envVars.linkerForTarget;
}
)
//
(
let
inherit (stdenv.hostPlatform.rust) cargoEnvVarTarget rustcTarget;
in
{
"CC_${cargoEnvVarTarget}" = envVars.ccForHost;
"CXX_${cargoEnvVarTarget}" = envVars.cxxForHost;
"CARGO_TARGET_${cargoEnvVarTarget}_LINKER" = envVars.linkerForHost;
CARGO_BUILD_TARGET = rustcTarget;
}
)
//
(
let
inherit (stdenv.buildPlatform.rust) cargoEnvVarTarget;
in
{
"CC_${cargoEnvVarTarget}" = envVars.ccForBuild;
"CXX_${cargoEnvVarTarget}" = envVars.cxxForBuild;
"CARGO_TARGET_${cargoEnvVarTarget}_LINKER" = envVars.linkerForBuild;
HOST_CC = "${pkgsBuildHost.stdenv.cc}/bin/cc";
HOST_CXX = "${pkgsBuildHost.stdenv.cc}/bin/c++";
}
)
)

71
nix/pkgs/main/default.nix Normal file
View file

@ -0,0 +1,71 @@
{ inputs
# Dependencies
, craneLib
, lib
, libiconv
, pkgsBuildHost
, rocksdb
, rust
, stdenv
# Options
, features ? []
, profile ? "release"
}:
craneLib.buildPackage rec {
src = inputs.nix-filter {
root = inputs.self;
include = [
"src"
"Cargo.toml"
"Cargo.lock"
];
};
# This is redundant with CI
doCheck = false;
env =
let
rocksdb' = rocksdb.override {
enableJemalloc = builtins.elem "jemalloc" features;
};
in
{
CARGO_PROFILE = profile;
CONDUIT_VERSION_EXTRA = inputs.self.shortRev or inputs.self.dirtyShortRev;
ROCKSDB_INCLUDE_DIR = "${rocksdb'}/include";
ROCKSDB_LIB_DIR = "${rocksdb'}/lib";
}
//
(import ./cross-compilation-env.nix {
inherit
lib
pkgsBuildHost
rust
stdenv;
});
nativeBuildInputs = [
# bindgen needs the build platform's libclang. Apparently due to "splicing
# weirdness", pkgs.rustPlatform.bindgenHook on its own doesn't quite do the
# right thing here.
pkgsBuildHost.rustPlatform.bindgenHook
]
++ lib.optionals stdenv.isDarwin [ libiconv ];
cargoExtraArgs = ""
+ lib.optionalString
(features != [])
"--features " + (builtins.concatStringsSep "," features);
meta.mainProgram = (craneLib.crateNameFromCargoToml {
cargoToml = "${inputs.self}/Cargo.toml";
}).pname;
passthru = {
inherit env;
};
}

View file

@ -0,0 +1,28 @@
{ inputs
# Dependencies
, dockerTools
, lib
, main
, stdenv
, tini
}:
dockerTools.buildLayeredImage {
name = main.pname;
tag = "main";
created = "@${toString inputs.self.lastModified}";
contents = [
dockerTools.caCertificates
];
config = {
Entrypoint = if !stdenv.isDarwin
# Use the `tini` init system so that signals (e.g. ctrl+c/SIGINT)
# are handled as expected
then [ "${lib.getExe' tini "tini"}" "--" ]
else [];
Cmd = [
"${lib.getExe main}"
];
};
}

View file

@ -1,15 +0,0 @@
# Complement
## What's that?
Have a look at [its repository](https://github.com/matrix-org/complement).
## How do I use it with conduwuit?
For reproducible results, Complement support in conduwuit uses Nix to run and generate an image.
After installing Nix, you can run either:
- `nix run #.complement-runtime -- ./path/to/logs.jsonl ./path/to/results.jsonl` to build a Complement image, run the tests, and output the logs and results to the specified paths.
- `nix run #.complement-image` to just build a Complement image

View file

@ -1,592 +0,0 @@
# =============================================================================
# This is the official complement config for conduwuit.
# DO NOT USE IT IN ACTUAL SERVERS
# =============================================================================
[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 (delegation). See
# https://spec.matrix.org/latest/client-server-api/#getwell-knownmatrixclient
# and
# https://spec.matrix.org/v1.9/server-server-api/#getwell-knownmatrixserver
# for more information
# We set this via env var
# server_name = "your.server.name"
# Servers listed here will be used to gather public keys of other servers (notary trusted key servers).
#
# The default behaviour for conduwuit is to attempt to query trusted key servers before querying the individual servers.
# This is done for performance reasons, but if you would like to query individual servers before the notary servers
# configured below, set to
#
# (Currently, conduwuit doesn't support batched key requests, so this list should only contain Synapse servers)
# Defaults to `matrix.org`
trusted_servers = []
# Sentry.io crash/panic reporting, performance monitoring/metrics, etc.
# Conduwuit's Sentry reporting endpoint is o4506996327251968.ingest.us.sentry.io
#
# Defaults to false
#sentry = false
# Report your Conduwuit server_name in Sentry.io crash reports and metrics
#
# Defaults to false
#sentry_send_server_name = false
# Performance monitoring/tracing sample rate for Sentry.io
#
# Note that too high values may impact performance, and can be disabled by setting it to 0.0
#
# Defaults to 0.15
#sentry_traces_sample_rate = 0.15
### Database configuration
# This is the only directory where conduwuit will save its data, including media
database_path = "/conduwuit/data"
# Database backend: Only rocksdb and sqlite are supported. Please note that sqlite
# will perform significantly worse than rocksdb as it is not intended to be used the
# way it is by conduwuit. sqlite only exists for historical reasons.
database_backend = "rocksdb"
### Network
# The port(s) conduwuit will be running on. You need to set up a reverse proxy such as
# Caddy or Nginx so all requests to /_matrix on port 443 and 8448 will be
# forwarded to the conduwuit instance running on this port
# Docker users: Don't change this, you'll need to map an external port to this.
# To listen on multiple ports, specify a vector e.g. [8080, 8448]
port = [8008, 8448]
# default address (IPv4 or IPv6) conduwuit will listen on. Generally you want this to be
# localhost (127.0.0.1 / ::1). If you are using Docker or a container NAT networking setup, you
# likely need this to be 0.0.0.0.
address = "0.0.0.0"
# How many requests conduwuit sends to other servers at the same time concurrently. Default is 500
# Note that because conduwuit is very fast unlike other homeserver implementations, setting this too
# high could inadvertently result in ratelimits kicking in, or overloading lower-end homeservers out there.
#
# A valid use-case for enabling this is if you have a significant amount of overall federation activity
# such as many rooms joined/tracked, and many servers in the true destination cache caused by that. Upon
# rebooting conduwuit, depending on how fast your resources are, client and incoming federation requests
# may timeout or be "stalled" for a period of time due to hitting the max concurrent requests limit from
# refreshing federation/destination caches and such.
#
# If you have a lot of active users on your homeserver, you will definitely need to raise this.
#
# No this will not speed up room joins.
max_concurrent_requests = 2000
# Max request size for file uploads
max_request_size = 100_000_000 # in bytes
# Uncomment unix_socket_path to listen on a UNIX socket at the specified path.
# If listening on a UNIX socket, you must remove/comment the 'address' key if defined and add your
# reverse proxy to the 'conduwuit' group, unless world RW permissions are specified with unix_socket_perms (666 minimum).
#unix_socket_path = "/run/conduwuit/conduwuit.sock"
#unix_socket_perms = 660
# Set this to true for conduwuit to compress HTTP response bodies using zstd.
# This option does nothing if conduwuit was not built with `zstd_compression` feature.
# Please be aware that enabling HTTP compression may weaken TLS.
# Most users should not need to enable this.
# See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH before deciding to enable this.
zstd_compression = false
# Set this to true for conduwuit to compress HTTP response bodies using gzip.
# This option does nothing if conduwuit was not built with `gzip_compression` feature.
# Please be aware that enabling HTTP compression may weaken TLS.
# Most users should not need to enable this.
# See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH before deciding to enable this.
gzip_compression = false
# Set this to true for conduwuit to compress HTTP response bodies using brotli.
# This option does nothing if conduwuit was not built with `brotli_compression` feature.
# Please be aware that enabling HTTP compression may weaken TLS.
# Most users should not need to enable this.
# See https://breachattack.com/ and https://wikipedia.org/wiki/BREACH before deciding to enable this.
brotli_compression = false
# Vector list of IPv4 and IPv6 CIDR ranges / subnets *in quotes* that you do not want conduwuit to send outbound requests to.
# Defaults to RFC1918, unroutable, loopback, multicast, and testnet addresses for security.
#
# To disable, set this to be an empty vector (`[]`).
# Please be aware that this is *not* a guarantee. You should be using a firewall with zones as doing this on the application layer may have bypasses.
#
# Currently this does not account for proxies in use like Synapse does.
ip_range_denylist = []
### Moderation / Privacy / Security
# Set to true to allow user type "guest" registrations. Element attempts to register guest users automatically.
# For private homeservers, this is best at false.
allow_guest_registration = true
# Vector list of servers that conduwuit will refuse to download remote media from.
# No default.
# prevent_media_downloads_from = ["example.com", "example.local"]
# Enable complement tests being able to register
allow_registration = true
# DO NOT USE THIS IN ON REAL SERVERS
yes_i_am_very_very_sure_i_want_an_open_registration_server_prone_to_abuse = true
# controls whether federation is allowed or not
# defaults to true
allow_federation = true
# controls whether users are allowed to create rooms.
# appservices and admins are always allowed to create rooms
# defaults to true
allow_room_creation = true
# controls whether non-admin local users are forbidden from sending room invites (local and remote),
# and if non-admin users can receive remote room invites. admins are always allowed to send and receive all room invites.
# defaults to false
block_non_admin_invites = false
# List of forbidden username patterns/strings. Values in this list are matched as *contains*.
# This is checked upon username availability check, registration, and startup as warnings if any local users in your database
# have a forbidden username.
# No default.
# forbidden_usernames = []
# List of forbidden room aliases and room IDs as patterns/strings. Values in this list are matched as *contains*.
# This is checked upon room alias creation, custom room ID creation if used, and startup as warnings if any room aliases
# in your database have a forbidden room alias/ID.
# No default.
# forbidden_alias_names = []
# Set this to true to allow your server's public room directory to be federated.
# Set this to false to protect against /publicRooms spiders, but will forbid external users
# from viewing your server's public room directory. If federation is disabled entirely
# (`allow_federation`), this is inherently false.
allow_public_room_directory_over_federation = true
# Set this to true to allow your server's public room directory to be queried without client
# authentication (access token) through the Client APIs. Set this to false to protect against /publicRooms spiders.
allow_public_room_directory_without_auth = true
# Set this to true to lock down your server's public room directory and only allow admins to publish rooms to the room directory.
# Unpublishing is still allowed by all users with this enabled.
#
# Defaults to false
lockdown_public_room_directory = false
# Set this to true to allow federating device display names / allow external users to see your device display name.
# If federation is disabled entirely (`allow_federation`), this is inherently false. For privacy, this is best disabled.
allow_device_name_federation = true
# Vector list of domains allowed to send requests to for URL previews. Defaults to none.
# Note: this is a *contains* match, not an explicit match. Putting "google.com" will match "https://google.com" and "http://mymaliciousdomainexamplegoogle.com"
# Setting this to "*" will allow all URL previews. Please note that this opens up significant attack surface to your server, you are expected to be aware of the risks by doing so.
url_preview_domain_contains_allowlist = ["*"]
# Vector list of explicit domains allowed to send requests to for URL previews. Defaults to none.
# Note: This is an *explicit* match, not a ccontains match. Putting "google.com" will match "https://google.com", "http://google.com", but not "https://mymaliciousdomainexamplegoogle.com"
# Setting this to "*" will allow all URL previews. Please note that this opens up significant attack surface to your server, you are expected to be aware of the risks by doing so.
url_preview_domain_explicit_allowlist = []
# Vector list of URLs allowed to send requests to for URL previews. Defaults to none.
# Note that this is a *contains* match, not an explicit match. Putting "google.com" will match "https://google.com/", "https://google.com/url?q=https://mymaliciousdomainexample.com", and "https://mymaliciousdomainexample.com/hi/google.com"
# Setting this to "*" will allow all URL previews. Please note that this opens up significant attack surface to your server, you are expected to be aware of the risks by doing so.
url_preview_url_contains_allowlist = []
# Maximum amount of bytes allowed in a URL preview body size when spidering. Defaults to 384KB (384_000 bytes)
url_preview_max_spider_size = 384_000
# Option to decide whether you would like to run the domain allowlist checks (contains and explicit) on the root domain or not. Does not apply to URL contains allowlist. Defaults to false.
# Example: If this is enabled and you have "wikipedia.org" allowed in the explicit and/or contains domain allowlist, it will allow all subdomains under "wikipedia.org" such as "en.m.wikipedia.org" as the root domain is checked and matched.
# Useful if the domain contains allowlist is still too broad for you but you still want to allow all the subdomains under a root domain.
url_preview_check_root_domain = false
# A single contact and/or support page for /.well-known/matrix/support
# All options here are strings. Currently only supports 1 single contact.
# No default.
#well_known_support_page = ""
#well_known_support_role = ""
#well_known_support_email = ""
#well_known_support_mxid = ""
# Config option to allow or disallow incoming federation requests that obtain the profiles
# of our local users from `/_matrix/federation/v1/query/profile`
#
# This is inherently false if `allow_federation` is disabled
#
# Defaults to true
allow_profile_lookup_federation_requests = true
### Misc
# max log level for conduwuit. allows debug, info, warn, or error
# see also: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
# For release builds, the maximum log level for conduwuit is info. For debug builds, it is "trace".
# Defaults to "warn"
log = "trace"
# controls whether encrypted rooms and events are allowed (default true)
#allow_encryption = false
# if enabled, conduwuit will send a simple GET request periodically to `https://pupbrain.dev/check-for-updates/stable`
# for any new announcements made. Despite the name, this is not an update check
# endpoint, it is simply an announcement check endpoint.
# Defaults to false.
allow_check_for_updates = false
# If you are using delegation via well-known files and you cannot serve them from your reverse proxy, you can
# uncomment these to serve them directly from conduwuit. This requires proxying all requests to conduwuit, not just `/_matrix` to work.
# Note that whatever you put will show up in the well-known JSON values.
# Set to false to disable users from joining or creating room versions that aren't 100% officially supported by conduwuit.
# conduwuit officially supports room versions 6 - 10. conduwuit has experimental/unstable support for 3 - 5, and 11.
# Defaults to true.
allow_unstable_room_versions = true
# Option to control adding arbitrary text to the end of the user's displayname upon registration with a space before the text.
# This was the lightning bolt emoji option, just replaced with support for adding your own custom text or emojis.
# To disable, set this to "" (an empty string)
# Defaults to "🏳️‍⚧️" (trans pride flag)
#new_user_displayname_suffix = ""
# Option to control whether conduwuit will query your list of trusted notary key servers (`trusted_servers`) for
# remote homeserver signing keys it doesn't know *first*, or query the individual servers first before falling back to the trusted
# key servers.
#
# The former/default behaviour makes federated/remote rooms joins generally faster because we're querying a single (or list of) server
# that we know works, is reasonably fast, and is reliable for just about all the homeserver signing keys in the room. Querying individual
# servers may take longer depending on the general infrastructure of everyone in there, how many dead servers there are, etc.
#
# However, this does create an increased reliance on one single or multiple large entities as `trusted_servers` should generally
# contain long-term and large servers who know a very large number of homeservers.
#
# If you don't know what any of this means, leave this and `trusted_servers` alone to their defaults.
#
# Defaults to true as this is the fastest option for federation.
query_trusted_key_servers_first = true
# List/vector of room **IDs** that conduwuit will make newly registered users join.
# The room IDs specified must be rooms that you have joined at least once on the server, and must be public.
#
# No default.
#auto_join_rooms = []
# Retry failed and incomplete messages to remote servers immediately upon startup. This is called bursting.
# If this is disabled, said messages may not be delivered until more messages are queued for that server.
# Do not change this option unless server resources are extremely limited or the scale of the server's
# deployment is huge. Do not disable this unless you know what you are doing.
startup_netburst = true
# Limit the startup netburst to the most recent (default: 50) messages queued for each remote server. All older
# messages are dropped and not reattempted. The `startup_netburst` option must be enabled for this value to have
# any effect. Do not change this value unless you know what you are doing. Set this value to -1 to reattempt
# every message without trimming the queues; this may consume significant disk. Set this value to 0 to drop all
# messages without any attempt at redelivery.
#startup_netburst_keep = 50
### Generic database options
# Set this to any float value to multiply conduwuit's in-memory LRU caches with.
# May be useful if you have significant memory to spare to increase performance.
# Defaults to 1.0.
#conduit_cache_capacity_modifier = 1.0
# Set this to any float value in megabytes for conduwuit to tell the database engine that this much memory is available for database-related caches.
# May be useful if you have significant memory to spare to increase performance.
# Defaults to 256.0
#db_cache_capacity_mb = 256.0
# Interval in seconds when conduwuit will run database cleanup operations.
#
# For SQLite: this will flush the WAL by executing `PRAGMA wal_checkpoint(RESTART)` (https://www.sqlite.org/pragma.html#pragma_wal_checkpoint)
# For RocksDB: this will run `flush_opt` to flush database memtables to SST files on disk (https://docs.rs/rocksdb/latest/rocksdb/struct.DBCommon.html#method.flush_opt)
# These operations always run on shutdown.
#
# Defaults to 30 minutes (1800 seconds) to avoid IO amplification from too frequent cleanups
#cleanup_second_interval = 1800
### RocksDB options
# Set this to true to use RocksDB config options that are tailored to HDDs (slower device storage)
#
# It is worth noting that by default, conduwuit will use RocksDB with Direct IO enabled. *Generally* speaking this improves performance as it bypasses buffered I/O (system page cache).
# However there is a potential chance that Direct IO may cause issues with database operations if your setup is uncommon. This has been observed with FUSE filesystems, and possibly ZFS filesystem.
# RocksDB generally deals/corrects these issues but it cannot account for all setups.
# If you experience any weird RocksDB issues, try enabling this option as it turns off Direct IO and feel free to report in the conduwuit Matrix room if this option fixes your DB issues.
# See https://github.com/facebook/rocksdb/wiki/Direct-IO for more information.
#
# Defaults to false
#rocksdb_optimize_for_spinning_disks = false
# RocksDB log level. This is not the same as conduwuit's log level. This is the log level for the RocksDB engine/library
# which show up in your database folder/path as `LOG` files. Defaults to error. conduwuit will typically log RocksDB errors as normal.
#rocksdb_log_level = "error"
# Max RocksDB `LOG` file size before rotating in bytes. Defaults to 4MB.
#rocksdb_max_log_file_size = 4194304
# Time in seconds before RocksDB will forcibly rotate logs. Defaults to 0.
#rocksdb_log_time_to_roll = 0
# Amount of threads that RocksDB will use for parallelism on database operatons such as cleanup, sync, flush, compaction, etc. Set to 0 to use all your physical cores.
#
# Defaults to your CPU physical core count (not logical threads).
#rocksdb_parallelism_threads = 0
# Maximum number of LOG files RocksDB will keep. This must *not* be set to 0. It must be at least 1.
# Defaults to 3 as these are not very useful.
#rocksdb_max_log_files = 3
# Type of RocksDB database compression to use.
# Available options are "zstd", "zlib", "bz2" and "lz4"
# It is best to use ZSTD as an overall good balance between speed/performance, storage, IO amplification, and CPU usage.
# For more performance but less compression (more storage used) and less CPU usage, use LZ4.
# See https://github.com/facebook/rocksdb/wiki/Compression for more details.
#
# Defaults to "zstd"
#rocksdb_compression_algo = "zstd"
# Level of compression the specified compression algorithm for RocksDB to use.
# Default is 32767, which is internally read by RocksDB as the default magic number and
# translated to the library's default compression level as they all differ.
# See their `kDefaultCompressionLevel`.
#
#rocksdb_compression_level = 32767
# Level of compression the specified compression algorithm for the bottommost level/data for RocksDB to use.
# Default is 32767, which is internally read by RocksDB as the default magic number and
# translated to the library's default compression level as they all differ.
# See their `kDefaultCompressionLevel`.
#
# Since this is the bottommost level (generally old and least used data), it may be desirable to have a very
# high compression level here as it's lesss likely for this data to be used. Research your chosen compression algorithm.
#
#rocksdb_bottommost_compression_level = 32767
# Whether to enable RocksDB "bottommost_compression".
# At the expense of more CPU usage, this will further compress the database to reduce more storage.
# It is recommended to use ZSTD compression with this for best compression results.
# See https://github.com/facebook/rocksdb/wiki/Compression for more details.
#
# Defaults to false as this uses more CPU when compressing.
#rocksdb_bottommost_compression = false
# Database recovery mode (for RocksDB WAL corruption)
#
# Use this option when the server reports corruption and refuses to start. Set mode 2 (PointInTime)
# to cleanly recover from this corruption. The server will continue from the last good state,
# several seconds or minutes prior to the crash. Clients may have to run "clear-cache & reload" to
# account for the rollback. Upon success, you may reset the mode back to default and restart again.
# Please note in some cases the corruption error may not be cleared for at least 30 minutes of
# operation in PointInTime mode.
#
# As a very last ditch effort, if PointInTime does not fix or resolve anything, you can try mode
# 3 (SkipAnyCorruptedRecord) but this will leave the server in a potentially inconsistent state.
#
# The default mode 1 (TolerateCorruptedTailRecords) will automatically drop the last entry in the
# database if corrupted during shutdown, but nothing more. It is extraordinarily unlikely this will
# desynchronize clients. To disable any form of silent rollback set mode 0 (AbsoluteConsistency).
#
# The options are:
# 0 = AbsoluteConsistency
# 1 = TolerateCorruptedTailRecords (default)
# 2 = PointInTime (use me if trying to recover)
# 3 = SkipAnyCorruptedRecord (you now voided your Conduwuit warranty)
#
# See https://github.com/facebook/rocksdb/wiki/WAL-Recovery-Modes for more information
#
# Defaults to 1 (TolerateCorruptedTailRecords)
#rocksdb_recovery_mode = 1
# Controls whether memory buffers are written to storage at the fixed interval set by `cleanup_period_interval`
# even when they are not full. Setting this will increase load on the storage backplane and is never advised
# under normal circumstances.
#rocksdb_periodic_cleanup = false
### Domain Name Resolution and Caching
# Maximum entries stored in DNS memory-cache. The size of an entry may vary so please take care if
# raising this value excessively. Only decrease this when using an external DNS cache. Please note
# that systemd does *not* count as an external cache, even when configured to do so.
#dns_cache_entries = 12288
# Minimum time-to-live in seconds for entries in the DNS cache. The default may appear high to most
# administrators; this is by design. Only decrease this if you are using an external DNS cache.
#dns_min_ttl = 60 * 90
# Minimum time-to-live in seconds for NXDOMAIN entries in the DNS cache. This value is critical for
# the server to federate efficiently. NXDOMAIN's are assumed to not be returning to the federation
# and aggressively cached rather than constantly rechecked.
#dns_min_ttl_nxdomain = 60 * 60 * 24 * 3
# The number of seconds to wait for a reply to a DNS query. Please note that recursive queries can
# take up to several seconds for some domains, so this value should not be too low.
#dns_timeout = 5
# Number of retries after a timeout.
#dns_attempts = 5
# Enable to query all nameservers until the domain is found. Referred to as "trust_negative_responses" in hickory_resolver.
# This can avoid useless DNS queries if the first nameserver responds with NXDOMAIN or an empty NOERROR response.
#
# The default is to query one nameserver and stop (false).
#query_all_nameservers = false
### Request Timeouts, Connection Timeouts, and Connection Pooling
## Request Timeouts are HTTP response timeouts
## Connection Timeouts are TCP connection timeouts
##
## Connection Pooling Timeouts are timeouts for keeping an open idle connection alive.
## Connection pooling and keepalive is very useful for federation or other places where for performance reasons,
## we want to keep connections open that we will re-use frequently due to TCP and TLS 1.3 overhead/expensiveness.
##
## Generally these defaults are the best, but if you find a reason to need to change these they are here.
# Default/base connection timeout
# This is used only by URL previews and update/news endpoint checks
#
# Defaults to 10 seconds
#request_conn_timeout = 10
# Default/base request timeout
# This is used only by URL previews and update/news endpoint checks
#
# Defaults to 35 seconds
#request_timeout = 35
# Default/base max idle connections per host
# This is used only by URL previews and update/news endpoint checks
#
# Defaults to 1 as generally the same open connection can be re-used
#request_idle_per_host = 1
# Default/base idle connection pool timeout
# This is used only by URL previews and update/news endpoint checks
#
# Defaults to 5 seconds
#request_idle_timeout = 5
# Federation well-known resolution connection timeout
#
# Defaults to 6 seconds
#well_known_conn_timeout = 6
# Federation HTTP well-known resolution request timeout
#
# Defaults to 10 seconds
#well_known_timeout = 10
# Federation client/server request timeout
# You most definitely want this to be high to account for extremely large room joins, slow homeservers, your own resources etc.
#
# Defaults to 300 seconds
#federation_timeout = 300
# Federation client/sender max idle connections per host
#
# Defaults to 1 as generally the same open connection can be re-used
#federation_idle_per_host = 1
# Federation client/sender idle connection pool timeout
#
# Defaults to 25 seconds
#federation_idle_timeout = 25
# Appservice URL request connection timeout
#
# Defaults to 120 seconds
#appservice_timeout = 120
# Appservice URL idle connection pool timeout
#
# Defaults to 300 seconds
#appservice_idle_timeout = 300
# Notification gateway pusher idle connection pool timeout
#
# Defaults to 15 seconds
#pusher_idle_timeout = 15
### Presence / Typing Indicators / Read Receipts
# Config option to control local (your server only) presence updates/requests. Defaults to true.
# Note that presence on conduwuit is very fast unlike Synapse's.
# If using outgoing presence, this MUST be enabled.
#
allow_local_presence = true
# Config option to control incoming federated presence updates/requests. Defaults to true.
# This option receives presence updates from other servers, but does not send any unless `allow_outgoing_presence` is true.
# Note that presence on conduwuit is very fast unlike Synapse's.
#
allow_incoming_presence = true
# Config option to control outgoing presence updates/requests. Defaults to true.
# This option sends presence updates to other servers, but does not receive any unless `allow_incoming_presence` is true.
# Note that presence on conduwuit is very fast unlike Synapse's.
# If using outgoing presence, you MUST enable `allow_local_presence` as well.
#
allow_outgoing_presence = true
# Config option to control how many seconds before presence updates that you are idle. Defaults to 5 minutes.
#presence_idle_timeout_s = 300
# Config option to control how many seconds before presence updates that you are offline. Defaults to 30 minutes.
#presence_offline_timeout_s = 1800
# Config option to control whether we should receive remote incoming read receipts.
# Defaults to true.
allow_incoming_read_receipts = true
# Config option to control outgoing typing updates to federation. Defaults to true.
allow_outgoing_typing = true
# Config option to control incoming typing updates from federation. Defaults to true.
allow_incoming_typing = true
# Config option to control maximum time federation user can indicate typing.
#typing_federation_timeout_s = 30
# Config option to control minimum time local client can indicate typing. This does not override
# a client's request to stop typing. It only enforces a minimum value in case of no stop request.
#typing_client_timeout_min_s = 15
# Config option to control maximum time local client can indicate typing.
#typing_client_timeout_max_s = 45
# Other options not in [global]:
#
#
# Enables running conduwuit with direct TLS support
# It is strongly recommended you use a reverse proxy instead. This is primarily relevant for test suites like complement that require a private CA setup.
[global.tls]
certs = "/conduwuit/certificate.crt"
key = "/conduwuit/private_key.key"
#
# Whether to listen and allow for HTTP and HTTPS connections (insecure!)
# This config option is only available if conduwuit was built with `axum_dual_protocol` feature (not default feature)
# Defaults to false
dual_protocol = true

View file

@ -1,596 +0,0 @@
{
"Action": "fail",
"Test": "TestBannedUserCannotSendJoin"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/event_with_mismatched_state_key"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/invite_event"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/join_event"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/leave_event"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/non-state_membership_event"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV1"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV1/leave_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV1/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV2"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV2/leave_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV2/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/event_with_mismatched_state_key"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/invite_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/join_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/leave_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/non-state_membership_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/event_with_mismatched_state_key"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/invite_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/join_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/knock_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/non-state_membership_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/event_with_mismatched_state_key"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/invite_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/join_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/knock_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/non-state_membership_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/regular_event"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummaryJoinRules"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/max_depth"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/pagination"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/query_whole_graph"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/redact_link"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/suggested_only"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederation"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederation/good_connectivity"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederation/interrupted_connectivity"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederationOnRoomJoin"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederation/stopped_server"
}
{
"Action": "fail",
"Test": "TestEventAuth"
}
{
"Action": "fail",
"Test": "TestFederationKeyUploadQuery"
}
{
"Action": "fail",
"Test": "TestFederationKeyUploadQuery/Can_claim_remote_one_time_key_using_POST"
}
{
"Action": "fail",
"Test": "TestFederationKeyUploadQuery/Can_query_remote_device_keys_using_POST"
}
{
"Action": "fail",
"Test": "TestFederationRejectInvite"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel/Invited_user_can_reject_invite_over_federation"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel/Invited_user_can_reject_invite_over_federation_several_times"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel/Invited_user_has_'is_direct'_flag_in_prev_content_after_joining"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel/Remote_invited_user_can_see_room_metadata"
}
{
"Action": "fail",
"Test": "TestGetMissingEventsGapFilling"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents/Inbound_federation_can_return_missing_events_for_invited_visibility"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents/Inbound_federation_can_return_missing_events_for_joined_visibility"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents/Inbound_federation_can_return_missing_events_for_shared_visibility"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents/Inbound_federation_can_return_missing_events_for_world_readable_visibility"
}
{
"Action": "fail",
"Test": "TestInboundFederationRejectsEventsWithRejectedAuthEvents"
}
{
"Action": "fail",
"Test": "TestJoinFederatedRoomFromApplicationServiceBridgeUser"
}
{
"Action": "fail",
"Test": "TestJumpToDateEndpoint"
}
{
"Action": "fail",
"Test": "TestKnocking"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_can_knock_on_a_room_without_a_reason"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_can_knock_on_a_room_without_a_reason#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_cannot_knock_on_a_room_they_are_already_in"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_cannot_knock_on_a_room_they_are_already_in#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_cannot_knock_on_a_room_they_are_already_invited_to"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_cannot_knock_on_a_room_they_are_already_invited_to#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_in_the_room_can_reject_a_knock"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_in_the_room_can_reject_a_knock#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_has_already_knocked_is_allowed_to_knock_again_on_the_same_room"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_has_already_knocked_is_allowed_to_knock_again_on_the_same_room#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_has_knocked_on_a_local_room_can_rescind_their_knock_and_then_knock_again"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_is_banned_from_a_room_cannot_knock_on_it"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_is_banned_from_a_room_cannot_knock_on_it#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Attempting_to_join_a_room_with_join_rule_'knock'_without_an_invite_should_fail"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Attempting_to_join_a_room_with_join_rule_'knock'_without_an_invite_should_fail#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_can_knock_on_a_room_without_a_reason"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_can_knock_on_a_room_without_a_reason#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_cannot_knock_on_a_room_they_are_already_in"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_cannot_knock_on_a_room_they_are_already_in#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_cannot_knock_on_a_room_they_are_already_invited_to"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_cannot_knock_on_a_room_they_are_already_invited_to#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_in_the_room_can_accept_a_knock"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_in_the_room_can_accept_a_knock#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_in_the_room_can_reject_a_knock"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_in_the_room_can_reject_a_knock#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_has_already_knocked_is_allowed_to_knock_again_on_the_same_room"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_has_already_knocked_is_allowed_to_knock_again_on_the_same_room#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_has_knocked_on_a_local_room_can_rescind_their_knock_and_then_knock_again"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_is_banned_from_a_room_cannot_knock_on_it"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_is_banned_from_a_room_cannot_knock_on_it#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Knocking_on_a_room_with_a_join_rule_other_than_'knock'_should_fail"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Knocking_on_a_room_with_a_join_rule_other_than_'knock'_should_fail#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Knocking_on_a_room_with_join_rule_'knock'_should_succeed"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Knocking_on_a_room_with_join_rule_'knock'_should_succeed#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Users_in_the_room_see_a_user's_membership_update_when_they_knock"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Users_in_the_room_see_a_user's_membership_update_when_they_knock#01"
}
{
"Action": "fail",
"Test": "TestKnocking/Knocking_on_a_room_with_a_join_rule_other_than_'knock'_should_fail"
}
{
"Action": "fail",
"Test": "TestKnocking/Knocking_on_a_room_with_a_join_rule_other_than_'knock'_should_fail#01"
}
{
"Action": "fail",
"Test": "TestKnocking/Knocking_on_a_room_with_join_rule_'knock'_should_succeed"
}
{
"Action": "fail",
"Test": "TestKnocking/Knocking_on_a_room_with_join_rule_'knock'_should_succeed#01"
}
{
"Action": "fail",
"Test": "TestKnocking/Users_in_the_room_see_a_user's_membership_update_when_they_knock"
}
{
"Action": "fail",
"Test": "TestKnocking/Users_in_the_room_see_a_user's_membership_update_when_they_knock#01"
}
{
"Action": "fail",
"Test": "TestKnockRoomsInPublicRoomsDirectory"
}
{
"Action": "fail",
"Test": "TestKnockRoomsInPublicRoomsDirectoryInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestLocalPngThumbnail"
}
{
"Action": "fail",
"Test": "TestMediaFilenames"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/ASCII"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_download_file_'name;with;semicolons'"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_download_file_'name_with_spaces'"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/Unicode"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/Unicode/Can_download_specifying_a_different_Unicode_file_name"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/Unicode/Can_download_with_Unicode_file_name_locally"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/Unicode/Can_download_with_Unicode_file_name_over_federation"
}
{
"Action": "fail",
"Test": "TestNetworkPartitionOrdering"
}
{
"Action": "fail",
"Test": "TestOutboundFederationIgnoresMissingEventWithBadJSONForRoomVersion6"
}
{
"Action": "fail",
"Test": "TestRemotePresence"
}
{
"Action": "fail",
"Test": "TestRemotePresence/Presence_changes_are_also_reported_to_remote_room_members"
}
{
"Action": "fail",
"Test": "TestRemotePresence/Presence_changes_to_UNAVAILABLE_are_reported_to_remote_room_members"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsLocalJoin"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_succeed_when_joined_to_allowed_room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_succeed_when_joined_to_allowed_room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoin"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinFailOver"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinFailOverInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_succeed_when_joined_to_allowed_room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_succeed_when_joined_to_allowed_room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinLocalUser"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinLocalUserInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsSpacesSummaryFederation"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsSpacesSummaryLocal"
}
{
"Action": "fail",
"Test": "TestToDeviceMessagesOverFederation"
}
{
"Action": "fail",
"Test": "TestToDeviceMessagesOverFederation/interrupted_connectivity"
}
{
"Action": "fail",
"Test": "TestToDeviceMessagesOverFederation/stopped_server"
}
{
"Action": "fail",
"Test": "TestUnbanViaInvite"
}
{
"Action": "fail",
"Test": "TestUnknownEndpoints"
}
{
"Action": "fail",
"Test": "TestUnknownEndpoints/Key_endpoints"
}
{
"Action": "fail",
"Test": "TestUnrejectRejectedEvents"
}

View file

@ -1,896 +0,0 @@
{
"Action": "fail",
"Test": "TestBannedUserCannotSendJoin"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/event_with_mismatched_state_key"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/invite_event"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/join_event"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/leave_event"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/non-state_membership_event"
}
{
"Action": "fail",
"Test": "TestCannotSendKnockViaSendKnockInMSC3787Room/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV1"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV1/leave_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV1/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV2"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV2/leave_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonJoinViaSendJoinV2/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/event_with_mismatched_state_key"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/invite_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/join_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/leave_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/non-state_membership_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonKnockViaSendKnock/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/event_with_mismatched_state_key"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/invite_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/join_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/knock_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/non-state_membership_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV1/regular_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/event_with_mismatched_state_key"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/invite_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/join_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/knock_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/non-state_membership_event"
}
{
"Action": "fail",
"Test": "TestCannotSendNonLeaveViaSendLeaveV2/regular_event"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummaryJoinRules"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/max_depth"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/pagination"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/query_whole_graph"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/redact_link"
}
{
"Action": "fail",
"Test": "TestClientSpacesSummary/suggested_only"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederation"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederation/good_connectivity"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederation/interrupted_connectivity"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederationOnRoomJoin"
}
{
"Action": "fail",
"Test": "TestDeviceListsUpdateOverFederation/stopped_server"
}
{
"Action": "fail",
"Test": "TestEventAuth"
}
{
"Action": "fail",
"Test": "TestFederationKeyUploadQuery"
}
{
"Action": "fail",
"Test": "TestFederationKeyUploadQuery/Can_claim_remote_one_time_key_using_POST"
}
{
"Action": "fail",
"Test": "TestFederationKeyUploadQuery/Can_query_remote_device_keys_using_POST"
}
{
"Action": "fail",
"Test": "TestFederationRejectInvite"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel/Invited_user_can_reject_invite_over_federation"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel/Invited_user_can_reject_invite_over_federation_several_times"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel/Invited_user_has_'is_direct'_flag_in_prev_content_after_joining"
}
{
"Action": "fail",
"Test": "TestFederationRoomsInvite/Parallel/Remote_invited_user_can_see_room_metadata"
}
{
"Action": "fail",
"Test": "TestGetMissingEventsGapFilling"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents/Inbound_federation_can_return_missing_events_for_invited_visibility"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents/Inbound_federation_can_return_missing_events_for_joined_visibility"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents/Inbound_federation_can_return_missing_events_for_shared_visibility"
}
{
"Action": "fail",
"Test": "TestInboundCanReturnMissingEvents/Inbound_federation_can_return_missing_events_for_world_readable_visibility"
}
{
"Action": "fail",
"Test": "TestInboundFederationRejectsEventsWithRejectedAuthEvents"
}
{
"Action": "fail",
"Test": "TestJoinFederatedRoomFromApplicationServiceBridgeUser"
}
{
"Action": "fail",
"Test": "TestJumpToDateEndpoint"
}
{
"Action": "fail",
"Test": "TestKnocking"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_can_knock_on_a_room_without_a_reason"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_can_knock_on_a_room_without_a_reason#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_cannot_knock_on_a_room_they_are_already_in"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_cannot_knock_on_a_room_they_are_already_in#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_cannot_knock_on_a_room_they_are_already_invited_to"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_cannot_knock_on_a_room_they_are_already_invited_to#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_in_the_room_can_reject_a_knock"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_in_the_room_can_reject_a_knock#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_has_already_knocked_is_allowed_to_knock_again_on_the_same_room"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_has_already_knocked_is_allowed_to_knock_again_on_the_same_room#01"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_has_knocked_on_a_local_room_can_rescind_their_knock_and_then_knock_again"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_is_banned_from_a_room_cannot_knock_on_it"
}
{
"Action": "fail",
"Test": "TestKnocking/A_user_that_is_banned_from_a_room_cannot_knock_on_it#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Attempting_to_join_a_room_with_join_rule_'knock'_without_an_invite_should_fail"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Attempting_to_join_a_room_with_join_rule_'knock'_without_an_invite_should_fail#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_can_knock_on_a_room_without_a_reason"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_can_knock_on_a_room_without_a_reason#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_cannot_knock_on_a_room_they_are_already_in"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_cannot_knock_on_a_room_they_are_already_in#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_cannot_knock_on_a_room_they_are_already_invited_to"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_cannot_knock_on_a_room_they_are_already_invited_to#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_in_the_room_can_accept_a_knock"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_in_the_room_can_accept_a_knock#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_in_the_room_can_reject_a_knock"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_in_the_room_can_reject_a_knock#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_has_already_knocked_is_allowed_to_knock_again_on_the_same_room"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_has_already_knocked_is_allowed_to_knock_again_on_the_same_room#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_has_knocked_on_a_local_room_can_rescind_their_knock_and_then_knock_again"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_is_banned_from_a_room_cannot_knock_on_it"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/A_user_that_is_banned_from_a_room_cannot_knock_on_it#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Knocking_on_a_room_with_a_join_rule_other_than_'knock'_should_fail"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Knocking_on_a_room_with_a_join_rule_other_than_'knock'_should_fail#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Knocking_on_a_room_with_join_rule_'knock'_should_succeed"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Knocking_on_a_room_with_join_rule_'knock'_should_succeed#01"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Users_in_the_room_see_a_user's_membership_update_when_they_knock"
}
{
"Action": "fail",
"Test": "TestKnockingInMSC3787Room/Users_in_the_room_see_a_user's_membership_update_when_they_knock#01"
}
{
"Action": "fail",
"Test": "TestKnocking/Knocking_on_a_room_with_a_join_rule_other_than_'knock'_should_fail"
}
{
"Action": "fail",
"Test": "TestKnocking/Knocking_on_a_room_with_a_join_rule_other_than_'knock'_should_fail#01"
}
{
"Action": "fail",
"Test": "TestKnocking/Knocking_on_a_room_with_join_rule_'knock'_should_succeed"
}
{
"Action": "fail",
"Test": "TestKnocking/Knocking_on_a_room_with_join_rule_'knock'_should_succeed#01"
}
{
"Action": "fail",
"Test": "TestKnocking/Users_in_the_room_see_a_user's_membership_update_when_they_knock"
}
{
"Action": "fail",
"Test": "TestKnocking/Users_in_the_room_see_a_user's_membership_update_when_they_knock#01"
}
{
"Action": "fail",
"Test": "TestKnockRoomsInPublicRoomsDirectory"
}
{
"Action": "fail",
"Test": "TestKnockRoomsInPublicRoomsDirectoryInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestLocalPngThumbnail"
}
{
"Action": "fail",
"Test": "TestMediaFilenames"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/ASCII"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_download_file_'name;with;semicolons'"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_download_file_'name_with_spaces'"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/Unicode"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/Unicode/Can_download_specifying_a_different_Unicode_file_name"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/Unicode/Can_download_with_Unicode_file_name_locally"
}
{
"Action": "fail",
"Test": "TestMediaFilenames/Parallel/Unicode/Can_download_with_Unicode_file_name_over_federation"
}
{
"Action": "fail",
"Test": "TestNetworkPartitionOrdering"
}
{
"Action": "fail",
"Test": "TestOutboundFederationIgnoresMissingEventWithBadJSONForRoomVersion6"
}
{
"Action": "fail",
"Test": "TestRemotePresence"
}
{
"Action": "fail",
"Test": "TestRemotePresence/Presence_changes_are_also_reported_to_remote_room_members"
}
{
"Action": "fail",
"Test": "TestRemotePresence/Presence_changes_to_UNAVAILABLE_are_reported_to_remote_room_members"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsLocalJoin"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_succeed_when_joined_to_allowed_room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_succeed_when_joined_to_allowed_room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoin"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinFailOver"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinFailOverInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_succeed_when_joined_to_allowed_room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_succeed_when_joined_to_allowed_room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinLocalUser"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsRemoteJoinLocalUserInMSC3787Room"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsSpacesSummaryFederation"
}
{
"Action": "fail",
"Test": "TestRestrictedRoomsSpacesSummaryLocal"
}
{
"Action": "fail",
"Test": "TestToDeviceMessagesOverFederation"
}
{
"Action": "fail",
"Test": "TestToDeviceMessagesOverFederation/interrupted_connectivity"
}
{
"Action": "fail",
"Test": "TestToDeviceMessagesOverFederation/stopped_server"
}
{
"Action": "fail",
"Test": "TestUnbanViaInvite"
}
{
"Action": "fail",
"Test": "TestUnknownEndpoints"
}
{
"Action": "fail",
"Test": "TestUnknownEndpoints/Key_endpoints"
}
{
"Action": "fail",
"Test": "TestUnrejectRejectedEvents"
}
{
"Action": "pass",
"Test": "TestACLs"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV1/event_with_mismatched_state_key"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV1/invite_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV1/knock_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV1/non-state_membership_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV2/event_with_mismatched_state_key"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV2/invite_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV2/knock_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV2/non-state_membership_event"
}
{
"Action": "pass",
"Test": "TestFederatedClientSpaces"
}
{
"Action": "pass",
"Test": "TestFederationRedactSendsWithoutEvent"
}
{
"Action": "pass",
"Test": "TestFederationRoomsInvite/Parallel/Invited_user_can_reject_invite_over_federation_for_empty_room"
}
{
"Action": "pass",
"Test": "TestInboundFederationKeys"
}
{
"Action": "pass",
"Test": "TestInboundFederationProfile"
}
{
"Action": "pass",
"Test": "TestInboundFederationProfile/Inbound_federation_can_query_profile_data"
}
{
"Action": "pass",
"Test": "TestInboundFederationProfile/Non-numeric_ports_in_server_names_are_rejected"
}
{
"Action": "pass",
"Test": "TestIsDirectFlagFederation"
}
{
"Action": "pass",
"Test": "TestIsDirectFlagLocal"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomFailOver"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents//send_join_response_missing_signatures_shouldn't_block_room_join"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents//send_join_response_with_bad_signatures_shouldn't_block_room_join"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents//send_join_response_with_state_with_unverifiable_auth_events_shouldn't_block_room_join"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents//send_join_response_with_unobtainable_keys_shouldn't_block_room_join"
}
{
"Action": "pass",
"Test": "TestJoinViaRoomIDAndServerName"
}
{
"Action": "pass",
"Test": "TestKnocking/Attempting_to_join_a_room_with_join_rule_'knock'_without_an_invite_should_fail"
}
{
"Action": "pass",
"Test": "TestKnocking/Attempting_to_join_a_room_with_join_rule_'knock'_without_an_invite_should_fail#01"
}
{
"Action": "pass",
"Test": "TestKnocking/A_user_in_the_room_can_accept_a_knock"
}
{
"Action": "pass",
"Test": "TestKnocking/A_user_in_the_room_can_accept_a_knock#01"
}
{
"Action": "pass",
"Test": "TestKnocking/Change_the_join_rule_of_a_room_from_'invite'_to_'knock'"
}
{
"Action": "pass",
"Test": "TestKnocking/Change_the_join_rule_of_a_room_from_'invite'_to_'knock'#01"
}
{
"Action": "pass",
"Test": "TestKnockingInMSC3787Room/Change_the_join_rule_of_a_room_from_'invite'_to_'knock'"
}
{
"Action": "pass",
"Test": "TestKnockingInMSC3787Room/Change_the_join_rule_of_a_room_from_'invite'_to_'knock'#01"
}
{
"Action": "pass",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_download_file_'ascii'"
}
{
"Action": "pass",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_download_specifying_a_different_ASCII_file_name"
}
{
"Action": "pass",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_upload_with_ASCII_file_name"
}
{
"Action": "pass",
"Test": "TestMediaFilenames/Parallel/Unicode/Can_upload_with_Unicode_file_name"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName/parallel"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName/parallel/Can_download_without_a_file_name_locally"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName/parallel/Can_download_without_a_file_name_over_federation"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName/parallel/Can_upload_without_a_file_name"
}
{
"Action": "pass",
"Test": "TestOutboundFederationProfile"
}
{
"Action": "pass",
"Test": "TestOutboundFederationProfile/Outbound_federation_can_query_profile_data"
}
{
"Action": "pass",
"Test": "TestOutboundFederationSend"
}
{
"Action": "pass",
"Test": "TestRemoteAliasRequestsUnderstandUnicode"
}
{
"Action": "pass",
"Test": "TestRemotePngThumbnail"
}
{
"Action": "pass",
"Test": "TestRemoteTyping"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_fail_initially"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_fail_when_left_allowed_room"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_fail_with_mangled_join_rules"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_succeed_when_invited"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_fail_initially"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_fail_when_left_allowed_room"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_fail_with_mangled_join_rules"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_succeed_when_invited"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_fail_initially"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_fail_when_left_allowed_room"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_fail_with_mangled_join_rules"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_succeed_when_invited"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_fail_initially"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_fail_when_left_allowed_room"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_fail_with_mangled_join_rules"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_succeed_when_invited"
}
{
"Action": "pass",
"Test": "TestToDeviceMessagesOverFederation/good_connectivity"
}
{
"Action": "pass",
"Test": "TestUnknownEndpoints/Client-server_endpoints"
}
{
"Action": "pass",
"Test": "TestUnknownEndpoints/Media_endpoints"
}
{
"Action": "pass",
"Test": "TestUnknownEndpoints/Server-server_endpoints"
}
{
"Action": "pass",
"Test": "TestUnknownEndpoints/Unknown_prefix"
}
{
"Action": "pass",
"Test": "TestUserAppearsInChangedDeviceListOnJoinOverFederation"
}
{
"Action": "pass",
"Test": "TestWriteMDirectAccountData"
}
{
"Action": "skip",
"Test": "TestMediaFilenames/Parallel/Unicode/Will_serve_safe_media_types_as_inline"
}
{
"Action": "skip",
"Test": "TestMediaFilenames/Parallel/Unicode/Will_serve_safe_media_types_with_parameters_as_inline"
}
{
"Action": "skip",
"Test": "TestMediaFilenames/Parallel/Unicode/Will_serve_unsafe_media_types_as_attachments"
}
{
"Action": "skip",
"Test": "TestSendJoinPartialStateResponse"
}

View file

@ -1,284 +0,0 @@
{
"Action": "pass",
"Test": "TestACLs"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV1/event_with_mismatched_state_key"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV1/invite_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV1/knock_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV1/non-state_membership_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV2/event_with_mismatched_state_key"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV2/invite_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV2/knock_event"
}
{
"Action": "pass",
"Test": "TestCannotSendNonJoinViaSendJoinV2/non-state_membership_event"
}
{
"Action": "pass",
"Test": "TestFederatedClientSpaces"
}
{
"Action": "pass",
"Test": "TestFederationRedactSendsWithoutEvent"
}
{
"Action": "pass",
"Test": "TestFederationRoomsInvite/Parallel/Invited_user_can_reject_invite_over_federation_for_empty_room"
}
{
"Action": "pass",
"Test": "TestInboundFederationKeys"
}
{
"Action": "pass",
"Test": "TestInboundFederationProfile"
}
{
"Action": "pass",
"Test": "TestInboundFederationProfile/Inbound_federation_can_query_profile_data"
}
{
"Action": "pass",
"Test": "TestInboundFederationProfile/Non-numeric_ports_in_server_names_are_rejected"
}
{
"Action": "pass",
"Test": "TestIsDirectFlagFederation"
}
{
"Action": "pass",
"Test": "TestIsDirectFlagLocal"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomFailOver"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents//send_join_response_missing_signatures_shouldn't_block_room_join"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents//send_join_response_with_bad_signatures_shouldn't_block_room_join"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents//send_join_response_with_state_with_unverifiable_auth_events_shouldn't_block_room_join"
}
{
"Action": "pass",
"Test": "TestJoinFederatedRoomWithUnverifiableEvents//send_join_response_with_unobtainable_keys_shouldn't_block_room_join"
}
{
"Action": "pass",
"Test": "TestJoinViaRoomIDAndServerName"
}
{
"Action": "pass",
"Test": "TestKnocking/Attempting_to_join_a_room_with_join_rule_'knock'_without_an_invite_should_fail"
}
{
"Action": "pass",
"Test": "TestKnocking/Attempting_to_join_a_room_with_join_rule_'knock'_without_an_invite_should_fail#01"
}
{
"Action": "pass",
"Test": "TestKnocking/A_user_in_the_room_can_accept_a_knock"
}
{
"Action": "pass",
"Test": "TestKnocking/A_user_in_the_room_can_accept_a_knock#01"
}
{
"Action": "pass",
"Test": "TestKnocking/Change_the_join_rule_of_a_room_from_'invite'_to_'knock'"
}
{
"Action": "pass",
"Test": "TestKnocking/Change_the_join_rule_of_a_room_from_'invite'_to_'knock'#01"
}
{
"Action": "pass",
"Test": "TestKnockingInMSC3787Room/Change_the_join_rule_of_a_room_from_'invite'_to_'knock'"
}
{
"Action": "pass",
"Test": "TestKnockingInMSC3787Room/Change_the_join_rule_of_a_room_from_'invite'_to_'knock'#01"
}
{
"Action": "pass",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_download_file_'ascii'"
}
{
"Action": "pass",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_download_specifying_a_different_ASCII_file_name"
}
{
"Action": "pass",
"Test": "TestMediaFilenames/Parallel/ASCII/Can_upload_with_ASCII_file_name"
}
{
"Action": "pass",
"Test": "TestMediaFilenames/Parallel/Unicode/Can_upload_with_Unicode_file_name"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName/parallel"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName/parallel/Can_download_without_a_file_name_locally"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName/parallel/Can_download_without_a_file_name_over_federation"
}
{
"Action": "pass",
"Test": "TestMediaWithoutFileName/parallel/Can_upload_without_a_file_name"
}
{
"Action": "pass",
"Test": "TestOutboundFederationProfile"
}
{
"Action": "pass",
"Test": "TestOutboundFederationProfile/Outbound_federation_can_query_profile_data"
}
{
"Action": "pass",
"Test": "TestOutboundFederationSend"
}
{
"Action": "pass",
"Test": "TestRemoteAliasRequestsUnderstandUnicode"
}
{
"Action": "pass",
"Test": "TestRemotePngThumbnail"
}
{
"Action": "pass",
"Test": "TestRemoteTyping"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_fail_initially"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_fail_when_left_allowed_room"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_fail_with_mangled_join_rules"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoinInMSC3787Room/Join_should_succeed_when_invited"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_fail_initially"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_fail_when_left_allowed_room"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_fail_with_mangled_join_rules"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsLocalJoin/Join_should_succeed_when_invited"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_fail_initially"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_fail_when_left_allowed_room"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_fail_with_mangled_join_rules"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoinInMSC3787Room/Join_should_succeed_when_invited"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_fail_initially"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_fail_when_left_allowed_room"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_fail_with_mangled_join_rules"
}
{
"Action": "pass",
"Test": "TestRestrictedRoomsRemoteJoin/Join_should_succeed_when_invited"
}
{
"Action": "pass",
"Test": "TestToDeviceMessagesOverFederation/good_connectivity"
}
{
"Action": "pass",
"Test": "TestUnknownEndpoints/Client-server_endpoints"
}
{
"Action": "pass",
"Test": "TestUnknownEndpoints/Media_endpoints"
}
{
"Action": "pass",
"Test": "TestUnknownEndpoints/Server-server_endpoints"
}
{
"Action": "pass",
"Test": "TestUnknownEndpoints/Unknown_prefix"
}
{
"Action": "pass",
"Test": "TestUserAppearsInChangedDeviceListOnJoinOverFederation"
}
{
"Action": "pass",
"Test": "TestWriteMDirectAccountData"
}