[ente Authenticator] Add types
This commit is contained in:
parent
50e375ebdf
commit
4faa05a465
23
src/types/authenticator/auth_entity.ts
Normal file
23
src/types/authenticator/auth_entity.ts
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
export class AuthEntity {
|
||||||
|
id: string;
|
||||||
|
encryptedData: string | null;
|
||||||
|
header: string | null;
|
||||||
|
isDeleted: boolean;
|
||||||
|
createdAt: number;
|
||||||
|
updatedAt: number;
|
||||||
|
constructor(
|
||||||
|
id: string,
|
||||||
|
encryptedData: string | null,
|
||||||
|
header: string | null,
|
||||||
|
isDeleted: boolean,
|
||||||
|
createdAt: number,
|
||||||
|
updatedAt: number
|
||||||
|
) {
|
||||||
|
this.id = id;
|
||||||
|
this.encryptedData = encryptedData;
|
||||||
|
this.header = header;
|
||||||
|
this.isDeleted = isDeleted;
|
||||||
|
this.createdAt = createdAt;
|
||||||
|
this.updatedAt = updatedAt;
|
||||||
|
}
|
||||||
|
}
|
166
src/types/authenticator/code.ts
Normal file
166
src/types/authenticator/code.ts
Normal file
|
@ -0,0 +1,166 @@
|
||||||
|
import { URI } from 'vscode-uri';
|
||||||
|
|
||||||
|
type Type = 'totp' | 'TOTP' | 'hotp' | 'HOTP';
|
||||||
|
|
||||||
|
type AlgorithmType =
|
||||||
|
| 'sha1'
|
||||||
|
| 'SHA1'
|
||||||
|
| 'sha256'
|
||||||
|
| 'SHA256'
|
||||||
|
| 'sha512'
|
||||||
|
| 'SHA512';
|
||||||
|
|
||||||
|
export class Code {
|
||||||
|
static readonly defaultDigits = 6;
|
||||||
|
static readonly defaultPeriod = 30;
|
||||||
|
|
||||||
|
// id for the corresponding auth entity
|
||||||
|
id?: String;
|
||||||
|
account: string;
|
||||||
|
issuer: string;
|
||||||
|
digits?: number;
|
||||||
|
period: number;
|
||||||
|
secret: string;
|
||||||
|
algorithm: AlgorithmType;
|
||||||
|
type: Type;
|
||||||
|
rawData?: string;
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
account: string,
|
||||||
|
issuer: string,
|
||||||
|
digits: number | undefined,
|
||||||
|
period: number,
|
||||||
|
secret: string,
|
||||||
|
algorithm: AlgorithmType,
|
||||||
|
type: Type,
|
||||||
|
rawData?: string,
|
||||||
|
id?: string
|
||||||
|
) {
|
||||||
|
this.account = account;
|
||||||
|
this.issuer = issuer;
|
||||||
|
this.digits = digits;
|
||||||
|
this.period = period;
|
||||||
|
this.secret = secret;
|
||||||
|
this.algorithm = algorithm;
|
||||||
|
this.type = type;
|
||||||
|
this.rawData = rawData;
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
static fromRawData(id: string, rawData: string): Code {
|
||||||
|
let santizedRawData = rawData
|
||||||
|
.replace(/\+/g, '%2B')
|
||||||
|
.replace(/:/g, '%3A');
|
||||||
|
if (santizedRawData.startsWith('"')) {
|
||||||
|
santizedRawData = santizedRawData.substring(1);
|
||||||
|
}
|
||||||
|
if (santizedRawData.endsWith('"')) {
|
||||||
|
santizedRawData = santizedRawData.substring(
|
||||||
|
0,
|
||||||
|
santizedRawData.length - 1
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const uriParams = {};
|
||||||
|
const searchParamsString =
|
||||||
|
decodeURIComponent(santizedRawData).split('?')[1];
|
||||||
|
searchParamsString.split('&').forEach((pair) => {
|
||||||
|
const [key, value] = pair.split('=');
|
||||||
|
uriParams[key] = value;
|
||||||
|
});
|
||||||
|
|
||||||
|
const uri = URI.parse(santizedRawData);
|
||||||
|
let uriPath = uri.path;
|
||||||
|
if (
|
||||||
|
uriPath.startsWith('/otpauth://') ||
|
||||||
|
uriPath.startsWith('otpauth://')
|
||||||
|
) {
|
||||||
|
uriPath = uriPath.split('otpauth://')[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Code(
|
||||||
|
Code._getAccount(uriPath),
|
||||||
|
Code._getIssuer(uriPath, uriParams),
|
||||||
|
Code._getDigits(uriParams),
|
||||||
|
Code._getPeriod(uriParams),
|
||||||
|
Code.getSanitizedSecret(uriParams),
|
||||||
|
Code._getAlgorithm(uriParams),
|
||||||
|
Code._getType(uriPath),
|
||||||
|
rawData,
|
||||||
|
id
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static _getAccount(uriPath: string): string {
|
||||||
|
try {
|
||||||
|
const path = decodeURIComponent(uriPath);
|
||||||
|
return path.split(':')[1];
|
||||||
|
} catch (e) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static _getIssuer(
|
||||||
|
uriPath: string,
|
||||||
|
uriParams: { get?: any }
|
||||||
|
): string {
|
||||||
|
try {
|
||||||
|
if (uriParams['issuer'] !== undefined) {
|
||||||
|
let issuer = uriParams['issuer'];
|
||||||
|
// This is to handle bug in the ente auth app
|
||||||
|
if (issuer.endsWith('period')) {
|
||||||
|
issuer = issuer.substring(0, issuer.length - 6);
|
||||||
|
}
|
||||||
|
return issuer;
|
||||||
|
}
|
||||||
|
const path = decodeURIComponent(uriPath);
|
||||||
|
return path.split(':')[0].substring(1);
|
||||||
|
} catch (e) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static _getDigits(uriParams): number {
|
||||||
|
try {
|
||||||
|
return parseInt(uriParams['digits'], 10);
|
||||||
|
} catch (e) {
|
||||||
|
return Code.defaultDigits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static _getPeriod(uriParams): number {
|
||||||
|
try {
|
||||||
|
return parseInt(uriParams['period'], 10) || Code.defaultPeriod;
|
||||||
|
} catch (e) {
|
||||||
|
return Code.defaultPeriod;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static _getAlgorithm(uriParams): AlgorithmType {
|
||||||
|
try {
|
||||||
|
const algorithm = uriParams['algorithm'].toLowerCase();
|
||||||
|
if (algorithm === 'sha256') {
|
||||||
|
return algorithm;
|
||||||
|
} else if (algorithm === 'sha512') {
|
||||||
|
return algorithm;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
// nothing
|
||||||
|
}
|
||||||
|
return 'sha1';
|
||||||
|
}
|
||||||
|
|
||||||
|
private static _getType(uriPath: string): Type {
|
||||||
|
const oauthType = uriPath.split('/')[0].substring(0);
|
||||||
|
if (oauthType === 'totp') {
|
||||||
|
return 'totp';
|
||||||
|
} else if (oauthType === 'hotp') {
|
||||||
|
return 'hotp';
|
||||||
|
}
|
||||||
|
throw new Error(`Unsupported format with host ${oauthType}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
static getSanitizedSecret(uriParams): string {
|
||||||
|
return uriParams['secret'].replace(/ /g, '').toUpperCase();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue