From 890187e00419602a85c85f18b87867d96ec1972c Mon Sep 17 00:00:00 2001
From: Devon Hudson <devonhudson@librem.one>
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 da3d8d88..173e823f 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 2a039602..d6a4ecf3 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 <devonhudson@librem.one>
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 173e823f..48fbea2a 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,