mirror of
https://github.com/bitwarden/directory-connector
synced 2025-12-16 00:04:34 +00:00
Add support for filtering users based on their group membership (#9)
* Add support for filtering users based on their group membership. * Fix async call in if statement and proper keyword detection. * Handle case where the checkMemberGroups was failing due to deleted user. * Pass UseEntry into the filter and simplify filter condition. * Revert changes in package-lock.json
This commit is contained in:
2
package-lock.json
generated
2
package-lock.json
generated
@@ -13050,4 +13050,4 @@
|
|||||||
"integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA=="
|
"integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -86,7 +86,7 @@ export class AzureDirectoryService extends BaseDirectoryService implements Direc
|
|||||||
res = await userReq.get();
|
res = await userReq.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
const setFilter = this.createCustomSet(this.syncConfig.userFilter);
|
const setFilter = this.createCustomUserSet(this.syncConfig.userFilter);
|
||||||
while (true) {
|
while (true) {
|
||||||
const users: graphType.User[] = res.value;
|
const users: graphType.User[] = res.value;
|
||||||
if (users != null) {
|
if (users != null) {
|
||||||
@@ -95,7 +95,7 @@ export class AzureDirectoryService extends BaseDirectoryService implements Direc
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const entry = this.buildUser(user);
|
const entry = this.buildUser(user);
|
||||||
if (this.filterOutResult(setFilter, entry.email)) {
|
if (await this.filterOutUserResult(setFilter, entry)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,6 +123,77 @@ export class AzureDirectoryService extends BaseDirectoryService implements Direc
|
|||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private createCustomUserSet(filter: string): [UserSetType, Set<string>] {
|
||||||
|
if (filter == null || filter === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mainParts = filter.split('|');
|
||||||
|
if (mainParts.length < 1 || mainParts[0] == null || mainParts[0].trim() === '') {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const parts = mainParts[0].split(':');
|
||||||
|
if (parts.length !== 2) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const keyword = parts[0].trim().toLowerCase();
|
||||||
|
let userSetType = UserSetType.IncludeUser;
|
||||||
|
if (keyword === 'include') {
|
||||||
|
userSetType = UserSetType.IncludeUser;
|
||||||
|
} else if (keyword === 'exclude') {
|
||||||
|
userSetType = UserSetType.ExcludeUser;
|
||||||
|
} else if (keyword === 'includegroup') {
|
||||||
|
userSetType = UserSetType.IncludeGroup;
|
||||||
|
} else if (keyword === 'excludegroup') {
|
||||||
|
userSetType = UserSetType.ExcludeGroup;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const set = new Set<string>();
|
||||||
|
const pieces = parts[1].split(',');
|
||||||
|
for (const p of pieces) {
|
||||||
|
set.add(p.trim().toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
return [userSetType, set];
|
||||||
|
}
|
||||||
|
|
||||||
|
private async filterOutUserResult(setFilter: [UserSetType, Set<string>], user: UserEntry): Promise<boolean> {
|
||||||
|
if (setFilter != null) {
|
||||||
|
let userSetTypeExclude = null;
|
||||||
|
if (setFilter[0] === UserSetType.IncludeUser) {
|
||||||
|
userSetTypeExclude = false;
|
||||||
|
} else if (setFilter[0] === UserSetType.ExcludeUser) {
|
||||||
|
userSetTypeExclude = true;
|
||||||
|
}
|
||||||
|
if (userSetTypeExclude != null) {
|
||||||
|
return this.filterOutResult([userSetTypeExclude, setFilter[1]], user.email);
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
let memberGroups = await this.client.api(`/users/${user.externalId}/checkMemberGroups`).post({
|
||||||
|
groupIds: Array.from(setFilter[1])
|
||||||
|
});
|
||||||
|
if (memberGroups.value.length > 0 && setFilter[0] == UserSetType.IncludeGroup) {
|
||||||
|
return false;
|
||||||
|
} else if (memberGroups.value.length > 0 && setFilter[0] == UserSetType.ExcludeGroup) {
|
||||||
|
return true;
|
||||||
|
} else if (memberGroups.value.length == 0 && setFilter[0] == UserSetType.IncludeGroup) {
|
||||||
|
return true;
|
||||||
|
} else if (memberGroups.value.length == 0 && setFilter[0] == UserSetType.ExcludeGroup) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch(ex) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private buildUser(user: graphType.User): UserEntry {
|
private buildUser(user: graphType.User): UserEntry {
|
||||||
const entry = new UserEntry();
|
const entry = new UserEntry();
|
||||||
entry.referenceId = user.id;
|
entry.referenceId = user.id;
|
||||||
@@ -278,3 +349,10 @@ export class AzureDirectoryService extends BaseDirectoryService implements Direc
|
|||||||
this.accessTokenExpiration = exp;
|
this.accessTokenExpiration = exp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum UserSetType {
|
||||||
|
IncludeUser,
|
||||||
|
ExcludeUser,
|
||||||
|
IncludeGroup,
|
||||||
|
ExcludeGroup
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user