From 890187e00419602a85c85f18b87867d96ec1972c Mon Sep 17 00:00:00 2001 From: Devon Hudson Date: Sat, 16 Jan 2021 22:15:45 -0700 Subject: [PATCH 1/2] improvement: Handle optional device_id field during login remove debug logging --- src/client_server/session.rs | 35 ++++++++++++++++++++++++++--------- src/database/users.rs | 2 +- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/src/client_server/session.rs b/src/client_server/session.rs index da3d8d8..173e823 100644 --- a/src/client_server/session.rs +++ b/src/client_server/session.rs @@ -77,7 +77,6 @@ pub async fn login_route( // Generate new device id if the user didn't specify one let device_id = body - .body .device_id .clone() .unwrap_or_else(|| utils::random_string(DEVICE_ID_LENGTH).into()); @@ -85,14 +84,32 @@ pub async fn login_route( // Generate a new token for the device let token = utils::random_string(TOKEN_LENGTH); - // TODO: Don't always create a new device - // Add device - db.users.create_device( - &user_id, - &device_id, - &token, - body.initial_device_display_name.clone(), - )?; + let mut create_new_device = true; + + // Only search db for existing device if one was provided in the request + match &body.device_id { + Some(_) => { + // Look to see if provided device_id already exists + if let Some(_) = db.users.all_device_ids(&user_id).find(|x| match x { + Ok(x) if **x == *device_id => true, + _ => false, + }) { + // Replace token for existing device + db.users.set_token(&user_id, &device_id, &token)?; + create_new_device = false; + } + } + _ => (), + }; + + if create_new_device { + db.users.create_device( + &user_id, + &device_id, + &token, + body.initial_device_display_name.clone(), + )?; + } info!("{} logged in", user_id); diff --git a/src/database/users.rs b/src/database/users.rs index 2a03960..d6a4ecf 100644 --- a/src/database/users.rs +++ b/src/database/users.rs @@ -251,7 +251,7 @@ impl Users { } /// Replaces the access token of one device. - fn set_token(&self, user_id: &UserId, device_id: &DeviceId, token: &str) -> Result<()> { + pub fn set_token(&self, user_id: &UserId, device_id: &DeviceId, token: &str) -> Result<()> { let mut userdeviceid = user_id.to_string().as_bytes().to_vec(); userdeviceid.push(0xff); userdeviceid.extend_from_slice(device_id.as_bytes()); From 762255fa8d0ec7797ead205ac454479ff53fd860 Mon Sep 17 00:00:00 2001 From: Devon Hudson Date: Sun, 17 Jan 2021 08:39:47 -0700 Subject: [PATCH 2/2] Simplify device creation logic during login --- src/client_server/session.rs | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/client_server/session.rs b/src/client_server/session.rs index 173e823..48fbea2 100644 --- a/src/client_server/session.rs +++ b/src/client_server/session.rs @@ -84,25 +84,17 @@ pub async fn login_route( // Generate a new token for the device let token = utils::random_string(TOKEN_LENGTH); - let mut create_new_device = true; + // Determine if device_id was provided and exists in the db for this user + let device_exists = body.device_id.as_ref().map_or(false, |device_id| { + db.users + .all_device_ids(&user_id) + .find(|x| x.as_ref().map_or(false, |v| v == device_id)) + .is_some() + }); - // Only search db for existing device if one was provided in the request - match &body.device_id { - Some(_) => { - // Look to see if provided device_id already exists - if let Some(_) = db.users.all_device_ids(&user_id).find(|x| match x { - Ok(x) if **x == *device_id => true, - _ => false, - }) { - // Replace token for existing device - db.users.set_token(&user_id, &device_id, &token)?; - create_new_device = false; - } - } - _ => (), - }; - - if create_new_device { + if device_exists { + db.users.set_token(&user_id, &device_id, &token)?; + } else { db.users.create_device( &user_id, &device_id,