diff --git a/reserve-api/src/identity/impl/encrypt.ts b/reserve-api/src/identity/impl/encrypt.ts index 9a6839b14e25ee88ba0be0ffe83e05ea233991ec..8d02e3ed977a72a9a58dddd3e4915ac614ce4550 100644 --- a/reserve-api/src/identity/impl/encrypt.ts +++ b/reserve-api/src/identity/impl/encrypt.ts @@ -6,9 +6,13 @@ */ //#region imports -import crypto from 'crypto'; +import crypto, { BinaryLike } from 'crypto'; //#endregion -export function encrypt(value: string, key: string): Buffer { - return crypto.createCipher('aes-256-gcm', key).update(value); +export function encrypt( + value: string, + key: BinaryLike, + iv: BinaryLike = crypto.randomBytes(16), +): Buffer { + return crypto.createCipheriv('aes-256-gcm', key, iv).update(value); } diff --git a/reserve-api/src/identity/impl/generate-anonymization-key.ts b/reserve-api/src/identity/impl/generate-anonymization-key.ts index d43f42a55ec69ccb1761de48e5f39a80d439ec49..93fc893dea61d79c9feb4352dcd8a1ae3182feb5 100644 --- a/reserve-api/src/identity/impl/generate-anonymization-key.ts +++ b/reserve-api/src/identity/impl/generate-anonymization-key.ts @@ -9,6 +9,6 @@ import crypto from 'crypto'; //#endregion -export function generateAnonymizationKey(): string { - return crypto.randomBytes(256).toString('hex'); +export function generateAnonymizationKey(): Buffer { + return crypto.randomBytes(32); } diff --git a/reserve-api/src/identity/impl/identity.service.ts b/reserve-api/src/identity/impl/identity.service.ts index c6b57ae9626522f2d3b2269ab41949cfecf2e1af..c14ef6359af29c6b207fa96863dd558400119734 100644 --- a/reserve-api/src/identity/impl/identity.service.ts +++ b/reserve-api/src/identity/impl/identity.service.ts @@ -101,11 +101,14 @@ export class IdentityServiceImpl implements IdentityService { ): Promise<void> { const identity = await this.getByUserId(workspaceId, userId); const key = generateAnonymizationKey(); - identity.email = encrypt(identity.email, key).toString(); - identity.firstName = encrypt(identity.firstName, key).toString(); - identity.lastName = encrypt(identity.lastName, key).toString(); + identity.email = encrypt(identity.email, key).toString('hex'); + identity.firstName = encrypt(identity.firstName, key).toString('hex'); + identity.lastName = encrypt(identity.lastName, key).toString('hex'); if (identity.phone) { - identity.phone = encrypt(identity.phone, key).toString(); + identity.phone = encrypt(identity.phone, key).toString('hex'); + } + if (identity.password) { + identity.password = encrypt(identity.password, key).toString('hex'); } identity.anonymized = true; await this.repository.save(identity); diff --git a/reserve-web/reserve-client/src/epics/user/index.ts b/reserve-web/reserve-client/src/epics/user/index.ts index 602be4d7b5c02784795f99cfecbc6fda3edb5c49..7ad53c1e7c72524302706d9f880d5d13358bbce5 100644 --- a/reserve-web/reserve-client/src/epics/user/index.ts +++ b/reserve-web/reserve-client/src/epics/user/index.ts @@ -13,6 +13,8 @@ import { isActionOf } from 'typesafe-actions'; import { RootAction } from 'actions'; import { get, patch, put, del } from 'actions/request'; import * as actions from 'actions/users'; +import * as authActions from 'actions/auth'; +import { merge } from 'rxjs'; //#endregion export const fetchByIdEpic: Epic<RootAction> = (action$) => ( @@ -58,9 +60,15 @@ export const updateProfileEpic: Epic<RootAction> = (action$) => ( ); export const deleteMeEpic: Epic<RootAction> = (action$) => ( - action$.pipe( - filter(isActionOf(actions.deleteMe.request)), - map(({meta}) => del(null, meta)), + merge( + action$.pipe( + filter(isActionOf(actions.deleteMe.request)), + map(({meta}) => del(null, meta)), + ), + action$.pipe( + filter(isActionOf(actions.deleteMe.success)), + map(() => authActions.logout.success()), + ) ) ); diff --git a/reserve-web/reserve-client/src/reducers/view/user/getMe.ts b/reserve-web/reserve-client/src/reducers/view/user/getMe.ts index 2c07dfcb8ba9c9349201f034b01315dca7f7af3e..885451315e47d4c5a797c793eec25f5dc35ab72b 100644 --- a/reserve-web/reserve-client/src/reducers/view/user/getMe.ts +++ b/reserve-web/reserve-client/src/reducers/view/user/getMe.ts @@ -8,7 +8,7 @@ //#region imports import { getType } from 'typesafe-actions'; -import { userActions as actions, RootAction } from 'actions'; +import { authActions, userActions as actions, RootAction } from 'actions'; //#endregion export interface GetMeMeta { @@ -34,6 +34,7 @@ export function getMe( }; case getType(actions.getMe.success): + case getType(authActions.logout.success): return { pending: false, retrieved: true,