Skip to content

Commit 3293cc7

Browse files
authored
Ignore the error when setting the user id twice to the same value (#321)
## 🎟️ Tracking <!-- Paste the link to the Jira or GitHub issue or otherwise describe / point to where this change is coming from. --> ## 📔 Objective The mobile clients will call `init_crypto` multiple times on the same client if the user types the wrong password/pin. The simplest fix here is to make it so that `init_user_id` only errors when there is an attempted UUID change, and trying to set the same UUID is just ignored. The UUID will only be set the very first call either way. Ideally we'd do as mentioned in #278, and just provide this ID during initialization once we have a pure/user-bound client split, but that's a bigger API break. ## ⏰ Reminders before review - Contributor guidelines followed - All formatters and local linters executed and passed - Written new unit and / or integration tests where applicable - Protected functional changes with optionality (feature flags) - Used internationalization (i18n) for all UI strings - CI builds passed - Communicated to DevOps any deployment requirements - Updated any necessary documentation (Confluence, contributing docs) or informed the documentation team ## 🦮 Reviewer guidelines <!-- Suggested interactions but feel free to use (or not) as you desire! --> - 👍 (`:+1:`) or similar for great changes - 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info - ❓ (`:question:`) for questions - 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry that's not quite a confirmed issue and could potentially benefit from discussion - 🎨 (`:art:`) for suggestions / improvements - ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or concerns needing attention - 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or indications of technical debt - ⛏ (`:pick:`) for minor or nitpick changes
1 parent 17866c0 commit 3293cc7

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

crates/bitwarden-core/src/client/internal.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,16 @@ impl InternalClient {
184184

185185
#[allow(missing_docs)]
186186
pub fn init_user_id(&self, user_id: Uuid) -> Result<(), UserIdAlreadySetError> {
187-
self.user_id.set(user_id).map_err(|_| UserIdAlreadySetError)
187+
let set_uuid = self.user_id.get_or_init(|| user_id);
188+
189+
// Only return an error if the user_id is already set to a different value,
190+
// as we want an SDK client to be tied to a single user_id.
191+
// If it's the same value, we can just do nothing.
192+
if *set_uuid != user_id {
193+
Err(UserIdAlreadySetError)
194+
} else {
195+
Ok(())
196+
}
188197
}
189198

190199
#[allow(missing_docs)]
@@ -248,3 +257,27 @@ impl InternalClient {
248257
EncryptionSettings::set_org_keys(org_keys, &self.key_store)
249258
}
250259
}
260+
261+
#[cfg(test)]
262+
mod tests {
263+
use crate::Client;
264+
265+
#[test]
266+
fn initializing_user_multiple_times() {
267+
use super::*;
268+
269+
let client = Client::new(None);
270+
let user_id = Uuid::new_v4();
271+
272+
// Setting the user ID for the first time should work.
273+
assert!(client.internal.init_user_id(user_id).is_ok());
274+
assert_eq!(client.internal.get_user_id(), Some(user_id));
275+
276+
// Trying to set the same user_id again should not return an error.
277+
assert!(client.internal.init_user_id(user_id).is_ok());
278+
279+
// Trying to set a different user_id should return an error.
280+
let different_user_id = Uuid::new_v4();
281+
assert!(client.internal.init_user_id(different_user_id).is_err());
282+
}
283+
}

0 commit comments

Comments
 (0)