Änderungen: - Implementierung von neuen Methoden `getAccountSettings` und `setAccountSettings` im `SettingsService`, um Benutzerkontoeinstellungen zu verwalten. - Anpassung der E-Mail-Verschlüsselung im `User`-Modell zur Verwendung von Buffer für die Speicherung und zur Verbesserung der Fehlerbehandlung bei der Entschlüsselung. - Hinzufügung eines neuen `immutable`-Feldes im `UserParamType`-Modell, um unveränderliche Einstellungen zu kennzeichnen. - Anpassungen in den Frontend-Komponenten zur Berücksichtigung von unveränderlichen Feldern und zur Verbesserung der Benutzeroberfläche. Diese Anpassungen verbessern die Sicherheit der Benutzerdaten und erweitern die Funktionalität der Kontoeinstellungen.
97 lines
2.7 KiB
JavaScript
97 lines
2.7 KiB
JavaScript
import { sequelize } from '../../utils/sequelize.js';
|
|
import { DataTypes } from 'sequelize';
|
|
import { encrypt, decrypt } from '../../utils/encryption.js';
|
|
import crypto from 'crypto';
|
|
|
|
const User = sequelize.define('user', {
|
|
email: {
|
|
type: DataTypes.BLOB,
|
|
allowNull: false,
|
|
unique: true,
|
|
set(value) {
|
|
if (value) {
|
|
const encrypted = encrypt(value);
|
|
// Konvertiere Hex-String zu Buffer für die Speicherung
|
|
const buffer = Buffer.from(encrypted, 'hex');
|
|
this.setDataValue('email', buffer);
|
|
}
|
|
},
|
|
get() {
|
|
const encrypted = this.getDataValue('email');
|
|
if (encrypted) {
|
|
try {
|
|
// Konvertiere Buffer zu String für die Entschlüsselung
|
|
const encryptedString = encrypted.toString('hex');
|
|
const decrypted = decrypt(encryptedString);
|
|
if (decrypted) {
|
|
return decrypted;
|
|
}
|
|
} catch (error) {
|
|
console.warn('Email decryption failed, treating as plain text:', error.message);
|
|
}
|
|
|
|
// Fallback: Versuche es als Klartext zu lesen
|
|
try {
|
|
return encrypted.toString('utf8');
|
|
} catch (error) {
|
|
console.warn('Email could not be read as plain text:', error.message);
|
|
return null;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
},
|
|
salt: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
defaultValue: () => crypto.randomBytes(16).toString('hex')
|
|
},
|
|
username: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
unique: true
|
|
},
|
|
password: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
},
|
|
registrationDate: {
|
|
type: DataTypes.DATE,
|
|
allowNull: false,
|
|
defaultValue: DataTypes.NOW
|
|
},
|
|
active: {
|
|
type: DataTypes.BOOLEAN,
|
|
defaultValue: false
|
|
},
|
|
resetToken: {
|
|
type: DataTypes.UUID,
|
|
allowNull: true
|
|
},
|
|
hashedId: {
|
|
type: DataTypes.STRING,
|
|
allowNull: true
|
|
},
|
|
searchable: {
|
|
type: DataTypes.BOOLEAN,
|
|
defaultValue: true
|
|
},
|
|
authCode: {
|
|
type: DataTypes.STRING,
|
|
allowNull: true
|
|
}
|
|
}, {
|
|
tableName: 'user',
|
|
schema: 'community',
|
|
underscored: true,
|
|
hooks: {
|
|
afterCreate: async (user, options) => {
|
|
const hashedId = crypto.createHash('sha256').update(user.id.toString()).digest('hex');
|
|
user.hashedId = hashedId;
|
|
await user.save();
|
|
},
|
|
}
|
|
});
|
|
|
|
export default User;
|