Page MenuHomePhabricator

D6899.diff
No OneTemporary

D6899.diff

diff --git a/services/identity/src/constants.rs b/services/identity/src/constants.rs
--- a/services/identity/src/constants.rs
+++ b/services/identity/src/constants.rs
@@ -11,10 +11,12 @@
pub const USERS_TABLE_REGISTRATION_ATTRIBUTE: &str = "pakeRegistrationData";
pub const USERS_TABLE_USERNAME_ATTRIBUTE: &str = "username";
pub const USERS_TABLE_DEVICES_ATTRIBUTE: &str = "devices";
+pub const USERS_TABLE_DEVICE_ATTRIBUTE_NAME: &str = "device";
pub const USERS_TABLE_DEVICES_MAP_ATTRIBUTE_NAME: &str = "signingPublicKey";
pub const USERS_TABLE_WALLET_ADDRESS_ATTRIBUTE: &str = "walletAddress";
pub const USERS_TABLE_USERNAME_INDEX: &str = "username-index";
pub const USERS_TABLE_WALLET_ADDRESS_INDEX: &str = "walletAddress-index";
+pub const USERS_TABLE_INITIALIZATION_INFO: &str = "initializationInfo";
pub const ACCESS_TOKEN_TABLE: &str = "identity-tokens";
pub const ACCESS_TOKEN_TABLE_PARTITION_KEY: &str = "userID";
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
@@ -20,6 +20,7 @@
ACCESS_TOKEN_TABLE_VALID_ATTRIBUTE, NONCE_TABLE,
NONCE_TABLE_CREATED_ATTRIBUTE, NONCE_TABLE_PARTITION_KEY, USERS_TABLE,
USERS_TABLE_DEVICES_ATTRIBUTE, USERS_TABLE_DEVICES_MAP_ATTRIBUTE_NAME,
+ USERS_TABLE_DEVICE_ATTRIBUTE_NAME, USERS_TABLE_INITIALIZATION_INFO,
USERS_TABLE_PARTITION_KEY, USERS_TABLE_REGISTRATION_ATTRIBUTE,
USERS_TABLE_USERNAME_ATTRIBUTE, USERS_TABLE_USERNAME_INDEX,
USERS_TABLE_WALLET_ADDRESS_ATTRIBUTE, USERS_TABLE_WALLET_ADDRESS_INDEX,
@@ -70,6 +71,31 @@
}
}
+ pub async fn get_session_initialization_info(
+ &self,
+ user_id: &str,
+ ) -> Result<Option<HashMap<String, HashMap<String, String>>>, Error> {
+ match self.get_item_from_users_table(user_id).await {
+ Ok(GetItemOutput {
+ item: Some(mut item),
+ ..
+ }) => parse_devices_attribute(item.remove(USERS_TABLE_DEVICES_ATTRIBUTE))
+ .map(Some)
+ .map_err(Error::Attribute),
+ Ok(_) => {
+ info!("No item found for user {} in users table", user_id);
+ Ok(None)
+ }
+ Err(e) => {
+ error!(
+ "DynamoDB client failed to get session initialization info for user {}: {}",
+ user_id, e
+ );
+ Err(e)
+ }
+ }
+ }
+
pub async fn update_users_table(
&self,
user_id: String,
@@ -611,6 +637,55 @@
}
}
+fn parse_devices_attribute(
+ attribute: Option<AttributeValue>,
+) -> Result<HashMap<String, HashMap<String, String>>, DBItemError> {
+ let mut devices = HashMap::new();
+ let ddb_devices =
+ parse_map_attribute(USERS_TABLE_DEVICES_ATTRIBUTE, attribute)?;
+
+ for (signing_public_key, session_initialization_info) in ddb_devices {
+ let session_initialization_info_map = parse_map_attribute(
+ USERS_TABLE_DEVICE_ATTRIBUTE_NAME,
+ Some(session_initialization_info),
+ )?;
+ let mut inner_hash_map = HashMap::new();
+ for (initialization_component_name, initialization_component_value) in
+ session_initialization_info_map
+ {
+ let initialization_piece_value_string = parse_string_attribute(
+ USERS_TABLE_INITIALIZATION_INFO,
+ Some(initialization_component_value),
+ )?;
+ inner_hash_map.insert(
+ initialization_component_name,
+ initialization_piece_value_string,
+ );
+ }
+ devices.insert(signing_public_key, inner_hash_map);
+ }
+ Ok(devices)
+}
+
+fn parse_map_attribute(
+ attribute_name: &'static str,
+ attribute_value: Option<AttributeValue>,
+) -> Result<HashMap<String, AttributeValue>, DBItemError> {
+ match attribute_value {
+ Some(AttributeValue::M(map)) => Ok(map),
+ Some(_) => Err(DBItemError::new(
+ attribute_name,
+ attribute_value,
+ DBItemAttributeError::IncorrectType,
+ )),
+ None => Err(DBItemError::new(
+ attribute_name,
+ attribute_value,
+ DBItemAttributeError::Missing,
+ )),
+ }
+}
+
fn parse_string_attribute(
attribute_name: &'static str,
attribute_value: Option<AttributeValue>,

File Metadata

Mime Type
text/plain
Expires
Thu, Nov 28, 6:44 PM (22 h, 8 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2594610
Default Alt Text
D6899.diff (4 KB)

Event Timeline