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 @@ -13,10 +13,7 @@ // Workspace crate imports use crate::config::CONFIG; -use crate::constants::{ - request_metadata, - error_types -}; +use crate::constants::error_types; use crate::database::{ DBDeviceTypeInt, DatabaseClient, DeviceType, KeyPayload }; @@ -34,7 +31,7 @@ VerifyUserAccessTokenResponse, WalletAuthRequest, GetFarcasterUsersRequest, GetFarcasterUsersResponse }; -use crate::grpc_services::shared::get_value; +use crate::grpc_services::shared::get_platform_metadata; use crate::grpc_utils::{ DeviceKeyUploadActions, RegistrationActions, SignedNonce }; @@ -229,7 +226,7 @@ &self, request: tonic::Request, ) -> Result, tonic::Status> { - let code_version = get_code_version(&request); + let platform_metadata = get_platform_metadata(&request)?; let message = request.into_inner(); if let Some(WorkflowInProgress::Registration(state)) = self @@ -251,7 +248,7 @@ .add_password_user_to_users_table( *state, password_file, - code_version, + platform_metadata, login_time, ) .await @@ -371,7 +368,7 @@ &self, request: tonic::Request, ) -> Result, tonic::Status> { - let code_version = get_code_version(&request); + let platform_metadata = get_platform_metadata(&request)?; let message = request.into_inner(); if let Some(WorkflowInProgress::Login(state)) = self @@ -399,7 +396,7 @@ .add_user_device( state.user_id.clone(), state.flattened_device_key_upload.clone(), - code_version, + platform_metadata, login_time, ) .await @@ -438,7 +435,7 @@ &self, request: tonic::Request, ) -> Result, tonic::Status> { - let code_version = get_code_version(&request); + let platform_metadata = get_platform_metadata(&request)?; let message = request.into_inner(); // WalletAuthRequest is used for both log_in_wallet_user and register_wallet_user @@ -492,7 +489,7 @@ .add_user_device( user_id.clone(), flattened_device_key_upload.clone(), - code_version, + platform_metadata, chrono::Utc::now(), ) .await @@ -528,7 +525,7 @@ &self, request: tonic::Request, ) -> Result, tonic::Status> { - let code_version = get_code_version(&request); + let platform_metadata = get_platform_metadata(&request)?; let message = request.into_inner(); let parsed_message = parse_and_verify_siwe_message( @@ -590,7 +587,7 @@ wallet_address.clone(), social_proof, None, - code_version, + platform_metadata, login_time, message.farcaster_id, initial_device_list, @@ -628,7 +625,7 @@ &self, request: tonic::Request, ) -> Result, tonic::Status> { - let code_version = get_code_version(&request); + let platform_metadata = get_platform_metadata(&request)?; let message = request.into_inner(); let parsed_message = parse_and_verify_siwe_message( @@ -674,7 +671,7 @@ wallet_address.clone(), social_proof, Some(user_id.clone()), - code_version, + platform_metadata, login_time, None, initial_device_list, @@ -712,7 +709,7 @@ &self, request: tonic::Request, ) -> Result, tonic::Status> { - let code_version = get_code_version(&request); + let platform_metadata = get_platform_metadata(&request)?; let message = request.into_inner(); let challenge_response = SignedNonce::try_from(&message)?; @@ -770,7 +767,7 @@ .put_device_data( &user_id, flattened_device_key_upload, - code_version, + platform_metadata, login_time, ) .await @@ -1196,15 +1193,3 @@ Ok(flattened_device_key_upload) } - -fn get_code_version(req: &tonic::Request) -> u64 { - get_value(req, request_metadata::CODE_VERSION) - .and_then(|version| version.parse().ok()) - .unwrap_or_else(|| { - warn!( - "Could not retrieve code version from request: {:?}. Defaulting to 0", - req - ); - Default::default() - }) -} diff --git a/services/identity/src/database.rs b/services/identity/src/database.rs --- a/services/identity/src/database.rs +++ b/services/identity/src/database.rs @@ -21,6 +21,7 @@ constants::{error_types, USERS_TABLE_SOCIAL_PROOF_ATTRIBUTE_NAME}, ddb_utils::EthereumIdentity, device_list::SignedDeviceList, + grpc_services::shared::PlatformMetadata, reserved_users::UserDetail, siwe::SocialProof, }; @@ -158,7 +159,7 @@ &self, registration_state: UserRegistrationInfo, password_file: Vec, - code_version: u64, + platform_details: PlatformMetadata, access_token_creation_time: DateTime, ) -> Result { let device_key_upload = registration_state.flattened_device_key_upload; @@ -179,7 +180,7 @@ .register_primary_device( &user_id, device_key_upload.clone(), - code_version, + platform_details, access_token_creation_time, initial_device_list, ) @@ -189,7 +190,7 @@ .add_device( &user_id, device_key_upload.clone(), - code_version, + platform_details, access_token_creation_time, ) .await?; @@ -214,7 +215,7 @@ wallet_address: String, social_proof: SocialProof, user_id: Option, - code_version: u64, + platform_metadata: PlatformMetadata, access_token_creation_time: DateTime, farcaster_id: Option, initial_device_list: Option, @@ -240,7 +241,7 @@ .register_primary_device( &user_id, flattened_device_key_upload.clone(), - code_version, + platform_metadata, access_token_creation_time, initial_device_list, ) @@ -250,7 +251,7 @@ .add_device( &user_id, flattened_device_key_upload.clone(), - code_version, + platform_metadata, access_token_creation_time, ) .await?; @@ -329,7 +330,7 @@ &self, user_id: String, flattened_device_key_upload: FlattenedDeviceKeyUpload, - code_version: u64, + platform_metadata: PlatformMetadata, access_token_creation_time: DateTime, ) -> Result<(), Error> { let content_one_time_keys = @@ -359,7 +360,7 @@ .add_device( &user_id, flattened_device_key_upload, - code_version, + platform_metadata, access_token_creation_time, ) .await?; diff --git a/services/identity/src/database/device_list.rs b/services/identity/src/database/device_list.rs --- a/services/identity/src/database/device_list.rs +++ b/services/identity/src/database/device_list.rs @@ -24,7 +24,10 @@ USERS_TABLE_PARTITION_KEY, }, error::{DeviceListError, Error}, - grpc_services::protos::{self, unauth::DeviceType}, + grpc_services::{ + protos::{self, unauth::DeviceType}, + shared::PlatformMetadata, + }, grpc_utils::DeviceKeysInfo, olm::is_valid_olm_key, }; @@ -98,7 +101,7 @@ pub fn from_device_key_upload( user_id: impl Into, upload: FlattenedDeviceKeyUpload, - code_version: u64, + platform_metadata: PlatformMetadata, login_time: DateTime, ) -> Result { if !is_valid_olm_key(&upload.content_prekey) @@ -110,8 +113,10 @@ ); return Err(Error::InvalidFormat); } - let device_type = DeviceType::from_str_name(upload.device_type.as_str_name()) + let key_upload_device_type = DeviceType::from_str_name(upload.device_type.as_str_name()) .expect("DeviceType conversion failed. Identity client and server protos mismatch"); + let platform_details = + PlatformDetails::new(platform_metadata, Some(key_upload_device_type))?; let device_row = Self { user_id: user_id.into(), @@ -128,12 +133,7 @@ prekey: upload.notif_prekey, prekey_signature: upload.notif_prekey_signature, }, - platform_details: PlatformDetails { - device_type, - code_version, - state_version: None, - major_desktop_version: None, - }, + platform_details, login_time, }; Ok(device_row) @@ -178,6 +178,48 @@ } } +impl PlatformDetails { + pub fn new( + metadata: PlatformMetadata, + key_upload_device_type: Option, + ) -> Result { + let PlatformMetadata { device_type, .. } = metadata; + + let metadata_device_type = + DeviceType::from_str_name(&device_type.to_uppercase()); + + let device_type = match (metadata_device_type, key_upload_device_type) { + (Some(metadata_value), None) => metadata_value, + (Some(metadata_value), Some(key_upload_value)) => { + if metadata_value != key_upload_value { + warn!( + "DeviceKeyUplaod device type ({}) mismatches request metadata platform ({}). {}", + "Prefering value from key uplaod.", + key_upload_value.as_str_name(), + metadata_value.as_str_name() + ); + } + key_upload_value + } + (None, Some(key_upload_value)) => key_upload_value, + (None, None) => { + warn!( + "Received invalid device_type in request metadata: {}", + device_type + ); + return Err(Error::InvalidFormat); + } + }; + + Ok(Self { + device_type, + code_version: metadata.code_version, + state_version: metadata.state_version, + major_desktop_version: metadata.major_desktop_version, + }) + } +} + // helper structs for converting to/from attribute values for sort key (a.k.a itemID) pub struct DeviceIDAttribute(pub String); struct DeviceListKeyAttribute(DateTime); @@ -892,7 +934,7 @@ &self, user_id: impl Into, device_key_upload: FlattenedDeviceKeyUpload, - code_version: u64, + platform_metadata: PlatformMetadata, login_time: DateTime, ) -> Result<(), Error> { let content_one_time_keys = device_key_upload.content_one_time_keys.clone(); @@ -901,7 +943,7 @@ let new_device = DeviceRow::from_device_key_upload( user_id_string.clone(), device_key_upload, - code_version, + platform_metadata, login_time, )?; let device_id = new_device.device_id.clone(); @@ -969,7 +1011,7 @@ &self, user_id: impl Into, device_key_upload: FlattenedDeviceKeyUpload, - code_version: u64, + platform_metadata: PlatformMetadata, login_time: DateTime, initial_device_list: DeviceListUpdate, ) -> Result<(), Error> { @@ -991,7 +1033,7 @@ let primary_device = DeviceRow::from_device_key_upload( &user_id, device_key_upload, - code_version, + platform_metadata, login_time, )?; @@ -1024,7 +1066,7 @@ &self, user_id: impl Into, device_key_upload: FlattenedDeviceKeyUpload, - code_version: u64, + platform_metadata: PlatformMetadata, login_time: DateTime, ) -> Result<(), Error> { let user_id: String = user_id.into(); @@ -1033,7 +1075,7 @@ let new_device = DeviceRow::from_device_key_upload( &user_id, device_key_upload, - code_version, + platform_metadata, login_time, )?;