fix: treat steam host same as totp with 5 digits

This commit is contained in:
Prateek Sunal 2024-04-26 11:29:36 +05:30
parent a6ee7ac2bd
commit 1418741229
2 changed files with 14 additions and 8 deletions

View file

@ -2,6 +2,7 @@ import 'package:ente_auth/utils/totp_util.dart';
class Code { class Code {
static const defaultDigits = 6; static const defaultDigits = 6;
static const steamDigits = 5;
static const defaultPeriod = 30; static const defaultPeriod = 30;
int? generatedID; int? generatedID;
@ -67,10 +68,12 @@ class Code {
String issuer, String issuer,
String secret, String secret,
) { ) {
final digits =
issuer.toLowerCase() == "steam" ? steamDigits : defaultDigits;
return Code( return Code(
account, account,
issuer, issuer,
defaultDigits, digits,
defaultPeriod, defaultPeriod,
secret, secret,
Algorithm.sha1, Algorithm.sha1,
@ -82,10 +85,13 @@ class Code {
static Code fromRawData(String rawData) { static Code fromRawData(String rawData) {
Uri uri = Uri.parse(rawData); Uri uri = Uri.parse(rawData);
final issuer = _getIssuer(uri);
final digits = issuer.toLowerCase() == "stream" ? 5 : _getDigits(uri);
try { try {
return Code( return Code(
_getAccount(uri), _getAccount(uri),
_getIssuer(uri), issuer,
_getDigits(uri), _getDigits(uri),
_getPeriod(uri), _getPeriod(uri),
getSanitizedSecret(uri.queryParameters['secret']!), getSanitizedSecret(uri.queryParameters['secret']!),
@ -184,7 +190,7 @@ class Code {
} }
static Type _getType(Uri uri) { static Type _getType(Uri uri) {
if (uri.host == "totp") { if (uri.host == "totp" || uri.host == "steam") {
return Type.totp; return Type.totp;
} else if (uri.host == "hotp") { } else if (uri.host == "hotp") {
return Type.hotp; return Type.hotp;

View file

@ -3,13 +3,13 @@ import 'package:flutter/foundation.dart';
import 'package:otp/otp.dart' as otp; import 'package:otp/otp.dart' as otp;
String getOTP(Code code) { String getOTP(Code code) {
if(code.type == Type.hotp) { if (code.type == Type.hotp) {
return _getHOTPCode(code); return _getHOTPCode(code);
} }
return otp.OTP.generateTOTPCodeString( return otp.OTP.generateTOTPCodeString(
getSanitizedSecret(code.secret), getSanitizedSecret(code.secret),
DateTime.now().millisecondsSinceEpoch, DateTime.now().millisecondsSinceEpoch,
length: code.digits, length: code.issuer.toLowerCase() == "steam" ? 5 : code.digits,
interval: code.period, interval: code.period,
algorithm: _getAlgorithm(code), algorithm: _getAlgorithm(code),
isGoogle: true, isGoogle: true,
@ -20,7 +20,7 @@ String _getHOTPCode(Code code) {
return otp.OTP.generateHOTPCodeString( return otp.OTP.generateHOTPCodeString(
getSanitizedSecret(code.secret), getSanitizedSecret(code.secret),
code.counter, code.counter,
length: code.digits, length: code.issuer.toLowerCase() == "steam" ? 5 : code.digits,
algorithm: _getAlgorithm(code), algorithm: _getAlgorithm(code),
isGoogle: true, isGoogle: true,
); );
@ -30,7 +30,7 @@ String getNextTotp(Code code) {
return otp.OTP.generateTOTPCodeString( return otp.OTP.generateTOTPCodeString(
getSanitizedSecret(code.secret), getSanitizedSecret(code.secret),
DateTime.now().millisecondsSinceEpoch + code.period * 1000, DateTime.now().millisecondsSinceEpoch + code.period * 1000,
length: code.digits, length: code.issuer.toLowerCase() == "stream" ? 5 : code.digits,
interval: code.period, interval: code.period,
algorithm: _getAlgorithm(code), algorithm: _getAlgorithm(code),
isGoogle: true, isGoogle: true,
@ -60,4 +60,4 @@ String safeDecode(String value) {
debugPrint("Failed to decode $e"); debugPrint("Failed to decode $e");
return value; return value;
} }
} }