@boxyhq/saml-jackson 1.9.11 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/controller/api.d.ts +9 -0
  2. package/dist/controller/api.js +14 -0
  3. package/dist/controller/api.js.map +1 -1
  4. package/dist/controller/connection/oidc.js +8 -0
  5. package/dist/controller/connection/oidc.js.map +1 -1
  6. package/dist/controller/connection/saml.js +8 -0
  7. package/dist/controller/connection/saml.js.map +1 -1
  8. package/dist/controller/utils.d.ts +3 -1
  9. package/dist/controller/utils.js +3 -1
  10. package/dist/controller/utils.js.map +1 -1
  11. package/dist/db/planetscale/entity/JacksonIndex.js +2 -3
  12. package/dist/db/planetscale/entity/JacksonIndex.js.map +1 -1
  13. package/dist/db/planetscale/entity/JacksonStore.js +2 -3
  14. package/dist/db/planetscale/entity/JacksonStore.js.map +1 -1
  15. package/dist/db/planetscale/entity/JacksonTTL.js +2 -3
  16. package/dist/db/planetscale/entity/JacksonTTL.js.map +1 -1
  17. package/dist/db/redis.js +16 -26
  18. package/dist/db/redis.js.map +1 -1
  19. package/dist/db/sql/entity/JacksonIndex.js +2 -3
  20. package/dist/db/sql/entity/JacksonIndex.js.map +1 -1
  21. package/dist/db/sql/entity/JacksonStore.js +2 -3
  22. package/dist/db/sql/entity/JacksonStore.js.map +1 -1
  23. package/dist/db/sql/entity/JacksonTTL.js +2 -3
  24. package/dist/db/sql/entity/JacksonTTL.js.map +1 -1
  25. package/dist/db/sql/mariadb/entity/JacksonIndex.js +2 -3
  26. package/dist/db/sql/mariadb/entity/JacksonIndex.js.map +1 -1
  27. package/dist/db/sql/mariadb/entity/JacksonStore.js +2 -3
  28. package/dist/db/sql/mariadb/entity/JacksonStore.js.map +1 -1
  29. package/dist/db/sql/mariadb/entity/JacksonTTL.js +2 -3
  30. package/dist/db/sql/mariadb/entity/JacksonTTL.js.map +1 -1
  31. package/dist/db/sql/mssql/entity/JacksonIndex.js +2 -3
  32. package/dist/db/sql/mssql/entity/JacksonIndex.js.map +1 -1
  33. package/dist/db/sql/mssql/entity/JacksonStore.js +2 -3
  34. package/dist/db/sql/mssql/entity/JacksonStore.js.map +1 -1
  35. package/dist/db/sql/mssql/entity/JacksonTTL.js +2 -3
  36. package/dist/db/sql/mssql/entity/JacksonTTL.js.map +1 -1
  37. package/dist/directory-sync/index.d.ts +10 -8
  38. package/dist/directory-sync/index.js +22 -12
  39. package/dist/directory-sync/index.js.map +1 -1
  40. package/dist/directory-sync/non-scim/google/api.d.ts +48 -0
  41. package/dist/directory-sync/non-scim/google/api.js +147 -0
  42. package/dist/directory-sync/non-scim/google/api.js.map +1 -0
  43. package/dist/directory-sync/non-scim/google/index.d.ts +12 -0
  44. package/dist/directory-sync/non-scim/google/index.js +14 -0
  45. package/dist/directory-sync/non-scim/google/index.js.map +1 -0
  46. package/dist/directory-sync/non-scim/google/oauth.d.ts +27 -0
  47. package/dist/directory-sync/non-scim/google/oauth.js +109 -0
  48. package/dist/directory-sync/non-scim/google/oauth.js.map +1 -0
  49. package/dist/directory-sync/non-scim/index.d.ts +10 -0
  50. package/dist/directory-sync/non-scim/index.js +51 -0
  51. package/dist/directory-sync/non-scim/index.js.map +1 -0
  52. package/dist/directory-sync/non-scim/syncGroupMembers.d.ts +23 -0
  53. package/dist/directory-sync/non-scim/syncGroupMembers.js +112 -0
  54. package/dist/directory-sync/non-scim/syncGroupMembers.js.map +1 -0
  55. package/dist/directory-sync/non-scim/syncGroups.d.ts +24 -0
  56. package/dist/directory-sync/non-scim/syncGroups.js +124 -0
  57. package/dist/directory-sync/non-scim/syncGroups.js.map +1 -0
  58. package/dist/directory-sync/non-scim/syncUsers.d.ts +24 -0
  59. package/dist/directory-sync/non-scim/syncUsers.js +124 -0
  60. package/dist/directory-sync/non-scim/syncUsers.js.map +1 -0
  61. package/dist/directory-sync/non-scim/utils.d.ts +36 -0
  62. package/dist/directory-sync/non-scim/utils.js +124 -0
  63. package/dist/directory-sync/non-scim/utils.js.map +1 -0
  64. package/dist/directory-sync/{Base.d.ts → scim/Base.d.ts} +1 -5
  65. package/dist/directory-sync/{Base.js → scim/Base.js} +3 -17
  66. package/dist/directory-sync/scim/Base.js.map +1 -0
  67. package/dist/directory-sync/{DirectoryConfig.d.ts → scim/DirectoryConfig.d.ts} +20 -27
  68. package/dist/directory-sync/{DirectoryConfig.js → scim/DirectoryConfig.js} +94 -48
  69. package/dist/directory-sync/scim/DirectoryConfig.js.map +1 -0
  70. package/dist/directory-sync/{DirectoryGroups.d.ts → scim/DirectoryGroups.d.ts} +8 -6
  71. package/dist/directory-sync/{DirectoryGroups.js → scim/DirectoryGroups.js} +8 -12
  72. package/dist/directory-sync/scim/DirectoryGroups.js.map +1 -0
  73. package/dist/directory-sync/{DirectoryUsers.d.ts → scim/DirectoryUsers.d.ts} +7 -5
  74. package/dist/directory-sync/{DirectoryUsers.js → scim/DirectoryUsers.js} +4 -3
  75. package/dist/directory-sync/scim/DirectoryUsers.js.map +1 -0
  76. package/dist/directory-sync/scim/Groups.d.ts +38 -0
  77. package/dist/directory-sync/{Groups.js → scim/Groups.js} +38 -29
  78. package/dist/directory-sync/scim/Groups.js.map +1 -0
  79. package/dist/directory-sync/scim/Users.d.ts +32 -0
  80. package/dist/directory-sync/{Users.js → scim/Users.js} +27 -25
  81. package/dist/directory-sync/scim/Users.js.map +1 -0
  82. package/dist/directory-sync/{WebhookEventsLogger.d.ts → scim/WebhookEventsLogger.d.ts} +1 -1
  83. package/dist/directory-sync/{WebhookEventsLogger.js → scim/WebhookEventsLogger.js} +3 -1
  84. package/dist/directory-sync/scim/WebhookEventsLogger.js.map +1 -0
  85. package/dist/directory-sync/{events.d.ts → scim/events.d.ts} +5 -3
  86. package/dist/directory-sync/{events.js → scim/events.js} +6 -4
  87. package/dist/directory-sync/scim/events.js.map +1 -0
  88. package/dist/directory-sync/{transform.d.ts → scim/transform.d.ts} +1 -1
  89. package/dist/directory-sync/scim/transform.js.map +1 -0
  90. package/dist/directory-sync/scim/utils.d.ts +33 -0
  91. package/dist/directory-sync/{utils.js → scim/utils.js} +8 -3
  92. package/dist/directory-sync/scim/utils.js.map +1 -0
  93. package/dist/directory-sync/types.d.ts +65 -13
  94. package/dist/directory-sync/types.js +3 -2
  95. package/dist/directory-sync/types.js.map +1 -1
  96. package/dist/typings.d.ts +18 -0
  97. package/package.json +15 -12
  98. package/dist/directory-sync/Base.js.map +0 -1
  99. package/dist/directory-sync/DirectoryConfig.js.map +0 -1
  100. package/dist/directory-sync/DirectoryGroups.js.map +0 -1
  101. package/dist/directory-sync/DirectoryUsers.js.map +0 -1
  102. package/dist/directory-sync/Groups.d.ts +0 -48
  103. package/dist/directory-sync/Groups.js.map +0 -1
  104. package/dist/directory-sync/Users.d.ts +0 -49
  105. package/dist/directory-sync/Users.js.map +0 -1
  106. package/dist/directory-sync/WebhookEventsLogger.js.map +0 -1
  107. package/dist/directory-sync/events.js.map +0 -1
  108. package/dist/directory-sync/transform.js.map +0 -1
  109. package/dist/directory-sync/utils.d.ts +0 -33
  110. package/dist/directory-sync/utils.js.map +0 -1
  111. /package/dist/directory-sync/{transform.js → scim/transform.js} +0 -0
