mirror of
https://github.com/Unleash/unleash.git
synced 2025-08-27 13:49:10 +02:00
fix: audit scim user deleted events (#10322)
SCIM users deleted in bulk are not captured in the event log. We just add an event like this:  This prevents partial user sync because we don't get an event when the user was deleted.
This commit is contained in:
parent
f7e39df386
commit
5901475c9e
@ -290,8 +290,12 @@ export class UserStore implements IUserStore {
|
|||||||
await this.activeUsers().del();
|
await this.activeUsers().del();
|
||||||
}
|
}
|
||||||
|
|
||||||
async deleteScimUsers(): Promise<void> {
|
async deleteScimUsers(): Promise<User[]> {
|
||||||
await this.db(TABLE).whereNotNull('scim_id').del();
|
const rows = await this.db(TABLE)
|
||||||
|
.whereNotNull('scim_id')
|
||||||
|
.del()
|
||||||
|
.returning(USER_COLUMNS);
|
||||||
|
return rows.map(rowToUser);
|
||||||
}
|
}
|
||||||
|
|
||||||
async count(): Promise<number> {
|
async count(): Promise<number> {
|
||||||
|
@ -403,14 +403,26 @@ class UserService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async deleteScimUsers(auditUser: IAuditUser): Promise<void> {
|
async deleteScimUsers(auditUser: IAuditUser): Promise<void> {
|
||||||
await this.store.deleteScimUsers();
|
const users = await this.store.deleteScimUsers();
|
||||||
|
// Note: after deletion we can't get the role for the user
|
||||||
await this.eventService.storeEvent(
|
const viewerRole = await this.accessService.getPredefinedRole(
|
||||||
|
RoleName.VIEWER,
|
||||||
|
);
|
||||||
|
if (users.length > 0) {
|
||||||
|
const deletions = users.map((user) => {
|
||||||
|
return new UserDeletedEvent({
|
||||||
|
deletedUser: { ...user, rootRole: viewerRole.id },
|
||||||
|
auditUser,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
await this.eventService.storeEvents([
|
||||||
|
...deletions,
|
||||||
new ScimUsersDeleted({
|
new ScimUsersDeleted({
|
||||||
data: null,
|
data: null,
|
||||||
auditUser,
|
auditUser,
|
||||||
}),
|
}),
|
||||||
);
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async loginUser(
|
async loginUser(
|
||||||
|
@ -46,5 +46,5 @@ export interface IUserStore extends Store<IUser, number> {
|
|||||||
count(): Promise<number>;
|
count(): Promise<number>;
|
||||||
countRecentlyDeleted(): Promise<number>;
|
countRecentlyDeleted(): Promise<number>;
|
||||||
countServiceAccounts(): Promise<number>;
|
countServiceAccounts(): Promise<number>;
|
||||||
deleteScimUsers(): Promise<void>;
|
deleteScimUsers(): Promise<IUser[]>;
|
||||||
}
|
}
|
||||||
|
2
src/test/fixtures/fake-user-store.ts
vendored
2
src/test/fixtures/fake-user-store.ts
vendored
@ -159,7 +159,7 @@ class UserStoreMock implements IUserStore {
|
|||||||
return Promise.resolve(undefined);
|
return Promise.resolve(undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteScimUsers(): Promise<void> {
|
deleteScimUsers(): Promise<User[]> {
|
||||||
throw new Error('Method not implemented.');
|
throw new Error('Method not implemented.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user