@boxyhq/saml-jackson 0.3.6-beta.659 → 0.3.7

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.
@@ -18,25 +18,10 @@ export declare class APIController implements IAPIController {
18
18
  * consumes:
19
19
  * - application/x-www-form-urlencoded
20
20
  * parameters:
21
- * - name: name
22
- * description: Name/identifier for the config
23
- * type: string
24
- * in: formData
25
- * required: true
26
- * example: cal-saml-config
27
- * - name: description
28
- * description: A short description for the config not more than 50 characters
29
- * type: string
30
- * in: formData
31
- * required: true
32
- * example: SAML login for cal.com app
33
21
  * - name: encodedRawMetadata
34
22
  * description: Base64 encoding of the XML metadata
35
23
  * in: formData
36
- * type: string
37
- * - name: rawMetadata
38
- * description: Raw XML metadata
39
- * in: formData
24
+ * required: true
40
25
  * type: string
41
26
  * - name: defaultRedirectUrl
42
27
  * description: The redirect URL to use in the IdP login flow
@@ -82,81 +67,6 @@ export declare class APIController implements IAPIController {
82
67
  * description: Unauthorized
83
68
  */
84
69
  config(body: IdPConfig): Promise<OAuth>;
85
- /**
86
- * @swagger
87
- *
88
- * /api/v1/saml/config:
89
- * patch:
90
- * summary: Update SAML configuration
91
- * operationId: update-saml-config
92
- * tags: [SAML Config]
93
- * consumes:
94
- * - application/json
95
- * - application/x-www-form-urlencoded
96
- * parameters:
97
- * - name: clientID
98
- * description: Client ID for the config
99
- * type: string
100
- * in: formData
101
- * required: true
102
- * - name: clientSecret
103
- * description: Client Secret for the config
104
- * type: string
105
- * in: formData
106
- * required: true
107
- * - name: name
108
- * description: Name/identifier for the config
109
- * type: string
110
- * in: formData
111
- * required: true
112
- * example: cal-saml-config
113
- * - name: description
114
- * description: A short description for the config not more than 50 characters
115
- * type: string
116
- * in: formData
117
- * required: true
118
- * example: SAML login for cal.com app
119
- * - name: encodedRawMetadata
120
- * description: Base64 encoding of the XML metadata
121
- * in: formData
122
- * type: string
123
- * - name: rawMetadata
124
- * description: Raw XML metadata
125
- * in: formData
126
- * type: string
127
- * - name: defaultRedirectUrl
128
- * description: The redirect URL to use in the IdP login flow
129
- * in: formData
130
- * required: true
131
- * type: string
132
- * example: http://localhost:3000/login/saml
133
- * - name: redirectUrl
134
- * description: JSON encoded array containing a list of allowed redirect URLs
135
- * in: formData
136
- * required: true
137
- * type: string
138
- * example: '["http://localhost:3000/*"]'
139
- * - name: tenant
140
- * description: Tenant
141
- * in: formData
142
- * required: true
143
- * type: string
144
- * example: boxyhq.com
145
- * - name: product
146
- * description: Product
147
- * in: formData
148
- * required: true
149
- * type: string
150
- * example: demo
151
- * responses:
152
- * 204:
153
- * description: Success
154
- * 400:
155
- * description: Please provide clientID | Please provide clientSecret | clientSecret mismatch | Tenant/Product config mismatch with IdP metadata
156
- * 401:
157
- * description: Unauthorized
158
- */
159
- updateConfig(body: any): Promise<void>;
160
70
  /**
161
71
  * @swagger
162
72
  *
@@ -186,35 +96,11 @@ export declare class APIController implements IAPIController {
186
96
  * description: Success
187
97
  * schema:
188
98
  * type: object
99
+ * properties:
100
+ * provider:
101
+ * type: string
189
102
  * example:
190
- * {
191
- * "config": {
192
- * "idpMetadata": {
193
- * "sso": {
194
- * "postUrl": "https://dev-20901260.okta.com/app/dev-20901260_jacksonnext_1/xxxxxxxxxxxxx/sso/saml",
195
- * "redirectUrl": "https://dev-20901260.okta.com/app/dev-20901260_jacksonnext_1/xxxxxxxxxxxxx/sso/saml"
196
- * },
197
- * "entityID": "http://www.okta.com/xxxxxxxxxxxxx",
198
- * "thumbprint": "Eo+eUi3UM3XIMkFFtdVK3yJ5vO9f7YZdasdasdad",
199
- * "loginType": "idp",
200
- * "provider": "okta.com"
201
- * },
202
- * "defaultRedirectUrl": "https://hoppscotch.io/",
203
- * "redirectUrl": ["https://hoppscotch.io/"],
204
- * "tenant": "hoppscotch.io",
205
- * "product": "API Engine",
206
- * "name": "Hoppscotch-SP",
207
- * "description": "SP for hoppscotch.io",
208
- * "clientID": "Xq8AJt3yYAxmXizsCWmUBDRiVP1iTC8Y/otnvFIMitk",
209
- * "clientSecret": "00e3e11a3426f97d8000000738300009130cd45419c5943",
210
- * "certs": {
211
- * "publicKey": "-----BEGIN CERTIFICATE-----.......-----END CERTIFICATE-----",
212
- * "privateKey": "-----BEGIN PRIVATE KEY-----......-----END PRIVATE KEY-----"
213
- * }
214
- * }
215
- * }
216
- * '400':
217
- * description: Please provide `clientID` or `tenant`/`product`.
103
+ * type: accounts.google.com
218
104
  * '401':
219
105
  * description: Unauthorized
220
106
  */
@@ -222,7 +108,7 @@ export declare class APIController implements IAPIController {
222
108
  clientID: string;
223
109
  tenant: string;
224
110
  product: string;
225
- }): Promise<any>;
111
+ }): Promise<Partial<OAuth>>;
226
112
  /**
227
113
  * @swagger
228
114
  * /api/v1/saml/config:
@@ -27,17 +27,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
27
27
  step((generator = generator.apply(thisArg, _arguments || [])).next());
28
28
  });
29
29
  };
30
- var __rest = (this && this.__rest) || function (s, e) {
31
- var t = {};
32
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
33
- t[p] = s[p];
34
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
35
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
36
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
37
- t[p[i]] = s[p[i]];
38
- }
39
- return t;
40
- };
41
30
  var __importDefault = (this && this.__importDefault) || function (mod) {
42
31
  return (mod && mod.__esModule) ? mod : { "default": mod };
43
32
  };
@@ -54,7 +43,7 @@ class APIController {
54
43
  this.configStore = configStore;
55
44
  }
56
45
  _validateIdPConfig(body) {
57
- const { encodedRawMetadata, rawMetadata, defaultRedirectUrl, redirectUrl, tenant, product, name } = body;
46
+ const { encodedRawMetadata, rawMetadata, defaultRedirectUrl, redirectUrl, tenant, product } = body;
58
47
  if (!rawMetadata && !encodedRawMetadata) {
59
48
  throw new error_1.JacksonError('Please provide rawMetadata or encodedRawMetadata', 400);
60
49
  }
@@ -70,9 +59,6 @@ class APIController {
70
59
  if (!product) {
71
60
  throw new error_1.JacksonError('Please provide product', 400);
72
61
  }
73
- if (!name) {
74
- throw new error_1.JacksonError('Please provide a friendly name', 400);
75
- }
76
62
  }
77
63
  /**
78
64
  * @swagger
@@ -87,25 +73,10 @@ class APIController {
87
73
  * consumes:
88
74
  * - application/x-www-form-urlencoded
89
75
  * parameters:
90
- * - name: name
91
- * description: Name/identifier for the config
92
- * type: string
93
- * in: formData
94
- * required: true
95
- * example: cal-saml-config
96
- * - name: description
97
- * description: A short description for the config not more than 50 characters
98
- * type: string
99
- * in: formData
100
- * required: true
101
- * example: SAML login for cal.com app
102
76
  * - name: encodedRawMetadata
103
77
  * description: Base64 encoding of the XML metadata
104
78
  * in: formData
105
- * type: string
106
- * - name: rawMetadata
107
- * description: Raw XML metadata
108
- * in: formData
79
+ * required: true
109
80
  * type: string
110
81
  * - name: defaultRedirectUrl
111
82
  * description: The redirect URL to use in the IdP login flow
@@ -152,7 +123,7 @@ class APIController {
152
123
  */
