Merge pull request 'Room visibility, aliases and redaction' (#40) from alias into master

next
Timo Kösters 2020-05-31 10:23:04 +02:00
commit 3aa0c8ed25
11 changed files with 574 additions and 224 deletions

201
Cargo.lock generated
View File

@ -30,9 +30,9 @@ version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26c4f3195085c36ea8d24d32b2f828d23296a9370a28aa39d111f6f16bef9f3b" checksum = "26c4f3195085c36ea8d24d32b2f828d23296a9370a28aa39d111f6f16bef9f3b"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
@ -277,9 +277,9 @@ version = "0.3.0"
source = "git+https://github.com/SergioBenitez/Devise.git?rev=e58b3ac9a#e58b3ac9afc3b6ff10a8aaf02a3e768a8f530089" source = "git+https://github.com/SergioBenitez/Devise.git?rev=e58b3ac9a#e58b3ac9afc3b6ff10a8aaf02a3e768a8f530089"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
@ -421,9 +421,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39" checksum = "d0b5a30a4328ab5473878237c447333c093297bded83a4983d10f4deea240d39"
dependencies = [ dependencies = [
"proc-macro-hack", "proc-macro-hack",
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
@ -557,9 +557,9 @@ checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9"
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "0.13.5" version = "0.13.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96816e1d921eca64d208a85aab4f7798455a8e34229ee5a88c935bdee1b78b14" checksum = "a6e7655b9594024ad0ee439f3b5a7299369dc2a3f459b47c696f9ff676f9aa1f"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures-channel", "futures-channel",
@ -571,8 +571,8 @@ dependencies = [
"httparse", "httparse",
"itoa", "itoa",
"log", "log",
"net2",
"pin-project", "pin-project",
"socket2",
"time", "time",
"tokio", "tokio",
"tower-service", "tower-service",
@ -663,9 +663,9 @@ dependencies = [
[[package]] [[package]]
name = "js-sys" name = "js-sys"
version = "0.3.39" version = "0.3.40"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa5a448de267e7358beaf4a5d849518fe9a0c13fce7afd44b06e68550e5562a7" checksum = "ce10c23ad2ea25ceca0093bd3192229da4c5b3c0f2de499c1ecac0d98d452177"
dependencies = [ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
@ -697,9 +697,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.70" version = "0.2.71"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
[[package]] [[package]]
name = "lock_api" name = "lock_api"
@ -918,9 +918,9 @@ checksum = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
[[package]] [[package]]
name = "openssl-sys" name = "openssl-sys"
version = "0.9.56" version = "0.9.57"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f02309a7f127000ed50594f0b50ecc69e7c654e16d41b4e8156d1b3df8e0b52e" checksum = "7410fef80af8ac071d4f63755c0ab89ac3df0fd1ea91f1d1f37cf5cec4395990"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"cc", "cc",
@ -1002,9 +1002,9 @@ version = "0.4.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40" checksum = "e58db2081ba5b4c93bd6be09c40fd36cb9193a8336c384f3b40012e531aa7e40"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
@ -1045,9 +1045,9 @@ checksum = "237a5ed80e274dbc66f86bd59c1e25edc039660be53194b5fe0a482e0f2612ea"
[[package]] [[package]]
name = "proc-macro-hack" name = "proc-macro-hack"
version = "0.5.15" version = "0.5.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4"
[[package]] [[package]]
name = "proc-macro-nested" name = "proc-macro-nested"
@ -1066,9 +1066,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.13" version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53f5ffe53a6b28e37c9c1ce74893477864d64f74778a93a4beb43c8fa167f639" checksum = "1502d12e458c49a4c9cbff560d0fe0060c252bc29799ed94ca2ed4bb665a0101"
dependencies = [ dependencies = [
"unicode-xid 0.2.0", "unicode-xid 0.2.0",
] ]
@ -1088,7 +1088,7 @@ version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" checksum = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
] ]
[[package]] [[package]]
@ -1195,9 +1195,9 @@ dependencies = [
[[package]] [[package]]
name = "ring" name = "ring"
version = "0.16.13" version = "0.16.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "703516ae74571f24b465b4a1431e81e2ad51336cb0ded733a55a1aa3eccac196" checksum = "06b3fefa4f12272808f809a0af618501fdaba41a58963c5fb72238ab0be09603"
dependencies = [ dependencies = [
"cc", "cc",
"libc", "libc",
@ -1229,7 +1229,7 @@ dependencies = [
"time", "time",
"tokio", "tokio",
"toml", "toml",
"version_check 0.9.1", "version_check 0.9.2",
"yansi 0.5.0", "yansi 0.5.0",
] ]
@ -1242,7 +1242,7 @@ dependencies = [
"indexmap", "indexmap",
"quote 1.0.6", "quote 1.0.6",
"rocket_http", "rocket_http",
"version_check 0.9.1", "version_check 0.9.2",
"yansi 0.5.0", "yansi 0.5.0",
] ]
@ -1277,7 +1277,7 @@ dependencies = [
"percent-encoding 2.1.0", "percent-encoding 2.1.0",
"ruma-api-macros", "ruma-api-macros",
"ruma-identifiers", "ruma-identifiers",
"ruma-serde 0.2.1", "ruma-serde",
"serde", "serde",
"serde_json", "serde_json",
"strum", "strum",
@ -1289,16 +1289,15 @@ version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52b82b4567b9af9b40a86f7778821c016ea961f55e4fee255f8f24bb28ee7452" checksum = "52b82b4567b9af9b40a86f7778821c016ea961f55e4fee255f8f24bb28ee7452"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
name = "ruma-client-api" name = "ruma-client-api"
version = "0.9.0" version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/ruma/ruma-client-api.git?rev=c725288cd099690c1d13f1a9b9e57228bc860a62#c725288cd099690c1d13f1a9b9e57228bc860a62"
checksum = "082913ad135ca55ee06a55d295bea954982f2ac5e0150adc09024f5cbb8cb6cf"
dependencies = [ dependencies = [
"http", "http",
"js_int", "js_int",
@ -1306,7 +1305,7 @@ dependencies = [
"ruma-common", "ruma-common",
"ruma-events", "ruma-events",
"ruma-identifiers", "ruma-identifiers",
"ruma-serde 0.2.1", "ruma-serde",
"serde", "serde",
"serde_json", "serde_json",
"strum", "strum",
@ -1319,47 +1318,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "253416d67b4bde281f2781424232a58a946a4f1c451d5f857a8d0705d58eaf2a" checksum = "253416d67b4bde281f2781424232a58a946a4f1c451d5f857a8d0705d58eaf2a"
dependencies = [ dependencies = [
"matches", "matches",
"ruma-serde 0.2.1", "ruma-serde",
"serde", "serde",
"serde_json", "serde_json",
] ]
[[package]] [[package]]
name = "ruma-events" name = "ruma-events"
version = "0.21.2" version = "0.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/ruma/ruma-events.git?rev=4d09416cd1663d63c22153705c9e1fd77910797f#4d09416cd1663d63c22153705c9e1fd77910797f"
checksum = "0afc6d4da07d10213478d32dc42b6222df0a1ea319e9ced9f8a341617952d909"
dependencies = [ dependencies = [
"js_int", "js_int",
"ruma-common", "ruma-common",
"ruma-events-macros", "ruma-events-macros",
"ruma-identifiers", "ruma-identifiers",
"ruma-serde 0.2.1", "ruma-serde",
"serde", "serde",
"serde_json", "serde_json",
"strum",
] ]
[[package]] [[package]]
name = "ruma-events-macros" name = "ruma-events-macros"
version = "0.21.2" version = "0.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/ruma/ruma-events.git?rev=4d09416cd1663d63c22153705c9e1fd77910797f#4d09416cd1663d63c22153705c9e1fd77910797f"
checksum = "fc706c4a53cc54c3a198cfbcd7dfff20448599d84f90e636d96034d0df5a9ac9"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
name = "ruma-federation-api" name = "ruma-federation-api"
version = "0.0.1" version = "0.0.1"
source = "git+https://github.com/ruma/ruma-federation-api.git?rev=ccbf216f39bbbaa59131cc200eae5bd18aa1947c#ccbf216f39bbbaa59131cc200eae5bd18aa1947c" source = "git+https://github.com/ruma/ruma-federation-api.git?rev=4cf4aa6ef74b25ad8c14d99d7774129f023df163#4cf4aa6ef74b25ad8c14d99d7774129f023df163"
dependencies = [ dependencies = [
"js_int", "js_int",
"matches",
"ruma-api", "ruma-api",
"ruma-events", "ruma-events",
"ruma-identifiers", "ruma-identifiers",
"ruma-serde 0.1.3", "ruma-serde",
"serde", "serde",
"serde_json", "serde_json",
] ]
@ -1376,23 +1375,9 @@ dependencies = [
[[package]] [[package]]
name = "ruma-serde" name = "ruma-serde"
version = "0.1.3" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e14edc0e2f5177c419e3b89060b1e94fb3af81b2f253783ac6967f14a7ec3911" checksum = "8c71dabb8e2709ca4f59201cb72d7fe8d590e7e3f55feb348e851c18354938af"
dependencies = [
"dtoa",
"itoa",
"js_int",
"serde",
"serde_json",
"url",
]
[[package]]
name = "ruma-serde"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0dd3d04c6755bae23101dec7426d044b773ef517932f23d5a6254c4caa1cfce3"
dependencies = [ dependencies = [
"dtoa", "dtoa",
"itoa", "itoa",
@ -1507,22 +1492,22 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.110" version = "1.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c" checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.110" version = "1.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984" checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
@ -1586,6 +1571,18 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4" checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
[[package]]
name = "socket2"
version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03088793f677dce356f3ccc2edb1b314ad191ab702a5de3faf49304f7e104918"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"winapi 0.3.8",
]
[[package]] [[package]]
name = "spin" name = "spin"
version = "0.5.2" version = "0.5.2"
@ -1614,9 +1611,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c"
dependencies = [ dependencies = [
"heck", "heck",
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
@ -1632,11 +1629,11 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.23" version = "1.0.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95b5f192649e48a5302a13f2feb224df883b98933222369e4b3b0fe2a5447269" checksum = "bb37da98a55b1d08529362d9cbb863be17556873df2585904ab9d2bc951291d0"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"unicode-xid 0.2.0", "unicode-xid 0.2.0",
] ]
@ -1657,22 +1654,22 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.18" version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5976891d6950b4f68477850b5b9e5aa64d955961466f9e174363f573e54e8ca7" checksum = "b13f926965ad00595dd129fa12823b04bbf866e9085ab0a5f2b05b850fbfc344"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "1.0.18" version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab81dbd1cd69cd2ce22ecfbdd3bdb73334ba25350649408cc6c085f46d89573d" checksum = "893582086c2f98cde18f906265a65b5030a074b1046c674ae898be6519a7f479"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
@ -1714,9 +1711,9 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
] ]
[[package]] [[package]]
@ -1782,7 +1779,7 @@ version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
dependencies = [ dependencies = [
"version_check 0.9.1", "version_check 0.9.2",
] ]
[[package]] [[package]]
@ -1852,9 +1849,9 @@ checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.1" version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
[[package]] [[package]]
name = "want" name = "want"
@ -1874,9 +1871,9 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
[[package]] [[package]]
name = "wasm-bindgen" name = "wasm-bindgen"
version = "0.2.62" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e3c7d40d09cdbf0f4895ae58cf57d92e1e57a9dd8ed2e8390514b54a47cc5551" checksum = "4c2dc4aa152834bc334f506c1a06b866416a8b6697d5c9f75b9a689c8486def0"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"serde", "serde",
@ -1886,24 +1883,24 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-backend" name = "wasm-bindgen-backend"
version = "0.2.62" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3972e137ebf830900db522d6c8fd74d1900dcfc733462e9a12e942b00b4ac94" checksum = "ded84f06e0ed21499f6184df0e0cb3494727b0c5da89534e0fcc55c51d812101"
dependencies = [ dependencies = [
"bumpalo", "bumpalo",
"lazy_static", "lazy_static",
"log", "log",
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
[[package]] [[package]]
name = "wasm-bindgen-futures" name = "wasm-bindgen-futures"
version = "0.4.12" version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a369c5e1dfb7569e14d62af4da642a3cbc2f9a3652fe586e26ac22222aa4b04" checksum = "64487204d863f109eb77e8462189d111f27cb5712cc9fdb3461297a76963a2f6"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"js-sys", "js-sys",
@ -1913,9 +1910,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro" name = "wasm-bindgen-macro"
version = "0.2.62" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cd85aa2c579e8892442954685f0d801f9129de24fa2136b2c6a539c76b65776" checksum = "838e423688dac18d73e31edce74ddfac468e37b1506ad163ffaf0a46f703ffe3"
dependencies = [ dependencies = [
"quote 1.0.6", "quote 1.0.6",
"wasm-bindgen-macro-support", "wasm-bindgen-macro-support",
@ -1923,28 +1920,28 @@ dependencies = [
[[package]] [[package]]
name = "wasm-bindgen-macro-support" name = "wasm-bindgen-macro-support"
version = "0.2.62" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8eb197bd3a47553334907ffd2f16507b4f4f01bbec3ac921a7719e0decdfe72a" checksum = "3156052d8ec77142051a533cdd686cba889537b213f948cd1d20869926e68e92"
dependencies = [ dependencies = [
"proc-macro2 1.0.13", "proc-macro2 1.0.17",
"quote 1.0.6", "quote 1.0.6",
"syn 1.0.23", "syn 1.0.29",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
[[package]] [[package]]
name = "wasm-bindgen-shared" name = "wasm-bindgen-shared"
version = "0.2.62" version = "0.2.63"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a91c2916119c17a8e316507afaaa2dd94b47646048014bbdf6bef098c1bb58ad" checksum = "c9ba19973a58daf4db6f352eda73dc0e289493cd29fb2632eb172085b6521acd"
[[package]] [[package]]
name = "web-sys" name = "web-sys"
version = "0.3.39" version = "0.3.40"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bc359e5dd3b46cb9687a051d50a2fdd228e4ba7cf6fcf861a5365c3d671a642" checksum = "7b72fe77fd39e4bd3eaa4412fd299a0be6b3dfe9d2597e2f1c20beb968f41d17"
dependencies = [ dependencies = [
"js-sys", "js-sys",
"wasm-bindgen", "wasm-bindgen",
@ -1952,9 +1949,9 @@ dependencies = [
[[package]] [[package]]
name = "webpki" name = "webpki"
version = "0.21.2" version = "0.21.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1f50e1972865d6b1adb54167d1c8ed48606004c2c9d0ea5f1eeb34d95e863ef" checksum = "ab146130f5f790d45f82aeeb09e55a256573373ec64409fc19a6fb82fb1032ae"
dependencies = [ dependencies = [
"ring", "ring",
"untrusted", "untrusted",

View File

@ -14,23 +14,26 @@ edition = "2018"
[dependencies] [dependencies]
rocket = { git = "https://github.com/SergioBenitez/Rocket.git", branch = "async", features = ["tls"] } rocket = { git = "https://github.com/SergioBenitez/Rocket.git", branch = "async", features = ["tls"] }
http = "0.2.1" http = "0.2.1"
ruma-client-api = "0.9.0" ruma-client-api = { git = "https://github.com/ruma/ruma-client-api.git", rev = "c725288cd099690c1d13f1a9b9e57228bc860a62" }
ruma-identifiers = { version = "0.16.1", features = ["rand"] } ruma-identifiers = { version = "0.16.1", features = ["rand"] }
ruma-api = "0.16.1" ruma-api = "0.16.1"
ruma-events = "0.21.2" ruma-events = { git = "https://github.com/ruma/ruma-events.git", rev = "4d09416cd1663d63c22153705c9e1fd77910797f" }
ruma-signatures = { git = "https://github.com/ruma/ruma-signatures.git", rev = "1ca545cba8dfd43e0fc8e3c18e1311fb73390a97" } ruma-signatures = { git = "https://github.com/ruma/ruma-signatures.git", rev = "1ca545cba8dfd43e0fc8e3c18e1311fb73390a97" }
ruma-federation-api = { git = "https://github.com/ruma/ruma-federation-api.git", rev = "ccbf216f39bbbaa59131cc200eae5bd18aa1947c" } ruma-federation-api = { git = "https://github.com/ruma/ruma-federation-api.git", rev = "4cf4aa6ef74b25ad8c14d99d7774129f023df163" }
log = "0.4.8" log = "0.4.8"
sled = "0.31.0" sled = "0.31.0"
directories = "2.0.2" directories = "2.0.2"
js_int = "0.1.5" js_int = "0.1.5"
serde_json = { version = "1.0.53", features = ["raw_value"] } serde_json = { version = "1.0.53", features = ["raw_value"] }
serde = "1.0.110" serde = "1.0.111"
tokio = { version = "0.2.21", features = ["macros"] } tokio = { version = "0.2.21", features = ["macros"] }
rand = "0.7.3" rand = "0.7.3"
rust-argon2 = "0.8.2" rust-argon2 = "0.8.2"
reqwest = "0.10.4" reqwest = "=0.10.4"
base64 = "0.12.1" base64 = "0.12.1"
thiserror = "1.0.18" thiserror = "1.0.19"
ruma-common = "0.1.2" ruma-common = "0.1.2"
image = { version = "0.23.4", default-features = false, features = ["jpeg", "png", "gif"] } image = { version = "0.23.4", default-features = false, features = ["jpeg", "png", "gif"] }
[patch.crates-io]
ruma-events = { git = "https://github.com/ruma/ruma-events.git", rev = "4d09416cd1663d63c22153705c9e1fd77910797f" }

View File

@ -37,7 +37,7 @@ Also check out the [milestones](https://git.koesters.xyz/timo/conduit/milestones
#### How can I contribute? #### How can I contribute?
If you want to help, you may be able to find something in the issue tracker. If you do, comment on the issue, so others know. You can also join #conduit:matrix.org and ask there. If you want to help, you may be able to find something in the issue tracker. If you do, comment on the issue, so others know. You can also join #conduit:matrix.org and ask there.
#### Donate #### Donate

View File

@ -3,6 +3,9 @@ server_name = "your.server.name"
port = 8448 port = 8448
address = "0.0.0.0" address = "0.0.0.0"
# Default path is in this user's data
#database_path = "/home/timo/MyConduitServer"
#[global.tls] #[global.tls]
#certs = "/etc/letsencrypt/live/your.server.name/fullchain.pem" #certs = "/etc/letsencrypt/live/your.server.name/fullchain.pem"
#key = "/etc/letsencrypt/live/your.server.name/privkey.pem" #key = "/etc/letsencrypt/live/your.server.name/privkey.pem"

View File

@ -5,15 +5,18 @@ use std::{
}; };
use log::{debug, warn}; use log::{debug, warn};
use rocket::{get, options, post, put, State}; use rocket::{delete, get, options, post, put, State};
use ruma_client_api::{ use ruma_client_api::{
error::{Error, ErrorKind}, error::{Error, ErrorKind},
r0::{ r0::{
account::{get_username_availability, register}, account::{get_username_availability, register},
alias::get_alias, alias::{create_alias, delete_alias, get_alias},
capabilities::get_capabilities, capabilities::get_capabilities,
config::{get_global_account_data, set_global_account_data}, config::{get_global_account_data, set_global_account_data},
directory::{self, get_public_rooms, get_public_rooms_filtered}, directory::{
self, get_public_rooms, get_public_rooms_filtered, get_room_visibility,
set_room_visibility,
},
filter::{self, create_filter, get_filter}, filter::{self, create_filter, get_filter},
keys::{claim_keys, get_keys, upload_keys}, keys::{claim_keys, get_keys, upload_keys},
media::{create_content, get_content, get_content_thumbnail, get_media_config}, media::{create_content, get_content, get_content_thumbnail, get_media_config},
@ -28,6 +31,7 @@ use ruma_client_api::{
}, },
push::{get_pushrules_all, set_pushrule, set_pushrule_enabled}, push::{get_pushrules_all, set_pushrule, set_pushrule_enabled},
read_marker::set_read_marker, read_marker::set_read_marker,
redact::redact_event,
room::{self, create_room}, room::{self, create_room},
session::{get_login_types, login, logout}, session::{get_login_types, login, logout},
state::{ state::{
@ -45,10 +49,10 @@ use ruma_client_api::{
}; };
use ruma_events::{ use ruma_events::{
collections::only::Event as EduEvent, collections::only::Event as EduEvent,
room::{guest_access, history_visibility, join_rules, member}, room::{canonical_alias, guest_access, history_visibility, join_rules, member, redaction},
EventJson, EventType, EventJson, EventType,
}; };
use ruma_identifiers::{RoomId, RoomVersionId, UserId}; use ruma_identifiers::{RoomAliasId, RoomId, RoomVersionId, UserId};
use serde_json::{json, value::RawValue}; use serde_json::{json, value::RawValue};
use crate::{server_server, utils, Database, MatrixResult, Ruma}; use crate::{server_server, utils, Database, MatrixResult, Ruma};
@ -517,6 +521,7 @@ pub fn set_displayname_route(
.unwrap(), .unwrap(),
None, None,
Some(user_id.to_string()), Some(user_id.to_string()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
@ -564,7 +569,7 @@ pub fn set_avatar_url_route(
) -> MatrixResult<set_avatar_url::Response> { ) -> MatrixResult<set_avatar_url::Response> {
let user_id = body.user_id.as_ref().expect("user is authenticated"); let user_id = body.user_id.as_ref().expect("user is authenticated");
if let avatar_url = &body.avatar_url { if let Some(avatar_url) = &body.avatar_url {
if !avatar_url.starts_with("mxc://") { if !avatar_url.starts_with("mxc://") {
debug!("Request contains an invalid avatar_url."); debug!("Request contains an invalid avatar_url.");
return MatrixResult(Err(Error { return MatrixResult(Err(Error {
@ -579,7 +584,7 @@ pub fn set_avatar_url_route(
} }
db.users db.users
.set_avatar_url(&user_id, Some(body.avatar_url.clone())) .set_avatar_url(&user_id, body.avatar_url.clone())
.unwrap(); .unwrap();
// Send a new membership event into all joined rooms // Send a new membership event into all joined rooms
@ -591,7 +596,7 @@ pub fn set_avatar_url_route(
user_id.clone(), user_id.clone(),
EventType::RoomMember, EventType::RoomMember,
serde_json::to_value(ruma_events::room::member::MemberEventContent { serde_json::to_value(ruma_events::room::member::MemberEventContent {
avatar_url: Some(body.avatar_url.clone()), avatar_url: body.avatar_url.clone(),
..serde_json::from_value::<EventJson<_>>( ..serde_json::from_value::<EventJson<_>>(
db.rooms db.rooms
.room_state(&room_id) .room_state(&room_id)
@ -608,6 +613,7 @@ pub fn set_avatar_url_route(
.unwrap(), .unwrap(),
None, None,
Some(user_id.to_string()), Some(user_id.to_string()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
@ -669,7 +675,7 @@ pub fn get_profile_route(
MatrixResult(Err(Error { MatrixResult(Err(Error {
kind: ErrorKind::NotFound, kind: ErrorKind::NotFound,
message: "Profile was not found.".to_owned(), message: "Profile was not found.".to_owned(),
status_code: http::StatusCode::BAD_REQUEST, status_code: http::StatusCode::NOT_FOUND,
})) }))
} }
@ -906,8 +912,32 @@ pub fn create_room_route(
let room_id = RoomId::new(db.globals.server_name()).expect("host is valid"); let room_id = RoomId::new(db.globals.server_name()).expect("host is valid");
let user_id = body.user_id.as_ref().expect("user is authenticated"); let user_id = body.user_id.as_ref().expect("user is authenticated");
// TODO: Create alias and check if it already exists let alias = if let Some(localpart) = &body.room_alias_name {
// TODO: Check for invalid characters and maximum length
if let Ok(alias) =
RoomAliasId::try_from(format!("#{}:{}", localpart, db.globals.server_name()))
{
if db.rooms.id_from_alias(&alias).unwrap().is_some() {
return MatrixResult(Err(Error {
kind: ErrorKind::Unknown,
message: "Alias already exists.".to_owned(),
status_code: http::StatusCode::BAD_REQUEST,
}));
}
Some(alias)
} else {
return MatrixResult(Err(Error {
kind: ErrorKind::Unknown,
message: "Invalid alias.".to_owned(),
status_code: http::StatusCode::BAD_REQUEST,
}));
}
} else {
None
};
// 1. The room create event
db.rooms db.rooms
.append_pdu( .append_pdu(
room_id.clone(), room_id.clone(),
@ -915,21 +945,22 @@ pub fn create_room_route(
EventType::RoomCreate, EventType::RoomCreate,
serde_json::to_value(ruma_events::room::create::CreateEventContent { serde_json::to_value(ruma_events::room::create::CreateEventContent {
creator: user_id.clone(), creator: user_id.clone(),
federate: body federate: body.creation_content.as_ref().map_or(true, |c| c.federate),
predecessor: body
.creation_content .creation_content
.and_then(|c| c.federate) .as_ref()
.unwrap_or(true), .and_then(|c| c.predecessor.clone()),
predecessor: None, // TODO: Check creation_content.predecessor once ruma has that
room_version: RoomVersionId::version_5(), room_version: RoomVersionId::version_5(),
}) })
.unwrap(), .unwrap(),
None, None,
Some("".to_owned()), Some("".to_owned()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
// Join room // 2. Let the room creator join
db.rooms db.rooms
.append_pdu( .append_pdu(
room_id.clone(), room_id.clone(),
@ -945,6 +976,7 @@ pub fn create_room_route(
.unwrap(), .unwrap(),
None, None,
Some(user_id.to_string()), Some(user_id.to_string()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
@ -956,7 +988,7 @@ pub fn create_room_route(
room::Visibility::Public => create_room::RoomPreset::PublicChat, room::Visibility::Public => create_room::RoomPreset::PublicChat,
}); });
// 0. Power levels // 3. Power levels
let mut users = BTreeMap::new(); let mut users = BTreeMap::new();
users.insert(user_id.clone(), 100.into()); users.insert(user_id.clone(), 100.into());
for invite_user_id in &body.invite { for invite_user_id in &body.invite {
@ -991,12 +1023,13 @@ pub fn create_room_route(
power_levels_content, power_levels_content,
None, None,
Some("".to_owned()), Some("".to_owned()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
// 1. Events set by preset // 4. Events set by preset
// 1.1 Join Rules // 4.1 Join Rules
db.rooms db.rooms
.append_pdu( .append_pdu(
room_id.clone(), room_id.clone(),
@ -1016,11 +1049,12 @@ pub fn create_room_route(
}, },
None, None,
Some("".to_owned()), Some("".to_owned()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
// 1.2 History Visibility // 4.2 History Visibility
db.rooms db.rooms
.append_pdu( .append_pdu(
room_id.clone(), room_id.clone(),
@ -1032,11 +1066,12 @@ pub fn create_room_route(
.unwrap(), .unwrap(),
None, None,
Some("".to_owned()), Some("".to_owned()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
// 1.3 Guest Access // 4.3 Guest Access
db.rooms db.rooms
.append_pdu( .append_pdu(
room_id.clone(), room_id.clone(),
@ -1056,11 +1091,12 @@ pub fn create_room_route(
}, },
None, None,
Some("".to_owned()), Some("".to_owned()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
// 2. Events listed in initial_state // 5. Events listed in initial_state
for create_room::InitialStateEvent { for create_room::InitialStateEvent {
event_type, event_type,
state_key, state_key,
@ -1071,16 +1107,17 @@ pub fn create_room_route(
.append_pdu( .append_pdu(
room_id.clone(), room_id.clone(),
user_id.clone(), user_id.clone(),
EventType::from(event_type), event_type.clone(),
serde_json::from_str(content.get()).unwrap(), serde_json::from_str(content.get()).unwrap(),
None, None,
state_key.clone(), state_key.clone(),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
} }
// 3. Events implied by name and topic // 6. Events implied by name and topic
if let Some(name) = &body.name { if let Some(name) = &body.name {
db.rooms db.rooms
.append_pdu( .append_pdu(
@ -1093,6 +1130,7 @@ pub fn create_room_route(
.unwrap(), .unwrap(),
None, None,
Some("".to_owned()), Some("".to_owned()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
@ -1110,12 +1148,13 @@ pub fn create_room_route(
.unwrap(), .unwrap(),
None, None,
Some("".to_owned()), Some("".to_owned()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
} }
// 4. Events implied by invite (and TODO: invite_3pid) // 7. Events implied by invite (and TODO: invite_3pid)
for user in &body.invite { for user in &body.invite {
db.rooms db.rooms
.append_pdu( .append_pdu(
@ -1132,43 +1171,119 @@ pub fn create_room_route(
.unwrap(), .unwrap(),
None, None,
Some(user.to_string()), Some(user.to_string()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
} }
// Homeserver specific stuff
if let Some(alias) = alias {
db.rooms
.set_alias(&alias, Some(&room_id), &db.globals)
.unwrap();
}
if let Some(room::Visibility::Public) = body.visibility {
db.rooms.set_public(&room_id, true).unwrap();
}
MatrixResult(Ok(create_room::Response { room_id })) MatrixResult(Ok(create_room::Response { room_id }))
} }
#[put(
"/_matrix/client/r0/rooms/<_room_id>/redact/<_event_id>/<_txn_id>",
data = "<body>"
)]
pub fn redact_event_route(
db: State<'_, Database>,
body: Ruma<redact_event::Request>,
_room_id: String,
_event_id: String,
_txn_id: String,
) -> MatrixResult<redact_event::Response> {
let user_id = body.user_id.as_ref().expect("user is authenticated");
if let Ok(event_id) = db.rooms.append_pdu(
body.room_id.clone(),
user_id.clone(),
EventType::RoomRedaction,
serde_json::to_value(redaction::RedactionEventContent {
reason: body.reason.clone(),
})
.unwrap(),
None,
None,
Some(body.event_id.clone()),
&db.globals,
) {
MatrixResult(Ok(redact_event::Response { event_id }))
} else {
MatrixResult(Err(Error {
kind: ErrorKind::Unknown,
message: "Failed to redact event.".to_owned(),
status_code: http::StatusCode::BAD_REQUEST,
}))
}
}
#[put("/_matrix/client/r0/directory/room/<_room_alias>", data = "<body>")]
pub fn create_alias_route(
db: State<'_, Database>,
body: Ruma<create_alias::Request>,
_room_alias: String,
) -> MatrixResult<create_alias::Response> {
if db.rooms.id_from_alias(&body.room_alias).unwrap().is_some() {
return MatrixResult(Err(Error {
kind: ErrorKind::Unknown,
message: "Alias already exists".to_owned(),
status_code: http::StatusCode::BAD_REQUEST,
}));
}
db.rooms
.set_alias(&body.room_alias, Some(&body.room_id), &db.globals)
.unwrap();
MatrixResult(Ok(create_alias::Response))
}
#[delete("/_matrix/client/r0/directory/room/<_room_alias>", data = "<body>")]
pub fn delete_alias_route(
db: State<'_, Database>,
body: Ruma<delete_alias::Request>,
_room_alias: String,
) -> MatrixResult<delete_alias::Response> {
db.rooms
.set_alias(&body.room_alias, None, &db.globals)
.unwrap();
MatrixResult(Ok(delete_alias::Response))
}
#[get("/_matrix/client/r0/directory/room/<_room_alias>", data = "<body>")] #[get("/_matrix/client/r0/directory/room/<_room_alias>", data = "<body>")]
pub fn get_alias_route( pub fn get_alias_route(
db: State<'_, Database>, db: State<'_, Database>,
body: Ruma<get_alias::Request>, body: Ruma<get_alias::Request>,
_room_alias: String, _room_alias: String,
) -> MatrixResult<get_alias::Response> { ) -> MatrixResult<get_alias::Response> {
warn!("TODO: get_alias_route"); if body.room_alias.server_name() == db.globals.server_name() {
let room_id = if body.room_alias.server_name() == db.globals.server_name() { if let Some(room_id) = db.rooms.id_from_alias(&body.room_alias).unwrap() {
match body.room_alias.alias() { MatrixResult(Ok(get_alias::Response {
"conduit" => "!lgOCCXQKtXOAPlAlG5:conduit.rs", room_id,
_ => { servers: vec![db.globals.server_name().to_owned()],
debug!("Room alias not found."); }))
return MatrixResult(Err(Error { } else {
kind: ErrorKind::NotFound, debug!("Room alias not found.");
message: "Room not found.".to_owned(), return MatrixResult(Err(Error {
status_code: http::StatusCode::BAD_REQUEST, kind: ErrorKind::NotFound,
})); message: "Room with alias not found.".to_owned(),
} status_code: http::StatusCode::BAD_REQUEST,
}));
} }
} else { } else {
todo!("ask remote server"); todo!("ask remote server");
} }
.try_into()
.unwrap();
MatrixResult(Ok(get_alias::Response {
room_id,
servers: vec!["conduit.rs".to_owned()],
}))
} }
#[post("/_matrix/client/r0/rooms/<_room_id>/join", data = "<body>")] #[post("/_matrix/client/r0/rooms/<_room_id>/join", data = "<body>")]
@ -1220,6 +1335,7 @@ pub fn join_room_by_id_route(
serde_json::to_value(event).unwrap(), serde_json::to_value(event).unwrap(),
None, None,
Some(user_id.to_string()), Some(user_id.to_string()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
@ -1237,17 +1353,21 @@ pub fn join_room_by_id_or_alias_route(
) -> MatrixResult<join_room_by_id_or_alias::Response> { ) -> MatrixResult<join_room_by_id_or_alias::Response> {
let room_id = match RoomId::try_from(body.room_id_or_alias.clone()) { let room_id = match RoomId::try_from(body.room_id_or_alias.clone()) {
Ok(room_id) => room_id, Ok(room_id) => room_id,
Err(room_alias) => { Err(_) => {
if room_alias.server_name() == db.globals.server_name() { if let Some(room_id) = db
.rooms
.id_from_alias(&body.room_id_or_alias.clone().try_into().unwrap())
.unwrap()
{
room_id
} else {
// Ask creator server of the room to join TODO ask someone else when not available
//server_server::send_request(data, destination, request)
return MatrixResult(Err(Error { return MatrixResult(Err(Error {
kind: ErrorKind::NotFound, kind: ErrorKind::NotFound,
message: "Room alias not found.".to_owned(), message: "Room alias not found.".to_owned(),
status_code: http::StatusCode::BAD_REQUEST, status_code: http::StatusCode::BAD_REQUEST,
})); }));
} else {
// Ask creator server of the room to join TODO ask someone else when not available
//server_server::send_request(data, destination, request)
todo!();
} }
} }
}; };
@ -1285,6 +1405,7 @@ pub fn leave_room_route(
json!({"membership": "leave"}), json!({"membership": "leave"}),
None, None,
Some(user_id.to_string()), Some(user_id.to_string()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
@ -1328,6 +1449,7 @@ pub fn invite_user_route(
serde_json::to_value(event).unwrap(), serde_json::to_value(event).unwrap(),
None, None,
Some(user_id.to_string()), Some(user_id.to_string()),
None,
&db.globals, &db.globals,
) )
.unwrap(); .unwrap();
@ -1342,6 +1464,35 @@ pub fn invite_user_route(
} }
} }
#[put("/_matrix/client/r0/directory/list/room/<_room_id>", data = "<body>")]
pub async fn set_room_visibility_route(
db: State<'_, Database>,
body: Ruma<set_room_visibility::Request>,
_room_id: String,
) -> MatrixResult<set_room_visibility::Response> {
match body.visibility {
room::Visibility::Public => db.rooms.set_public(&body.room_id, true).unwrap(),
room::Visibility::Private => db.rooms.set_public(&body.room_id, false).unwrap(),
}
MatrixResult(Ok(set_room_visibility::Response))
}
#[get("/_matrix/client/r0/directory/list/room/<_room_id>", data = "<body>")]
pub async fn get_room_visibility_route(
db: State<'_, Database>,
body: Ruma<get_room_visibility::Request>,
_room_id: String,
) -> MatrixResult<get_room_visibility::Response> {
MatrixResult(Ok(get_room_visibility::Response {
visibility: if db.rooms.is_public_room(&body.room_id).unwrap() {
room::Visibility::Public
} else {
room::Visibility::Private
},
}))
}
#[get("/_matrix/client/r0/publicRooms", data = "<body>")] #[get("/_matrix/client/r0/publicRooms", data = "<body>")]
pub async fn get_public_rooms_route( pub async fn get_public_rooms_route(
db: State<'_, Database>, db: State<'_, Database>,
@ -1399,9 +1550,10 @@ pub async fn get_public_rooms_filtered_route(
) -> MatrixResult<get_public_rooms_filtered::Response> { ) -> MatrixResult<get_public_rooms_filtered::Response> {
let mut chunk = db let mut chunk = db
.rooms .rooms
.all_rooms() .public_rooms()
.into_iter()
.map(|room_id| { .map(|room_id| {
let room_id = room_id.unwrap();
let state = db.rooms.room_state(&room_id).unwrap(); let state = db.rooms.room_state(&room_id).unwrap();
directory::PublicRoomsChunk { directory::PublicRoomsChunk {
@ -1414,7 +1566,7 @@ pub async fn get_public_rooms_filtered_route(
.deserialize() .deserialize()
.unwrap() .unwrap()
.alias .alias
}).map(|a| a.to_string()), }),
name: state.get(&(EventType::RoomName, "".to_owned())).map(|s| { name: state.get(&(EventType::RoomName, "".to_owned())).map(|s| {
serde_json::from_value::<EventJson<ruma_events::room::name::NameEventContent>>( serde_json::from_value::<EventJson<ruma_events::room::name::NameEventContent>>(
s.content.clone(), s.content.clone(),
@ -1565,6 +1717,7 @@ pub fn create_message_event_route(
serde_json::from_str(body.json_body.unwrap().get()).unwrap(), serde_json::from_str(body.json_body.unwrap().get()).unwrap(),
Some(unsigned), Some(unsigned),
None, None,
None,
&db.globals, &db.globals,
) { ) {
MatrixResult(Ok(create_message_event::Response { event_id })) MatrixResult(Ok(create_message_event::Response { event_id }))
@ -1590,14 +1743,49 @@ pub fn create_state_event_for_key_route(
) -> MatrixResult<create_state_event_for_key::Response> { ) -> MatrixResult<create_state_event_for_key::Response> {
let user_id = body.user_id.as_ref().expect("user is authenticated"); let user_id = body.user_id.as_ref().expect("user is authenticated");
// Reponse of with/without key is the same let content =
serde_json::from_str::<serde_json::Value>(body.json_body.clone().unwrap().get()).unwrap();
if body.event_type == EventType::RoomCanonicalAlias {
let canonical_alias = serde_json::from_value::<
EventJson<canonical_alias::CanonicalAliasEventContent>,
>(content.clone())
.unwrap()
.deserialize()
.unwrap();
let mut aliases = canonical_alias.alt_aliases;
if let Some(alias) = canonical_alias.alias {
aliases.push(alias);
}
for alias in aliases {
if alias.server_name() != db.globals.server_name()
|| db
.rooms
.id_from_alias(&alias)
.unwrap()
.filter(|room| room == &body.room_id) // Make sure it's the right room
.is_none()
{
return MatrixResult(Err(Error {
kind: ErrorKind::Unknown,
message: "You are only allowed to send canonical_alias events when it's aliases already exists".to_owned(),
status_code: http::StatusCode::BAD_REQUEST,
}));
}
}
}
if let Ok(event_id) = db.rooms.append_pdu( if let Ok(event_id) = db.rooms.append_pdu(
body.room_id.clone(), body.room_id.clone(),
user_id.clone(), user_id.clone(),
body.event_type.clone(), body.event_type.clone(),
serde_json::from_str(body.json_body.clone().unwrap().get()).unwrap(), content,
None, None,
Some(body.state_key.clone()), Some(body.state_key.clone()),
None,
&db.globals, &db.globals,
) { ) {
MatrixResult(Ok(create_state_event_for_key::Response { event_id })) MatrixResult(Ok(create_state_event_for_key::Response { event_id }))
@ -1620,26 +1808,43 @@ pub fn create_state_event_for_empty_key_route(
_room_id: String, _room_id: String,
_event_type: String, _event_type: String,
) -> MatrixResult<create_state_event_for_empty_key::Response> { ) -> MatrixResult<create_state_event_for_empty_key::Response> {
let user_id = body.user_id.as_ref().expect("user is authenticated"); // This just calls create_state_event_for_key_route
let Ruma {
body:
create_state_event_for_empty_key::Request {
room_id,
event_type,
data,
},
user_id,
device_id,
json_body,
} = body;
// Reponse of with/without key is the same let response = create_state_event_for_key_route(
if let Ok(event_id) = db.rooms.append_pdu( db,
body.room_id.clone(), Ruma {
user_id.clone(), body: create_state_event_for_key::Request {
body.event_type.clone(), room_id,
serde_json::from_str(body.json_body.unwrap().get()).unwrap(), event_type,
None, data,
Some("".to_owned()), state_key: "".to_owned(),
&db.globals, },
) { user_id,
MatrixResult(Ok(create_state_event_for_empty_key::Response { event_id })) device_id,
} else { json_body,
MatrixResult(Err(Error { },
kind: ErrorKind::Unknown, _room_id,
message: "Failed to send event.".to_owned(), _event_type,
status_code: http::StatusCode::BAD_REQUEST, "".to_owned(),
})) );
}
MatrixResult(match response.0 {
Ok(create_state_event_for_key::Response { event_id }) => {
Ok(create_state_event_for_empty_key::Response { event_id })
}
Err(e) => Err(e),
})
} }
#[get("/_matrix/client/r0/rooms/<_room_id>/state", data = "<body>")] #[get("/_matrix/client/r0/rooms/<_room_id>/state", data = "<body>")]
@ -1933,17 +2138,19 @@ pub fn sync_route(
let mut invited_rooms = BTreeMap::new(); let mut invited_rooms = BTreeMap::new();
for room_id in db.rooms.rooms_invited(&user_id) { for room_id in db.rooms.rooms_invited(&user_id) {
let room_id = room_id.unwrap(); let room_id = room_id.unwrap();
let events = db
.rooms
.pdus_since(&room_id, since)
.unwrap()
.map(|pdu| pdu.unwrap().to_stripped_state_event())
.collect();
invited_rooms.insert( invited_rooms.insert(
room_id, room_id.clone(),
sync_events::InvitedRoom { sync_events::InvitedRoom {
invite_state: sync_events::InviteState { events }, invite_state: sync_events::InviteState {
events: db
.rooms
.room_state(&room_id)
.unwrap()
.into_iter()
.map(|(_, pdu)| pdu.to_stripped_state_event())
.collect(),
},
}, },
); );
} }
@ -2046,12 +2253,12 @@ pub fn get_message_events_route(
.map(|pdu| pdu.to_room_event()) .map(|pdu| pdu.to_room_event())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
MatrixResult(Ok(get_message_events::Response { MatrixResult(Ok(dbg!(get_message_events::Response {
start: Some(body.from.clone()), start: Some(body.from.clone()),
end: prev_batch, end: prev_batch,
chunk: room_events, chunk: room_events,
state: Vec::new(), state: Vec::new(),
})) })))
} else { } else {
MatrixResult(Err(Error { MatrixResult(Err(Error {
kind: ErrorKind::Unknown, kind: ErrorKind::Unknown,

View File

@ -77,6 +77,10 @@ impl Database {
roomid_pduleaves: db.open_tree("roomid_pduleaves").unwrap(), roomid_pduleaves: db.open_tree("roomid_pduleaves").unwrap(),
roomstateid_pdu: db.open_tree("roomstateid_pdu").unwrap(), roomstateid_pdu: db.open_tree("roomstateid_pdu").unwrap(),
alias_roomid: db.open_tree("alias_roomid").unwrap(),
aliasid_alias: db.open_tree("alias_roomid").unwrap(),
publicroomids: db.open_tree("publicroomids").unwrap(),
userroomid_joined: db.open_tree("userroomid_joined").unwrap(), userroomid_joined: db.open_tree("userroomid_joined").unwrap(),
roomuserid_joined: db.open_tree("roomuserid_joined").unwrap(), roomuserid_joined: db.open_tree("roomuserid_joined").unwrap(),
userroomid_invited: db.open_tree("userroomid_invited").unwrap(), userroomid_invited: db.open_tree("userroomid_invited").unwrap(),

View File

@ -11,8 +11,8 @@ use ruma_events::{
}, },
EventJson, EventType, EventJson, EventType,
}; };
use ruma_identifiers::{EventId, RoomId, UserId}; use ruma_identifiers::{EventId, RoomAliasId, RoomId, UserId};
use sled::IVec;
use std::{ use std::{
collections::{BTreeMap, HashMap}, collections::{BTreeMap, HashMap},
convert::{TryFrom, TryInto}, convert::{TryFrom, TryInto},
@ -26,6 +26,10 @@ pub struct Rooms {
pub(super) roomid_pduleaves: sled::Tree, pub(super) roomid_pduleaves: sled::Tree,
pub(super) roomstateid_pdu: sled::Tree, // RoomStateId = Room + StateType + StateKey pub(super) roomstateid_pdu: sled::Tree, // RoomStateId = Room + StateType + StateKey
pub(super) alias_roomid: sled::Tree,
pub(super) aliasid_alias: sled::Tree, // AliasId = RoomId + Count
pub(super) publicroomids: sled::Tree,
pub(super) userroomid_joined: sled::Tree, pub(super) userroomid_joined: sled::Tree,
pub(super) roomuserid_joined: sled::Tree, pub(super) roomuserid_joined: sled::Tree,
pub(super) userroomid_invited: sled::Tree, pub(super) userroomid_invited: sled::Tree,
@ -110,28 +114,50 @@ impl Rooms {
self.eventid_pduid self.eventid_pduid
.get(event_id.to_string().as_bytes())? .get(event_id.to_string().as_bytes())?
.map_or(Ok(None), |pdu_id| { .map_or(Ok(None), |pdu_id| {
Ok(serde_json::from_slice( Ok(Some(serde_json::from_slice(
&self.pduid_pdu.get(pdu_id)?.ok_or(Error::BadDatabase( &self.pduid_pdu.get(pdu_id)?.ok_or(Error::BadDatabase(
"eventid_pduid points to nonexistent pdu", "eventid_pduid points to nonexistent pdu",
))?, ))?,
)?) )?))
.map(Some)
}) })
} }
/// Returns the pdu's id.
pub fn get_pdu_id(&self, event_id: &EventId) -> Result<Option<IVec>> {
self.eventid_pduid
.get(event_id.to_string().as_bytes())?
.map_or(Ok(None), |pdu_id| Ok(Some(pdu_id)))
}
/// Returns the pdu. /// Returns the pdu.
pub fn get_pdu(&self, event_id: &EventId) -> Result<Option<PduEvent>> { pub fn get_pdu(&self, event_id: &EventId) -> Result<Option<PduEvent>> {
self.eventid_pduid self.eventid_pduid
.get(event_id.to_string().as_bytes())? .get(event_id.to_string().as_bytes())?
.map_or(Ok(None), |pdu_id| { .map_or(Ok(None), |pdu_id| {
Ok(serde_json::from_slice( Ok(Some(serde_json::from_slice(
&self.pduid_pdu.get(pdu_id)?.ok_or(Error::BadDatabase( &self.pduid_pdu.get(pdu_id)?.ok_or(Error::BadDatabase(
"eventid_pduid points to nonexistent pdu", "eventid_pduid points to nonexistent pdu",
))?, ))?,
)?) )?))
.map(Some)
}) })
} }
/// Returns the pdu.
pub fn get_pdu_from_id(&self, pdu_id: &IVec) -> Result<Option<PduEvent>> {
self.pduid_pdu
.get(pdu_id)?
.map_or(Ok(None), |pdu| Ok(Some(serde_json::from_slice(&pdu)?)))
}
/// Returns the pdu.
pub fn replace_pdu(&self, pdu_id: &IVec, pdu: &PduEvent) -> Result<()> {
if self.pduid_pdu.get(&pdu_id)?.is_some() {
self.pduid_pdu
.insert(&pdu_id, &*serde_json::to_string(pdu)?)?;
Ok(())
} else {
Err(Error::BadRequest("pdu does not exist"))
}
}
/// Returns the leaf pdus of a room. /// Returns the leaf pdus of a room.
pub fn get_pdu_leaves(&self, room_id: &RoomId) -> Result<Vec<EventId>> { pub fn get_pdu_leaves(&self, room_id: &RoomId) -> Result<Vec<EventId>> {
@ -177,6 +203,7 @@ impl Rooms {
content: serde_json::Value, content: serde_json::Value,
unsigned: Option<serde_json::Map<String, serde_json::Value>>, unsigned: Option<serde_json::Map<String, serde_json::Value>>,
state_key: Option<String>, state_key: Option<String>,
redacts: Option<EventId>,
globals: &super::globals::Globals, globals: &super::globals::Globals,
) -> Result<EventId> { ) -> Result<EventId> {
// TODO: Make sure this isn't called twice in parallel // TODO: Make sure this isn't called twice in parallel
@ -287,7 +314,7 @@ impl Rooms {
.join_rule .join_rule
}); });
if target_membership == member::MembershipState::Join { let authorized = if target_membership == member::MembershipState::Join {
let mut prev_events = prev_events.iter(); let mut prev_events = prev_events.iter();
let prev_event = self let prev_event = self
.get_pdu(prev_events.next().ok_or(Error::BadRequest( .get_pdu(prev_events.next().ok_or(Error::BadRequest(
@ -367,34 +394,30 @@ impl Rooms {
} }
} else { } else {
false false
};
if authorized {
// Update our membership info
self.update_membership(&room_id, &target_user_id, &target_membership)?;
} }
authorized
} }
EventType::RoomCreate => prev_events.is_empty(), EventType::RoomCreate => prev_events.is_empty(),
_ if sender_membership == member::MembershipState::Join => {
// Not allow any of the following events if the sender is not joined.
_ if sender_membership != member::MembershipState::Join => false,
_ => {
// TODO // TODO
sender_power.unwrap_or(&power_levels.users_default) sender_power.unwrap_or(&power_levels.users_default)
>= &power_levels.state_default >= &power_levels.state_default
} }
_ => false,
} { } {
error!("Unauthorized"); error!("Unauthorized");
// Not authorized // Not authorized
return Err(Error::BadRequest("event not authorized")); return Err(Error::BadRequest("event not authorized"));
} }
if event_type == EventType::RoomMember {
// TODO: Don't get this twice
let target_user_id = UserId::try_from(&**state_key)?;
self.update_membership(
&room_id,
&target_user_id,
&serde_json::from_value::<EventJson<member::MemberEventContent>>(
content.clone(),
)?
.deserialize()?
.membership,
)?;
}
} }
} else if !self.is_joined(&sender, &room_id)? { } else if !self.is_joined(&sender, &room_id)? {
return Err(Error::BadRequest("event not authorized")); return Err(Error::BadRequest("event not authorized"));
@ -435,7 +458,7 @@ impl Rooms {
.try_into() .try_into()
.expect("depth can overflow and should be deprecated..."), .expect("depth can overflow and should be deprecated..."),
auth_events: Vec::new(), auth_events: Vec::new(),
redacts: None, redacts,
unsigned, unsigned,
hashes: ruma_federation_api::EventHash { hashes: ruma_federation_api::EventHash {
sha256: "aaa".to_owned(), sha256: "aaa".to_owned(),
@ -555,7 +578,21 @@ impl Rooms {
.map(|(_, v)| Ok(serde_json::from_slice(&v)?)) .map(|(_, v)| Ok(serde_json::from_slice(&v)?))
} }
/// Makes a user join a room. Only call this if the membership is Join already /// Replace a PDU with the redacted form.
pub fn redact_pdu(&self, event_id: &EventId) -> Result<()> {
if let Some(pdu_id) = self.get_pdu_id(event_id)? {
let mut pdu = self
.get_pdu_from_id(&pdu_id)?
.ok_or(Error::BadDatabase("pduid points to invalid pdu"))?;
pdu.redact();
self.replace_pdu(&pdu_id, &pdu)?;
Ok(())
} else {
Err(Error::BadRequest("eventid does not exist"))
}
}
/// Update current membership data.
fn update_membership( fn update_membership(
&self, &self,
room_id: &RoomId, room_id: &RoomId,
@ -609,6 +646,68 @@ impl Rooms {
Ok(()) Ok(())
} }
pub fn set_alias(
&self,
alias: &RoomAliasId,
room_id: Option<&RoomId>,
globals: &super::globals::Globals,
) -> Result<()> {
if let Some(room_id) = room_id {
self.alias_roomid
.insert(alias.alias(), &*room_id.to_string())?;
let mut aliasid = room_id.to_string().as_bytes().to_vec();
aliasid.extend_from_slice(&globals.next_count()?.to_be_bytes());
self.aliasid_alias.insert(aliasid, &*alias.alias())?;
} else {
if let Some(room_id) = self.alias_roomid.remove(alias.alias())? {
for key in self.aliasid_alias.scan_prefix(room_id).keys() {
self.aliasid_alias.remove(key?)?;
}
}
}
Ok(())
}
pub fn id_from_alias(&self, alias: &RoomAliasId) -> Result<Option<RoomId>> {
self.alias_roomid
.get(alias.alias())?
.map_or(Ok(None), |bytes| {
Ok(Some(RoomId::try_from(utils::string_from_bytes(&bytes)?)?))
})
}
pub fn room_aliases(&self, room_id: &RoomId) -> impl Iterator<Item = Result<RoomAliasId>> {
let mut prefix = room_id.to_string().as_bytes().to_vec();
prefix.push(0xff);
self.aliasid_alias
.scan_prefix(prefix)
.values()
.map(|bytes| Ok(RoomAliasId::try_from(utils::string_from_bytes(&bytes?)?)?))
}
pub fn set_public(&self, room_id: &RoomId, public: bool) -> Result<()> {
if public {
self.publicroomids.insert(room_id.to_string(), &[])?;
} else {
self.publicroomids.remove(room_id.to_string())?;
}
Ok(())
}
pub fn is_public_room(&self, room_id: &RoomId) -> Result<bool> {
Ok(self.publicroomids.contains_key(room_id.to_string())?)
}
pub fn public_rooms(&self) -> impl Iterator<Item = Result<RoomId>> {
self.publicroomids
.iter()
.keys()
.map(|bytes| Ok(RoomId::try_from(utils::string_from_bytes(&bytes?)?)?))
}
/// Returns an iterator over all rooms a user joined. /// Returns an iterator over all rooms a user joined.
pub fn room_members(&self, room_id: &RoomId) -> impl Iterator<Item = Result<UserId>> { pub fn room_members(&self, room_id: &RoomId) -> impl Iterator<Item = Result<UserId>> {
self.roomuserid_joined self.roomuserid_joined

View File

@ -141,9 +141,8 @@ impl Users {
let mut prefix = userdeviceid.clone(); let mut prefix = userdeviceid.clone();
prefix.push(0xff); prefix.push(0xff);
for result in self.todeviceid_events.scan_prefix(&prefix) { for key in self.todeviceid_events.scan_prefix(&prefix).keys() {
let (key, value) = result?; self.todeviceid_events.remove(key?)?;
self.todeviceid_events.remove(key)?;
} }
// TODO: Remove onetimekeys // TODO: Remove onetimekeys

View File

@ -50,12 +50,17 @@ fn setup_rocket() -> rocket::Rocket {
client_server::set_read_marker_route, client_server::set_read_marker_route,
client_server::create_typing_event_route, client_server::create_typing_event_route,
client_server::create_room_route, client_server::create_room_route,
client_server::redact_event_route,
client_server::create_alias_route,
client_server::delete_alias_route,
client_server::get_alias_route, client_server::get_alias_route,
client_server::join_room_by_id_route, client_server::join_room_by_id_route,
client_server::join_room_by_id_or_alias_route, client_server::join_room_by_id_or_alias_route,
client_server::leave_room_route, client_server::leave_room_route,
client_server::forget_room_route, client_server::forget_room_route,
client_server::invite_user_route, client_server::invite_user_route,
client_server::set_room_visibility_route,
client_server::get_room_visibility_route,
client_server::get_public_rooms_route, client_server::get_public_rooms_route,
client_server::get_public_rooms_filtered_route, client_server::get_public_rooms_filtered_route,
client_server::search_users_route, client_server::search_users_route,

View File

@ -33,6 +33,38 @@ pub struct PduEvent {
} }
impl PduEvent { impl PduEvent {
pub fn redact(&mut self) {
self.unsigned.clear();
let allowed = match self.kind {
EventType::RoomMember => vec!["membership"],
EventType::RoomCreate => vec!["creator"],
EventType::RoomJoinRules => vec!["join_rule"],
EventType::RoomPowerLevels => vec![
"ban",
"events",
"events_default",
"kick",
"redact",
"state_default",
"users",
"users_default",
],
EventType::RoomHistoryVisibility => vec!["history_visibility"],
_ => vec![],
};
let old_content = self.content.as_object_mut().unwrap(); // TODO error
let mut new_content = serde_json::Map::new();
for key in allowed {
if let Some(value) = old_content.remove(key) {
new_content.insert(key.to_owned(), value);
}
}
self.content = new_content.into();
}
pub fn to_room_event(&self) -> EventJson<RoomEvent> { pub fn to_room_event(&self) -> EventJson<RoomEvent> {
// Can only fail in rare circumstances that won't ever happen here, see // Can only fail in rare circumstances that won't ever happen here, see
// https://docs.rs/serde_json/1.0.50/serde_json/fn.to_string.html // https://docs.rs/serde_json/1.0.50/serde_json/fn.to_string.html
@ -40,7 +72,6 @@ impl PduEvent {
// EventJson's deserialize implementation always returns `Ok(...)` // EventJson's deserialize implementation always returns `Ok(...)`
serde_json::from_str::<EventJson<RoomEvent>>(&json).unwrap() serde_json::from_str::<EventJson<RoomEvent>>(&json).unwrap()
} }
pub fn to_state_event(&self) -> EventJson<StateEvent> { pub fn to_state_event(&self) -> EventJson<StateEvent> {
let json = serde_json::to_string(&self).unwrap(); let json = serde_json::to_string(&self).unwrap();
serde_json::from_str::<EventJson<StateEvent>>(&json).unwrap() serde_json::from_str::<EventJson<StateEvent>>(&json).unwrap()

View File

@ -4,7 +4,9 @@ use log::error;
use rocket::{get, response::content::Json, State}; use rocket::{get, response::content::Json, State};
use ruma_api::Endpoint; use ruma_api::Endpoint;
use ruma_client_api::error::Error; use ruma_client_api::error::Error;
use ruma_federation_api::{v1::get_server_version, v2::get_server_keys}; use ruma_federation_api::discovery::{
get_server_keys::v2 as get_server_keys, get_server_version::v1 as get_server_version,
};
use serde_json::json; use serde_json::json;
use std::{ use std::{
collections::BTreeMap, collections::BTreeMap,