From 8d1ee859f28563b72fd57011eef230de5834d314 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa?= Date: Fri, 24 Aug 2018 19:02:34 +0200 Subject: [PATCH] Implemented basic support for prelogin and notification negotiation --- src/api/core/accounts.rs | 28 ++++++++++++++++++++++++++++ src/api/core/mod.rs | 1 + src/api/mod.rs | 2 ++ src/api/notifications.rs | 31 +++++++++++++++++++++++++++++++ src/main.rs | 1 + 5 files changed, 63 insertions(+) create mode 100644 src/api/notifications.rs diff --git a/src/api/core/accounts.rs b/src/api/core/accounts.rs index cb6f83fa..a551a868 100644 --- a/src/api/core/accounts.rs +++ b/src/api/core/accounts.rs @@ -275,3 +275,31 @@ fn password_hint(data: JsonUpcase, conn: DbConn) -> EmptyResul None => Ok(()), } } + +#[derive(Deserialize)] +#[allow(non_snake_case)] +struct PreloginData { + Email: String, +} + +#[post("/accounts/prelogin", data = "")] +fn prelogin(data: JsonUpcase, conn: DbConn) -> JsonResult { + let data: PreloginData = data.into_inner().data; + + match User::find_by_mail(&data.Email, &conn) { + Some(user) => { + let kdf_type = 0; // PBKDF2: 0 + + let _server_iter = user.password_iterations; + let client_iter = 5000; // TODO: Make iterations user configurable + + + Ok(Json(json!({ + "Kdf": kdf_type, + "KdfIterations": client_iter + }))) + }, + None => err!("Invalid user"), + } +} + diff --git a/src/api/core/mod.rs b/src/api/core/mod.rs index 907b053b..f465a449 100644 --- a/src/api/core/mod.rs +++ b/src/api/core/mod.rs @@ -25,6 +25,7 @@ pub fn routes() -> Vec { delete_account, revision_date, password_hint, + prelogin, sync, diff --git a/src/api/mod.rs b/src/api/mod.rs index 15f6778c..d651497b 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -2,11 +2,13 @@ pub(crate) mod core; mod icons; mod identity; mod web; +mod notifications; pub use self::core::routes as core_routes; pub use self::icons::routes as icons_routes; pub use self::identity::routes as identity_routes; pub use self::web::routes as web_routes; +pub use self::notifications::routes as notifications_routes; use rocket::response::status::BadRequest; use rocket_contrib::Json; diff --git a/src/api/notifications.rs b/src/api/notifications.rs new file mode 100644 index 00000000..f24fade6 --- /dev/null +++ b/src/api/notifications.rs @@ -0,0 +1,31 @@ +use rocket::Route; +use rocket_contrib::Json; + +use db::DbConn; +use api::JsonResult; +use auth::Headers; + +pub fn routes() -> Vec { + routes![negotiate] +} + +#[post("/hub/negotiate")] +fn negotiate(_headers: Headers, _conn: DbConn) -> JsonResult { + use data_encoding::BASE64URL; + use crypto; + + // Store this in db? + let conn_id = BASE64URL.encode(&crypto::get_random(vec![0u8; 16])); + + // TODO: Implement transports + // Rocket WS support: https://github.com/SergioBenitez/Rocket/issues/90 + // Rocket SSE support: https://github.com/SergioBenitez/Rocket/issues/33 + Ok(Json(json!({ + "connectionId": conn_id, + "availableTransports":[ + // {"transport":"WebSockets", "transferFormats":["Text","Binary"]}, + // {"transport":"ServerSentEvents", "transferFormats":["Text"]}, + // {"transport":"LongPolling", "transferFormats":["Text","Binary"]} + ] + }))) +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 324d7bef..e715031c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,6 +45,7 @@ fn init_rocket() -> Rocket { .mount("/api", api::core_routes()) .mount("/identity", api::identity_routes()) .mount("/icons", api::icons_routes()) + .mount("/notifications", api::notifications_routes()) .manage(db::init_pool()) }