From 03a5bb3592969bf2be886e26677ae5d383589665 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Sat, 3 May 2025 09:09:52 +0200 Subject: [PATCH] change user model to login routine --- src/data-source.ts | 2 ++ src/entity/management/user.ts | 19 +++++++++-- src/enums/loginRoutineEnum.ts | 4 +++ src/helpers/backupHelper.ts | 2 ++ .../1746252454922-UserLoginRoutine.ts | 32 +++++++++++++++++++ 5 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 src/enums/loginRoutineEnum.ts create mode 100644 src/migrations/1746252454922-UserLoginRoutine.ts diff --git a/src/data-source.ts b/src/data-source.ts index 6d40b6c..dad9827 100644 --- a/src/data-source.ts +++ b/src/data-source.ts @@ -55,6 +55,7 @@ import { QueryUpdatedAt1744795756230 } from "./migrations/1744795756230-QueryUpd import { SettingsFromEnv1745059495808 } from "./migrations/1745059495808-settingsFromEnv"; import { MemberCreatedAt1746006549262 } from "./migrations/1746006549262-memberCreatedAt"; import { UserLoginRoutine1746252454922 } from "./migrations/1746252454922-UserLoginRoutine"; +import { SettingsFromEnv_SET1745059495808 } from "./migrations/1745059495808-settingsFromEnv_set"; const dataSource = new DataSource({ type: DB_TYPE as any, @@ -119,6 +120,7 @@ const dataSource = new DataSource({ SettingsFromEnv1745059495808, SettingsFromEnv_SET1745059495808, MemberCreatedAt1746006549262, + UserLoginRoutine1746252454922, ], migrationsRun: true, migrationsTransactionMode: "each", diff --git a/src/entity/management/user.ts b/src/entity/management/user.ts index 94ab3a3..a833864 100644 --- a/src/entity/management/user.ts +++ b/src/entity/management/user.ts @@ -1,6 +1,7 @@ import { Column, Entity, JoinTable, ManyToMany, OneToMany, PrimaryColumn } from "typeorm"; import { role } from "./role"; import { userPermission } from "./user_permission"; +import { LoginRoutineEnum } from "../../enums/loginRoutineEnum"; @Entity() export class user { @@ -19,11 +20,23 @@ export class user { @Column({ type: "varchar", length: 255 }) lastname: string; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "text", select: false }) secret: string; - @Column({ type: "boolean", default: false }) - static: boolean; + @Column({ + type: "varchar", + length: "255", + default: LoginRoutineEnum.totp, + transformer: { + to(value: LoginRoutineEnum) { + return value.toString(); + }, + from(value: string) { + return LoginRoutineEnum[value as keyof typeof LoginRoutineEnum]; + }, + }, + }) + routine: LoginRoutineEnum; @Column({ type: "boolean", default: false }) isOwner: boolean; diff --git a/src/enums/loginRoutineEnum.ts b/src/enums/loginRoutineEnum.ts new file mode 100644 index 0000000..4d42334 --- /dev/null +++ b/src/enums/loginRoutineEnum.ts @@ -0,0 +1,4 @@ +export enum LoginRoutineEnum { + password = "password", // login with self defined password + totp = "totp", // login with totp by auth apps +} diff --git a/src/helpers/backupHelper.ts b/src/helpers/backupHelper.ts index 4534a30..f107881 100644 --- a/src/helpers/backupHelper.ts +++ b/src/helpers/backupHelper.ts @@ -7,6 +7,7 @@ import UserService from "../service/management/userService"; import DatabaseActionException from "../exceptions/databaseActionException"; import { availableTemplates } from "../type/templateTypes"; import SettingHelper from "./settingsHelper"; +import { LoginRoutineEnum } from "../enums/loginRoutineEnum"; export type BackupSection = | "member" @@ -806,6 +807,7 @@ export default abstract class BackupHelper { let roles = await this.transactionManager.getRepository("role").find(); let dataWithMappedIds = (data?.["user"] ?? []).map((u) => ({ ...u, + routine: u.routine ?? LoginRoutineEnum.totp, roles: u.roles.map((r: any) => ({ ...r, id: roles.find((role) => role.role == r.role)?.id ?? undefined, diff --git a/src/migrations/1746252454922-UserLoginRoutine.ts b/src/migrations/1746252454922-UserLoginRoutine.ts new file mode 100644 index 0000000..0da51e0 --- /dev/null +++ b/src/migrations/1746252454922-UserLoginRoutine.ts @@ -0,0 +1,32 @@ +import { MigrationInterface, QueryRunner, TableColumn } from "typeorm"; +import { getDefaultByORM, getTypeByORM } from "./ormHelper"; + +export class UserLoginRoutine1746252454922 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + let users = await queryRunner.manager.getRepository("user").find({ select: ["id", "secret"] }); + + await queryRunner.dropColumns("user", ["secret", "static"]); + + await queryRunner.addColumns("user", [ + new TableColumn({ name: "secret", ...getTypeByORM("text") }), + new TableColumn({ name: "routine", ...getTypeByORM("varchar") }), + ]); + + await queryRunner.manager.getRepository("user").save(users.map((u) => ({ id: u.id, secret: u.secret }))); + } + + public async down(queryRunner: QueryRunner): Promise { + let users = await queryRunner.manager.getRepository("user").find({ select: ["id", "secret"] }); + + await queryRunner.dropColumn("user", "secret"); + + await queryRunner.addColumns("user", [ + new TableColumn({ name: "secret", ...getTypeByORM("varchar") }), + new TableColumn({ name: "static", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) }), + ]); + + await queryRunner.manager.getRepository("user").save(users.map((u) => ({ id: u.id, secret: u.secret }))); + + await queryRunner.dropColumn("user", "routine"); + } +}