mirror of
				https://gitlab.com/comunic/comunicapiv3
				synced 2025-11-04 01:24:04 +00:00 
			
		
		
		
	Can register a new key
This commit is contained in:
		@@ -283,9 +283,9 @@ CREATE TABLE `comunic_admin` (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `comunic_admin_key` (
 | 
					CREATE TABLE `comunic_admin_key` (
 | 
				
			||||||
  `id` INT NOT NULL,
 | 
					  `id` INT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
  `admin_id` INT NULL,
 | 
					  `admin_id` INT NULL,
 | 
				
			||||||
  `name` VARCHAR(45) NULL,
 | 
					  `name` VARCHAR(45) NULL,
 | 
				
			||||||
  `time_add` INT NULL,
 | 
					  `time_add` INT NULL,
 | 
				
			||||||
  `key` TEXT NULL,
 | 
					  `security_key` TEXT NULL,
 | 
				
			||||||
  PRIMARY KEY (`id`));
 | 
					  PRIMARY KEY (`id`));
 | 
				
			||||||
@@ -9,9 +9,9 @@ CREATE TABLE `comunic_admin` (
 | 
				
			|||||||
  PRIMARY KEY (`id`));
 | 
					  PRIMARY KEY (`id`));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CREATE TABLE `comunic_admin_key` (
 | 
					CREATE TABLE `comunic_admin_key` (
 | 
				
			||||||
  `id` INT NOT NULL,
 | 
					  `id` INT NOT NULL AUTO_INCREMENT,
 | 
				
			||||||
  `admin_id` INT NULL,
 | 
					  `admin_id` INT NULL,
 | 
				
			||||||
  `name` VARCHAR(45) NULL,
 | 
					  `name` VARCHAR(45) NULL,
 | 
				
			||||||
  `time_add` INT NULL,
 | 
					  `time_add` INT NULL,
 | 
				
			||||||
  `key` TEXT NULL,
 | 
					  `security_key` TEXT NULL,
 | 
				
			||||||
  PRIMARY KEY (`id`));
 | 
					  PRIMARY KEY (`id`));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,7 +12,7 @@ use crate::data::admin::NewAdminGeneralSettings;
 | 
				
			|||||||
use crate::data::base_request_handler::BaseRequestHandler;
 | 
					use crate::data::base_request_handler::BaseRequestHandler;
 | 
				
			||||||
use crate::data::http_request_handler::HttpRequestHandler;
 | 
					use crate::data::http_request_handler::HttpRequestHandler;
 | 
				
			||||||
use crate::data::webauthn_config::get_wan;
 | 
					use crate::data::webauthn_config::get_wan;
 | 
				
			||||||
use crate::helpers::{admin_access_token_helper, admin_account_helper, admin_key_registration_challenges_helper};
 | 
					use crate::helpers::{admin_access_token_helper, admin_account_helper, admin_account_key_helper, admin_key_registration_challenges_helper};
 | 
				
			||||||
use crate::routes::RequestResult;
 | 
					use crate::routes::RequestResult;
 | 
				
			||||||
