diff --git a/services/identity/src/client_service.rs b/services/identity/src/client_service.rs --- a/services/identity/src/client_service.rs +++ b/services/identity/src/client_service.rs @@ -2,25 +2,35 @@ tonic::include_proto!("identity.client"); } -use std::str::FromStr; +use std::{collections::HashMap, str::FromStr}; use crate::{ client_service::client_proto::{ AddReservedUsernamesRequest, DeleteUserRequest, Empty, - GenerateNonceResponse, InboundKeysForUserRequest, - InboundKeysForUserResponse, OpaqueLoginFinishRequest, - OpaqueLoginFinishResponse, OpaqueLoginStartRequest, - OpaqueLoginStartResponse, OutboundKeysForUserRequest, - OutboundKeysForUserResponse, OutboundKeyserverResponse, - RefreshUserPreKeysRequest, RegistrationFinishRequest, - RegistrationFinishResponse, RegistrationStartRequest, - RegistrationStartResponse, RemoveReservedUsernameRequest, - ReservedRegistrationStartRequest, UpdateUserPasswordFinishRequest, - UpdateUserPasswordStartRequest, UpdateUserPasswordStartResponse, - UploadOneTimeKeysRequest, VerifyUserAccessTokenRequest, - VerifyUserAccessTokenResponse, WalletLoginRequest, WalletLoginResponse, + GenerateNonceResponse, IdentityKeyInfo, InboundKeyInfo, + InboundKeysForUserRequest, InboundKeysForUserResponse, + OpaqueLoginFinishRequest, OpaqueLoginFinishResponse, + OpaqueLoginStartRequest, OpaqueLoginStartResponse, + OutboundKeysForUserRequest, OutboundKeysForUserResponse, + OutboundKeyserverResponse, PreKey, RefreshUserPreKeysRequest, + RegistrationFinishRequest, RegistrationFinishResponse, + RegistrationStartRequest, RegistrationStartResponse, + RemoveReservedUsernameRequest, ReservedRegistrationStartRequest, + UpdateUserPasswordFinishRequest, UpdateUserPasswordStartRequest, + UpdateUserPasswordStartResponse, UploadOneTimeKeysRequest, + VerifyUserAccessTokenRequest, VerifyUserAccessTokenResponse, + WalletLoginRequest, WalletLoginResponse, }, config::CONFIG, + constants::{ + USERS_TABLE_DEVICES_MAP_CONTENT_PREKEY_ATTRIBUTE_NAME, + USERS_TABLE_DEVICES_MAP_CONTENT_PREKEY_SIGNATURE_ATTRIBUTE_NAME, + USERS_TABLE_DEVICES_MAP_KEY_PAYLOAD_ATTRIBUTE_NAME, + USERS_TABLE_DEVICES_MAP_KEY_PAYLOAD_SIGNATURE_ATTRIBUTE_NAME, + USERS_TABLE_DEVICES_MAP_NOTIF_PREKEY_ATTRIBUTE_NAME, + USERS_TABLE_DEVICES_MAP_NOTIF_PREKEY_SIGNATURE_ATTRIBUTE_NAME, + USERS_TABLE_DEVICES_MAP_SOCIAL_PROOF_ATTRIBUTE_NAME, + }, database::{DatabaseClient, Error as DBError, KeyPayload}, id::generate_uuid, nonce::generate_nonce_data, @@ -883,3 +893,60 @@ } } } + +fn device_info_to_inbound_key_info( + mut device_info: HashMap, +) -> Result { + let identity_info = IdentityKeyInfo { + payload: extract_from_device_info( + &mut device_info, + USERS_TABLE_DEVICES_MAP_KEY_PAYLOAD_ATTRIBUTE_NAME, + )?, + payload_signature: extract_from_device_info( + &mut device_info, + USERS_TABLE_DEVICES_MAP_KEY_PAYLOAD_SIGNATURE_ATTRIBUTE_NAME, + )?, + social_proof: Some(extract_from_device_info( + &mut device_info, + USERS_TABLE_DEVICES_MAP_SOCIAL_PROOF_ATTRIBUTE_NAME, + )?), + }; + + let content_prekey = PreKey { + pre_key: extract_from_device_info( + &mut device_info, + USERS_TABLE_DEVICES_MAP_CONTENT_PREKEY_ATTRIBUTE_NAME, + )?, + pre_key_signature: extract_from_device_info( + &mut device_info, + USERS_TABLE_DEVICES_MAP_CONTENT_PREKEY_SIGNATURE_ATTRIBUTE_NAME, + )?, + }; + + let notif_prekey = PreKey { + pre_key: extract_from_device_info( + &mut device_info, + USERS_TABLE_DEVICES_MAP_NOTIF_PREKEY_ATTRIBUTE_NAME, + )?, + pre_key_signature: extract_from_device_info( + &mut device_info, + USERS_TABLE_DEVICES_MAP_NOTIF_PREKEY_SIGNATURE_ATTRIBUTE_NAME, + )?, + }; + + Ok(InboundKeyInfo { + identity_info: Some(identity_info), + content_prekey: Some(content_prekey), + notif_prekey: Some(notif_prekey), + }) +} + +fn extract_from_device_info( + map: &mut HashMap, + key: &str, +) -> Result { + map.remove(key).ok_or_else(|| { + error!("{} missing from device info", key); + tonic::Status::failed_precondition("Database item malformed") + }) +}