@boxyhq/saml-jackson 1.9.11 → 1.10.0

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 (104) hide show
  1. package/dist/controller/utils.d.ts +1 -0
  2. package/dist/controller/utils.js +2 -1
  3. package/dist/controller/utils.js.map +1 -1
  4. package/dist/db/planetscale/entity/JacksonIndex.js +2 -3
  5. package/dist/db/planetscale/entity/JacksonIndex.js.map +1 -1
  6. package/dist/db/planetscale/entity/JacksonStore.js +2 -3
  7. package/dist/db/planetscale/entity/JacksonStore.js.map +1 -1
  8. package/dist/db/planetscale/entity/JacksonTTL.js +2 -3
  9. package/dist/db/planetscale/entity/JacksonTTL.js.map +1 -1
  10. package/dist/db/redis.js +16 -26
  11. package/dist/db/redis.js.map +1 -1
  12. package/dist/db/sql/entity/JacksonIndex.js +2 -3
  13. package/dist/db/sql/entity/JacksonIndex.js.map +1 -1
  14. package/dist/db/sql/entity/JacksonStore.js +2 -3
  15. package/dist/db/sql/entity/JacksonStore.js.map +1 -1
  16. package/dist/db/sql/entity/JacksonTTL.js +2 -3
  17. package/dist/db/sql/entity/JacksonTTL.js.map +1 -1
  18. package/dist/db/sql/mariadb/entity/JacksonIndex.js +2 -3
  19. package/dist/db/sql/mariadb/entity/JacksonIndex.js.map +1 -1
  20. package/dist/db/sql/mariadb/entity/JacksonStore.js +2 -3
  21. package/dist/db/sql/mariadb/entity/JacksonStore.js.map +1 -1
  22. package/dist/db/sql/mariadb/entity/JacksonTTL.js +2 -3
  23. package/dist/db/sql/mariadb/entity/JacksonTTL.js.map +1 -1
  24. package/dist/db/sql/mssql/entity/JacksonIndex.js +2 -3
  25. package/dist/db/sql/mssql/entity/JacksonIndex.js.map +1 -1
  26. package/dist/db/sql/mssql/entity/JacksonStore.js +2 -3
  27. package/dist/db/sql/mssql/entity/JacksonStore.js.map +1 -1
  28. package/dist/db/sql/mssql/entity/JacksonTTL.js +2 -3
  29. package/dist/db/sql/mssql/entity/JacksonTTL.js.map +1 -1
  30. package/dist/directory-sync/index.d.ts +10 -8
  31. package/dist/directory-sync/index.js +22 -12
  32. package/dist/directory-sync/index.js.map +1 -1
  33. package/dist/directory-sync/non-scim/google/api.d.ts +48 -0
  34. package/dist/directory-sync/non-scim/google/api.js +147 -0
  35. package/dist/directory-sync/non-scim/google/api.js.map +1 -0
  36. package/dist/directory-sync/non-scim/google/index.d.ts +12 -0
  37. package/dist/directory-sync/non-scim/google/index.js +14 -0
  38. package/dist/directory-sync/non-scim/google/index.js.map +1 -0
  39. package/dist/directory-sync/non-scim/google/oauth.d.ts +27 -0
  40. package/dist/directory-sync/non-scim/google/oauth.js +109 -0
  41. package/dist/directory-sync/non-scim/google/oauth.js.map +1 -0
  42. package/dist/directory-sync/non-scim/index.d.ts +10 -0
  43. package/dist/directory-sync/non-scim/index.js +51 -0
  44. package/dist/directory-sync/non-scim/index.js.map +1 -0
  45. package/dist/directory-sync/non-scim/syncGroupMembers.d.ts +23 -0
  46. package/dist/directory-sync/non-scim/syncGroupMembers.js +112 -0
  47. package/dist/directory-sync/non-scim/syncGroupMembers.js.map +1 -0
  48. package/dist/directory-sync/non-scim/syncGroups.d.ts +24 -0
  49. package/dist/directory-sync/non-scim/syncGroups.js +124 -0
  50. package/dist/directory-sync/non-scim/syncGroups.js.map +1 -0
  51. package/dist/directory-sync/non-scim/syncUsers.d.ts +24 -0
  52. package/dist/directory-sync/non-scim/syncUsers.js +124 -0
  53. package/dist/directory-sync/non-scim/syncUsers.js.map +1 -0
  54. package/dist/directory-sync/non-scim/utils.d.ts +36 -0
  55. package/dist/directory-sync/non-scim/utils.js +124 -0
  56. package/dist/directory-sync/non-scim/utils.js.map +1 -0
  57. package/dist/directory-sync/{Base.d.ts → scim/Base.d.ts} +1 -5
  58. package/dist/directory-sync/{Base.js → scim/Base.js} +3 -17
  59. package/dist/directory-sync/scim/Base.js.map +1 -0
  60. package/dist/directory-sync/{DirectoryConfig.d.ts → scim/DirectoryConfig.d.ts} +21 -27
  61. package/dist/directory-sync/{DirectoryConfig.js → scim/DirectoryConfig.js} +76 -48
  62. package/dist/directory-sync/scim/DirectoryConfig.js.map +1 -0
  63. package/dist/directory-sync/{DirectoryGroups.d.ts → scim/DirectoryGroups.d.ts} +8 -6
  64. package/dist/directory-sync/{DirectoryGroups.js → scim/DirectoryGroups.js} +8 -12
  65. package/dist/directory-sync/scim/DirectoryGroups.js.map +1 -0
  66. package/dist/directory-sync/{DirectoryUsers.d.ts → scim/DirectoryUsers.d.ts} +7 -5
  67. package/dist/directory-sync/{DirectoryUsers.js → scim/DirectoryUsers.js} +4 -3
  68. package/dist/directory-sync/scim/DirectoryUsers.js.map +1 -0
  69. package/dist/directory-sync/scim/Groups.d.ts +38 -0
  70. package/dist/directory-sync/{Groups.js → scim/Groups.js} +38 -29
  71. package/dist/directory-sync/scim/Groups.js.map +1 -0
  72. package/dist/directory-sync/scim/Users.d.ts +32 -0
  73. package/dist/directory-sync/{Users.js → scim/Users.js} +27 -25
  74. package/dist/directory-sync/scim/Users.js.map +1 -0
  75. package/dist/directory-sync/{WebhookEventsLogger.d.ts → scim/WebhookEventsLogger.d.ts} +1 -1
  76. package/dist/directory-sync/{WebhookEventsLogger.js → scim/WebhookEventsLogger.js} +3 -1
  77. package/dist/directory-sync/scim/WebhookEventsLogger.js.map +1 -0
  78. package/dist/directory-sync/{events.d.ts → scim/events.d.ts} +5 -3
  79. package/dist/directory-sync/{events.js → scim/events.js} +6 -4
  80. package/dist/directory-sync/scim/events.js.map +1 -0
  81. package/dist/directory-sync/{transform.d.ts → scim/transform.d.ts} +1 -1
  82. package/dist/directory-sync/scim/transform.js.map +1 -0
  83. package/dist/directory-sync/scim/utils.d.ts +33 -0
  84. package/dist/directory-sync/{utils.js → scim/utils.js} +8 -3
  85. package/dist/directory-sync/scim/utils.js.map +1 -0
  86. package/dist/directory-sync/types.d.ts +65 -13
  87. package/dist/directory-sync/types.js +3 -2
  88. package/dist/directory-sync/types.js.map +1 -1
  89. package/dist/typings.d.ts +9 -0
  90. package/package.json +14 -11
  91. package/dist/directory-sync/Base.js.map +0 -1
  92. package/dist/directory-sync/DirectoryConfig.js.map +0 -1
  93. package/dist/directory-sync/DirectoryGroups.js.map +0 -1
  94. package/dist/directory-sync/DirectoryUsers.js.map +0 -1
  95. package/dist/directory-sync/Groups.d.ts +0 -48
  96. package/dist/directory-sync/Groups.js.map +0 -1
  97. package/dist/directory-sync/Users.d.ts +0 -49
  98. package/dist/directory-sync/Users.js.map +0 -1
  99. package/dist/directory-sync/WebhookEventsLogger.js.map +0 -1
  100. package/dist/directory-sync/events.js.map +0 -1
  101. package/dist/directory-sync/transform.js.map +0 -1
  102. package/dist/directory-sync/utils.d.ts +0 -33
  103. package/dist/directory-sync/utils.js.map +0 -1
  104. /package/dist/directory-sync/{transform.js → scim/transform.js} +0 -0
