v1.3 Fix of Google Authenticator migration support #9

Merged
Lisoveliy merged 5 commits from dev into main 2025-07-24 03:18:36 +02:00
Showing only changes of commit acc3218df6 - Show all commits

View File

@ -6,9 +6,9 @@ const otpauthScheme = "otpauth:/";
const googleMigrationScheme = "otpauth-migration:/"; const googleMigrationScheme = "otpauth-migration:/";
export function getTOTPByLink(link) { export function getTOTPByLink(link) {
if(link.includes(otpauthScheme)) if (link.includes(otpauthScheme))
return getByOtpauthScheme(link) return getByOtpauthScheme(link)
if(link.includes(googleMigrationScheme)) if (link.includes(googleMigrationScheme))
return getByGoogleMigrationScheme(link) return getByGoogleMigrationScheme(link)
return null; return null;
@ -21,7 +21,7 @@ function getHashType(algorithm) {
else return "SHA-1"; else return "SHA-1";
} }
function getByOtpauthScheme(link){ function getByOtpauthScheme(link) {
try { try {
let args = link.split("/", otpauthScheme.length); let args = link.split("/", otpauthScheme.length);
let type = args[2]; //Returns 'hotp' or 'totp' let type = args[2]; //Returns 'hotp' or 'totp'
@ -31,7 +31,7 @@ function getByOtpauthScheme(link){
args[3].split(":")[0]?.split("?")[0]; //Returns client args[3].split(":")[0]?.split("?")[0]; //Returns client
let secret = args[3].split("secret=")[1]?.split("&")[0]; //Returns secret let secret = args[3].split("secret=")[1]?.split("&")[0]; //Returns secret
let period = args[3].split("period=")[1]?.split("&")[0]; //Returns period let period = args[3].split("period=")[1]?.split("&")[0]; //Returns period
let digits = args[3].split("digits=")[1]?.split("&")[0]; //Returns digits let digits = args[3].split("digit=")[1]?.split("&")[0]; //Returns digits
let algorithm = args[3].split("algorithm=")[1]?.split("&")[0]; //Returns algorithm let algorithm = args[3].split("algorithm=")[1]?.split("&")[0]; //Returns algorithm
let offset = args[3].split("offset=")[1]?.split("&")[0] ?? 0; //Returns offset let offset = args[3].split("offset=")[1]?.split("&")[0] ?? 0; //Returns offset
@ -40,7 +40,7 @@ function getByOtpauthScheme(link){
if (secret === undefined) throw new Error("Secret not defined"); if (secret === undefined) throw new Error("Secret not defined");
if(issuer == client){ if (issuer == client) {
issuer = args[3].split("issuer=")[1]?.split("&")[0]; issuer = args[3].split("issuer=")[1]?.split("&")[0];
} }
@ -51,8 +51,8 @@ function getByOtpauthScheme(link){
secret, secret,
issuer, issuer,
client, client,
digits, Number(digits),
period, Number(period),
Number(offset), Number(offset),
getHashType(algorithm) getHashType(algorithm)
); );
@ -62,7 +62,7 @@ function getByOtpauthScheme(link){
} }
} }
function getByGoogleMigrationScheme(link){ function getByGoogleMigrationScheme(link) {
let data = link.split("data=")[1]; //Returns base64 encoded data let data = link.split("data=")[1]; //Returns base64 encoded data
data = decodeURIComponent(data); data = decodeURIComponent(data);
@ -72,7 +72,7 @@ function getByGoogleMigrationScheme(link){
let protoTotps = []; let protoTotps = [];
proto.parts.forEach(part => { proto.parts.forEach(part => {
if(part.type == TYPES.LENDELIM){ if (part.type == TYPES.LENDELIM) {
protoTotps.push(decodeProto(part.value)); protoTotps.push(decodeProto(part.value));
} }
}); });
@ -80,7 +80,7 @@ function getByGoogleMigrationScheme(link){
let totps = []; let totps = [];
protoTotps.forEach(x => { protoTotps.forEach(x => {
let type = x.parts.filter(x => x.index == 6)[0]; //find type of OTP let type = x.parts.filter(x => x.index == 6)[0]; //find type of OTP
if(type.value !== '2'){ if (type.value !== '2') {
console.log("ERR: it's a not TOTP record") console.log("ERR: it's a not TOTP record")
return; return;
} }