Accept future OTP code
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
5b35ec6cf0
commit
b704e9868b
@ -38,9 +38,10 @@ pub async fn save_totp_factor(
|
|||||||
|
|
||||||
if !key.check_code(&form.first_code).unwrap_or(false) {
|
if !key.check_code(&form.first_code).unwrap_or(false) {
|
||||||
return HttpResponse::BadRequest().body(format!(
|
return HttpResponse::BadRequest().body(format!(
|
||||||
"Given code is invalid (expected {} or {})!",
|
"Given code is invalid (expected {}, {} or {})!",
|
||||||
|
key.previous_code().unwrap_or_default(),
|
||||||
key.current_code().unwrap_or_default(),
|
key.current_code().unwrap_or_default(),
|
||||||
key.previous_code().unwrap_or_default()
|
key.following_code().unwrap_or_default(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +73,11 @@ impl TotpKey {
|
|||||||
self.get_code_at(|| time() - PERIOD)
|
self.get_code_at(|| time() - PERIOD)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get following code
|
||||||
|
pub fn following_code(&self) -> Res<String> {
|
||||||
|
self.get_code_at(|| time() + PERIOD)
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the code at a specific time
|
/// Get the code at a specific time
|
||||||
fn get_code_at<F: Fn() -> u64>(&self, get_time: F) -> Res<String> {
|
fn get_code_at<F: Fn() -> u64>(&self, get_time: F) -> Res<String> {
|
||||||
let gen = TotpGenerator::new()
|
let gen = TotpGenerator::new()
|
||||||
@ -98,7 +103,9 @@ impl TotpKey {
|
|||||||
|
|
||||||
/// Check a code's validity
|
/// Check a code's validity
|
||||||
pub fn check_code(&self, code: &str) -> Res<bool> {
|
pub fn check_code(&self, code: &str) -> Res<bool> {
|
||||||
Ok(self.current_code()?.eq(code) || self.previous_code()?.eq(code))
|
Ok(self.previous_code()?.eq(code)
|
||||||
|
|| self.current_code()?.eq(code)
|
||||||
|
|| self.following_code()?.eq(code))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,7 +118,10 @@ mod test {
|
|||||||
let key = TotpKey::new_random();
|
let key = TotpKey::new_random();
|
||||||
let code = key.current_code().unwrap();
|
let code = key.current_code().unwrap();
|
||||||
let old_code = key.previous_code().unwrap();
|
let old_code = key.previous_code().unwrap();
|
||||||
|
let following_code = key.following_code().unwrap();
|
||||||
assert_ne!(code, old_code);
|
assert_ne!(code, old_code);
|
||||||
|
assert_ne!(code, following_code);
|
||||||
|
assert_ne!(old_code, following_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
Reference in New Issue
Block a user