@@ -0,0 +1,48 @@
1
+ import { OAuth2Client } from 'google-auth-library';
2
+ import type { Directory, IDirectoryConfig, Group, GroupMember, IDirectoryProvider, JacksonOption, PaginationParams } from '../../../typings';
3
+ interface GoogleProviderParams {
4
+ opts: JacksonOption;
5
+ directories: IDirectoryConfig;
6
+ }
7
+ export declare class GoogleProvider implements IDirectoryProvider {
8
+ opts: JacksonOption;
9
+ directories: IDirectoryConfig;
10
+ groupFieldsToExcludeWhenCompare: string[];
11
+ userFieldsToExcludeWhenCompare: string[];
12
+ constructor({ directories, opts }: GoogleProviderParams);
13
+ createOAuth2Client(directory: Directory): OAuth2Client;
14
+ getDirectories(): Promise<Directory[]>;
15
+ getUsers(directory: Directory, options: PaginationParams | null): Promise<{
16
+ data: never[];
17
+ metadata: null;
18
+ } | {
19
+ data: {
20
+ id: string;
21
+ email: string;
22
+ first_name: string;
23
+ last_name: string;
24
+ active: boolean;
25
+ raw: import("googleapis").admin_directory_v1.Schema$User;
26
+ }[];
27
+ metadata: {
28
+ nextPageToken: string | null | undefined;
29
+ hasNextPage: boolean;
30
+ };
31
+ }>;
32
+ getGroups(directory: Directory, options: PaginationParams | null): Promise<{
33
+ data: never[];
34
+ metadata: null;
35
+ } | {
36
+ data: {
37
+ id: string;
38
+ name: string;
39
+ raw: import("googleapis").admin_directory_v1.Schema$Group;
40
+ }[];
41
+ metadata: {
42
+ pageToken: string;
43
+ hasNextPage: boolean;
44
+ };
45
+ }>;
46
+ getGroupMembers(directory: Directory, group: Group): Promise<GroupMember[]>;
47
+ }
48
+ export {};
@@ -0,0 +1,147 @@
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.GoogleProvider = void 0;
13
+ const googleapis_1 = require("googleapis");
14
+ const google_auth_library_1 = require("google-auth-library");
15
+ class GoogleProvider {
16
+ constructor({ directories, opts }) {
17
+ this.groupFieldsToExcludeWhenCompare = ['etag'];
18
+ this.userFieldsToExcludeWhenCompare = ['etag', 'lastLoginTime', 'thumbnailPhotoEtag'];
19
+ this.opts = opts;
20
+ this.directories = directories;
21
+ }
22
+ createOAuth2Client(directory) {
23
+ var _a;
24
+ const googleProvider = (_a = this.opts.dsync) === null || _a === void 0 ? void 0 : _a.providers.google;
25
+ const authClient = new google_auth_library_1.OAuth2Client(googleProvider === null || googleProvider === void 0 ? void 0 : googleProvider.clientId, googleProvider === null || googleProvider === void 0 ? void 0 : googleProvider.clientSecret, googleProvider === null || googleProvider === void 0 ? void 0 : googleProvider.callbackUrl);
26
+ authClient.setCredentials({
27
+ access_token: directory.google_access_token,
28
+ refresh_token: directory.google_refresh_token,
29
+ });
30
+ return authClient;
31
+ }
32
+ getDirectories() {
33
+ return __awaiter(this, void 0, void 0, function* () {
34
+ const { data: directories } = yield this.directories.getByProvider({
35
+ provider: 'google',
36
+ });
37
+ if (!directories || directories.length === 0) {
38
+ return [];
39
+ }
40
+ return directories.filter((directory) => {
41
+ return (directory.google_access_token && directory.google_refresh_token && directory.google_domain !== '');
42
+ });
43
+ });
44
+ }
45
+ getUsers(directory, options) {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ const query = {
48
+ maxResults: 200,
49
+ domain: directory.google_domain,
50
+ };
51
+ if (options === null || options === void 0 ? void 0 : options.pageToken) {
52
+ query['pageToken'] = options.pageToken;
53
+ }
54
+ const googleAdmin = googleapis_1.google.admin({ version: 'directory_v1', auth: this.createOAuth2Client(directory) });
55
+ const response = yield googleAdmin.users.list(query);
56
+ if (!response.data.users) {
57
+ return {
58
+ data: [],
59
+ metadata: null,
60
+ };
61
+ }
62
+ const users = response.data.users.map((user) => {
63
+ var _a, _b;
64
+ return {
65
+ id: user.id,
66
+ email: user.primaryEmail,
67
+ first_name: (_a = user.name) === null || _a === void 0 ? void 0 : _a.givenName,
68
+ last_name: (_b = user.name) === null || _b === void 0 ? void 0 : _b.familyName,
69
+ active: !user.suspended,
70
+ raw: user,
71
+ };
72
+ });
73
+ return {
74
+ data: users,
75
+ metadata: {
76
+ nextPageToken: response.data.nextPageToken,
77
+ hasNextPage: !!response.data.nextPageToken,
78
+ },
79
+ };
80
+ });
81
+ }
82
+ getGroups(directory, options) {
83
+ return __awaiter(this, void 0, void 0, function* () {
84
+ const googleAdmin = googleapis_1.google.admin({ version: 'directory_v1', auth: this.createOAuth2Client(directory) });
85
+ const query = {
86
+ maxResults: 200,
87
+ domain: directory.google_domain,
88
+ };
89
+ if (options === null || options === void 0 ? void 0 : options.pageToken) {
90
+ query['pageToken'] = options.pageToken;
91
+ }
92
+ const response = yield googleAdmin.groups.list(query);
93
+ if (!response.data.groups) {
94
+ return {
95
+ data: [],
96
+ metadata: null,
97
+ };
98
+ }
99
+ const groups = response.data.groups.map((group) => {
100
+ return {
101
+ id: group.id,
102
+ name: group.name,
103
+ raw: group,
104
+ };
105
+ });
106
+ return {
107
+ data: groups,
108
+ metadata: {
109
+ pageToken: response.data.nextPageToken,
110
+ hasNextPage: !!response.data.nextPageToken,
111
+ },
112
+ };
113
+ });
114
+ }
115
+ getGroupMembers(directory, group) {
116
+ return __awaiter(this, void 0, void 0, function* () {
117
+ const googleAdmin = googleapis_1.google.admin({ version: 'directory_v1', auth: this.createOAuth2Client(directory) });
118
+ const allMembers = [];
119
+ const query = {
120
+ maxResults: 200,
121
+ groupKey: group.id,
122
+ domain: directory.google_domain,
123
+ };
124
+ let nextPageToken = null;
125
+ do {
126
+ if (nextPageToken) {
127
+ query['pageToken'] = nextPageToken;
128
+ }
129
+ const response = yield googleAdmin.members.list(query);
130
+ if (!response.data.members) {
131
+ break;
132
+ }
133
+ const members = response.data.members.map((user) => {
134
+ return {
135
+ id: user.id,
136
+ raw: user,
137
+ };
138
+ });
139
+ allMembers.push(...members);
140
+ nextPageToken = response.data.nextPageToken;
141
+ } while (nextPageToken);
142
+ return allMembers;
143
+ });
144
+ }
145
+ }
146
+ exports.GoogleProvider = GoogleProvider;
147
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/directory-sync/non-scim/google/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { GoogleAuth } from './oauth';
2
+ import { GoogleProvider } from './api';
3
+ import type { IDirectoryConfig, JacksonOption } from '../../../typings';
4
+ interface NewGoogleProviderParams {
5
+ directories: IDirectoryConfig;
6
+ opts: JacksonOption;
7
+ }
8
+ export declare const newGoogleProvider: (params: NewGoogleProviderParams) => {
9
+ directory: GoogleProvider;
10
+ oauth: GoogleAuth;
11
+ };
12
+ export {};
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.newGoogleProvider = void 0;
4
+ const oauth_1 = require("./oauth");
5
+ const api_1 = require("./api");
6
+ const newGoogleProvider = (params) => {
7
+ const { directories, opts } = params;
8
+ return {
9
+ directory: new api_1.GoogleProvider({ opts, directories }),
10
+ oauth: new oauth_1.GoogleAuth({ opts, directories }),
11
+ };
12
+ };
13
+ exports.newGoogleProvider = newGoogleProvider;
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/directory-sync/non-scim/google/index.ts"],"names":[],"mappings":";;;AAAA,mCAAqC;AACrC,+BAAuC;AAQhC,MAAM,iBAAiB,GAAG,CAAC,MAA+B,EAAE,EAAE;IACnE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAErC,OAAO;QACL,SAAS,EAAE,IAAI,oBAAc,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QACpD,KAAK,EAAE,IAAI,kBAAU,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;KAC7C,CAAC;AACJ,CAAC,CAAC;AAPW,QAAA,iBAAiB,qBAO5B"}
@@ -0,0 +1,27 @@
1
+ import { OAuth2Client, Credentials } from 'google-auth-library';
2
+ import type { Directory, IDirectoryConfig, JacksonOption, Response } from '../../../typings';
3
+ interface GoogleAuthParams {
4
+ opts: JacksonOption;
5
+ directories: IDirectoryConfig;
6
+ }
7
+ export declare class GoogleAuth {
8
+ private opts;
9
+ private directories;
10
+ constructor({ directories, opts }: GoogleAuthParams);
11
+ createOAuth2Client(directory: Directory): OAuth2Client;
12
+ generateAuthorizationUrl(params: {
13
+ directoryId: string;
14
+ }): Promise<Response<{
15
+ authorizationUrl: string;
16
+ }>>;
17
+ getAccessToken(params: {
18
+ directoryId: string;
19
+ code: string;
20
+ }): Promise<Response<Credentials>>;
21
+ setToken(params: {
22
+ directoryId: string;
23
+ accessToken: Credentials['access_token'];
24
+ refreshToken: Credentials['refresh_token'];
25
+ }): Promise<Response<Directory>>;
26
+ }
27
+ export {};
@@ -0,0 +1,109 @@
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.GoogleAuth = void 0;
13
+ const google_auth_library_1 = require("google-auth-library");
14
+ const error_1 = require("../../../controller/error");
15
+ const scope = [
16
+ 'https://www.googleapis.com/auth/admin.directory.user.readonly',
17
+ 'https://www.googleapis.com/auth/admin.directory.group.readonly',
18
+ 'https://www.googleapis.com/auth/admin.directory.group.member.readonly',
19
+ ];
20
+ class GoogleAuth {
21
+ constructor({ directories, opts }) {
22
+ this.opts = opts;
23
+ this.directories = directories;
24
+ }
25
+ createOAuth2Client(directory) {
26
+ var _a;
27
+ const googleProvider = (_a = this.opts.dsync) === null || _a === void 0 ? void 0 : _a.providers.google;
28
+ const authClient = new google_auth_library_1.OAuth2Client(googleProvider === null || googleProvider === void 0 ? void 0 : googleProvider.clientId, googleProvider === null || googleProvider === void 0 ? void 0 : googleProvider.clientSecret, googleProvider === null || googleProvider === void 0 ? void 0 : googleProvider.callbackUrl);
29
+ authClient.setCredentials({
30
+ access_token: directory.google_access_token,
31
+ refresh_token: directory.google_refresh_token,
32
+ });
33
+ return authClient;
34
+ }
35
+ // Generate the Google authorization URL
36
+ generateAuthorizationUrl(params) {
37
+ return __awaiter(this, void 0, void 0, function* () {
38
+ const { directoryId } = params;
39
+ try {
40
+ const { data: directory, error } = yield this.directories.get(directoryId);
41
+ if (error) {
42
+ throw error;
43
+ }
44
+ if ((directory === null || directory === void 0 ? void 0 : directory.type) !== 'google') {
45
+ throw new error_1.JacksonError('Directory is not a Google Directory', 400);
46
+ }
47
+ const oauth2Client = this.createOAuth2Client(directory);
48
+ const authorizationUrl = oauth2Client.generateAuthUrl({
49
+ access_type: 'offline',
50
+ prompt: 'consent',
51
+ scope,
52
+ state: JSON.stringify({ directoryId }),
53
+ });
54
+ const data = {
55
+ authorizationUrl,
56
+ };
57
+ return { data, error: null };
58
+ }
59
+ catch (error) {
60
+ return (0, error_1.apiError)(error);
61
+ }
62
+ });
63
+ }
64
+ // Get the Google API access token from the authorization code
65
+ getAccessToken(params) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const { directoryId, code } = params;
68
+ try {
69
+ const { data: directory, error } = yield this.directories.get(directoryId);
70
+ if (error) {
71
+ throw error;
72
+ }
73
+ const oauth2Client = this.createOAuth2Client(directory);
74
+ const { tokens } = yield oauth2Client.getToken(code);
75
+ return { data: tokens, error: null };
76
+ }
77
+ catch (error) {
78
+ return (0, error_1.apiError)(error);
79
+ }
80
+ });
81
+ }
82
+ // Set the Google API access token and refresh token for the directory
83
+ setToken(params) {
84
+ return __awaiter(this, void 0, void 0, function* () {
85
+ const { directoryId, accessToken, refreshToken } = params;
86
+ try {
87
+ if (!accessToken) {
88
+ throw new error_1.JacksonError(`Access token is required`, 400);
89
+ }
90
+ if (!refreshToken) {
91
+ throw new error_1.JacksonError(`Refresh token is required`, 400);
92
+ }
93
+ const { data } = yield this.directories.update(directoryId, {
94
+ google_access_token: accessToken,
95
+ google_refresh_token: refreshToken,
96
+ });
97
+ if (!data) {
98
+ throw new error_1.JacksonError('Failed to update directory', 400);
99
+ }
100
+ return { data, error: null };
101
+ }
102
+ catch (error) {
103
+ return (0, error_1.apiError)(error);
104
+ }
105
+ });
106
+ }
107
+ }
108
+ exports.GoogleAuth = GoogleAuth;
109
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../../src/directory-sync/non-scim/google/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { IDirectoryConfig, IUsers, IGroups, IRequestHandler, JacksonOption, EventCallback } from '../../typings';
2
+ interface SyncParams {
3
+ userController: IUsers;
4
+ groupController: IGroups;
5
+ opts: JacksonOption;
6
+ directories: IDirectoryConfig;
7
+ requestHandler: IRequestHandler;
8
+ }
9
+ export declare const startSync: (params: SyncParams, callback: EventCallback) => Promise<void>;
10
+ export {};
@@ -0,0 +1,51 @@
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.startSync = void 0;
13
+ const google_1 = require("./google");
14
+ const syncUsers_1 = require("./syncUsers");
15
+ const syncGroups_1 = require("./syncGroups");
16
+ const syncGroupMembers_1 = require("./syncGroupMembers");
17
+ // Method to start the directory sync process
18
+ // This method will be called by the directory sync cron job
19
+ const startSync = (params, callback) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const { userController, groupController, opts, directories, requestHandler } = params;
21
+ const { directory: provider } = (0, google_1.newGoogleProvider)({ directories, opts });
22
+ const startTime = Date.now();
23
+ console.info('Starting the sync process');
24
+ const allDirectories = yield provider.getDirectories();
25
+ if (allDirectories.length === 0) {
26
+ console.info('No directories found. Skipping the sync process');
27
+ return;
28
+ }
29
+ try {
30
+ for (const directory of allDirectories) {
31
+ const params = {
32
+ directory,
33
+ userController,
34
+ groupController,
35
+ provider,
36
+ requestHandler,
37
+ callback,
38
+ };
39
+ yield new syncUsers_1.SyncUsers(params).sync();
40
+ yield new syncGroups_1.SyncGroups(params).sync();
41
+ yield new syncGroupMembers_1.SyncGroupMembers(params).sync();
42
+ }
43
+ }
44
+ catch (e) {
45
+ console.error(e);
46
+ }
47
+ const endTime = Date.now();
48
+ console.info(`Sync process completed in ${(endTime - startTime) / 1000} seconds`);
49
+ });
50
+ exports.startSync = startSync;
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/directory-sync/non-scim/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qCAA6C;AAS7C,2CAAwC;AACxC,6CAA0C;AAC1C,yDAAsD;AAUtD,6CAA6C;AAC7C,4DAA4D;AACrD,MAAM,SAAS,GAAG,CAAO,MAAkB,EAAE,QAAuB,EAAE,EAAE;IAC7E,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC;IAEtF,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAA,0BAAiB,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzE,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAE1C,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;IAEvD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;QAC/B,OAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAChE,OAAO;KACR;IAED,IAAI;QACF,KAAK,MAAM,SAAS,IAAI,cAAc,EAAE;YACtC,MAAM,MAAM,GAAG;gBACb,SAAS;gBACT,cAAc;gBACd,eAAe;gBACf,QAAQ;gBACR,cAAc;gBACd,QAAQ;aACT,CAAC;YAEF,MAAM,IAAI,qBAAS,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,uBAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,mCAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;SAC3C;KACF;IAAC,OAAO,CAAM,EAAE;QACf,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAClB;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE3B,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC;AACpF,CAAC,CAAA,CAAC;AAtCW,QAAA,SAAS,aAsCpB"}
@@ -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 {};