diff --git a/lib/models/code.dart b/lib/models/code.dart index 4eb9b0d0b..f4344d871 100644 --- a/lib/models/code.dart +++ b/lib/models/code.dart @@ -67,7 +67,10 @@ class Code { static String _getAccount(Uri uri) { try { - final String path = Uri.decodeComponent(uri.path); + String path = Uri.decodeComponent(uri.path); + if (path.startsWith("/")) { + path = path.substring(1, path.length); + } // Parse account name from documented auth URI // otpauth://totp/ACCOUNT?secret=SUPERSECRET&issuer=SERVICE if (uri.queryParameters.containsKey("issuer") && !path.contains(":")) { @@ -88,6 +91,7 @@ class Code { if (issuerName.contains("period=")) { return issuerName.substring(0, issuerName.indexOf("period=")); } + return issuerName; } final String path = Uri.decodeComponent(uri.path); return path.split(':')[0].substring(1); diff --git a/test/models/code_test.dart b/test/models/code_test.dart index c61122292..1521c4817 100644 --- a/test/models/code_test.dart +++ b/test/models/code_test.dart @@ -6,8 +6,17 @@ void main() { final code1 = Code.fromRawData( "otpauth://totp/example%20finance%3Aee%40ff.gg?secret=ASKZNWOU6SVYAMVS", ); - expect(code1.issuer, "example finance"); - expect(code1.account, "ee@ff.gg"); + expect(code1.issuer, "example finance", reason: "issuerMismatch"); + expect(code1.account, "ee@ff.gg", reason: "accountMismatch"); expect(code1.secret, "ASKZNWOU6SVYAMVS"); }); + + test("parseDocumentedFormat", () { + final code = Code.fromRawData( + "otpauth://totp/testdata@ente.io?secret=ASKZNWOU6SVYAMVS&issuer=GitHub", + ); + expect(code.issuer, "GitHub", reason: "issuerMismatch"); + expect(code.account, "testdata@ente.io", reason: "accountMismatch"); + expect(code.secret, "ASKZNWOU6SVYAMVS"); + }); }