153
124
  config(body) {
154
125
  return __awaiter(this, void 0, void 0, function* () {
155
- const { encodedRawMetadata, rawMetadata, defaultRedirectUrl, redirectUrl, tenant, product, name, description, } = body;
126
+ const { encodedRawMetadata, rawMetadata, defaultRedirectUrl, redirectUrl, tenant, product } = body;
156
127
  this._validateIdPConfig(body);
157
128
  let metaData = rawMetadata;
158
129
  if (encodedRawMetadata) {
@@ -184,8 +155,6 @@ class APIController {
184
155
  redirectUrl: JSON.parse(redirectUrl),
185
156
  tenant,
186
157
  product,
187
- name,
188
- description,
189
158
  clientID,
190
159
  clientSecret,
191
160
  certs,
@@ -205,128 +174,6 @@ class APIController {
205
174
  };
206
175
  });
207
176
  }
208
- /**
209
- * @swagger
210
- *
211
- * /api/v1/saml/config:
212
- * patch:
213
- * summary: Update SAML configuration
214
- * operationId: update-saml-config
215
- * tags: [SAML Config]
216
- * consumes:
217
- * - application/json
218
- * - application/x-www-form-urlencoded
219
- * parameters:
220
- * - name: clientID
221
- * description: Client ID for the config
222
- * type: string
223
- * in: formData
224
- * required: true
225
- * - name: clientSecret
226
- * description: Client Secret for the config
227
- * type: string
228
- * in: formData
229
- * required: true
230
- * - name: name
231
- * description: Name/identifier for the config
232
- * type: string
233
- * in: formData
234
- * required: true
235
- * example: cal-saml-config
236
- * - name: description
237
- * description: A short description for the config not more than 50 characters
238
- * type: string
239
- * in: formData
240
- * required: true
241
- * example: SAML login for cal.com app
242
- * - name: encodedRawMetadata
243
- * description: Base64 encoding of the XML metadata
244
- * in: formData
245
- * type: string
246
- * - name: rawMetadata
247
- * description: Raw XML metadata
248
- * in: formData
249
- * type: string
250
- * - name: defaultRedirectUrl
251
- * description: The redirect URL to use in the IdP login flow
252
- * in: formData
253
- * required: true
254
- * type: string
255
- * example: http://localhost:3000/login/saml
256
- * - name: redirectUrl
257
- * description: JSON encoded array containing a list of allowed redirect URLs
258
- * in: formData
259
- * required: true
260
- * type: string
261
- * example: '["http://localhost:3000/*"]'
262
- * - name: tenant
263
- * description: Tenant
264
- * in: formData
265
- * required: true
266
- * type: string
267
- * example: boxyhq.com
268
- * - name: product
269
- * description: Product
270
- * in: formData
271
- * required: true
272
- * type: string
273
- * example: demo
274
- * responses:
275
- * 204:
276
- * description: Success
277
- * 400:
278
- * description: Please provide clientID | Please provide clientSecret | clientSecret mismatch | Tenant/Product config mismatch with IdP metadata
279
- * 401:
280
- * description: Unauthorized
281
- */
282
- updateConfig(body) {
283
- var _a;
284
- return __awaiter(this, void 0, void 0, function* () {
285
- const { encodedRawMetadata, // could be empty
286
- rawMetadata, // could be empty
287
- defaultRedirectUrl, redirectUrl, name, description } = body, clientInfo = __rest(body, ["encodedRawMetadata", "rawMetadata", "defaultRedirectUrl", "redirectUrl", "name", "description"]);
288
- if (!(clientInfo === null || clientInfo === void 0 ? void 0 : clientInfo.clientID)) {
289
- throw new error_1.JacksonError('Please provide clientID', 400);
290
- }
291
- if (!(clientInfo === null || clientInfo === void 0 ? void 0 : clientInfo.clientSecret)) {
292
- throw new error_1.JacksonError('Please provide clientSecret', 400);
293
- }
294
- const _currentConfig = (_a = (yield this.getConfig(clientInfo))) === null || _a === void 0 ? void 0 : _a.config;
295
- if (_currentConfig.clientSecret !== (clientInfo === null || clientInfo === void 0 ? void 0 : clientInfo.clientSecret)) {
296
- throw new error_1.JacksonError('clientSecret mismatch', 400);
297
- }
298
- let metaData = rawMetadata;
299
- if (encodedRawMetadata) {
300
- metaData = Buffer.from(encodedRawMetadata, 'base64').toString();
301
- }
302
- let newMetadata;
303
- if (metaData) {
304
- newMetadata = yield saml_1.default.parseMetadataAsync(metaData);
305
- // extract provider
306
- let providerName = extractHostName(newMetadata.entityID);
307
- if (!providerName) {
308
- providerName = extractHostName(newMetadata.sso.redirectUrl || newMetadata.sso.postUrl);
309
- }
310
- newMetadata.provider = providerName ? providerName : 'Unknown';
311
- }
312
- if (newMetadata) {
313
- // check if clientID matches with new metadata payload
314
- const clientID = dbutils.keyDigest(dbutils.keyFromParts(clientInfo.tenant, clientInfo.product, newMetadata.entityID));
315
- if (clientID !== (clientInfo === null || clientInfo === void 0 ? void 0 : clientInfo.clientID)) {
316
- throw new error_1.JacksonError('Tenant/Product config mismatch with IdP metadata', 400);
317
- }
318
- }
319
- yield this.configStore.put(clientInfo === null || clientInfo === void 0 ? void 0 : clientInfo.clientID, Object.assign(Object.assign({}, _currentConfig), { name: name ? name : _currentConfig.name, description: description ? description : _currentConfig.description, idpMetadata: newMetadata ? newMetadata : _currentConfig.idpMetadata, defaultRedirectUrl: defaultRedirectUrl ? defaultRedirectUrl : _currentConfig.defaultRedirectUrl, redirectUrl: redirectUrl ? JSON.parse(redirectUrl) : _currentConfig.redirectUrl }), {
320
- // secondary index on entityID
321
- name: utils_1.IndexNames.EntityID,
322
- value: _currentConfig.idpMetadata.entityID,
323
- }, {
324
- // secondary index on tenant + product
325
- name: utils_1.IndexNames.TenantProduct,
326
- value: dbutils.keyFromParts(_currentConfig.tenant, _currentConfig.product),
327
- });
328
- });
329
- }
330
177
  /**
331
178
  * @swagger
332
179
  *
@@ -356,35 +203,11 @@ class APIController {
356
203
  * description: Success
357
204
  * schema:
358
205
  * type: object
206
+ * properties:
207
+ * provider:
208
+ * type: string
359
209
  * example:
360
- * {
361
- * "config": {
362
- * "idpMetadata": {
363
- * "sso": {
364
- * "postUrl": "https://dev-20901260.okta.com/app/dev-20901260_jacksonnext_1/xxxxxxxxxxxxx/sso/saml",
365
- * "redirectUrl": "https://dev-20901260.okta.com/app/dev-20901260_jacksonnext_1/xxxxxxxxxxxxx/sso/saml"
366
- * },
367
- * "entityID": "http://www.okta.com/xxxxxxxxxxxxx",
368
- * "thumbprint": "Eo+eUi3UM3XIMkFFtdVK3yJ5vO9f7YZdasdasdad",
369
- * "loginType": "idp",
370
- * "provider": "okta.com"
371
- * },
372
- * "defaultRedirectUrl": "https://hoppscotch.io/",
373
- * "redirectUrl": ["https://hoppscotch.io/"],
374
- * "tenant": "hoppscotch.io",
375
- * "product": "API Engine",
376
- * "name": "Hoppscotch-SP",
377
- * "description": "SP for hoppscotch.io",
378
- * "clientID": "Xq8AJt3yYAxmXizsCWmUBDRiVP1iTC8Y/otnvFIMitk",
379
- * "clientSecret": "00e3e11a3426f97d8000000738300009130cd45419c5943",
380
- * "certs": {
381
- * "publicKey": "-----BEGIN CERTIFICATE-----.......-----END CERTIFICATE-----",
382
- * "privateKey": "-----BEGIN PRIVATE KEY-----......-----END PRIVATE KEY-----"
383
- * }
384
- * }
385
- * }
386
- * '400':
387
- * description: Please provide `clientID` or `tenant`/`product`.
210
+ * type: accounts.google.com
388
211
  * '401':
389
212
  * description: Unauthorized
390
213
  */
@@ -393,7 +216,7 @@ class APIController {
393
216
  const { clientID, tenant, product } = body;
394
217
  if (clientID) {
395
218
  const samlConfig = yield this.configStore.get(clientID);
396
- return samlConfig ? { config: samlConfig } : {};
219
+ return samlConfig ? { provider: samlConfig.idpMetadata.provider } : {};
397
220
  }
398
221
  if (tenant && product) {
399
222
  const samlConfigs = yield this.configStore.getByIndex({
@@ -403,7 +226,7 @@ class APIController {
403
226
  if (!samlConfigs || !samlConfigs.length) {
404
227
  return {};
405
228
  }
406
- return { config: samlConfigs[0] };
229
+ return { provider: samlConfigs[0].idpMetadata.provider };
407
230
  }
408
231
  throw new error_1.JacksonError('Please provide `clientID` or `tenant` and `product`.', 400);
409
232
  });
@@ -457,7 +280,7 @@ class APIController {
457
280
  yield this.configStore.delete(clientID);
458
281
  }
459
282
  else {
460
- throw new error_1.JacksonError('clientSecret mismatch', 400);
283
+ throw new error_1.JacksonError('clientSecret mismatch.', 400);
461
284
  }
462
285
  return;
463
286
  }
@@ -144,8 +144,8 @@ class OAuthController {
144
144
  }
145
145
  samlResponse(body) {
146
146
  return __awaiter(this, void 0, void 0, function* () {
147
- const { SAMLResponse } = body; // RelayState will contain the sessionId from earlier quasi-oauth flow
148
- let RelayState = body.RelayState || '';
147
+ const { SAMLResponse } = body;
148
+ let RelayState = body.RelayState || ''; // RelayState will contain the sessionId from earlier quasi-oauth flow
149
149
  if (!this.opts.idpEnabled && !RelayState.startsWith(relayStatePrefix)) {
150
150
  // IDP is disabled so block the request
151
151
  throw new error_1.JacksonError('IdP (Identity Provider) flow has been disabled. Please head to your Service Provider to login.', 403);
@@ -284,7 +284,7 @@ class OAuthController {
284
284
  }
285
285
  else if (client_id && client_secret) {
286
286
  // check if we have an encoded client_id
287
- if (client_id !== 'dummy' && client_secret !== 'dummy') {
287
+ if (client_id !== 'dummy') {
288
288
  const sp = getEncodedClientId(client_id);
289
289
  if (!sp) {
290
290
  // OAuth flow
package/dist/db/db.d.ts CHANGED
@@ -4,7 +4,6 @@ declare class DB implements DatabaseDriver {
4
4
  private encryptionKey;
5
5
  constructor(db: DatabaseDriver, encryptionKey: EncryptionKey);
6
6
  get(namespace: string, key: string): Promise<unknown>;
7
- getAll(namespace: any): Promise<unknown[]>;
8
7
  getByIndex(namespace: string, idx: Index): Promise<unknown[]>;
9
8
  put(namespace: string, key: string, val: unknown, ttl?: number, ...indexes: Index[]): Promise<unknown>;
10
9
  delete(namespace: string, key: string): Promise<unknown>;
package/dist/db/db.js CHANGED
@@ -57,15 +57,6 @@ class DB {
57
57
  return decrypt(res, this.encryptionKey);
58
58
  });
59
59
  }
60
- getAll(namespace) {
61
- return __awaiter(this, void 0, void 0, function* () {
62
- const res = (yield this.db.getAll(namespace));
63
- const encryptionKey = this.encryptionKey;
64
- return res.map((r) => {
65
- return decrypt(r, encryptionKey);
66
- });
67
- });
68
- }
69
60
  getByIndex(namespace, idx) {
70
61
  return __awaiter(this, void 0, void 0, function* () {
71
62
  const res = yield this.db.getByIndex(namespace, idx);
package/dist/db/mem.d.ts CHANGED
@@ -10,7 +10,6 @@ declare class Mem implements DatabaseDriver {
10
10
  constructor(options: DatabaseOption);
11
11
  init(): Promise<Mem>;
12
12
  get(namespace: string, key: string): Promise<any>;
13
- getAll(namespace: string): Promise<unknown[]>;
14
13
  getByIndex(namespace: string, idx: Index): Promise<any>;
15
14
  put(namespace: string, key: string, val: Encrypted, ttl?: number, ...indexes: any[]): Promise<any>;
16
15
  delete(namespace: string, key: string): Promise<any>;
package/dist/db/mem.js CHANGED
@@ -66,21 +66,6 @@ class Mem {
66
66
  return null;
67
67
  });
68
68
  }
69
- getAll(namespace) {
70
- return __awaiter(this, void 0, void 0, function* () {
71
- const returnValue = [];
72
- if (namespace) {
73
- for (const key in this.store) {
74
- if (key.startsWith(namespace)) {
75
- returnValue.push(this.store[key]);
76
- }
77
- }
78
- }
79
- if (returnValue)
80
- return returnValue;
81
- return [];
82
- });
83
- }
84
69
  getByIndex(namespace, idx) {
85
70
  return __awaiter(this, void 0, void 0, function* () {
86
71
  const dbKeys = yield this.indexes[dbutils.keyForIndex(namespace, idx)];
@@ -95,10 +80,6 @@ class Mem {
95
80
  return __awaiter(this, void 0, void 0, function* () {
96
81
  const k = dbutils.key(namespace, key);
97
82
  this.store[k] = val;
98
- if (!Date.parse(this.store['createdAt']))
99
- this.store['createdAt'] = new Date().toISOString();
100
- this.store['modifiedAt'] = new Date().toISOString();
101
- // console.log(this.store)
102
83
  if (ttl) {
103
84
  this.ttlStore[k] = {
104
85
  namespace,
@@ -7,7 +7,6 @@ declare class Mongo implements DatabaseDriver {
7
7
  constructor(options: DatabaseOption);
8
8
  init(): Promise<Mongo>;
9
9
  get(namespace: string, key: string): Promise<any>;
10
- getAll(namespace: string): Promise<unknown[]>;
11
10
  getByIndex(namespace: string, idx: Index): Promise<any>;
12
11
  put(namespace: string, key: string, val: Encrypted, ttl?: number, ...indexes: any[]): Promise<void>;
13
12
  delete(namespace: string, key: string): Promise<any>;
package/dist/db/mongo.js CHANGED
@@ -36,16 +36,8 @@ class Mongo {
36
36
  }
37
37
  init() {
38
38
  return __awaiter(this, void 0, void 0, function* () {
39
- try {
40
- if (!this.options.url) {
41
- throw Error('Please specify a db url');
42
- }
43
- this.client = new mongodb_1.MongoClient(this.options.url);
44
- yield this.client.connect();
45
- }
46
- catch (err) {
47
- console.error(`error connecting to ${this.options.type} db: ${err}`);
48
- }
39
+ this.client = new mongodb_1.MongoClient(this.options.url);
40
+ yield this.client.connect();
49
41
  this.db = this.client.db();
50
42
  this.collection = this.db.collection('jacksonStore');
51
43
  yield this.collection.createIndex({ indexes: 1 });
@@ -64,15 +56,6 @@ class Mongo {
64
56
  return null;
65
57
  });
66
58
  }
67
- getAll(namespace) {
68
- return __awaiter(this, void 0, void 0, function* () {
69
- const _namespaceMatch = new RegExp(`^${namespace}:.*`);
70
- const docs = yield this.collection.find({ _id: _namespaceMatch }).toArray();
71
- if (docs)
72
- return docs.map(({ value }) => value);
73
- return [];
74
- });
75
- }
76
59
  getByIndex(namespace, idx) {
77
60
  return __awaiter(this, void 0, void 0, function* () {
78
61
  const docs = yield this.collection
@@ -103,12 +86,8 @@ class Mongo {
103
86
  }
104
87
  doc.indexes.push(idxKey);
105
88
  }
106
- doc.modifiedAt = new Date().toISOString();
107
89
  yield this.collection.updateOne({ _id: dbutils.key(namespace, key) }, {
108
90
  $set: doc,
109
- $setOnInsert: {
110
- createdAt: new Date().toISOString(),
111
- },
112
91
  }, { upsert: true });
113
92
  });
114
93
  }
@@ -5,7 +5,6 @@ declare class Redis implements DatabaseDriver {
5
5
  constructor(options: DatabaseOption);
6
6
  init(): Promise<Redis>;
7
7
  get(namespace: string, key: string): Promise<any>;
8
- getAll(namespace: string): Promise<unknown[]>;
9
8
  getByIndex(namespace: string, idx: Index): Promise<any>;
10
9
  put(namespace: string, key: string, val: Encrypted, ttl?: number, ...indexes: any[]): Promise<void>;
11
10
  delete(namespace: string, key: string): Promise<any>;
package/dist/db/redis.js CHANGED
@@ -57,26 +57,6 @@ class Redis {
57
57
  return null;
58
58
  });
59
59
  }
60
- getAll(namespace) {
61
- return __awaiter(this, void 0, void 0, function* () {
62
- const keys = yield this.client.sendCommand(['keys', namespace + ':*']);
63
- const returnValue = [];
64
- for (let i = 0; i < keys.length; i++) {
65
- try {
66
- if (this.client.get(keys[i])) {
67
- const value = yield this.client.get(keys[i]);
68
- returnValue.push(JSON.parse(value));
69
- }
70
- }
71
- catch (error) {
72
- console.error(error);
73
- }
74
- }
75
- if (returnValue)
76
- return returnValue;
77
- return [];
78
- });
79
- }
80
60
  getByIndex(namespace, idx) {
81
61
  return __awaiter(this, void 0, void 0, function* () {
82
62
  const dbKeys = yield this.client.sMembers(dbutils.keyForIndex(namespace, idx));
@@ -3,6 +3,4 @@ export declare class JacksonStore {
3
3
  value: string;
4
4
  iv?: string;
5
5
  tag?: string;
6
- createdAt?: Date;
7
- modifiedAt?: string;
8
6
  }
@@ -36,19 +36,6 @@ __decorate([
36
36
  nullable: true,
37
37
  })
38
38
  ], JacksonStore.prototype, "tag", void 0);
39
- __decorate([
40
- (0, typeorm_1.Column)({
41
- type: 'timestamp',
42
- default: () => 'CURRENT_TIMESTAMP',
43
- nullable: false,
44
- })
45
- ], JacksonStore.prototype, "createdAt", void 0);
46
- __decorate([
47
- (0, typeorm_1.Column)({
48
- type: 'timestamp',
49
- nullable: true,
50
- })
51
- ], JacksonStore.prototype, "modifiedAt", void 0);
52
39
  JacksonStore = __decorate([
53
40
  (0, typeorm_1.Entity)()
54
41
  ], JacksonStore);
@@ -10,7 +10,6 @@ declare class Sql implements DatabaseDriver {
10
10
  constructor(options: DatabaseOption);
11
11
  init(): Promise<Sql>;
12
12
  get(namespace: string, key: string): Promise<any>;
13
- getAll(namespace: string): Promise<unknown[]>;
14
13
  getByIndex(namespace: string, idx: Index): Promise<any>;
15
14
  put(namespace: string, key: string, val: Encrypted, ttl?: number, ...indexes: any[]): Promise<void>;
16
15
  delete(namespace: string, key: string): Promise<any>;
@@ -95,7 +95,7 @@ class Sql {
95
95
  }
96
96
  get(namespace, key) {
97
97
  return __awaiter(this, void 0, void 0, function* () {
98
- const res = yield this.storeRepository.findOne({
98
+ let res = yield this.storeRepository.findOne({
99
99
  key: dbutils.key(namespace, key),
100
100
  });
101
101
  if (res && res.value) {
@@ -108,22 +108,6 @@ class Sql {
108
108
  return null;
109
109
  });
110
110
  }
111
- getAll(namespace) {
112
- return __awaiter(this, void 0, void 0, function* () {
113
- const response = yield this.storeRepository.find({
114
- where: { key: (0, typeorm_1.Like)(`%${namespace}%`) },
115
- select: ['value', 'iv', 'tag'],
116
- order: {
117
- ['createdAt']: 'DESC',
118
- // ['createdAt']: 'ASC',
119
- },
120
- });
121
- const returnValue = JSON.parse(JSON.stringify(response));
122
- if (returnValue)
123
- return returnValue;
124
- return [];
125
- });
126
- }
127
111
  getByIndex(namespace, idx) {
128
112
  return __awaiter(this, void 0, void 0, function* () {
129
113
  const res = yield this.indexRepository.find({
@@ -151,7 +135,6 @@ class Sql {
151
135
  store.value = val.value;
152
136
  store.iv = val.iv;
153
137
  store.tag = val.tag;
154
- store.modifiedAt = new Date().toISOString();
155
138
  yield transactionalEntityManager.save(store);
156
139
  if (ttl) {
157
140
  const ttlRec = new JacksonTTL_1.JacksonTTL();
package/dist/db/store.js CHANGED
@@ -40,11 +40,6 @@ class Store {
40
40
  return yield this.db.get(this.namespace, dbutils.keyDigest(key));
41
41
  });
42
42
  }
43
- getAll() {
44
- return __awaiter(this, void 0, void 0, function* () {
45
- return yield this.db.getAll(this.namespace);
46
- });
47
- }
48
43
  getByIndex(idx) {
49
44
  return __awaiter(this, void 0, void 0, function* () {
50
45
  idx.value = dbutils.keyDigest(idx.value);
package/dist/index.d.ts CHANGED
@@ -1,11 +1,9 @@
1
1
  import { JacksonOption } from './typings';
2
2
  import { APIController } from './controller/api';
3
3
  import { OAuthController } from './controller/oauth';
4
- import { AdminController } from './controller/admin';
5
4
  export declare const controllers: (opts: JacksonOption) => Promise<{
6
5
  apiController: APIController;
7
6
  oauthController: OAuthController;
8
- adminController: AdminController;
9
7
  }>;
10
8
  export default controllers;
11
9
  export * from './typings';
package/dist/index.js CHANGED
@@ -25,7 +25,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
25
25
  exports.controllers = void 0;
26
26
  const api_1 = require("./controller/api");
27
27
  const oauth_1 = require("./controller/oauth");
28
- const admin_1 = require("./controller/admin");
29
28
  const db_1 = __importDefault(require("./db/db"));
30
29
  const read_config_1 = __importDefault(require("./read-config"));
31
30
  const defaultOpts = (opts) => {
@@ -55,7 +54,6 @@ const controllers = (opts) => __awaiter(void 0, void 0, void 0, function* () {
55
54
  const codeStore = db.store('oauth:code', opts.db.ttl);
56
55
  const tokenStore = db.store('oauth:token', opts.db.ttl);
57
56
  const apiController = new api_1.APIController({ configStore });
58
- const adminController = new admin_1.AdminController({ configStore });
59
57
  const oauthController = new oauth_1.OAuthController({
60
58
  configStore,
61
59
  sessionStore,
@@ -76,7 +74,6 @@ const controllers = (opts) => __awaiter(void 0, void 0, void 0, function* () {
76
74
  return {
77
75
  apiController,
78
76
  oauthController,
79
- adminController,
80
77
  };
81
78
  });
82
79
  exports.controllers = controllers;
package/dist/typings.d.ts CHANGED
@@ -3,8 +3,6 @@ export declare type IdPConfig = {
3
3
  redirectUrl: string;
4
4
  tenant: string;
5
5
  product: string;
6
- name: string;
7
- description: string;
8
6
  rawMetadata?: string;
9
7
  encodedRawMetadata?: string;
10
8
  };
@@ -15,12 +13,11 @@ export interface OAuth {
15
13
  }
16
14
  export interface IAPIController {
17
15
  config(body: IdPConfig): Promise<OAuth>;
18
- updateConfig(body: any): Promise<void>;
19
16
  getConfig(body: {
20
17
  clientID?: string;
21
18
  tenant?: string;
22
19
  product?: string;
23
- }): Promise<any>;
20
+ }): Promise<Partial<OAuth>>;
24
21
  deleteConfig(body: {
25
22
  clientID?: string;
26
23
  clientSecret?: string;
@@ -38,9 +35,6 @@ export interface IOAuthController {
38
35
  token(body: OAuthTokenReq): Promise<OAuthTokenRes>;
39
36
  userInfo(token: string): Promise<Profile>;
40
37
  }
41
- export interface IAdminController {
42
- getAllConfig(): any;
43
- }
44
38
  export interface OAuthReqBody {
45
39
  response_type: 'code';
46
40
  client_id: string;
@@ -79,14 +73,12 @@ export interface Index {
79
73
  value: string;
80
74
  }
81
75
  export interface DatabaseDriver {
82
- getAll(namespace: string): Promise<unknown[]>;
83
76
  get(namespace: string, key: string): Promise<any>;
84
77
  put(namespace: string, key: string, val: any, ttl: number, ...indexes: Index[]): Promise<any>;
85
78
  delete(namespace: string, key: string): Promise<any>;
86
79
  getByIndex(namespace: string, idx: Index): Promise<any>;
87
80
  }
88
81
  export interface Storable {
89
- getAll(): Promise<unknown[]>;
90
82
  get(key: string): Promise<any>;
91
83
  put(key: string, val: any, ...indexes: Index[]): Promise<any>;
92
84
  delete(key: string): Promise<any>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boxyhq/saml-jackson",
3
- "version": "0.3.6-beta.659",
3
+ "version": "0.3.7",
4
4
  "description": "SAML 2.0 service",
5
5
  "keywords": [
6
6
  "SAML 2.0"
@@ -18,9 +18,9 @@
18
18
  ],
19
19
  "scripts": {
20
20
  "build": "tsc -p tsconfig.build.json",
21
- "db:migration:generate:postgres": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:generate --config ormconfig.js -n createdAt",
22
- "db:migration:generate:mysql": "cross-env DB_TYPE=mysql DB_URL=mysql://root:mysql@localhost:3307/mysql ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:generate --config ormconfig.js -n createdAt",
23
- "db:migration:generate:mariadb": "cross-env DB_TYPE=mariadb DB_URL=mariadb://root@localhost:3306/mysql ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:generate --config ormconfig.js -n createdAt",
21
+ "db:migration:generate:postgres": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:generate --config ormconfig.js -n Initial",
22
+ "db:migration:generate:mysql": "cross-env DB_TYPE=mysql DB_URL=mysql://root:mysql@localhost:3307/mysql ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:generate --config ormconfig.js -n Initial",
23
+ "db:migration:generate:mariadb": "cross-env DB_TYPE=mariadb DB_URL=mariadb://root@localhost:3306/mysql ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js migration:generate --config ormconfig.js -n Initial",
24
24
  "db:migration:run:postgres": "ts-node --transpile-only ./node_modules/typeorm/cli.js migration:run",
25
25
  "db:migration:run:mysql": "cross-env DB_TYPE=mysql DB_URL=mysql://root:mysql@localhost:3307/mysql ts-node --transpile-only ./node_modules/typeorm/cli.js migration:run",
26
26
  "db:migration:run:mariadb": "cross-env DB_TYPE=mariadb DB_URL=mariadb://root@localhost:3306/mysql ts-node --transpile-only ./node_modules/typeorm/cli.js migration:run",
@@ -56,13 +56,13 @@
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/express": "4.17.13",
59
- "@types/node": "17.0.16",
59
+ "@types/node": "17.0.17",
60
60
  "@types/sinon": "10.0.11",
61
61
  "@types/tap": "15.0.5",
62
62
  "@typescript-eslint/eslint-plugin": "5.11.0",
63
63
  "@typescript-eslint/parser": "5.11.0",
64
64
  "cross-env": "7.0.3",
65
- "eslint": "8.8.0",
65
+ "eslint": "8.9.0",
66
66
  "eslint-config-prettier": "8.3.0",
67
67
  "prettier": "2.5.1",
68
68
  "sinon": "13.0.1",
@@ -1,8 +0,0 @@
1
- import { IAdminController, Storable, OAuth } from '../typings';
2
- export declare class AdminController implements IAdminController {
3
- configStore: Storable;
4
- constructor({ configStore }: {
5
- configStore: any;
6
- });
7
- getAllConfig(): Promise<Partial<OAuth>[]>;
8
- }
@@ -1,27 +0,0 @@
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.AdminController = void 0;
13
- class AdminController {
14
- constructor({ configStore }) {
15
- this.configStore = configStore;
16
- }
17
- getAllConfig() {
18
- return __awaiter(this, void 0, void 0, function* () {
19
- const configList = (yield this.configStore.getAll());
20
- if (!configList || !configList.length) {
21
- return [];
22
- }
23
- return configList;
24
- });
25
- }
26
- }
27
- exports.AdminController = AdminController;
@@ -1,16 +0,0 @@
1
- import {MigrationInterface, QueryRunner} from "typeorm";
2
-
3
- export class createdAt1644332636666 implements MigrationInterface {
4
- name = 'createdAt1644332636666'
5
-
6
- public async up(queryRunner: QueryRunner): Promise<void> {
7
- await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`createdAt\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP()`);
8
- await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`modifiedAt\` timestamp NULL`);
9
- }
10
-
11
- public async down(queryRunner: QueryRunner): Promise<void> {
12
- await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`modifiedAt\``);
13
- await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`createdAt\``);
14
- }
15
-
16
- }
@@ -1,16 +0,0 @@
1
- import {MigrationInterface, QueryRunner} from "typeorm";
2
-
3
- export class createdAt1644332641078 implements MigrationInterface {
4
- name = 'createdAt1644332641078'
5
-
6
- public async up(queryRunner: QueryRunner): Promise<void> {
7
- await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`createdAt\` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP`);
8
- await queryRunner.query(`ALTER TABLE \`jackson_store\` ADD \`modifiedAt\` timestamp NULL`);
9
- }
10
-
11
- public async down(queryRunner: QueryRunner): Promise<void> {
12
- await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`modifiedAt\``);
13
- await queryRunner.query(`ALTER TABLE \`jackson_store\` DROP COLUMN \`createdAt\``);
14
- }
15
-
16
- }
@@ -1,16 +0,0 @@
1
- import {MigrationInterface, QueryRunner} from "typeorm";
2
-
3
- export class createdAt1644332647279 implements MigrationInterface {
4
- name = 'createdAt1644332647279'
5
-
6
- public async up(queryRunner: QueryRunner): Promise<void> {
7
- await queryRunner.query(`ALTER TABLE "jackson_store" ADD "createdAt" TIMESTAMP NOT NULL DEFAULT now()`);
8
- await queryRunner.query(`ALTER TABLE "jackson_store" ADD "modifiedAt" TIMESTAMP`);
9
- }
10
-
11
- public async down(queryRunner: QueryRunner): Promise<void> {
12
- await queryRunner.query(`ALTER TABLE "jackson_store" DROP COLUMN "modifiedAt"`);
13
- await queryRunner.query(`ALTER TABLE "jackson_store" DROP COLUMN "createdAt"`);
14
- }
15
-
16
- }