use crate::utils::date_utils::time;
 | 
					use crate::utils::date_utils::time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -103,4 +103,22 @@ pub fn challenge_register_key(r: &mut HttpRequestHandler) -> RequestResult {
 | 
				
			|||||||
    admin_key_registration_challenges_helper::set(r.admin_id()?, state)?;
 | 
					    admin_key_registration_challenges_helper::set(r.admin_id()?, state)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    r.set_response(res)
 | 
					    r.set_response(res)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Register key
 | 
				
			||||||
 | 
					pub fn register_key(r: &mut HttpRequestHandler) -> RequestResult {
 | 
				
			||||||
 | 
					    let name = r.post_string("name")?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let creds = r.post_register_public_key_credential("key")?;
 | 
				
			||||||
 | 
					    let state = r.some_or_internal_error(
 | 
				
			||||||
 | 
					        admin_key_registration_challenges_helper::get(r.admin_id()?)?,
 | 
				
			||||||
 | 
					        "No challenge found!",
 | 
				
			||||||
 | 
					    )?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let wan = get_wan();
 | 
				
			||||||
 | 
					    let key = wan.register_credential(creds, state, |_| Ok(false))?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    admin_account_key_helper::add_key(r.admin_id()?, &name, key)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    r.ok()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -551,6 +551,13 @@ pub trait BaseRequestHandler {
 | 
				
			|||||||
        Ok(list)
 | 
					        Ok(list)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Get the response to a key register credential included in the request
 | 
				
			||||||
 | 
					    fn post_register_public_key_credential(&mut self, name: &str) -> Res<webauthn_rs::proto::RegisterPublicKeyCredential> {
 | 
				
			||||||
 | 
					        let str = self.post_string(name)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Ok(serde_json::from_str(&str)?)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Get the ID of a user included in a POST request
 | 
					    /// Get the ID of a user included in a POST request
 | 
				
			||||||
    fn post_user_id(&mut self, name: &str) -> ResultBoxError<UserID> {
 | 
					    fn post_user_id(&mut self, name: &str) -> ResultBoxError<UserID> {
 | 
				
			||||||
        let user_id = UserID::new(self.post_u64(name)?);
 | 
					        let user_id = UserID::new(self.post_u64(name)?);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										21
									
								
								src/helpers/admin_account_key_helper.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/helpers/admin_account_key_helper.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					//! # Admin account key helper
 | 
				
			||||||
 | 
					//!
 | 
				
			||||||
 | 
					//! @author Pierre Hubert
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use webauthn_rs::proto::Credential;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use crate::constants::database_tables_names::ADMIN_KEYS_TABLE;
 | 
				
			||||||
 | 
					use crate::data::admin::AdminID;
 | 
				
			||||||
 | 
					use crate::data::error::Res;
 | 
				
			||||||
 | 
					use crate::helpers::database;
 | 
				
			||||||
 | 
					use crate::utils::date_utils::time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// Save a new key in the database
 | 
				
			||||||
 | 
					pub fn add_key(id: AdminID, name: &str, key: Credential) -> Res {
 | 
				
			||||||
 | 
					    database::InsertQuery::new(ADMIN_KEYS_TABLE)
 | 
				
			||||||
 | 
					        .add_admin_id("admin_id", id)
 | 
				
			||||||
 | 
					        .add_str("name", name)
 | 
				
			||||||
 | 
					        .add_u64("time_add", time())
 | 
				
			||||||
 | 
					        .add_str("security_key", &serde_json::to_string(&key)?)
 | 
				
			||||||
 | 
					        .insert_drop_result()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -31,4 +31,12 @@ pub fn set(admin: AdminID, key: RegistrationState) -> Res {
 | 
				
			|||||||
    cache?.insert(admin, key);
 | 
					    cache?.insert(admin, key);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Ok(())
 | 
					    Ok(())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub fn get(admin: AdminID) -> Res<Option<RegistrationState>> {
 | 
				
			||||||
 | 
					    let cache = unsafe {
 | 
				
			||||||
 | 
					        CACHE.as_ref().unwrap().lock()
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ok(cache?.remove(&admin))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -692,6 +692,11 @@ impl InsertQuery {
 | 
				
			|||||||
        self
 | 
					        self
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn add_admin_id(mut self, key: &str, value: AdminID) -> InsertQuery {
 | 
				
			||||||
 | 
					        self.values.insert(key.to_string(), Value::from(value.id()));
 | 
				
			||||||
 | 
					        self
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn add_group_id(mut self, key: &str, value: &GroupID) -> InsertQuery {
 | 
					    pub fn add_group_id(mut self, key: &str, value: &GroupID) -> InsertQuery {
 | 
				
			||||||
        self.values.insert(key.to_string(), Value::from(value.id()));
 | 
					        self.values.insert(key.to_string(), Value::from(value.id()));
 | 
				
			||||||
        self
 | 
					        self
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,5 +23,6 @@ pub mod independent_push_notifications_service_helper;
 | 
				
			|||||||
pub mod firebase_notifications_helper;
 | 
					pub mod firebase_notifications_helper;
 | 
				
			||||||
pub mod forez_presence_helper;
 | 
					pub mod forez_presence_helper;
 | 
				
			||||||
pub mod admin_account_helper;
 | 
					pub mod admin_account_helper;
 | 
				
			||||||
 | 
					pub mod admin_account_key_helper;
 | 
				
			||||||
pub mod admin_access_token_helper;
 | 
					pub mod admin_access_token_helper;
 | 
				
			||||||
pub mod admin_key_registration_challenges_helper;
 | 
					pub mod admin_key_registration_challenges_helper;
 | 
				
			||||||
@@ -353,6 +353,7 @@ pub fn get_routes() -> Vec<Route> {
 | 
				
			|||||||
        Route::admin_post("/admin/accounts/id", Box::new(admin_account_controller::get_admin_id)),
 | 
					        Route::admin_post("/admin/accounts/id", Box::new(admin_account_controller::get_admin_id)),
 | 
				
			||||||
        Route::admin_post("/admin/accounts/info", Box::new(admin_account_controller::get_admin_info)),
 | 
					        Route::admin_post("/admin/accounts/info", Box::new(admin_account_controller::get_admin_info)),
 | 
				
			||||||
        Route::admin_post("/admin/accounts/update_general_settings", Box::new(admin_account_controller::update_general_settings)),
 | 
					        Route::admin_post("/admin/accounts/update_general_settings", Box::new(admin_account_controller::update_general_settings)),
 | 
				
			||||||
        Route::admin_post("/admin/accounts/challenge_register_key", Box::new(admin_account_controller::challenge_register_key))
 | 
					        Route::admin_post("/admin/accounts/challenge_register_key", Box::new(admin_account_controller::challenge_register_key)),
 | 
				
			||||||
 | 
					        Route::admin_post("/admin/accounts/register_key", Box::new(admin_account_controller::register_key)),
 | 
				
			||||||
    ]
 | 
					    ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user