Show OTP code validity in frontends
This commit is contained in:
@@ -11,6 +11,7 @@ use ironstorage::{
|
||||
crypto::KeyInfo,
|
||||
document::{DocumentError, EntryDocument, EntryFieldId},
|
||||
git::{GitConflict, GitProgressPhase, GitSnapshot},
|
||||
otp::OtpCodeValidity,
|
||||
presentation::{ClipboardDisposition, QrMatrix},
|
||||
read::{FindResults, GrepResults, TreeModel},
|
||||
repository::SecretBytes,
|
||||
@@ -95,8 +96,8 @@ pub struct OtpDisplay {
|
||||
entry: String,
|
||||
field: Option<EntryFieldId>,
|
||||
code: SecretBytes,
|
||||
validity: OtpCodeValidity,
|
||||
remaining_seconds: Option<u64>,
|
||||
counter: Option<u64>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@@ -135,7 +136,7 @@ impl OtpDisplay {
|
||||
self.remaining_seconds
|
||||
}
|
||||
pub fn counter(&self) -> Option<u64> {
|
||||
self.counter
|
||||
self.validity.counter()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,8 +208,8 @@ pub enum AsyncPayload {
|
||||
entry: String,
|
||||
field: Option<EntryFieldId>,
|
||||
code: SecretBytes,
|
||||
remaining_seconds: Option<u64>,
|
||||
counter: Option<u64>,
|
||||
validity: OtpCodeValidity,
|
||||
observed_at: u64,
|
||||
clipboard: bool,
|
||||
tree: Option<TreeModel>,
|
||||
},
|
||||
@@ -528,18 +529,16 @@ impl App {
|
||||
|
||||
pub fn tick(&mut self) {
|
||||
self.ticks = self.ticks.wrapping_add(1);
|
||||
if self.ticks.is_multiple_of(4)
|
||||
&& let Some(remaining) = self
|
||||
.otp_display
|
||||
.as_mut()
|
||||
.and_then(|display| display.remaining_seconds.as_mut())
|
||||
{
|
||||
*remaining = remaining.saturating_sub(1);
|
||||
}
|
||||
|
||||
pub fn observe_time(&mut self, unix_seconds: u64) {
|
||||
if let Some(display) = self.otp_display.as_mut() {
|
||||
display.remaining_seconds = display.validity.remaining_at(unix_seconds);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn begin_totp_refresh(&mut self) -> Option<(String, EntryFieldId)> {
|
||||
if self.otp_pending || !self.ticks.is_multiple_of(4) || self.mode != Mode::Viewer {
|
||||
if self.otp_pending || self.mode != Mode::Viewer {
|
||||
return None;
|
||||
}
|
||||
let viewer = self.viewer.as_ref()?;
|
||||
@@ -787,8 +786,8 @@ impl App {
|
||||
entry,
|
||||
field,
|
||||
code,
|
||||
remaining_seconds,
|
||||
counter,
|
||||
validity,
|
||||
observed_at,
|
||||
clipboard,
|
||||
tree,
|
||||
}) => {
|
||||
@@ -799,7 +798,7 @@ impl App {
|
||||
if clipboard {
|
||||
self.clipboard_request = Some(SecretBytes::new(code.expose().to_vec()));
|
||||
}
|
||||
self.status = if let Some(counter) = counter {
|
||||
self.status = if let Some(counter) = validity.counter() {
|
||||
format!("Generated and committed HOTP counter {counter}")
|
||||
} else {
|
||||
"TOTP code refreshed".to_owned()
|
||||
@@ -808,8 +807,8 @@ impl App {
|
||||
entry,
|
||||
field,
|
||||
code,
|
||||
remaining_seconds,
|
||||
counter,
|
||||
validity,
|
||||
remaining_seconds: validity.remaining_at(observed_at),
|
||||
});
|
||||
self.hotp_confirmation = None;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user