2024-10-01 13:49:18 +02:00
|
|
|
import * as plugins from '../plugins.js';
|
2024-09-29 13:56:38 +02:00
|
|
|
import { UserManager } from './classes.usermanager.js';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* a User is identified by its username or email.
|
|
|
|
|
* Both need to be unique and both can be changed.
|
|
|
|
|
*/
|
|
|
|
|
@plugins.smartdata.Manager()
|
|
|
|
|
export class User extends plugins.smartdata.SmartDataDbDoc<
|
|
|
|
|
User,
|
2024-10-07 10:26:21 +02:00
|
|
|
plugins.idpInterfaces.data.IUser
|
2024-09-29 13:56:38 +02:00
|
|
|
> {
|
|
|
|
|
// STATIC
|
|
|
|
|
public static async createNewUserForUserData(
|
2024-10-07 10:26:21 +02:00
|
|
|
userDataArg: plugins.idpInterfaces.data.IUser['data']
|
2024-09-29 13:56:38 +02:00
|
|
|
): Promise<User> {
|
|
|
|
|
const newUser = new User();
|
|
|
|
|
newUser.id = plugins.smartunique.shortId();
|
|
|
|
|
newUser.data = {
|
2026-04-20 08:12:07 +00:00
|
|
|
connectedOrgs: [],
|
2024-09-29 13:56:38 +02:00
|
|
|
status: 'new',
|
|
|
|
|
name: userDataArg.name,
|
|
|
|
|
username: userDataArg.username,
|
|
|
|
|
email: userDataArg.email,
|
|
|
|
|
passwordHash: userDataArg.passwordHash,
|
|
|
|
|
};
|
|
|
|
|
if (!newUser.data.passwordHash && userDataArg.password) {
|
|
|
|
|
newUser.data.passwordHash = await User.hashPassword(userDataArg.password);
|
|
|
|
|
}
|
|
|
|
|
await newUser.save();
|
|
|
|
|
return newUser;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-20 08:12:07 +00:00
|
|
|
public static async hashPassword(passwordArg: string) {
|
|
|
|
|
return plugins.argon2.hash(passwordArg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static isLegacyPasswordHash(passwordHashArg?: string) {
|
|
|
|
|
return !!passwordHashArg && !passwordHashArg.startsWith('$argon2');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static shouldUpgradePasswordHash(passwordHashArg?: string) {
|
|
|
|
|
return this.isLegacyPasswordHash(passwordHashArg);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static async verifyPassword(passwordArg: string, passwordHashArg?: string) {
|
|
|
|
|
if (!passwordHashArg) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (this.isLegacyPasswordHash(passwordHashArg)) {
|
|
|
|
|
return passwordHashArg === (await plugins.smarthash.sha256FromString(passwordArg));
|
|
|
|
|
}
|
|
|
|
|
return plugins.argon2.verify(passwordHashArg, passwordArg);
|
2024-09-29 13:56:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// INSTANCE
|
|
|
|
|
@plugins.smartdata.unI()
|
|
|
|
|
id: string;
|
|
|
|
|
|
|
|
|
|
@plugins.smartdata.svDb()
|
2024-10-07 10:26:21 +02:00
|
|
|
public data: plugins.idpInterfaces.data.IUser['data'];
|
2024-09-29 13:56:38 +02:00
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
|
super();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public setLegalData() {}
|
|
|
|
|
}
|