Skip to content

Commit 8bd957d

Browse files
committed
fix logins breach alert data being updated during login update
1 parent e1a85c9 commit 8bd957d

2 files changed

Lines changed: 51 additions & 9 deletions

File tree

components/logins/src/db.rs

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -455,8 +455,6 @@ impl LoginDb {
455455
SET local_modified = :now_millis,
456456
timeLastUsed = :time_last_used,
457457
timePasswordChanged = :time_password_changed,
458-
timeOfLastBreach = :time_of_last_breach,
459-
timeLastBreachAlertDismissed = :time_last_breach_alert_dismissed,
460458
httpRealm = :http_realm,
461459
formActionOrigin = :form_action_origin,
462460
usernameField = :username_field,
@@ -483,8 +481,6 @@ impl LoginDb {
483481
":time_password_changed": login.meta.time_password_changed,
484482
":sec_fields": login.sec_fields,
485483
":guid": &login.meta.id,
486-
":time_of_last_breach": login.fields.time_of_last_breach,
487-
":time_last_breach_alert_dismissed": login.fields.time_last_breach_alert_dismissed,
488484
// time_last_used has been set to now.
489485
":now_millis": login.meta.time_last_used,
490486
},
@@ -1799,8 +1795,9 @@ mod tests {
17991795
assert!(!db.is_potentially_breached(&login.meta.id).unwrap());
18001796
assert!(login.fields.time_last_breach_alert_dismissed.is_none());
18011797

1802-
// set - use a time that's definitely after password was changed
1803-
let breach_time = login.meta.time_password_changed + 1000;
1798+
// Wait and use a time that's definitely after password was changed
1799+
thread::sleep(time::Duration::from_millis(50));
1800+
let breach_time = util::system_time_ms_i64(SystemTime::now());
18041801
db.record_breach(&login.meta.id, breach_time).unwrap();
18051802
assert!(db.is_potentially_breached(&login.meta.id).unwrap());
18061803
let login1 = db.get_by_id(&login.meta.id).unwrap().unwrap();
@@ -1817,9 +1814,10 @@ mod tests {
18171814
let login3 = db.get_by_id(&login.meta.id).unwrap().unwrap();
18181815
assert!(login3.fields.time_of_last_breach.is_none());
18191816

1820-
// set again - use a time that's definitely after password was changed
1821-
let breach_time2 = login.meta.time_password_changed + 2000;
1822-
db.record_breach(&login.meta.id, breach_time2).unwrap();
1817+
// Wait and use a time that's definitely after password was changed
1818+
thread::sleep(time::Duration::from_millis(50));
1819+
let breach_time = util::system_time_ms_i64(SystemTime::now());
1820+
db.record_breach(&login.meta.id, breach_time).unwrap();
18231821
assert!(db.is_potentially_breached(&login.meta.id).unwrap());
18241822

18251823
// now change password
@@ -1836,6 +1834,45 @@ mod tests {
18361834
assert!(!db.is_potentially_breached(&login.meta.id).unwrap());
18371835
}
18381836

1837+
#[test]
1838+
fn test_breach_alert_fields_not_overwritten_by_update() {
1839+
ensure_initialized();
1840+
let db = LoginDb::open_in_memory();
1841+
let login = db
1842+
.add(
1843+
LoginEntry {
1844+
origin: "https://www.example.com".into(),
1845+
http_realm: Some("https://www.example.com".into()),
1846+
username: "user1".into(),
1847+
password: "password1".into(),
1848+
..Default::default()
1849+
},
1850+
&*TEST_ENCDEC,
1851+
)
1852+
.unwrap();
1853+
assert!(!db.is_potentially_breached(&login.meta.id).unwrap());
1854+
1855+
// Wait and use a time that's definitely after password was changed
1856+
thread::sleep(time::Duration::from_millis(50));
1857+
let breach_time = util::system_time_ms_i64(SystemTime::now());
1858+
db.record_breach(&login.meta.id, breach_time).unwrap();
1859+
assert!(db.is_potentially_breached(&login.meta.id).unwrap());
1860+
1861+
// change some fields
1862+
db.update(
1863+
&login.meta.id.clone(),
1864+
LoginEntry {
1865+
username_field: "changed-username-field".into(),
1866+
..login.clone().decrypt(&*TEST_ENCDEC).unwrap().entry()
1867+
},
1868+
&*TEST_ENCDEC,
1869+
)
1870+
.unwrap();
1871+
1872+
// breach still present
1873+
assert!(db.is_potentially_breached(&login.meta.id).unwrap());
1874+
}
1875+
18391876
#[test]
18401877
fn test_breach_alert_dismissal_with_specific_timestamp() {
18411878
ensure_initialized();

components/logins/src/logins.udl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ dictionary Login {
9494
string username;
9595

9696
// breach alert fields
97+
/// These fields can be synced from Desktop and are NOT included in LoginEntry,
98+
/// so update() will not modify them. Use the dedicated API methods to manipulate:
99+
/// record_breach(), reset_all_breaches(), is_potentially_breached(),
100+
/// record_breach_alert_dismissal(), record_breach_alert_dismissal_time(),
101+
/// and is_breach_alert_dismissed().
97102
i64? time_of_last_breach;
98103
i64? time_last_breach_alert_dismissed;
99104
};

0 commit comments

Comments
 (0)