diff --git a/Cargo.lock b/Cargo.lock index d8d3bc7..3101ab1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1355,9 +1355,21 @@ dependencies = [ "pin-project-lite", "signal-hook-registry", "slab", + "tokio-macros", "winapi 0.3.8", ] +[[package]] +name = "tokio-macros" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c3acc6aa564495a0f2e1d59fab677cd7f81a19994cfc7f3ad0e64301560389" +dependencies = [ + "proc-macro2 1.0.10", + "quote 1.0.3", + "syn 1.0.17", +] + [[package]] name = "tokio-rustls" version = "0.12.2" diff --git a/Cargo.toml b/Cargo.toml index 92a6681..7618ac0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,5 +26,5 @@ serde_json = "1.0.50" ruma-signatures = { git = "https://github.com/ruma/ruma-signatures.git" } ruma-federation-api = "0.0.1" serde = "1.0.106" -tokio = "0.2.16" +tokio = { version = "0.2.16", features = ["macros"] } #rt-threaded rand = "0.7.3" diff --git a/src/database.rs b/src/database.rs index a19ec43..f17e76f 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,6 +1,7 @@ use crate::utils; use directories::ProjectDirs; use sled::IVec; +use std::fs::remove_dir_all; pub struct MultiValue(sled::Tree); @@ -65,6 +66,16 @@ pub struct Database { } impl Database { + /// Tries to remove the old database but ignores all errors. + pub fn try_remove(hostname: &str) { + let mut path = ProjectDirs::from("xyz", "koesters", "matrixserver") + .unwrap() + .data_dir() + .to_path_buf(); + path.push(hostname); + let _ = remove_dir_all(path); + } + /// Load an existing database or create a new one. pub fn load_or_create(hostname: &str) -> Self { let mut path = ProjectDirs::from("xyz", "koesters", "matrixserver") diff --git a/src/main.rs b/src/main.rs index 4b1f72e..e7b49c7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,9 @@ mod pdu; mod ruma_wrapper; mod utils; +#[cfg(test)] +mod test; + pub use data::Data; pub use database::Database; pub use pdu::PduEvent; @@ -31,6 +34,7 @@ use ruma_client_api::{ get_avatar_url, get_display_name, get_profile, set_avatar_url, set_display_name, }, push::get_pushrules_all, + read_marker::set_read_marker, room::create_room, session::{get_login_types, login}, state::{create_state_event_for_empty_key, create_state_event_for_key}, @@ -159,9 +163,7 @@ fn login_route(data: State, body: Ruma) -> MatrixResult/read_markers", data = "")] +fn set_read_marker_route( + data: State, + body: Ruma, + _room_id: String, +) -> MatrixResult { + MatrixResult(Ok(set_read_marker::Response)) +} + #[post("/_matrix/client/r0/createRoom", data = "")] fn create_room_route( data: State, @@ -765,16 +776,7 @@ fn options_route(_segments: PathBuf) -> MatrixResult rocket::Rocket { rocket::ignite() .mount( "/", @@ -796,6 +798,7 @@ fn main() { set_presence_route, get_keys_route, upload_keys_route, + set_read_marker_route, create_room_route, get_alias_route, join_room_by_id_route, @@ -810,6 +813,17 @@ fn main() { ], ) .manage(data) - .launch() - .unwrap(); +} + +fn main() { + // Log info by default + if let Err(_) = std::env::var("RUST_LOG") { + std::env::set_var("RUST_LOG", "matrixserver=debug,info"); + } + pretty_env_logger::init(); + + let data = Data::load_or_create("matrixtesting.koesters.xyz"); + data.debug(); + + setup_rocket(data).launch().unwrap(); } diff --git a/src/test.rs b/src/test.rs new file mode 100644 index 0000000..6131eb2 --- /dev/null +++ b/src/test.rs @@ -0,0 +1,32 @@ +use super::*; +use rocket::{local::Client, http::Status}; + +fn setup_client() -> Client { + Database::try_remove("temp"); + let data = Data::load_or_create("temp"); + + let rocket = setup_rocket(data); + Client::new(rocket).expect("valid rocket instance") +} + +#[tokio::test] +async fn register_login() { + let client = setup_client(); + let mut response = client + .post("/_matrix/client/r0/register?kind=user") + .body( + r#"{ + "username": "cheeky_monkey", + "password": "ilovebananas", + "device_id": "GHTYAJCE", + "initial_device_display_name": "Jungle Phone", + "inhibit_login": false + }"#, + ) + .dispatch().await; + let body = serde_json::to_value(&response.body_string().await.unwrap()).unwrap(); + + assert_eq!(response.status().code, 401); + assert!(dbg!(&body["flows"]).as_array().unwrap().len() > 0); + assert!(body["session"].as_str().unwrap().len() > 0); +}