matrix-sdk: Split out the crypto part of the sdk into a separate crate.
parent
cf9ecbd0e8
commit
5fef444d61
74
Cargo.toml
74
Cargo.toml
|
@ -1,68 +1,6 @@
|
||||||
[package]
|
[workspace]
|
||||||
authors = ["Damir Jelić <poljar@termina.org.uk"]
|
members = [
|
||||||
description = "A high level Matrix client-server library."
|
"matrix_sdk",
|
||||||
edition = "2018"
|
"matrix_sdk_crypto",
|
||||||
homepage = "https://github.com/matrix-org/matrix-rust-sdk"
|
"matrix_sdk_types",
|
||||||
keywords = ["matrix", "chat", "messaging", "ruma", "nio"]
|
]
|
||||||
license = "Apache-2.0"
|
|
||||||
name = "matrix-sdk"
|
|
||||||
readme = "README.md"
|
|
||||||
repository = "https://github.com/matrix-org/matrix-rust-sdk"
|
|
||||||
version = "0.1.0"
|
|
||||||
|
|
||||||
[features]
|
|
||||||
default = []
|
|
||||||
encryption = ["olm-rs", "serde/derive", "serde_json", "cjson", "zeroize"]
|
|
||||||
sqlite-cryptostore = ["sqlx", "zeroize"]
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
futures = "0.3.4"
|
|
||||||
reqwest = "0.10.4"
|
|
||||||
http = "0.2.1"
|
|
||||||
url = "2.1.1"
|
|
||||||
async-trait = "0.1.30"
|
|
||||||
|
|
||||||
# Ruma dependencies
|
|
||||||
js_int = "0.1.5"
|
|
||||||
ruma-api = "0.16.0-rc.2"
|
|
||||||
ruma-client-api = { version = "0.8.0-rc.5" }
|
|
||||||
ruma-events = { version = "0.21.0-beta.1" }
|
|
||||||
ruma-identifiers = "0.16.0"
|
|
||||||
uuid = { version = "0.8.1", features = ["v4"] }
|
|
||||||
|
|
||||||
# Dependencies for the encryption support
|
|
||||||
olm-rs = { version = "0.5.0", optional = true, features = ["serde"]}
|
|
||||||
serde = { version = "1.0.106", optional = true, features = ["derive"] }
|
|
||||||
serde_json = { version = "1.0.51", optional = true }
|
|
||||||
cjson = { version = "0.1.0", optional = true }
|
|
||||||
zeroize = { version = "1.1.0", optional = true, features = ["zeroize_derive"] }
|
|
||||||
|
|
||||||
# Misc dependencies
|
|
||||||
thiserror = "1.0.14"
|
|
||||||
tracing = "0.1.13"
|
|
||||||
atomic = "0.4.5"
|
|
||||||
dashmap = "3.10.0"
|
|
||||||
|
|
||||||
[dependencies.tracing-futures]
|
|
||||||
version = "0.2.3"
|
|
||||||
default-features = false
|
|
||||||
features = ["std", "std-future"]
|
|
||||||
|
|
||||||
[dependencies.tokio]
|
|
||||||
version = "0.2.16"
|
|
||||||
default-features = false
|
|
||||||
features = ["sync", "time"]
|
|
||||||
|
|
||||||
[dependencies.sqlx]
|
|
||||||
version = "0.3.3"
|
|
||||||
optional = true
|
|
||||||
default-features = false
|
|
||||||
features = ["runtime-tokio", "sqlite"]
|
|
||||||
|
|
||||||
[dev-dependencies]
|
|
||||||
tokio = { version = "0.2.16", features = ["rt-threaded", "macros"] }
|
|
||||||
ruma-identifiers = { version = "0.16.0", features = ["rand"] }
|
|
||||||
serde_json = "1.0.51"
|
|
||||||
tracing-subscriber = "0.2.4"
|
|
||||||
tempfile = "3.1.0"
|
|
||||||
mockito = "0.25.1"
|
|
||||||
|
|
6
Makefile
6
Makefile
|
@ -1,12 +1,12 @@
|
||||||
all: build
|
all: build
|
||||||
|
|
||||||
build:
|
build:
|
||||||
cargo build --features 'encryption sqlite-cryptostore'
|
cargo build
|
||||||
test:
|
test:
|
||||||
cargo test --features 'encryption sqlite-cryptostore'
|
cargo test
|
||||||
|
|
||||||
coverage:
|
coverage:
|
||||||
cargo tarpaulin --features 'encryption sqlite-cryptostore' -v
|
cargo tarpaulin -v
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
cargo clean
|
cargo clean
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
[package]
|
||||||
|
authors = ["Damir Jelić <poljar@termina.org.uk"]
|
||||||
|
description = "A high level Matrix client-server library."
|
||||||
|
edition = "2018"
|
||||||
|
homepage = "https://github.com/matrix-org/matrix-rust-sdk"
|
||||||
|
keywords = ["matrix", "chat", "messaging", "ruma", "nio"]
|
||||||
|
license = "Apache-2.0"
|
||||||
|
name = "matrix-sdk"
|
||||||
|
readme = "README.md"
|
||||||
|
repository = "https://github.com/matrix-org/matrix-rust-sdk"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = ["encryption", "sqlite-cryptostore"]
|
||||||
|
encryption = ["matrix-sdk-crypto"]
|
||||||
|
sqlite-cryptostore = ["matrix-sdk-crypto/sqlite-cryptostore"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
futures = "0.3.4"
|
||||||
|
reqwest = "0.10.4"
|
||||||
|
http = "0.2.1"
|
||||||
|
url = "2.1.1"
|
||||||
|
async-trait = "0.1.30"
|
||||||
|
|
||||||
|
matrix-sdk-types = { path = "../matrix_sdk_types" }
|
||||||
|
matrix-sdk-crypto = { path = "../matrix_sdk_crypto", optional = true }
|
||||||
|
|
||||||
|
# Ruma dependencies
|
||||||
|
js_int = "0.1.5"
|
||||||
|
ruma-api = "0.16.0-rc.2"
|
||||||
|
ruma-client-api = { version = "0.8.0-rc.5" }
|
||||||
|
ruma-events = { version = "0.21.0-beta.1" }
|
||||||
|
ruma-identifiers = "0.16.0"
|
||||||
|
uuid = { version = "0.8.1", features = ["v4"] }
|
||||||
|
|
||||||
|
# Misc dependencies
|
||||||
|
thiserror = "1.0.14"
|
||||||
|
tracing = "0.1.13"
|
||||||
|
atomic = "0.4.5"
|
||||||
|
dashmap = "3.10.0"
|
||||||
|
|
||||||
|
[dependencies.tracing-futures]
|
||||||
|
version = "0.2.3"
|
||||||
|
default-features = false
|
||||||
|
features = ["std", "std-future"]
|
||||||
|
|
||||||
|
[dependencies.tokio]
|
||||||
|
version = "0.2.16"
|
||||||
|
default-features = false
|
||||||
|
features = ["sync", "time"]
|
||||||
|
|
||||||
|
[dependencies.sqlx]
|
||||||
|
version = "0.3.3"
|
||||||
|
optional = true
|
||||||
|
default-features = false
|
||||||
|
features = ["runtime-tokio", "sqlite"]
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
tokio = { version = "0.2.16", features = ["rt-threaded", "macros"] }
|
||||||
|
ruma-identifiers = { version = "0.16.0", features = ["rand"] }
|
||||||
|
serde_json = "1.0.51"
|
||||||
|
tracing-subscriber = "0.2.4"
|
||||||
|
tempfile = "3.1.0"
|
||||||
|
mockito = "0.25.1"
|
|
@ -1116,9 +1116,9 @@ mod test {
|
||||||
let uid = UserId::try_from("@example:localhost").unwrap();
|
let uid = UserId::try_from("@example:localhost").unwrap();
|
||||||
|
|
||||||
let mut bld = EventBuilder::default()
|
let mut bld = EventBuilder::default()
|
||||||
.add_room_event_from_file("./tests/data/events/member.json", RoomEvent::RoomMember)
|
.add_room_event_from_file("../test_data/events/member.json", RoomEvent::RoomMember)
|
||||||
.add_room_event_from_file(
|
.add_room_event_from_file(
|
||||||
"./tests/data/events/power_levels.json",
|
"../test_data/events/power_levels.json",
|
||||||
RoomEvent::RoomPowerLevels,
|
RoomEvent::RoomPowerLevels,
|
||||||
)
|
)
|
||||||
.build_client_runner(rid, uid);
|
.build_client_runner(rid, uid);
|
||||||
|
@ -1145,9 +1145,9 @@ mod test {
|
||||||
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
||||||
|
|
||||||
let mut bld = EventBuilder::default()
|
let mut bld = EventBuilder::default()
|
||||||
.add_room_event_from_file("./tests/data/events/member.json", RoomEvent::RoomMember)
|
.add_room_event_from_file("../test_data/events/member.json", RoomEvent::RoomMember)
|
||||||
.add_room_event_from_file(
|
.add_room_event_from_file(
|
||||||
"./tests/data/events/power_levels.json",
|
"../test_data/events/power_levels.json",
|
||||||
RoomEvent::RoomPowerLevels,
|
RoomEvent::RoomPowerLevels,
|
||||||
)
|
)
|
||||||
.build_mock_runner(
|
.build_mock_runner(
|
||||||
|
@ -1169,7 +1169,7 @@ mod test {
|
||||||
|
|
||||||
let _m = mock("POST", "/_matrix/client/r0/login")
|
let _m = mock("POST", "/_matrix/client/r0/login")
|
||||||
.with_status(403)
|
.with_status(403)
|
||||||
.with_body_from_file("tests/data/login_response_error.json")
|
.with_body_from_file("../test_data/login_response_error.json")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let client = AsyncClient::new(homeserver, None).unwrap();
|
let client = AsyncClient::new(homeserver, None).unwrap();
|
|
@ -41,7 +41,7 @@ use tokio::sync::Mutex;
|
||||||
use tokio::sync::RwLock;
|
use tokio::sync::RwLock;
|
||||||
|
|
||||||
#[cfg(feature = "encryption")]
|
#[cfg(feature = "encryption")]
|
||||||
use crate::crypto::{OlmMachine, OneTimeKeys};
|
use matrix_sdk_crypto::{OlmMachine, OneTimeKeys};
|
||||||
#[cfg(feature = "encryption")]
|
#[cfg(feature = "encryption")]
|
||||||
use ruma_client_api::r0::client_exchange::send_event_to_device;
|
use ruma_client_api::r0::client_exchange::send_event_to_device;
|
||||||
#[cfg(feature = "encryption")]
|
#[cfg(feature = "encryption")]
|
||||||
|
@ -820,7 +820,7 @@ mod test {
|
||||||
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
||||||
)
|
)
|
||||||
.with_status(200)
|
.with_status(200)
|
||||||
.with_body_from_file("tests/data/sync.json")
|
.with_body_from_file("../test_data/sync.json")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
|
@ -23,7 +23,7 @@ use thiserror::Error;
|
||||||
use url::ParseError;
|
use url::ParseError;
|
||||||
|
|
||||||
#[cfg(feature = "encryption")]
|
#[cfg(feature = "encryption")]
|
||||||
use crate::crypto::OlmError;
|
use matrix_sdk_crypto::OlmError;
|
||||||
|
|
||||||
/// Result type of the rust-sdk.
|
/// Result type of the rust-sdk.
|
||||||
pub type Result<T> = std::result::Result<T, Error>;
|
pub type Result<T> = std::result::Result<T, Error>;
|
|
@ -238,7 +238,7 @@ mod test {
|
||||||
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
||||||
)
|
)
|
||||||
.with_status(200)
|
.with_status(200)
|
||||||
.with_body_from_file("tests/data/sync.json")
|
.with_body_from_file("../test_data/sync.json")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let vec = Arc::new(Mutex::new(Vec::new()));
|
let vec = Arc::new(Mutex::new(Vec::new()));
|
|
@ -44,14 +44,11 @@ mod session;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub mod test_builder;
|
pub mod test_builder;
|
||||||
|
|
||||||
#[cfg(feature = "encryption")]
|
|
||||||
mod crypto;
|
|
||||||
|
|
||||||
pub use async_client::{AsyncClient, AsyncClientConfig, SyncSettings};
|
pub use async_client::{AsyncClient, AsyncClientConfig, SyncSettings};
|
||||||
pub use base_client::Client;
|
pub use base_client::Client;
|
||||||
#[cfg(feature = "encryption")]
|
|
||||||
pub use crypto::{Device, TrustState};
|
|
||||||
pub use event_emitter::EventEmitter;
|
pub use event_emitter::EventEmitter;
|
||||||
|
#[cfg(feature = "encryption")]
|
||||||
|
pub use matrix_sdk_crypto::{Device, TrustState};
|
||||||
pub use models::Room;
|
pub use models::Room;
|
||||||
pub use request_builder::{MessagesRequestBuilder, RoomBuilder};
|
pub use request_builder::{MessagesRequestBuilder, RoomBuilder};
|
||||||
|
|
|
@ -484,7 +484,7 @@ mod test {
|
||||||
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
||||||
)
|
)
|
||||||
.with_status(200)
|
.with_status(200)
|
||||||
.with_body_from_file("tests/data/sync.json")
|
.with_body_from_file("../test_data/sync.json")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
||||||
|
@ -514,9 +514,9 @@ mod test {
|
||||||
let uid = UserId::try_from("@example:localhost").unwrap();
|
let uid = UserId::try_from("@example:localhost").unwrap();
|
||||||
|
|
||||||
let mut bld = EventBuilder::default()
|
let mut bld = EventBuilder::default()
|
||||||
.add_room_event_from_file("./tests/data/events/member.json", RoomEvent::RoomMember)
|
.add_room_event_from_file("../test_data/events/member.json", RoomEvent::RoomMember)
|
||||||
.add_room_event_from_file(
|
.add_room_event_from_file(
|
||||||
"./tests/data/events/power_levels.json",
|
"../test_data/events/power_levels.json",
|
||||||
RoomEvent::RoomPowerLevels,
|
RoomEvent::RoomPowerLevels,
|
||||||
)
|
)
|
||||||
.build_room_runner(&rid, &uid);
|
.build_room_runner(&rid, &uid);
|
||||||
|
@ -542,7 +542,7 @@ mod test {
|
||||||
let uid = UserId::try_from("@example:localhost").unwrap();
|
let uid = UserId::try_from("@example:localhost").unwrap();
|
||||||
|
|
||||||
let mut bld = EventBuilder::default()
|
let mut bld = EventBuilder::default()
|
||||||
.add_state_event_from_file("./tests/data/events/aliases.json", StateEvent::RoomAliases)
|
.add_state_event_from_file("../test_data/events/aliases.json", StateEvent::RoomAliases)
|
||||||
.build_room_runner(&rid, &uid);
|
.build_room_runner(&rid, &uid);
|
||||||
|
|
||||||
let room = bld.to_room();
|
let room = bld.to_room();
|
||||||
|
@ -557,7 +557,7 @@ mod test {
|
||||||
|
|
||||||
let mut bld = EventBuilder::default()
|
let mut bld = EventBuilder::default()
|
||||||
.add_state_event_from_file(
|
.add_state_event_from_file(
|
||||||
"./tests/data/events/alias.json",
|
"../test_data/events/alias.json",
|
||||||
StateEvent::RoomCanonicalAlias,
|
StateEvent::RoomCanonicalAlias,
|
||||||
)
|
)
|
||||||
.build_room_runner(&rid, &uid);
|
.build_room_runner(&rid, &uid);
|
||||||
|
@ -573,7 +573,7 @@ mod test {
|
||||||
let uid = UserId::try_from("@example:localhost").unwrap();
|
let uid = UserId::try_from("@example:localhost").unwrap();
|
||||||
|
|
||||||
let mut bld = EventBuilder::default()
|
let mut bld = EventBuilder::default()
|
||||||
.add_state_event_from_file("./tests/data/events/name.json", StateEvent::RoomName)
|
.add_state_event_from_file("../test_data/events/name.json", StateEvent::RoomName)
|
||||||
.build_room_runner(&rid, &uid);
|
.build_room_runner(&rid, &uid);
|
||||||
|
|
||||||
let room = bld.to_room();
|
let room = bld.to_room();
|
||||||
|
@ -587,7 +587,7 @@ mod test {
|
||||||
|
|
||||||
let mut bld = EventBuilder::default().build_with_response(
|
let mut bld = EventBuilder::default().build_with_response(
|
||||||
// this sync has no room.name or room.alias events so only relies on summary
|
// this sync has no room.name or room.alias events so only relies on summary
|
||||||
"tests/data/sync_with_summary.json",
|
"../test_data/sync_with_summary.json",
|
||||||
"GET",
|
"GET",
|
||||||
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
||||||
);
|
);
|
|
@ -199,9 +199,9 @@ mod test {
|
||||||
let rid = RoomId::try_from("!roomid:room.com").unwrap();
|
let rid = RoomId::try_from("!roomid:room.com").unwrap();
|
||||||
let uid = UserId::try_from("@example:localhost").unwrap();
|
let uid = UserId::try_from("@example:localhost").unwrap();
|
||||||
let mut bld = EventBuilder::default()
|
let mut bld = EventBuilder::default()
|
||||||
.add_room_event_from_file("./tests/data/events/member.json", RoomEvent::RoomMember)
|
.add_room_event_from_file("../test_data/events/member.json", RoomEvent::RoomMember)
|
||||||
.add_room_event_from_file(
|
.add_room_event_from_file(
|
||||||
"./tests/data/events/power_levels.json",
|
"../test_data/events/power_levels.json",
|
||||||
RoomEvent::RoomPowerLevels,
|
RoomEvent::RoomPowerLevels,
|
||||||
)
|
)
|
||||||
.build_room_runner(&rid, &uid);
|
.build_room_runner(&rid, &uid);
|
||||||
|
@ -220,12 +220,12 @@ mod test {
|
||||||
let rid = RoomId::try_from("!roomid:room.com").unwrap();
|
let rid = RoomId::try_from("!roomid:room.com").unwrap();
|
||||||
let uid = UserId::try_from("@example:localhost").unwrap();
|
let uid = UserId::try_from("@example:localhost").unwrap();
|
||||||
let mut bld = EventBuilder::default()
|
let mut bld = EventBuilder::default()
|
||||||
.add_room_event_from_file("./tests/data/events/member.json", RoomEvent::RoomMember)
|
.add_room_event_from_file("../test_data/events/member.json", RoomEvent::RoomMember)
|
||||||
.add_room_event_from_file(
|
.add_room_event_from_file(
|
||||||
"./tests/data/events/power_levels.json",
|
"../test_data/events/power_levels.json",
|
||||||
RoomEvent::RoomPowerLevels,
|
RoomEvent::RoomPowerLevels,
|
||||||
)
|
)
|
||||||
.add_presence_event_from_file("./tests/data/events/presence.json")
|
.add_presence_event_from_file("../test_data/events/presence.json")
|
||||||
.build_room_runner(&rid, &uid);
|
.build_room_runner(&rid, &uid);
|
||||||
|
|
||||||
let room = bld.to_room();
|
let room = bld.to_room();
|
|
@ -307,7 +307,7 @@ mod test {
|
||||||
|
|
||||||
let _m = mock("POST", "/_matrix/client/r0/createRoom")
|
let _m = mock("POST", "/_matrix/client/r0/createRoom")
|
||||||
.with_status(200)
|
.with_status(200)
|
||||||
.with_body_from_file("./tests/data/room_id.json")
|
.with_body_from_file("../test_data/room_id.json")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let session = Session {
|
let session = Session {
|
||||||
|
@ -354,7 +354,7 @@ mod test {
|
||||||
Matcher::Regex(r"^/_matrix/client/r0/rooms/.*/messages".to_string()),
|
Matcher::Regex(r"^/_matrix/client/r0/rooms/.*/messages".to_string()),
|
||||||
)
|
)
|
||||||
.with_status(200)
|
.with_status(200)
|
||||||
.with_body_from_file("./tests/data/room_messages.json")
|
.with_body_from_file("../test_data/room_messages.json")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let session = Session {
|
let session = Session {
|
|
@ -14,7 +14,7 @@ async fn login() {
|
||||||
|
|
||||||
let _m = mock("POST", "/_matrix/client/r0/login")
|
let _m = mock("POST", "/_matrix/client/r0/login")
|
||||||
.with_status(200)
|
.with_status(200)
|
||||||
.with_body_from_file("tests/data/login_response.json")
|
.with_body_from_file("../test_data/login_response.json")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let client = AsyncClient::new(homeserver, None).unwrap();
|
let client = AsyncClient::new(homeserver, None).unwrap();
|
||||||
|
@ -43,7 +43,7 @@ async fn sync() {
|
||||||
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
||||||
)
|
)
|
||||||
.with_status(200)
|
.with_status(200)
|
||||||
.with_body_from_file("tests/data/sync.json")
|
.with_body_from_file("../test_data/sync.json")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
||||||
|
@ -72,7 +72,7 @@ async fn room_names() {
|
||||||
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
Matcher::Regex(r"^/_matrix/client/r0/sync\?.*$".to_string()),
|
||||||
)
|
)
|
||||||
.with_status(200)
|
.with_status(200)
|
||||||
.with_body_from_file("tests/data/sync.json")
|
.with_body_from_file("../test_data/sync.json")
|
||||||
.create();
|
.create();
|
||||||
|
|
||||||
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
let client = AsyncClient::new(homeserver, Some(session)).unwrap();
|
|
@ -0,0 +1,58 @@
|
||||||
|
[package]
|
||||||
|
authors = ["Damir Jelić <poljar@termina.org.uk"]
|
||||||
|
description = "Matrix encryption library"
|
||||||
|
edition = "2018"
|
||||||
|
homepage = "https://github.com/matrix-org/matrix-rust-sdk"
|
||||||
|
keywords = ["matrix", "chat", "messaging", "ruma", "nio"]
|
||||||
|
license = "Apache-2.0"
|
||||||
|
name = "matrix-sdk-crypto"
|
||||||
|
readme = "README.md"
|
||||||
|
repository = "https://github.com/matrix-org/matrix-rust-sdk"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
default = []
|
||||||
|
sqlite-cryptostore = ["sqlx"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
futures = "0.3.4"
|
||||||
|
async-trait = "0.1.30"
|
||||||
|
|
||||||
|
matrix-sdk-types = { path = "../matrix_sdk_types" }
|
||||||
|
|
||||||
|
olm-rs = { version = "0.5.0", features = ["serde"]}
|
||||||
|
serde = { version = "1.0.106", features = ["derive"] }
|
||||||
|
serde_json = { version = "1.0.51" }
|
||||||
|
cjson = { version = "0.1.0" }
|
||||||
|
zeroize = { version = "1.1.0", features = ["zeroize_derive"] }
|
||||||
|
uuid = { version = "0.8.1", features = ["v4"] }
|
||||||
|
url = "2.1.1"
|
||||||
|
|
||||||
|
# Misc dependencies
|
||||||
|
thiserror = "1.0.14"
|
||||||
|
tracing = "0.1.13"
|
||||||
|
atomic = "0.4.5"
|
||||||
|
dashmap = "3.10.0"
|
||||||
|
|
||||||
|
[dependencies.tracing-futures]
|
||||||
|
version = "0.2.3"
|
||||||
|
default-features = false
|
||||||
|
features = ["std", "std-future"]
|
||||||
|
|
||||||
|
[dependencies.tokio]
|
||||||
|
version = "0.2.16"
|
||||||
|
default-features = false
|
||||||
|
features = ["sync", "time"]
|
||||||
|
|
||||||
|
[dependencies.sqlx]
|
||||||
|
version = "0.3.3"
|
||||||
|
optional = true
|
||||||
|
default-features = false
|
||||||
|
features = ["runtime-tokio", "sqlite"]
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
tokio = { version = "0.2.16", features = ["rt-threaded", "macros"] }
|
||||||
|
ruma-identifiers = { version = "0.16.0", features = ["rand"] }
|
||||||
|
serde_json = "1.0.51"
|
||||||
|
tempfile = "3.1.0"
|
||||||
|
http = "*"
|
|
@ -23,9 +23,9 @@ use atomic::Atomic;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use super::OlmMachine;
|
use super::OlmMachine;
|
||||||
use crate::api::r0::keys::{DeviceKeys, KeyAlgorithm};
|
use matrix_sdk_types::api::r0::keys::{DeviceKeys, KeyAlgorithm};
|
||||||
use crate::events::Algorithm;
|
use matrix_sdk_types::events::Algorithm;
|
||||||
use crate::identifiers::{DeviceId, UserId};
|
use matrix_sdk_types::identifiers::{DeviceId, UserId};
|
||||||
|
|
||||||
/// A device represents a E2EE capable client of an user.
|
/// A device represents a E2EE capable client of an user.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
@ -131,7 +131,7 @@ impl Device {
|
||||||
|
|
||||||
for (key_id, key) in device_keys.keys.iter() {
|
for (key_id, key) in device_keys.keys.iter() {
|
||||||
let key_id = key_id.0;
|
let key_id = key_id.0;
|
||||||
keys.insert(key_id, key.clone());
|
let _ = keys.insert(key_id, key.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
let display_name = Arc::new(
|
let display_name = Arc::new(
|
||||||
|
@ -141,12 +141,12 @@ impl Device {
|
||||||
.map(|d| d.device_display_name.clone()),
|
.map(|d| d.device_display_name.clone()),
|
||||||
);
|
);
|
||||||
|
|
||||||
mem::replace(
|
let _ = mem::replace(
|
||||||
&mut self.algorithms,
|
&mut self.algorithms,
|
||||||
Arc::new(device_keys.algorithms.clone()),
|
Arc::new(device_keys.algorithms.clone()),
|
||||||
);
|
);
|
||||||
mem::replace(&mut self.keys, Arc::new(keys));
|
let _ = mem::replace(&mut self.keys, Arc::new(keys));
|
||||||
mem::replace(&mut self.display_name, display_name);
|
let _ = mem::replace(&mut self.display_name, display_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Mark the device as deleted.
|
/// Mark the device as deleted.
|
||||||
|
@ -190,7 +190,7 @@ impl From<&DeviceKeys> for Device {
|
||||||
|
|
||||||
for (key_id, key) in device_keys.keys.iter() {
|
for (key_id, key) in device_keys.keys.iter() {
|
||||||
let key_id = key_id.0;
|
let key_id = key_id.0;
|
||||||
keys.insert(key_id, key.clone());
|
let _ = keys.insert(key_id, key.clone());
|
||||||
}
|
}
|
||||||
|
|
||||||
Device {
|
Device {
|
||||||
|
@ -221,9 +221,9 @@ pub(crate) mod test {
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
use std::convert::{From, TryFrom};
|
use std::convert::{From, TryFrom};
|
||||||
|
|
||||||
use crate::api::r0::keys::{DeviceKeys, KeyAlgorithm};
|
use crate::device::{Device, TrustState};
|
||||||
use crate::crypto::device::{Device, TrustState};
|
use matrix_sdk_types::api::r0::keys::{DeviceKeys, KeyAlgorithm};
|
||||||
use crate::identifiers::UserId;
|
use matrix_sdk_types::identifiers::UserId;
|
||||||
|
|
||||||
fn device_keys() -> DeviceKeys {
|
fn device_keys() -> DeviceKeys {
|
||||||
let user_id = UserId::try_from("@alice:example.org").unwrap();
|
let user_id = UserId::try_from("@alice:example.org").unwrap();
|
|
@ -12,6 +12,9 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
//! This is the encryption part of the matrix-sdk. It contains a state machine
|
||||||
|
//! that will aid in adding encryption support to a client library.
|
||||||
|
|
||||||
mod device;
|
mod device;
|
||||||
mod error;
|
mod error;
|
||||||
mod machine;
|
mod machine;
|
|
@ -31,8 +31,8 @@ use super::store::memorystore::MemoryStore;
|
||||||
use super::store::sqlite::SqliteStore;
|
use super::store::sqlite::SqliteStore;
|
||||||
use super::{device::Device, CryptoStore};
|
use super::{device::Device, CryptoStore};
|
||||||
|
|
||||||
use crate::api;
|
use matrix_sdk_types::api;
|
||||||
use crate::events::{
|
use matrix_sdk_types::events::{
|
||||||
collections::all::RoomEvent,
|
collections::all::RoomEvent,
|
||||||
room::encrypted::{
|
room::encrypted::{
|
||||||
CiphertextInfo, EncryptedEvent, EncryptedEventContent, MegolmV1AesSha2Content,
|
CiphertextInfo, EncryptedEvent, EncryptedEventContent, MegolmV1AesSha2Content,
|
||||||
|
@ -45,7 +45,7 @@ use crate::events::{
|
||||||
},
|
},
|
||||||
Algorithm, EventJson, EventType,
|
Algorithm, EventJson, EventType,
|
||||||
};
|
};
|
||||||
use crate::identifiers::{DeviceId, RoomId, UserId};
|
use matrix_sdk_types::identifiers::{DeviceId, RoomId, UserId};
|
||||||
|
|
||||||
use api::r0::keys;
|
use api::r0::keys;
|
||||||
use api::r0::{
|
use api::r0::{
|
||||||
|
@ -94,7 +94,7 @@ impl std::fmt::Debug for OlmMachine {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl OlmMachine {
|
impl OlmMachine {
|
||||||
const ALGORITHMS: &'static [&'static ruma_events::Algorithm] = &[
|
const ALGORITHMS: &'static [&'static Algorithm] = &[
|
||||||
&Algorithm::OlmV1Curve25519AesSha2,
|
&Algorithm::OlmV1Curve25519AesSha2,
|
||||||
&Algorithm::MegolmV1AesSha2,
|
&Algorithm::MegolmV1AesSha2,
|
||||||
];
|
];
|
||||||
|
@ -136,7 +136,6 @@ impl OlmMachine {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// TODO load the tracked users here.
|
|
||||||
Ok(OlmMachine {
|
Ok(OlmMachine {
|
||||||
user_id: user_id.clone(),
|
user_id: user_id.clone(),
|
||||||
device_id: device_id.to_owned(),
|
device_id: device_id.to_owned(),
|
||||||
|
@ -1100,7 +1099,15 @@ impl OlmMachine {
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO accept an algorithm here
|
// TODO accept an algorithm here
|
||||||
pub(crate) async fn share_group_session<'a, I>(
|
/// Get to-device requests to share a group session with users in a room.
|
||||||
|
///
|
||||||
|
/// # Arguments
|
||||||
|
///
|
||||||
|
/// `room_id` - The room id of the room where the group session will be
|
||||||
|
/// used.
|
||||||
|
///
|
||||||
|
/// `users` - The list of users that should receive the group session.
|
||||||
|
pub async fn share_group_session<'a, I>(
|
||||||
&mut self,
|
&mut self,
|
||||||
room_id: &RoomId,
|
room_id: &RoomId,
|
||||||
users: I,
|
users: I,
|
||||||
|
@ -1395,7 +1402,7 @@ mod test {
|
||||||
static USER_ID: &str = "@bob:example.org";
|
static USER_ID: &str = "@bob:example.org";
|
||||||
static DEVICE_ID: &str = "DEVICEID";
|
static DEVICE_ID: &str = "DEVICEID";
|
||||||
|
|
||||||
use js_int::UInt;
|
use matrix_sdk_types::js_int::UInt;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
@ -1403,12 +1410,16 @@ mod test {
|
||||||
use std::sync::atomic::AtomicU64;
|
use std::sync::atomic::AtomicU64;
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
|
|
||||||
|
use http::Response;
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
|
||||||
use crate::api::r0::{client_exchange::send_event_to_device::Request as ToDeviceRequest, keys};
|
use crate::machine::{OlmMachine, OneTimeKeys};
|
||||||
use crate::crypto::machine::{OlmMachine, OneTimeKeys};
|
use crate::Device;
|
||||||
use crate::crypto::Device;
|
|
||||||
use crate::events::{
|
use matrix_sdk_types::api::r0::{
|
||||||
|
client_exchange::send_event_to_device::Request as ToDeviceRequest, keys,
|
||||||
|
};
|
||||||
|
use matrix_sdk_types::events::{
|
||||||
collections::all::RoomEvent,
|
collections::all::RoomEvent,
|
||||||
room::{
|
room::{
|
||||||
encrypted::{EncryptedEvent, EncryptedEventContent},
|
encrypted::{EncryptedEvent, EncryptedEventContent},
|
||||||
|
@ -1417,9 +1428,7 @@ mod test {
|
||||||
to_device::{AnyToDeviceEvent, ToDeviceEncrypted},
|
to_device::{AnyToDeviceEvent, ToDeviceEncrypted},
|
||||||
EventJson, EventType,
|
EventJson, EventType,
|
||||||
};
|
};
|
||||||
use crate::identifiers::{DeviceId, EventId, RoomId, UserId};
|
use matrix_sdk_types::identifiers::{DeviceId, EventId, RoomId, UserId};
|
||||||
|
|
||||||
use http::Response;
|
|
||||||
|
|
||||||
fn alice_id() -> UserId {
|
fn alice_id() -> UserId {
|
||||||
UserId::try_from("@alice:example.org").unwrap()
|
UserId::try_from("@alice:example.org").unwrap()
|
||||||
|
@ -1444,12 +1453,12 @@ mod test {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn keys_upload_response() -> keys::upload_keys::Response {
|
fn keys_upload_response() -> keys::upload_keys::Response {
|
||||||
let data = response_from_file("tests/data/keys_upload.json");
|
let data = response_from_file("../test_data/keys_upload.json");
|
||||||
keys::upload_keys::Response::try_from(data).expect("Can't parse the keys upload response")
|
keys::upload_keys::Response::try_from(data).expect("Can't parse the keys upload response")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn keys_query_response() -> keys::get_keys::Response {
|
fn keys_query_response() -> keys::get_keys::Response {
|
||||||
let data = response_from_file("tests/data/keys_query.json");
|
let data = response_from_file("../test_data/keys_query.json");
|
||||||
keys::get_keys::Response::try_from(data).expect("Can't parse the keys upload response")
|
keys::get_keys::Response::try_from(data).expect("Can't parse the keys upload response")
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,7 @@ use tokio::sync::Mutex;
|
||||||
|
|
||||||
use super::device::Device;
|
use super::device::Device;
|
||||||
use super::olm::{InboundGroupSession, Session};
|
use super::olm::{InboundGroupSession, Session};
|
||||||
use crate::identifiers::{DeviceId, RoomId, UserId};
|
use matrix_sdk_types::identifiers::{DeviceId, RoomId, UserId};
|
||||||
|
|
||||||
/// In-memory store for Olm Sessions.
|
/// In-memory store for Olm Sessions.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
@ -210,11 +210,11 @@ impl DeviceStore {
|
||||||
mod test {
|
mod test {
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
use crate::crypto::device::test::get_device;
|
use crate::device::test::get_device;
|
||||||
use crate::crypto::memory_stores::{DeviceStore, GroupSessionStore, SessionStore};
|
use crate::memory_stores::{DeviceStore, GroupSessionStore, SessionStore};
|
||||||
use crate::crypto::olm::test::get_account_and_session;
|
use crate::olm::test::get_account_and_session;
|
||||||
use crate::crypto::olm::{InboundGroupSession, OutboundGroupSession};
|
use crate::olm::{InboundGroupSession, OutboundGroupSession};
|
||||||
use crate::identifiers::RoomId;
|
use matrix_sdk_types::identifiers::RoomId;
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_session_store() {
|
async fn test_session_store() {
|
|
@ -35,8 +35,8 @@ pub use olm_rs::{
|
||||||
utility::OlmUtility,
|
utility::OlmUtility,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::api::r0::keys::SignedKey;
|
use matrix_sdk_types::api::r0::keys::SignedKey;
|
||||||
use crate::identifiers::RoomId;
|
use matrix_sdk_types::identifiers::RoomId;
|
||||||
|
|
||||||
/// The Olm account.
|
/// The Olm account.
|
||||||
/// An account is the central identity for encrypted communication between two
|
/// An account is the central identity for encrypted communication between two
|
||||||
|
@ -620,10 +620,10 @@ impl std::fmt::Debug for OutboundGroupSession {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
pub(crate) mod test {
|
pub(crate) mod test {
|
||||||
use crate::crypto::olm::{Account, InboundGroupSession, OutboundGroupSession, Session};
|
use crate::olm::{Account, InboundGroupSession, OutboundGroupSession, Session};
|
||||||
use crate::identifiers::RoomId;
|
use matrix_sdk_types::api::r0::keys::SignedKey;
|
||||||
|
use matrix_sdk_types::identifiers::RoomId;
|
||||||
use olm_rs::session::OlmMessage;
|
use olm_rs::session::OlmMessage;
|
||||||
use ruma_client_api::r0::keys::SignedKey;
|
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
|
@ -19,9 +19,9 @@ use async_trait::async_trait;
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
|
|
||||||
use super::{Account, CryptoStore, InboundGroupSession, Result, Session};
|
use super::{Account, CryptoStore, InboundGroupSession, Result, Session};
|
||||||
use crate::crypto::device::Device;
|
use crate::device::Device;
|
||||||
use crate::crypto::memory_stores::{DeviceStore, GroupSessionStore, SessionStore, UserDevices};
|
use crate::memory_stores::{DeviceStore, GroupSessionStore, SessionStore, UserDevices};
|
||||||
use crate::identifiers::{DeviceId, RoomId, UserId};
|
use matrix_sdk_types::identifiers::{DeviceId, RoomId, UserId};
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct MemoryStore {
|
pub struct MemoryStore {
|
||||||
|
@ -107,12 +107,12 @@ impl CryptoStore for MemoryStore {
|
||||||
mod test {
|
mod test {
|
||||||
use std::convert::TryFrom;
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
use crate::crypto::device::test::get_device;
|
use crate::device::test::get_device;
|
||||||
use crate::crypto::olm::test::get_account_and_session;
|
use crate::olm::test::get_account_and_session;
|
||||||
use crate::crypto::olm::{InboundGroupSession, OutboundGroupSession};
|
use crate::olm::{InboundGroupSession, OutboundGroupSession};
|
||||||
use crate::crypto::store::memorystore::MemoryStore;
|
use crate::store::memorystore::MemoryStore;
|
||||||
use crate::crypto::store::CryptoStore;
|
use crate::store::CryptoStore;
|
||||||
use crate::identifiers::RoomId;
|
use matrix_sdk_types::identifiers::RoomId;
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_session_store() {
|
async fn test_session_store() {
|
|
@ -26,7 +26,7 @@ use tokio::sync::Mutex;
|
||||||
use super::device::Device;
|
use super::device::Device;
|
||||||
use super::memory_stores::UserDevices;
|
use super::memory_stores::UserDevices;
|
||||||
use super::olm::{Account, InboundGroupSession, Session};
|
use super::olm::{Account, InboundGroupSession, Session};
|
||||||
use crate::identifiers::{DeviceId, RoomId, UserId};
|
use matrix_sdk_types::identifiers::{DeviceId, RoomId, UserId};
|
||||||
use olm_rs::errors::{OlmAccountError, OlmGroupSessionError, OlmSessionError};
|
use olm_rs::errors::{OlmAccountError, OlmGroupSessionError, OlmSessionError};
|
||||||
|
|
||||||
pub mod memorystore;
|
pub mod memorystore;
|
|
@ -29,11 +29,11 @@ use tokio::sync::Mutex;
|
||||||
use zeroize::Zeroizing;
|
use zeroize::Zeroizing;
|
||||||
|
|
||||||
use super::{Account, CryptoStore, CryptoStoreError, InboundGroupSession, Result, Session};
|
use super::{Account, CryptoStore, CryptoStoreError, InboundGroupSession, Result, Session};
|
||||||
use crate::api::r0::keys::KeyAlgorithm;
|
use crate::device::{Device, TrustState};
|
||||||
use crate::crypto::device::{Device, TrustState};
|
use crate::memory_stores::{DeviceStore, GroupSessionStore, SessionStore, UserDevices};
|
||||||
use crate::crypto::memory_stores::{DeviceStore, GroupSessionStore, SessionStore, UserDevices};
|
use matrix_sdk_types::api::r0::keys::KeyAlgorithm;
|
||||||
use crate::events::Algorithm;
|
use matrix_sdk_types::events::Algorithm;
|
||||||
use crate::identifiers::{DeviceId, RoomId, UserId};
|
use matrix_sdk_types::identifiers::{DeviceId, RoomId, UserId};
|
||||||
|
|
||||||
pub struct SqliteStore {
|
pub struct SqliteStore {
|
||||||
user_id: Arc<String>,
|
user_id: Arc<String>,
|
||||||
|
@ -639,9 +639,9 @@ impl std::fmt::Debug for SqliteStore {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use crate::api::r0::keys::SignedKey;
|
use crate::device::test::get_device;
|
||||||
use crate::crypto::device::test::get_device;
|
use crate::olm::GroupSessionKey;
|
||||||
use crate::crypto::olm::GroupSessionKey;
|
use matrix_sdk_types::api::r0::keys::SignedKey;
|
||||||
use olm_rs::outbound_group_session::OlmOutboundGroupSession;
|
use olm_rs::outbound_group_session::OlmOutboundGroupSession;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use tempfile::tempdir;
|
use tempfile::tempdir;
|
|
@ -0,0 +1,18 @@
|
||||||
|
[package]
|
||||||
|
authors = ["Damir Jelić <poljar@termina.org.uk"]
|
||||||
|
description = "Collection of Matrix types used in the matrix-sdk"
|
||||||
|
edition = "2018"
|
||||||
|
homepage = "https://github.com/matrix-org/matrix-rust-sdk"
|
||||||
|
keywords = ["matrix", "chat", "messaging", "ruma", "nio"]
|
||||||
|
license = "Apache-2.0"
|
||||||
|
name = "matrix-sdk-types"
|
||||||
|
readme = "README.md"
|
||||||
|
repository = "https://github.com/matrix-org/matrix-rust-sdk"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
js_int = "0.1.5"
|
||||||
|
ruma-api = "0.16.0-rc.2"
|
||||||
|
ruma-client-api = { version = "0.8.0-rc.5" }
|
||||||
|
ruma-events = { version = "0.21.0-beta.1" }
|
||||||
|
ruma-identifiers = "0.16.0"
|
|
@ -0,0 +1,5 @@
|
||||||
|
pub use js_int;
|
||||||
|
pub use ruma_api::Endpoint;
|
||||||
|
pub use ruma_client_api as api;
|
||||||
|
pub use ruma_events as events;
|
||||||
|
pub use ruma_identifiers as identifiers;
|
Loading…
Reference in New Issue