summary refs log tree commit diff
path: root/util
diff options
context:
space:
mode:
Diffstat (limited to 'util')
-rw-r--r--util/src/entities/BackupCodes.ts35
-rw-r--r--util/src/entities/Config.ts6
-rw-r--r--util/src/entities/Note.ts18
-rw-r--r--util/src/entities/User.ts12
-rw-r--r--util/src/entities/index.ts4
5 files changed, 70 insertions, 5 deletions
diff --git a/util/src/entities/BackupCodes.ts b/util/src/entities/BackupCodes.ts
new file mode 100644
index 00000000..d532a39a
--- /dev/null
+++ b/util/src/entities/BackupCodes.ts
@@ -0,0 +1,35 @@
+import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm";
+import { BaseClass } from "./BaseClass";
+import { User } from "./User";
+import crypto from "crypto";
+
+@Entity("backup_codes")
+export class BackupCode extends BaseClass {
+	@JoinColumn({ name: "user_id" })
+	@ManyToOne(() => User, { onDelete: "CASCADE" })
+	user: User;
+
+	@Column()
+	code: string;
+
+	@Column()
+	consumed: boolean;
+
+	@Column()
+	expired: boolean;
+}
+
+export function generateMfaBackupCodes(user_id: string) {
+	let backup_codes: BackupCode[] = [];
+	for (let i = 0; i < 10; i++) {
+		const code = BackupCode.create({
+			user: { id: user_id },
+			code: crypto.randomBytes(4).toString("hex"),	// 8 characters
+			consumed: false,
+			expired: false,
+		});
+		backup_codes.push(code);
+	}
+
+	return backup_codes;
+}
\ No newline at end of file
diff --git a/util/src/entities/Config.ts b/util/src/entities/Config.ts
index 3756d686..c84ea4aa 100644
--- a/util/src/entities/Config.ts
+++ b/util/src/entities/Config.ts
@@ -121,6 +121,9 @@ export interface ConfigValue {
 			secret: string | null;
 		};
 		ipdataApiKey: string | null;
+		twoFactor: {
+			generateBackupCodes: boolean;
+		};
 	};
 	login: {
 		requireCaptcha: boolean;
@@ -312,6 +315,9 @@ export const DefaultConfigOptions: ConfigValue = {
 			secret: null,
 		},
 		ipdataApiKey: "eca677b284b3bac29eb72f5e496aa9047f26543605efe99ff2ce35c9",
+		twoFactor: {
+			generateBackupCodes: true,
+		},
 	},
 	login: {
 		requireCaptcha: false,
diff --git a/util/src/entities/Note.ts b/util/src/entities/Note.ts
new file mode 100644
index 00000000..36017c5e
--- /dev/null
+++ b/util/src/entities/Note.ts
@@ -0,0 +1,18 @@
+import { Column, Entity, JoinColumn, ManyToOne, Unique } from "typeorm";
+import { BaseClass } from "./BaseClass";
+import { User } from "./User";
+
+@Entity("notes")
+@Unique(["owner", "target"])
+export class Note extends BaseClass {
+	@JoinColumn({ name: "owner_id" })
+	@ManyToOne(() => User, { onDelete: "CASCADE" })
+	owner: User;
+
+	@JoinColumn({ name: "target_id" })
+	@ManyToOne(() => User, { onDelete: "CASCADE" })
+	target: User;
+
+	@Column()
+	content: string;
+}
\ No newline at end of file
diff --git a/util/src/entities/User.ts b/util/src/entities/User.ts
index 9b1c494e..470398a5 100644
--- a/util/src/entities/User.ts
+++ b/util/src/entities/User.ts
@@ -1,10 +1,11 @@
-import { Column, Entity, FindOneOptions, JoinColumn, ManyToMany, OneToMany, RelationId } from "typeorm";
+import { Column, Entity, FindOneOptions, JoinColumn, OneToMany } from "typeorm";
 import { BaseClass } from "./BaseClass";
 import { BitField } from "../util/BitField";
 import { Relationship } from "./Relationship";
 import { ConnectedAccount } from "./ConnectedAccount";
 import { Config, FieldErrors, Snowflake, trimSpecial } from "..";
 import { Member, Session } from ".";
+import { Note } from "./Note";
 
 export enum PublicUserEnum {
 	username,
@@ -108,6 +109,12 @@ export class User extends BaseClass {
 	@Column({ select: false })
 	mfa_enabled: boolean; // if multi factor authentication is enabled
 
+	@Column({ select: false, nullable: true })
+	totp_secret?: string;
+
+	@Column({ nullable: true, select: false })
+	totp_last_ticket?: string;
+
 	@Column()
 	created_at: Date; // registration date
 
@@ -168,9 +175,6 @@ export class User extends BaseClass {
 	@Column({ type: "simple-json", select: false })
 	extended_settings: string;
 
-	@Column({ type: "simple-json" })
-	notes: { [key: string]: string };	//key is ID of user
-
 	toPublicUser() {
 		const user: any = {};
 		PublicUserProjection.forEach((x) => {
diff --git a/util/src/entities/index.ts b/util/src/entities/index.ts
index f023d5a6..c439a4b7 100644
--- a/util/src/entities/index.ts
+++ b/util/src/entities/index.ts
@@ -27,4 +27,6 @@ export * from "./Template";
 export * from "./User";
 export * from "./VoiceState";
 export * from "./Webhook";
-export * from "./ClientRelease";
\ No newline at end of file
+export * from "./ClientRelease";
+export * from "./BackupCodes";
+export * from "./Note";