#cargo-features = ["profile-rustflags"] [workspace] resolver = "2" members = ["src/*"] default-members = ["src/*"] [workspace.package] authors = [ "strawberry ", "timokoesters ", ] categories = ["network-programming"] description = "a very cool fork of Conduit, a Matrix homeserver written in Rust" edition = "2021" homepage = "https://conduwuit.puppyirl.gay/" keywords = ["chat", "matrix", "server", "uwu"] license = "Apache-2.0" # See also `rust-toolchain.toml` readme = "README.md" repository = "https://github.com/girlbossceo/conduwuit" rust-version = "1.80.0" version = "0.4.6" [workspace.metadata.crane] name = "conduit" [workspace.dependencies.const-str] version = "0.5.7" [workspace.dependencies.ctor] version = "0.2.8" [workspace.dependencies.cargo_toml] version = "0.20" default-features = false features = ["features"] [workspace.dependencies.toml] version = "0.8.14" default-features = false features = ["parse"] [workspace.dependencies.sanitize-filename] version = "0.5.0" [workspace.dependencies.jsonwebtoken] version = "9.3.0" [workspace.dependencies.base64] version = "0.22.1" # used for TURN server authentication [workspace.dependencies.hmac] version = "0.12.1" [workspace.dependencies.sha-1] version = "0.10.1" # used for checking if an IP is in specific subnets / CIDR ranges easier [workspace.dependencies.ipaddress] version = "0.1.3" [workspace.dependencies.rand] version = "0.8.5" # Used for the http request / response body type for Ruma endpoints used with reqwest [workspace.dependencies.bytes] version = "1.6.1" [workspace.dependencies.http-body-util] version = "0.1.1" [workspace.dependencies.http] version = "1.1.0" [workspace.dependencies.regex] version = "1.10.4" [workspace.dependencies.axum] version = "0.7.5" default-features = false features = [ "form", "http1", "http2", "json", "matched-path", "tokio", "tracing", ] [workspace.dependencies.axum-extra] version = "0.9.3" default-features = false features = ["typed-header", "tracing"] [workspace.dependencies.axum-server] version = "0.6.0" default-features = false features = ["tls-rustls"] [workspace.dependencies.axum-client-ip] version = "0.6.0" [workspace.dependencies.tower] version = "0.4.13" default-features = false features = ["util"] [workspace.dependencies.tower-http] version = "0.5.2" default-features = false features = [ "add-extension", "cors", "sensitive-headers", "set-header", "trace", "util", "catch-panic", ] [workspace.dependencies.reqwest] version = "0.12.4" default-features = false features = [ "rustls-tls-native-roots", "socks", "hickory-dns", "http2", ] [workspace.dependencies.serde] version = "1.0.204" default-features = false features = ["rc"] [workspace.dependencies.serde_json] version = "1.0.121" default-features = false features = ["raw_value"] # Used for appservice registration files [workspace.dependencies.serde_yaml] version = "0.9.34" # Used to load forbidden room/user regex from config [workspace.dependencies.serde_regex] version = "1.1.0" # Used for ruma wrapper [workspace.dependencies.serde_html_form] version = "0.2.6" # Used for password hashing [workspace.dependencies.argon2] version = "0.5.3" features = ["alloc", "rand"] default-features = false # Used to generate thumbnails for images [workspace.dependencies.image] version = "0.25.1" default-features = false features = [ "jpeg", "png", "gif", "webp", ] # logging [workspace.dependencies.log] version = "0.4.21" default-features = false [workspace.dependencies.tracing] version = "0.1.40" default-features = false [workspace.dependencies.tracing-subscriber] version = "0.3.18" features = ["env-filter"] [workspace.dependencies.tracing-core] version = "0.1.32" # for URL previews [workspace.dependencies.webpage] version = "2.0.1" default-features = false # used for conduit's CLI and admin room command parsing [workspace.dependencies.clap] version = "4.5.9" default-features = false features = [ "std", "derive", "help", "usage", "error-context", "string", ] [workspace.dependencies.futures-util] version = "0.3.30" default-features = false [workspace.dependencies.tokio] version = "1.39.2" default-features = false features = [ "fs", "net", "macros", "sync", "signal", "time", "rt-multi-thread", "io-util", ] [workspace.dependencies.tokio-metrics] version = "0.3.1" [workspace.dependencies.libloading] version = "0.8.5" # Validating urls in config, was already a transitive dependency [workspace.dependencies.url] version = "2.5.0" default-features = false features = ["serde"] # standard date and time tools [workspace.dependencies.chrono] version = "0.4.38" features = ["alloc", "std"] default-features = false [workspace.dependencies.hyper] version = "1.4.1" default-features = false features = [ "server", "http1", "http2", ] [workspace.dependencies.hyper-util] version = "0.1.6" default-features = false features = [ "client", "server-auto", "server-graceful", "service", "tokio", ] # to support multiple variations of setting a config option [workspace.dependencies.either] version = "1.11.0" default-features = false features = ["serde"] # Used for reading the configuration from conduwuit.toml & environment variables [workspace.dependencies.figment] version = "0.10.18" default-features = false features = ["env", "toml"] [workspace.dependencies.hickory-resolver] version = "0.24.1" default-features = false # Used for conduit::Error type [workspace.dependencies.thiserror] version = "1.0.63" # Used when hashing the state [workspace.dependencies.ring] version = "0.17.8" # Used to make working with iterators easier, was already a transitive depdendency [workspace.dependencies.itertools] version = "0.13.0" # to parse user-friendly time durations in admin commands #TODO: overlaps chrono? [workspace.dependencies.cyborgtime] version = "2.1.1" # used to replace the channels of the tokio runtime [workspace.dependencies.loole] version = "0.3.1" [workspace.dependencies.async-trait] version = "0.1.81" [workspace.dependencies.lru-cache] version = "0.1.2" # Used for matrix spec type definitions and helpers [workspace.dependencies.ruma] git = "https://github.com/girlbossceo/ruwuma" #branch = "conduwuit-changes" rev = "c76e2873c1593a3308d4ba3e0e4a1db65acf8536" features = [ "compat", "rand", "appservice-api-c", "client-api", "federation-api", "markdown", "push-gateway-api-c", "state-res", "server-util", "unstable-exhaustive-types", "ring-compat", "identifiers-validation", "unstable-unspecified", "unstable-msc2448", "unstable-msc2666", "unstable-msc2867", "unstable-msc2870", "unstable-msc3026", "unstable-msc3061", "unstable-msc3266", "unstable-msc3575", "unstable-msc4121", "unstable-msc4125", "unstable-extensible-events", ] [workspace.dependencies.rust-rocksdb] path = "deps/rust-rocksdb" package = "rust-rocksdb-uwu" features = [ "multi-threaded-cf", "mt_static", "lz4", "zstd", "zlib", "bzip2", ] # to listen on both HTTP and HTTPS if listening on TLS dierctly from conduwuit for complement or sytest [workspace.dependencies.axum-server-dual-protocol] version = "0.6" # optional SHA256 media keys feature [workspace.dependencies.sha2] version = "0.10.8" # optional opentelemetry, performance measurements, flamegraphs, etc for performance measurements and monitoring [workspace.dependencies.opentelemetry] version = "0.21.0" [workspace.dependencies.tracing-flame] version = "0.2.0" [workspace.dependencies.tracing-opentelemetry] version = "0.22.0" [workspace.dependencies.opentelemetry_sdk] version = "0.21.2" features = ["rt-tokio"] [workspace.dependencies.opentelemetry-jaeger] version = "0.20.0" features = ["rt-tokio"] # optional sentry metrics for crash/panic reporting [workspace.dependencies.sentry] version = "0.34.0" default-features = false features = [ "backtrace", "contexts", "debug-images", "panic", "rustls", "tower", "tower-http", "tracing", "reqwest", "log", ] [workspace.dependencies.sentry-tracing] version = "0.34.0" [workspace.dependencies.sentry-tower] version = "0.34.0" # jemalloc usage # locked to 0.5.4 due to static binary linking breakage [workspace.dependencies.tikv-jemalloc-sys] version = "=0.5.4" default-features = false features = ["stats", "unprefixed_malloc_on_supported_platforms"] [workspace.dependencies.tikv-jemallocator] version = "=0.5.4" default-features = false features = ["stats", "unprefixed_malloc_on_supported_platforms"] [workspace.dependencies.tikv-jemalloc-ctl] version = "=0.5.4" default-features = false features = ["use_std"] [workspace.dependencies.console-subscriber] version = "0.4" [workspace.dependencies.nix] version = "0.29.0" default-features = false features = ["resource"] [workspace.dependencies.sd-notify] version = "0.4.1" [workspace.dependencies.hardened_malloc-rs] version = "0.1.2" default-features = false features = [ "static", "gcc", "light", ] [workspace.dependencies.rustyline-async] version = "0.4.2" default-features = false [workspace.dependencies.termimad] version = "0.29.4" default-features = false [workspace.dependencies.checked_ops] version = "0.1" [workspace.dependencies.syn] version = "2.0.72" default-features = false features = ["full", "extra-traits"] [workspace.dependencies.quote] version = "1.0.36" [workspace.dependencies.proc-macro2] version = "1.0.86" # # Patches # # backport of [https://github.com/tokio-rs/tracing/pull/2956] to the 0.1.x branch of tracing. # we can switch back to upstream if #2956 is merged and backported in the upstream repo. # https://github.com/girlbossceo/tracing/commit/b348dca742af641c47bc390261f60711c2af573c [patch.crates-io.tracing-subscriber] git = "https://github.com/girlbossceo/tracing" rev = "4d78a14a5e03f539b8c6b475aefa08bb14e4de91" [patch.crates-io.tracing] git = "https://github.com/girlbossceo/tracing" rev = "4d78a14a5e03f539b8c6b475aefa08bb14e4de91" [patch.crates-io.tracing-core] git = "https://github.com/girlbossceo/tracing" rev = "4d78a14a5e03f539b8c6b475aefa08bb14e4de91" [patch.crates-io.tracing-log] git = "https://github.com/girlbossceo/tracing" rev = "4d78a14a5e03f539b8c6b475aefa08bb14e4de91" # fixes hyper graceful shutdowns [https://github.com/programatik29/axum-server/issues/114] # https://github.com/girlbossceo/axum-server/commit/8e3368d899079818934e61cc9c839abcbbcada8a [patch.crates-io.axum-server] git = "https://github.com/girlbossceo/axum-server" rev = "8e3368d899079818934e61cc9c839abcbbcada8a" # adds a tab completion callback: https://github.com/girlbossceo/rustyline-async/commit/de26100b0db03e419a3d8e1dd26895d170d1fe50 # adds event for CTRL+\: https://github.com/girlbossceo/rustyline-async/commit/67d8c49aeac03a5ef4e818f663eaa94dd7bf339b [patch.crates-io.rustyline-async] git = "https://github.com/girlbossceo/rustyline-async" rev = "de26100b0db03e419a3d8e1dd26895d170d1fe50" # # Our crates # [workspace.dependencies.conduit-router] package = "conduit_router" path = "src/router" default-features = false [workspace.dependencies.conduit-admin] package = "conduit_admin" path = "src/admin" default-features = false [workspace.dependencies.conduit-api] package = "conduit_api" path = "src/api" default-features = false [workspace.dependencies.conduit-service] package = "conduit_service" path = "src/service" default-features = false [workspace.dependencies.conduit-database] package = "conduit_database" path = "src/database" default-features = false [workspace.dependencies.conduit-core] package = "conduit_core" path = "src/core" default-features = false [workspace.dependencies.conduit-macros] package = "conduit_macros" path = "src/macros" default-features = false ############################################################################### # # Release profiles # [profile.release] strip = "symbols" lto = "thin" # release profile with debug symbols [profile.release-debuginfo] inherits = "release" debug = "full" strip = "none" [profile.release-high-perf] inherits = "release" lto = "fat" codegen-units = 1 panic = "abort" # do not use without profile-rustflags enabled [profile.release-max-perf] inherits = "release" strip = "symbols" lto = "fat" #rustflags = [ # '-Ctarget-cpu=native', # '-Ztune-cpu=native', # '-Ctarget-feature=+crt-static', # '-Crelocation-model=static', # '-Ztls-model=local-exec', # '-Zinline-in-all-cgus=true', # '-Zinline-mir=true', # '-Zmir-opt-level=3', # '-Clink-arg=-fuse-ld=gold', # '-Clink-arg=-Wl,--threads', # '-Clink-arg=-Wl,--gc-sections', # '-Clink-arg=-luring', # '-Clink-arg=-lstdc++', # '-Clink-arg=-lc', # '-Ztime-passes', # '-Ztime-llvm-passes', #] [profile.release-max-perf.build-override] inherits = "release-max-perf" opt-level = 0 #rustflags = [ # '-Ctarget-feature=-crt-static', #] [profile.bench] inherits = "release" #rustflags = [ # "-Cremark=all", # '-Ztime-passes', # '-Ztime-llvm-passes', #] ############################################################################### # # Developer profile # # To enable hot-reloading: # 1. Uncomment all of the rustflags here. # 2. Uncomment crate-type=dylib in src/*/Cargo.toml and deps/rust-rocksdb/Cargo.toml # # opt-level, mir-opt-level, validate-mir are not known to interfere with reloading # and can be raised if build times are tolerable. [profile.dev] debug = 1 opt-level = 0 panic = "unwind" debug-assertions = true incremental = true codegen-units = 64 #rustflags = [ # '--cfg', 'conduit_mods', # '-Ztime-passes', # '-Zmir-opt-level=0', # '-Zvalidate-mir=false', # '-Ztls-model=global-dynamic', # '-Cprefer-dynamic=true', # '-Zstaticlib-prefer-dynamic=true', # '-Zstaticlib-allow-rdylib-deps=true', # '-Zpacked-bundled-libs=false', # '-Zplt=true', # '-Crpath=true', # '-Clink-arg=-Wl,--as-needed', # '-Clink-arg=-Wl,--allow-shlib-undefined', # '-Clink-arg=-Wl,-z,keep-text-section-prefix', # '-Clink-arg=-Wl,-z,lazy', #] [profile.dev.package.conduit_core] inherits = "dev" incremental = false #rustflags = [ # '--cfg', 'conduit_mods', # '-Ztime-passes', # '-Zmir-opt-level=0', # '-Ztls-model=initial-exec', # '-Cprefer-dynamic=true', # '-Zstaticlib-prefer-dynamic=true', # '-Zstaticlib-allow-rdylib-deps=true', # '-Zpacked-bundled-libs=false', # '-Zplt=true', # '-Clink-arg=-Wl,--as-needed', # '-Clink-arg=-Wl,--allow-shlib-undefined', # '-Clink-arg=-Wl,-z,lazy', # '-Clink-arg=-Wl,-z,unique', # '-Clink-arg=-Wl,-z,nodlopen', # '-Clink-arg=-Wl,-z,nodelete', #] [profile.dev.package.conduit] inherits = "dev" incremental = false #rustflags = [ # '--cfg', 'conduit_mods', # '-Ztime-passes', # '-Zmir-opt-level=0', # '-Zvalidate-mir=false', # '-Ztls-model=global-dynamic', # '-Cprefer-dynamic=true', # '-Zexport-executable-symbols=true', # '-Zplt=true', # '-Crpath=true', # '-Clink-arg=-Wl,--as-needed', # '-Clink-arg=-Wl,--allow-shlib-undefined', # '-Clink-arg=-Wl,--export-dynamic', # '-Clink-arg=-Wl,-z,lazy', #] [profile.dev.package.rust-rocksdb-uwu] inherits = "dev" debug = 'limited' incremental = false codegen-units = 1 opt-level = 'z' #rustflags = [ # '--cfg', 'conduit_mods', # '-Ztls-model=initial-exec', # '-Cprefer-dynamic=true', # '-Zstaticlib-prefer-dynamic=true', # '-Zstaticlib-allow-rdylib-deps=true', # '-Zpacked-bundled-libs=true', # '-Zplt=true', # '-Clink-arg=-Wl,--no-as-needed', # '-Clink-arg=-Wl,--allow-shlib-undefined', # '-Clink-arg=-Wl,-z,lazy', # '-Clink-arg=-Wl,-z,nodlopen', # '-Clink-arg=-Wl,-z,nodelete', #] [profile.dev.package.'*'] inherits = "dev" debug = 'limited' incremental = false codegen-units = 1 opt-level = 'z' #rustflags = [ # '--cfg', 'conduit_mods', # '-Ztls-model=global-dynamic', # '-Cprefer-dynamic=true', # '-Zstaticlib-prefer-dynamic=true', # '-Zstaticlib-allow-rdylib-deps=true', # '-Zpacked-bundled-libs=true', # '-Zplt=true', # '-Clink-arg=-Wl,--as-needed', # '-Clink-arg=-Wl,-z,lazy', # '-Clink-arg=-Wl,-z,nodelete', #] # primarily used for CI [profile.test] inherits = "dev" codegen-units = 16 incremental = false [profile.test.package.'*'] inherits = "dev" debug = 0 codegen-units = 16 incremental = false ############################################################################### # # Linting # [workspace.lints.rust] absolute-paths-not-starting-with-crate = "warn" #box-pointers = "warn" deprecated-in-future = "warn" elided-lifetimes-in-paths = "warn" explicit-outlives-requirements = "warn" ffi-unwind-calls = "warn" keyword-idents = "warn" macro-use-extern-crate = "warn" meta-variable-misuse = "warn" missing-abi = "warn" #missing-copy-implementations = "warn" # TODO #missing-debug-implementations = "warn" # TODO non-ascii-idents = "warn" rust-2021-incompatible-closure-captures = "warn" rust-2021-incompatible-or-patterns = "warn" rust-2021-prefixes-incompatible-syntax = "warn" rust-2021-prelude-collisions = "warn" single-use-lifetimes = "warn" trivial-casts = "warn" trivial-numeric-casts = "warn" unit-bindings = "warn" #unnameable-types = "warn" # TODO unreachable-pub = "warn" unsafe-op-in-unsafe-fn = "warn" unstable-features = "warn" unused-extern-crates = "warn" unused-import-braces = "warn" unused-lifetimes = "warn" unused-macro-rules = "warn" unused-qualifications = "warn" #unused-results = "warn" # TODO ## some sadness let_underscore_drop = "allow" missing_docs = "allow" # cfgs cannot be limited to expected cfgs or their de facto non-transitive/opt-in use-case e.g. # tokio_unstable will warn. unexpected_cfgs = "allow" # this seems to suggest broken code and is not working correctly unused_braces = "allow" # buggy, but worth checking on occasionally unused_crate_dependencies = "allow" unsafe_code = "allow" variant_size_differences = "allow" ####################################### # # Clippy lints # [workspace.lints.clippy] ################### cargo = { level = "warn", priority = -1 } ## some sadness multiple_crate_versions = { level = "allow", priority = 1 } ################### complexity = { level = "warn", priority = -1 } ################### correctness = { level = "warn", priority = -1 } ################### nursery = { level = "warn", priority = -1 } ## some sadness missing_const_for_fn = { level = "allow", priority = 1 } # TODO option_if_let_else = { level = "allow", priority = 1 } # TODO redundant_pub_crate = { level = "allow", priority = 1 } # TODO significant_drop_in_scrutinee = { level = "allow", priority = 1 } # TODO significant_drop_tightening = { level = "allow", priority = 1 } # TODO ################### pedantic = { level = "warn", priority = -1 } ## some sadness doc_markdown = { level = "allow", priority = 1 } enum_glob_use = { level = "allow", priority = 1 } if_not_else = { level = "allow", priority = 1 } if_then_some_else_none = { level = "allow", priority = 1 } inline_always = { level = "allow", priority = 1 } missing_docs_in_private_items = { level = "allow", priority = 1 } missing_errors_doc = { level = "allow", priority = 1 } missing_panics_doc = { level = "allow", priority = 1 } module_name_repetitions = { level = "allow", priority = 1 } no_effect_underscore_binding = { level = "allow", priority = 1 } similar_names = { level = "allow", priority = 1 } struct_field_names = { level = "allow", priority = 1 } unnecessary_wraps = { level = "allow", priority = 1 } unused_async = { level = "allow", priority = 1 } ################### perf = { level = "warn", priority = -1 } ################### #restriction = "warn" #allow_attributes = "warn" # UNSTABLE arithmetic_side_effects = "warn" as_conversions = "warn" as_underscore = "warn" assertions_on_result_states = "warn" dbg_macro = "warn" default_union_representation = "warn" deref_by_slicing = "warn" empty_drop = "warn" empty_structs_with_brackets = "warn" exit = "warn" filetype_is_file = "warn" float_cmp_const = "warn" fn_to_numeric_cast_any = "warn" format_push_string = "warn" get_unwrap = "warn" impl_trait_in_params = "warn" let_underscore_untyped = "warn" lossy_float_literal = "warn" mem_forget = "warn" missing_assert_message = "warn" mutex_atomic = "warn" pub_without_shorthand = "warn" rc_buffer = "warn" rc_mutex = "warn" redundant_type_annotations = "warn" rest_pat_in_fully_bound_structs = "warn" semicolon_outside_block = "warn" str_to_string = "warn" string_lit_chars_any = "warn" string_slice = "warn" string_to_string = "warn" suspicious_xor_used_as_pow = "warn" tests_outside_test_module = "warn" try_err = "warn" undocumented_unsafe_blocks = "warn" unnecessary_safety_comment = "warn" unnecessary_safety_doc = "warn" unnecessary_self_imports = "warn" unneeded_field_pattern = "warn" unseparated_literal_suffix = "warn" #unwrap_used = "warn" # TODO verbose_file_reads = "warn" ################### style = { level = "warn", priority = -1 } ## some sadness # trivial assertions are quite alright assertions_on_constants = { level = "allow", priority = 1 } module_inception = { level = "allow", priority = 1 } ################### suspicious = { level = "warn", priority = -1 } ## some sadness let_underscore_future = { level = "allow", priority = 1 }