diff --git a/src/archive/archive.did b/src/archive/archive.did index cda9fef791..1a0d72a28b 100644 --- a/src/archive/archive.did +++ b/src/archive/archive.did @@ -65,6 +65,7 @@ type Operation = variant { name : opt Private; }; delete_account; + set_default_account; }; type Entry = record { diff --git a/src/canister_tests/src/api/archive.rs b/src/canister_tests/src/api/archive.rs index 2aa4c677f4..08ea73d542 100644 --- a/src/canister_tests/src/api/archive.rs +++ b/src/canister_tests/src/api/archive.rs @@ -98,6 +98,8 @@ pub mod compat { UpdateAccount { name: Option }, #[serde(rename = "delete_account")] DeleteAccount, + #[serde(rename = "set_default_account")] + SetDefaultAccount, } impl From for CompatOperation { @@ -134,6 +136,7 @@ pub mod compat { Operation::CreateAccount { name } => CompatOperation::CreateAccount { name }, Operation::UpdateAccount { name } => CompatOperation::UpdateAccount { name }, Operation::DeleteAccount => CompatOperation::DeleteAccount, + Operation::SetDefaultAccount => CompatOperation::SetDefaultAccount, } } } diff --git a/src/internet_identity/src/main.rs b/src/internet_identity/src/main.rs index 6d3df49f06..8db7ec0d43 100644 --- a/src/internet_identity/src/main.rs +++ b/src/internet_identity/src/main.rs @@ -1,6 +1,7 @@ use crate::anchor_management::tentative_device_registration; use crate::archive::ArchiveState; use crate::assets::init_assets; +use crate::authz_utils::IdentityUpdateError; use crate::state::persistent_state; use crate::stats::event_stats::all_aggregations_top_n; use anchor_management::registration; @@ -12,7 +13,7 @@ use ic_canister_sig_creation::signature_map::LABEL_SIG; use ic_cdk::api::{caller, set_certified_data, trap}; use ic_cdk::call; use ic_cdk_macros::{init, post_upgrade, pre_upgrade, query, update}; -use internet_identity_interface::archive::types::BufferedEntry; +use internet_identity_interface::archive::types::{BufferedEntry, Operation}; use internet_identity_interface::http_gateway::{HttpRequest, HttpResponse}; use internet_identity_interface::internet_identity::types::openid::{ OpenIdCredentialAddError, OpenIdCredentialRemoveError, OpenIdDelegationError, @@ -402,19 +403,34 @@ fn get_default_account( Ok(default_account_info) } +impl From for SetDefaultAccountError { + fn from(src: IdentityUpdateError) -> Self { + match src { + IdentityUpdateError::Unauthorized(principal) => Self::Unauthorized(principal), + IdentityUpdateError::StorageError(anchor_number, storage_error) => { + Self::InternalCanisterError(format!( + "Identity: {}, Error: {}", + anchor_number, storage_error + )) + } + } + } +} + #[update] fn set_default_account( anchor_number: AnchorNumber, origin: FrontendHostname, account_number: Option, ) -> Result { - check_authorization(anchor_number) - .map_err(|err| SetDefaultAccountError::Unauthorized(err.principal))?; - - let default_account_info = - account_management::set_default_account_for_origin(anchor_number, origin, account_number)?; - - Ok(default_account_info) + anchor_operation_with_authz_check(anchor_number, |_| { + let result = account_management::set_default_account_for_origin( + anchor_number, + origin, + account_number, + )?; + Ok((result, Operation::SetDefaultAccount)) + }) } #[update] diff --git a/src/internet_identity_interface/src/archive/types.rs b/src/internet_identity_interface/src/archive/types.rs index efde4dc12e..ec43b347b8 100644 --- a/src/internet_identity_interface/src/archive/types.rs +++ b/src/internet_identity_interface/src/archive/types.rs @@ -54,6 +54,9 @@ pub enum Operation { UpdateAccount { name: Option }, #[serde(rename = "delete_account")] DeleteAccount, + + #[serde(rename = "set_default_account")] + SetDefaultAccount, } #[derive(Eq, PartialEq, Clone, Debug, CandidType, Deserialize)]