mirror of
				https://gitlab.com/comunic/comunicapiv3
				synced 2025-11-04 01:24:04 +00:00 
			
		
		
		
	Return keys listing in auth options
This commit is contained in:
		@@ -287,5 +287,5 @@ CREATE TABLE `comunic_admin_key` (
 | 
				
			|||||||
  `admin_id` INT NULL,
 | 
					  `admin_id` INT NULL,
 | 
				
			||||||
  `name` VARCHAR(45) NULL,
 | 
					  `name` VARCHAR(45) NULL,
 | 
				
			||||||
  `time_add` INT NULL,
 | 
					  `time_add` INT NULL,
 | 
				
			||||||
  `security_key` TEXT NULL,
 | 
					  `credential` TEXT NULL,
 | 
				
			||||||
  PRIMARY KEY (`id`));
 | 
					  PRIMARY KEY (`id`));
 | 
				
			||||||
@@ -13,5 +13,5 @@ CREATE TABLE `comunic_admin_key` (
 | 
				
			|||||||
  `admin_id` INT NULL,
 | 
					  `admin_id` INT NULL,
 | 
				
			||||||
  `name` VARCHAR(45) NULL,
 | 
					  `name` VARCHAR(45) NULL,
 | 
				
			||||||
  `time_add` INT NULL,
 | 
					  `time_add` INT NULL,
 | 
				
			||||||
  `security_key` TEXT NULL,
 | 
					  `credential` TEXT NULL,
 | 
				
			||||||
  PRIMARY KEY (`id`));
 | 
					  PRIMARY KEY (`id`));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,17 +4,25 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
use serde::Serialize;
 | 
					use serde::Serialize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::data::admin::Admin;
 | 
					use crate::data::admin::{Admin, AdminKey};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Serialize)]
 | 
				
			||||||
 | 
					struct AuthKey {
 | 
				
			||||||
 | 
					    name: String,
 | 
				
			||||||
 | 
					    id: u64,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Serialize)]
 | 
					#[derive(Serialize)]
 | 
				
			||||||
pub struct AdminAuthOptions {
 | 
					pub struct AdminAuthOptions {
 | 
				
			||||||
    reset_token: bool,
 | 
					    reset_token: bool,
 | 
				
			||||||
 | 
					    keys: Vec<AuthKey>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl AdminAuthOptions {
 | 
					impl AdminAuthOptions {
 | 
				
			||||||
    pub fn new(admin: &Admin) -> Self {
 | 
					    pub fn new(admin: &Admin, keys: &Vec<AdminKey>) -> Self {
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            reset_token: admin.reset_token.is_some()
 | 
					            reset_token: admin.reset_token.is_some(),
 | 
				
			||||||
 | 
					            keys: keys.iter().map(|k| AuthKey { id: k.id, name: k.name.to_string() }).collect(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -20,8 +20,9 @@ use crate::utils::date_utils::time;
 | 
				
			|||||||
pub fn get_auth_options(r: &mut HttpRequestHandler) -> RequestResult {
 | 
					pub fn get_auth_options(r: &mut HttpRequestHandler) -> RequestResult {
 | 
				
			||||||
    let mail = r.post_email("mail")?;
 | 
					    let mail = r.post_email("mail")?;
 | 
				
			||||||
    let admin = admin_account_helper::find_admin_by_email(&mail)?;
 | 
					    let admin = admin_account_helper::find_admin_by_email(&mail)?;
 | 
				
			||||||
 | 
					    let keys = admin_account_key_helper::get_admin_keys(admin.id)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    r.set_response(AdminAuthOptions::new(&admin))
 | 
					    r.set_response(AdminAuthOptions::new(&admin, &keys))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Login admin using a reset token
 | 
					/// Login admin using a reset token
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,6 +2,8 @@
 | 
				
			|||||||
//!
 | 
					//!
 | 
				
			||||||
//! @author Pierre Hubert
 | 
					//! @author Pierre Hubert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use webauthn_rs::proto::Credential;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash)]
 | 
					#[derive(Copy, Clone, Eq, PartialEq, Debug, Hash)]
 | 
				
			||||||
pub struct AdminID(u64);
 | 
					pub struct AdminID(u64);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -41,7 +43,7 @@ pub struct AdminKey {
 | 
				
			|||||||
    pub id: u64,
 | 
					    pub id: u64,
 | 
				
			||||||
    pub admin_id: AdminID,
 | 
					    pub admin_id: AdminID,
 | 
				
			||||||
    pub name: String,
 | 
					    pub name: String,
 | 
				
			||||||
    pub key: String,
 | 
					    pub key: Credential,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Admin access token
 | 
					/// Admin access token
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
use webauthn_rs::proto::Credential;
 | 
					use webauthn_rs::proto::Credential;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::constants::database_tables_names::ADMIN_KEYS_TABLE;
 | 
					use crate::constants::database_tables_names::ADMIN_KEYS_TABLE;
 | 
				
			||||||
use crate::data::admin::AdminID;
 | 
					use crate::data::admin::{AdminID, AdminKey};
 | 
				
			||||||
use crate::data::error::Res;
 | 
					use crate::data::error::Res;
 | 
				
			||||||
use crate::helpers::database;
 | 
					use crate::helpers::database;
 | 
				
			||||||
use crate::utils::date_utils::time;
 | 
					use crate::utils::date_utils::time;
 | 
				
			||||||
@@ -16,6 +16,23 @@ pub fn add_key(id: AdminID, name: &str, key: Credential) -> Res {
 | 
				
			|||||||
        .add_admin_id("admin_id", id)
 | 
					        .add_admin_id("admin_id", id)
 | 
				
			||||||
        .add_str("name", name)
 | 
					        .add_str("name", name)
 | 
				
			||||||
        .add_u64("time_add", time())
 | 
					        .add_u64("time_add", time())
 | 
				
			||||||
        .add_str("security_key", &serde_json::to_string(&key)?)
 | 
					        .add_str("credential", &serde_json::to_string(&key)?)
 | 
				
			||||||
        .insert_drop_result()
 | 
					        .insert_drop_result()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Get the list of keys of a given admin
 | 
				
			||||||
 | 
					pub fn get_admin_keys(id: AdminID) -> Res<Vec<AdminKey>> {
 | 
				
			||||||
 | 
					    database::QueryInfo::new(ADMIN_KEYS_TABLE)
 | 
				
			||||||
 | 
					        .cond_admin_id("admin_id", id)
 | 
				
			||||||
 | 
					        .exec(db_to_admin_key)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Turn database entry into an AdminKey structure
 | 
				
			||||||
 | 
					fn db_to_admin_key(row: &database::RowResult) -> Res<AdminKey> {
 | 
				
			||||||
 | 
					    Ok(AdminKey {
 | 
				
			||||||
 | 
					        id: row.get_u64("id")?,
 | 
				
			||||||
 | 
					        admin_id: row.get_admin_id("admin_id")?,
 | 
				
			||||||
 | 
					        name: row.get_str("name")?,
 | 
				
			||||||
 | 
					        key: serde_json::from_str(&row.get_str("credential")?)?,
 | 
				
			||||||
 | 
					    })
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user