From c1cc9527ddae332261a774b415170a5420376f0d Mon Sep 17 00:00:00 2001 From: Luca Cassano <122177105+p4rzl@users.noreply.github.com> Date: Tue, 28 Jan 2025 16:52:45 +0100 Subject: [PATCH] Add support for passkeys in admin and user interfaces * **Admin Interface:** - Add a column for passkeys in the user table in `users.hbs`. - Add a section for managing passkeys in `settings.hbs`. * **Public API:** - Add endpoints for saving and retrieving passkeys in `public.rs`. * **User Interface:** - Add a passkey input field in the login form in `login.hbs`. --- src/api/core/public.rs | 34 ++++++++++++++++++++++++- src/static/templates/admin/settings.hbs | 14 ++++++++++ src/static/templates/admin/users.hbs | 4 +++ src/static/templates/user/login.hbs | 34 +++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/static/templates/user/login.hbs diff --git a/src/api/core/public.rs b/src/api/core/public.rs index 1c85ae1b..19eaf0d9 100644 --- a/src/api/core/public.rs +++ b/src/api/core/public.rs @@ -15,7 +15,7 @@ use crate::{ }; pub fn routes() -> Vec { - routes![ldap_import] + routes![ldap_import, save_passkey, get_passkeys] } #[derive(Deserialize)] @@ -190,6 +190,38 @@ async fn ldap_import(data: Json, token: PublicToken, mut conn: Db Ok(()) } +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct PasskeyData { + site: String, + passkey: String, +} + +#[post("/public/passkey/save", data = "")] +async fn save_passkey(data: Json, headers: Headers, mut conn: DbConn) -> EmptyResult { + let data = data.into_inner(); + let user_id = headers.user.uuid; + + let mut passkey = Passkey::new(user_id.clone(), data.site.clone(), data.passkey.clone()); + passkey.save(&mut conn).await?; + + Ok(()) +} + +#[get("/public/passkeys")] +async fn get_passkeys(headers: Headers, mut conn: DbConn) -> JsonResult { + let user_id = headers.user.uuid; + let passkeys = Passkey::find_by_user(&user_id, &mut conn).await; + + let passkeys_json: Vec = passkeys.iter().map(|p| p.to_json()).collect(); + + Ok(Json(json!({ + "data": passkeys_json, + "object": "list", + "continuationToken": null + }))) +} + pub struct PublicToken(OrganizationId); #[rocket::async_trait] diff --git a/src/static/templates/admin/settings.hbs b/src/static/templates/admin/settings.hbs index fb066cb4..365da916 100644 --- a/src/static/templates/admin/settings.hbs +++ b/src/static/templates/admin/settings.hbs @@ -135,6 +135,20 @@ {{/if}} +
+ +
+
+ Here you can manage the passkeys stored in the system. +
+ +
+ +
+
+
+ diff --git a/src/static/templates/admin/users.hbs b/src/static/templates/admin/users.hbs index 65470525..94ae4560 100644 --- a/src/static/templates/admin/users.hbs +++ b/src/static/templates/admin/users.hbs @@ -10,6 +10,7 @@ Last Active Entries Attachments + Passkeys Organizations Actions @@ -53,6 +54,9 @@ Size: {{attachment_size}} {{/if}} + + {{passkey_count}} +
{{#each organizations}} diff --git a/src/static/templates/user/login.hbs b/src/static/templates/user/login.hbs new file mode 100644 index 00000000..c162f46b --- /dev/null +++ b/src/static/templates/user/login.hbs @@ -0,0 +1,34 @@ +
+
+
User Login
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+ +