mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01: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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async deleteScimUsers(): Promise<void> {
 | 
			
		||||
        await this.db(TABLE).whereNotNull('scim_id').del();
 | 
			
		||||
    async deleteScimUsers(): Promise<User[]> {
 | 
			
		||||
        const rows = await this.db(TABLE)
 | 
			
		||||
            .whereNotNull('scim_id')
 | 
			
		||||
            .del()
 | 
			
		||||
            .returning(USER_COLUMNS);
 | 
			
		||||
        return rows.map(rowToUser);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async count(): Promise<number> {
 | 
			
		||||
 | 
			
		||||
@ -403,14 +403,26 @@ class UserService {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async deleteScimUsers(auditUser: IAuditUser): Promise<void> {
 | 
			
		||||
        await this.store.deleteScimUsers();
 | 
			
		||||
 | 
			
		||||
        await this.eventService.storeEvent(
 | 
			
		||||
        const users = await this.store.deleteScimUsers();
 | 
			
		||||
        // Note: after deletion we can't get the role for the user
 | 
			
		||||
        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({
 | 
			
		||||
                    data: null,
 | 
			
		||||
                    auditUser,
 | 
			
		||||
                }),
 | 
			
		||||
        );
 | 
			
		||||
            ]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async loginUser(
 | 
			
		||||
 | 
			
		||||
@ -46,5 +46,5 @@ export interface IUserStore extends Store<IUser, number> {
 | 
			
		||||
    count(): Promise<number>;
 | 
			
		||||
    countRecentlyDeleted(): 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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    deleteScimUsers(): Promise<void> {
 | 
			
		||||
    deleteScimUsers(): Promise<User[]> {
 | 
			
		||||
        throw new Error('Method not implemented.');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user