@@ -0,0 +1,23 @@
1
+ import type { Directory, IGroups, Group, IRequestHandler, DirectorySyncRequest, EventCallback, IDirectoryProvider } from '../../typings';
2
+ interface SyncGroupMembersParams {
3
+ groupController: IGroups;
4
+ provider: IDirectoryProvider;
5
+ requestHandler: IRequestHandler;
6
+ callback: EventCallback;
7
+ directory: Directory;
8
+ }
9
+ type HandleRequestParams = Pick<DirectorySyncRequest, 'method' | 'body' | 'resourceId'>;
10
+ export declare class SyncGroupMembers {
11
+ private groupController;
12
+ private provider;
13
+ private requestHandler;
14
+ private callback;
15
+ private directory;
16
+ constructor({ directory, groupController, requestHandler, provider, callback }: SyncGroupMembersParams);
17
+ sync(): Promise<void>;
18
+ getAllExistingMembers(group: Group): Promise<string[]>;
19
+ addMembers(group: Group, memberIds: string[]): Promise<void>;
20
+ deleteMembers(group: Group, memberIds: string[]): Promise<void>;
21
+ handleRequest(payload: HandleRequestParams): Promise<void>;
22
+ }
23
+ export {};
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.SyncGroupMembers = void 0;
16
+ const lodash_1 = __importDefault(require("lodash"));
17
+ const utils_1 = require("./utils");
18
+ class SyncGroupMembers {
19
+ constructor({ directory, groupController, requestHandler, provider, callback }) {
20
+ this.groupController = groupController;
21
+ this.provider = provider;
22
+ this.requestHandler = requestHandler;
23
+ this.callback = callback;
24
+ this.directory = directory;
25
+ }
26
+ sync() {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ let nextPageOption = null;
29
+ do {
30
+ const { data: groups, metadata } = yield this.provider.getGroups(this.directory, nextPageOption);
31
+ if (!groups || groups.length === 0) {
32
+ break;
33
+ }
34
+ for (const group of groups) {
35
+ const membersFromDB = yield this.getAllExistingMembers(group);
36
+ const membersFromProvider = yield this.provider.getGroupMembers(this.directory, group);
37
+ const idsFromDB = lodash_1.default.map(membersFromDB, 'user_id');
38
+ const idsFromProvider = lodash_1.default.map(membersFromProvider, 'id');
39
+ const deletedMembers = (0, utils_1.compareAndFindDeletedMembers)(idsFromDB, idsFromProvider);
40
+ const newMembers = (0, utils_1.compareAndFindNewMembers)(idsFromDB, idsFromProvider);
41
+ if (deletedMembers && deletedMembers.length > 0) {
42
+ yield this.deleteMembers(group, deletedMembers);
43
+ }
44
+ if (newMembers && newMembers.length > 0) {
45
+ yield this.addMembers(group, newMembers);
46
+ }
47
+ }
48
+ nextPageOption = metadata;
49
+ } while (nextPageOption && nextPageOption.hasNextPage);
50
+ });
51
+ }
52
+ // Get all existing members for a group from the Jackson store
53
+ getAllExistingMembers(group) {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ const existingMembers = [];
56
+ const pageLimit = 500;
57
+ let pageOffset = 0;
58
+ while (true) {
59
+ const { data: members } = yield this.groupController
60
+ .setTenantAndProduct(this.directory.tenant, this.directory.product)
61
+ .getGroupMembers({
62
+ groupId: group.id,
63
+ pageOffset,
64
+ pageLimit,
65
+ });
66
+ if (!members || members.length === 0) {
67
+ break;
68
+ }
69
+ existingMembers.push(...members);
70
+ if (members.length < pageLimit) {
71
+ break;
72
+ }
73
+ pageOffset += pageLimit;
74
+ }
75
+ return existingMembers;
76
+ });
77
+ }
78
+ addMembers(group, memberIds) {
79
+ return __awaiter(this, void 0, void 0, function* () {
80
+ yield this.handleRequest({
81
+ method: 'PATCH',
82
+ body: (0, utils_1.toGroupMembershipSCIMPayload)(memberIds, 'add'),
83
+ resourceId: group.id,
84
+ });
85
+ });
86
+ }
87
+ deleteMembers(group, memberIds) {
88
+ return __awaiter(this, void 0, void 0, function* () {
89
+ yield this.handleRequest({
90
+ method: 'PATCH',
91
+ body: (0, utils_1.toGroupMembershipSCIMPayload)(memberIds, 'remove'),
92
+ resourceId: group.id,
93
+ });
94
+ });
95
+ }
96
+ handleRequest(payload) {
97
+ return __awaiter(this, void 0, void 0, function* () {
98
+ const request = {
99
+ query: {},
100
+ body: payload.body,
101
+ resourceType: 'groups',
102
+ method: payload.method,
103
+ directoryId: this.directory.id,
104
+ apiSecret: this.directory.scim.secret,
105
+ resourceId: payload.resourceId,
106
+ };
107
+ yield this.requestHandler.handle(request, this.callback);
108
+ });
109
+ }
110
+ }
111
+ exports.SyncGroupMembers = SyncGroupMembers;
112
+ //# sourceMappingURL=syncGroupMembers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncGroupMembers.js","sourceRoot":"","sources":["../../../src/directory-sync/non-scim/syncGroupMembers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Directory, IGroups, Group, IRequestHandler, DirectorySyncRequest, EventCallback, IDirectoryProvider } from '../../typings';
2
+ interface SyncGroupsParams {
3
+ groupController: IGroups;
4
+ provider: IDirectoryProvider;
5
+ requestHandler: IRequestHandler;
6
+ callback: EventCallback;
7
+ directory: Directory;
8
+ }
9
+ type HandleRequestParams = Pick<DirectorySyncRequest, 'method' | 'body' | 'resourceId'>;
10
+ export declare class SyncGroups {
11
+ private groupController;
12
+ private provider;
13
+ private requestHandler;
14
+ private callback;
15
+ private directory;
16
+ constructor({ directory, groupController, callback, requestHandler, provider }: SyncGroupsParams);
17
+ sync(): Promise<void>;
18
+ getAllExistingGroups(): Promise<Group[]>;
19
+ createGroup(group: Group): Promise<void>;
20
+ updateGroup(group: Group): Promise<void>;
21
+ deleteGroups(groups: Group[]): Promise<void>;
22
+ handleRequest(payload: HandleRequestParams): Promise<void>;
23
+ }
24
+ export {};
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SyncGroups = void 0;
13
+ const utils_1 = require("./utils");
14
+ class SyncGroups {
15
+ constructor({ directory, groupController, callback, requestHandler, provider }) {
16
+ this.groupController = groupController;
17
+ this.provider = provider;
18
+ this.requestHandler = requestHandler;
19
+ this.callback = callback;
20
+ this.directory = directory;
21
+ }
22
+ sync() {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ const groupsFromProvider = [];
25
+ let nextPageOption = null;
26
+ do {
27
+ const { data: groups, metadata } = yield this.provider.getGroups(this.directory, nextPageOption);
28
+ if (!groups || groups.length === 0) {
29
+ break;
30
+ }
31
+ // Create or update groups
32
+ for (const group of groups) {
33
+ const { data: existingGroup } = yield this.groupController
34
+ .setTenantAndProduct(this.directory.tenant, this.directory.product)
35
+ .get(group.id);
36
+ if (!existingGroup) {
37
+ yield this.createGroup(group);
38
+ }
39
+ else if ((0, utils_1.isGroupUpdated)(existingGroup, group, this.provider.groupFieldsToExcludeWhenCompare)) {
40
+ yield this.updateGroup(group);
41
+ }
42
+ }
43
+ // Store groups to compare and delete later
44
+ groupsFromProvider.push(...groups);
45
+ nextPageOption = metadata;
46
+ } while (nextPageOption && nextPageOption.hasNextPage);
47
+ // Delete users that are not in the directory anymore
48
+ const existingGroups = yield this.getAllExistingGroups();
49
+ const groupsToDelete = (0, utils_1.compareAndFindDeletedGroups)(existingGroups, groupsFromProvider);
50
+ yield this.deleteGroups(groupsToDelete);
51
+ });
52
+ }
53
+ // Get all the existing groups from the Jackson store
54
+ getAllExistingGroups() {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ const existingGroups = [];
57
+ const pageLimit = 500;
58
+ let pageOffset = 0;
59
+ while (true) {
60
+ const { data: groups } = yield this.groupController
61
+ .setTenantAndProduct(this.directory.tenant, this.directory.product)
62
+ .getAll({
63
+ directoryId: this.directory.id,
64
+ pageOffset,
65
+ pageLimit,
66
+ });
67
+ if (!groups || groups.length === 0) {
68
+ break;
69
+ }
70
+ existingGroups.push(...groups);
71
+ if (groups.length < pageLimit) {
72
+ break;
73
+ }
74
+ pageOffset += pageLimit;
75
+ }
76
+ return existingGroups;
77
+ });
78
+ }
79
+ createGroup(group) {
80
+ return __awaiter(this, void 0, void 0, function* () {
81
+ yield this.handleRequest({
82
+ method: 'POST',
83
+ body: (0, utils_1.toGroupSCIMPayload)(group),
84
+ resourceId: undefined,
85
+ });
86
+ });
87
+ }
88
+ updateGroup(group) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ yield this.handleRequest({
91
+ method: 'PUT',
92
+ body: (0, utils_1.toGroupSCIMPayload)(group),
93
+ resourceId: group.id,
94
+ });
95
+ });
96
+ }
97
+ deleteGroups(groups) {
98
+ return __awaiter(this, void 0, void 0, function* () {
99
+ for (const group of groups) {
100
+ yield this.handleRequest({
101
+ method: 'DELETE',
102
+ body: (0, utils_1.toGroupSCIMPayload)(group),
103
+ resourceId: group.id,
104
+ });
105
+ }
106
+ });
107
+ }
108
+ handleRequest(payload) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ const request = {
111
+ query: {},
112
+ body: payload.body,
113
+ resourceType: 'groups',
114
+ method: payload.method,
115
+ directoryId: this.directory.id,
116
+ apiSecret: this.directory.scim.secret,
117
+ resourceId: payload.resourceId,
118
+ };
119
+ yield this.requestHandler.handle(request, this.callback);
120
+ });
121
+ }
122
+ }
123
+ exports.SyncGroups = SyncGroups;
124
+ //# sourceMappingURL=syncGroups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncGroups.js","sourceRoot":"","sources":["../../../src/directory-sync/non-scim/syncGroups.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Directory, User, IUsers, IRequestHandler, DirectorySyncRequest, EventCallback, IDirectoryProvider } from '../../typings';
2
+ interface SyncUserParams {
3
+ directory: Directory;
4
+ userController: IUsers;
5
+ callback: EventCallback;
6
+ provider: IDirectoryProvider;
7
+ requestHandler: IRequestHandler;
8
+ }
9
+ type HandleRequestParams = Pick<DirectorySyncRequest, 'method' | 'body' | 'resourceId'>;
10
+ export declare class SyncUsers {
11
+ private directory;
12
+ private userController;
13
+ private callback;
14
+ private provider;
15
+ private requestHandler;
16
+ constructor({ directory, userController, callback, provider, requestHandler }: SyncUserParams);
17
+ sync(): Promise<void>;
18
+ getAllExistingUsers(): Promise<User[]>;
19
+ createUser(user: User): Promise<void>;
20
+ updateUser(user: User): Promise<void>;
21
+ deleteUsers(users: User[]): Promise<void>;
22
+ handleRequest(payload: HandleRequestParams): Promise<void>;
23
+ }
24
+ export {};
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SyncUsers = void 0;
13
+ const utils_1 = require("./utils");
14
+ class SyncUsers {
15
+ constructor({ directory, userController, callback, provider, requestHandler }) {
16
+ this.callback = callback;
17
+ this.provider = provider;
18
+ this.directory = directory;
19
+ this.requestHandler = requestHandler;
20
+ this.userController = userController;
21
+ }
22
+ sync() {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ const usersFromProvider = [];
25
+ let nextPageOption = null;
26
+ do {
27
+ const { data: users, metadata } = yield this.provider.getUsers(this.directory, nextPageOption);
28
+ if (users.length === 0) {
29
+ break;
30
+ }
31
+ // Create or update users
32
+ for (const user of users) {
33
+ const { data: existingUser } = yield this.userController
34
+ .setTenantAndProduct(this.directory.tenant, this.directory.product)
35
+ .get(user.id);
36
+ if (!existingUser) {
37
+ yield this.createUser(user);
38
+ }
39
+ else if ((0, utils_1.isUserUpdated)(existingUser, user, this.provider.userFieldsToExcludeWhenCompare)) {
40
+ yield this.updateUser(user);
41
+ }
42
+ }
43
+ // Store users to compare and delete later
44
+ usersFromProvider.push(...users);
45
+ nextPageOption = metadata;
46
+ } while (nextPageOption && nextPageOption.hasNextPage);
47
+ // Delete users that are not in the directory anymore
48
+ const existingUsers = yield this.getAllExistingUsers();
49
+ const usersToDelete = (0, utils_1.compareAndFindDeletedUsers)(existingUsers, usersFromProvider);
50
+ yield this.deleteUsers(usersToDelete);
51
+ });
52
+ }
53
+ // Get all the existing users from the Jackson store
54
+ getAllExistingUsers() {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ const existingUsers = [];
57
+ const pageLimit = 500;
58
+ let pageOffset = 0;
59
+ while (true) {
60
+ const { data: users } = yield this.userController
61
+ .setTenantAndProduct(this.directory.tenant, this.directory.product)
62
+ .getAll({
63
+ directoryId: this.directory.id,
64
+ pageOffset,
65
+ pageLimit,
66
+ });
67
+ if (!users || users.length === 0) {
68
+ break;
69
+ }
70
+ existingUsers.push(...users);
71
+ if (users.length < pageLimit) {
72
+ break;
73
+ }
74
+ pageOffset += pageLimit;
75
+ }
76
+ return existingUsers;
77
+ });
78
+ }
79
+ createUser(user) {
80
+ return __awaiter(this, void 0, void 0, function* () {
81
+ yield this.handleRequest({
82
+ method: 'POST',
83
+ body: (0, utils_1.toUserSCIMPayload)(user),
84
+ resourceId: undefined,
85
+ });
86
+ });
87
+ }
88
+ updateUser(user) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ yield this.handleRequest({
91
+ method: 'PUT',
92
+ body: (0, utils_1.toUserSCIMPayload)(user),
93
+ resourceId: user.id,
94
+ });
95
+ });
96
+ }
97
+ deleteUsers(users) {
98
+ return __awaiter(this, void 0, void 0, function* () {
99
+ for (const user of users) {
100
+ yield this.handleRequest({
101
+ method: 'DELETE',
102
+ body: (0, utils_1.toUserSCIMPayload)(user),
103
+ resourceId: user.id,
104
+ });
105
+ }
106
+ });
107
+ }
108
+ handleRequest(payload) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ const request = {
111
+ query: {},
112
+ body: payload.body,
113
+ resourceType: 'users',
114
+ method: payload.method,
115
+ directoryId: this.directory.id,
116
+ apiSecret: this.directory.scim.secret,
117
+ resourceId: payload.resourceId,
118
+ };
119
+ yield this.requestHandler.handle(request, this.callback);
120
+ });
121
+ }
122
+ }
123
+ exports.SyncUsers = SyncUsers;
124
+ //# sourceMappingURL=syncUsers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncUsers.js","sourceRoot":"","sources":["../../../src/directory-sync/non-scim/syncUsers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { User, Group } from '../../typings';
2
+ export declare const toUserSCIMPayload: (user: User) => {
3
+ userName: string;
4
+ name: {
5
+ givenName: string;
6
+ familyName: string;
7
+ };
8
+ emails: {
9
+ primary: boolean;
10
+ value: string;
11
+ type: string;
12
+ }[];
13
+ userId: string;
14
+ active: boolean;
15
+ rawAttributes: any;
16
+ };
17
+ export declare const toGroupSCIMPayload: (group: Group) => {
18
+ displayName: string;
19
+ groupId: string;
20
+ rawAttributes: any;
21
+ };
22
+ export declare const toGroupMembershipSCIMPayload: (memberIds: string[], operation: 'add' | 'remove') => {
23
+ Operations: {
24
+ op: "add" | "remove";
25
+ path: string;
26
+ value: {
27
+ value: string;
28
+ }[];
29
+ }[];
30
+ };
31
+ export declare const isUserUpdated: (existingUser: User, userFromProvider: User, ignoreFields: string[] | undefined) => boolean;
32
+ export declare const isGroupUpdated: (existingGroup: Group, groupFromProvider: Group, ignoreFields: string[] | undefined) => boolean;
33
+ export declare const compareAndFindDeletedGroups: (existingGroups: Group[] | null, groups: Group[]) => Group[];
34
+ export declare const compareAndFindDeletedUsers: (existingUsers: User[] | null, users: User[]) => User[];
35
+ export declare const compareAndFindDeletedMembers: (idsFromDB: string[], idsFromProvider: string[]) => string[];
36
+ export declare const compareAndFindNewMembers: (idsFromDB: string[], idsFromProvider: string[]) => string[];
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.compareAndFindNewMembers = exports.compareAndFindDeletedMembers = exports.compareAndFindDeletedUsers = exports.compareAndFindDeletedGroups = exports.isGroupUpdated = exports.isUserUpdated = exports.toGroupMembershipSCIMPayload = exports.toGroupSCIMPayload = exports.toUserSCIMPayload = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ const toUserSCIMPayload = (user) => {
10
+ return {
11
+ userName: user.email,
12
+ name: {
13
+ givenName: user.first_name,
14
+ familyName: user.last_name,
15
+ },
16
+ emails: [
17
+ {
18
+ primary: true,
19
+ value: user.email,
20
+ type: 'work',
21
+ },
22
+ ],
23
+ userId: user.id,
24
+ active: user.active,
25
+ rawAttributes: user.raw,
26
+ };
27
+ };
28
+ exports.toUserSCIMPayload = toUserSCIMPayload;
29
+ const toGroupSCIMPayload = (group) => {
30
+ return {
31
+ displayName: group.name,
32
+ groupId: group.id,
33
+ rawAttributes: group.raw,
34
+ };
35
+ };
36
+ exports.toGroupSCIMPayload = toGroupSCIMPayload;
37
+ const toGroupMembershipSCIMPayload = (memberIds, operation) => {
38
+ const memberValues = memberIds.map((memberId) => {
39
+ return {
40
+ value: memberId,
41
+ };
42
+ });
43
+ return {
44
+ Operations: [
45
+ {
46
+ op: operation,
47
+ path: 'members',
48
+ value: memberValues,
49
+ },
50
+ ],
51
+ };
52
+ };
53
+ exports.toGroupMembershipSCIMPayload = toGroupMembershipSCIMPayload;
54
+ const isUserUpdated = (existingUser, userFromProvider, ignoreFields) => {
55
+ const copyOfExistingUser = lodash_1.default.cloneDeep(existingUser);
56
+ const copyOfUserFromProvider = lodash_1.default.cloneDeep(userFromProvider);
57
+ if (ignoreFields && ignoreFields.length > 0) {
58
+ ignoreFields.forEach((field) => {
59
+ lodash_1.default.unset(copyOfExistingUser.raw, field);
60
+ lodash_1.default.unset(copyOfUserFromProvider.raw, field);
61
+ });
62
+ }
63
+ return getObjectHash(copyOfExistingUser.raw) !== getObjectHash(copyOfUserFromProvider.raw);
64
+ };
65
+ exports.isUserUpdated = isUserUpdated;
66
+ const isGroupUpdated = (existingGroup, groupFromProvider, ignoreFields) => {
67
+ const copyOfExistingGroup = lodash_1.default.cloneDeep(existingGroup);
68
+ const copyOfGroupFromProvider = lodash_1.default.cloneDeep(groupFromProvider);
69
+ if (ignoreFields && ignoreFields.length > 0) {
70
+ ignoreFields.forEach((field) => {
71
+ lodash_1.default.unset(copyOfExistingGroup.raw, field);
72
+ lodash_1.default.unset(copyOfGroupFromProvider.raw, field);
73
+ });
74
+ }
75
+ return getObjectHash(copyOfExistingGroup.raw) !== getObjectHash(copyOfGroupFromProvider.raw);
76
+ };
77
+ exports.isGroupUpdated = isGroupUpdated;
78
+ const compareAndFindDeletedGroups = (existingGroups, groups) => {
79
+ if (!existingGroups || existingGroups.length === 0) {
80
+ return [];
81
+ }
82
+ const groupsToDelete = existingGroups.filter((existingGroup) => {
83
+ return !groups.some((group) => group.id === existingGroup.id);
84
+ });
85
+ return groupsToDelete;
86
+ };
87
+ exports.compareAndFindDeletedGroups = compareAndFindDeletedGroups;
88
+ const compareAndFindDeletedUsers = (existingUsers, users) => {
89
+ if (!existingUsers || existingUsers.length === 0) {
90
+ return [];
91
+ }
92
+ const usersToDelete = existingUsers.filter((existingUser) => {
93
+ return !users.some((user) => user.id === existingUser.id);
94
+ });
95
+ return usersToDelete;
96
+ };
97
+ exports.compareAndFindDeletedUsers = compareAndFindDeletedUsers;
98
+ const compareAndFindDeletedMembers = (idsFromDB, idsFromProvider) => {
99
+ return idsFromDB.filter((userId) => !idsFromProvider.includes(userId));
100
+ };
101
+ exports.compareAndFindDeletedMembers = compareAndFindDeletedMembers;
102
+ const compareAndFindNewMembers = (idsFromDB, idsFromProvider) => {
103
+ return idsFromProvider.filter((userId) => !idsFromDB.includes(userId));
104
+ };
105
+ exports.compareAndFindNewMembers = compareAndFindNewMembers;
106
+ const normalizeObject = (obj) => {
107
+ if (lodash_1.default.isArray(obj)) {
108
+ return obj.map(normalizeObject);
109
+ }
110
+ else if (lodash_1.default.isObject(obj)) {
111
+ const sortedKeys = lodash_1.default.sortBy(Object.keys(obj));
112
+ return lodash_1.default.fromPairs(sortedKeys.map((key) => [key, normalizeObject(obj[key])]));
113
+ }
114
+ else {
115
+ return obj;
116
+ }
117
+ };
118
+ const getObjectHash = (obj) => {
119
+ const normalizedObj = normalizeObject(obj);
120
+ const hash = crypto_1.default.createHash('sha1');
121
+ hash.update(JSON.stringify(normalizedObj));
122
+ return hash.digest('hex');
123
+ };
124
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/directory-sync/non-scim/utils.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Storable, DatabaseStore } from '../typings';
1
+ import type { Storable, DatabaseStore } from '../../typings';
2
2
  export declare class Base {
3
3
  protected db: DatabaseStore;
4
4
  protected tenant: null | string;
@@ -8,9 +8,5 @@ export declare class Base {
8
8
  db: DatabaseStore;
9
9
  });
10
10
  store(type: 'groups' | 'members' | 'users' | 'logs'): Storable;
11
- setTenant(tenant: string): this;
12
- setProduct(product: string): this;
13
11
  setTenantAndProduct(tenant: string, product: string): this;
14
- with(tenant: string, product: string): this;
15
- createId(): string;
16
12
  }