@boxyhq/saml-jackson 0.2.3-beta.230 → 0.2.3-beta.231

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boxyhq/saml-jackson",
3
- "version": "0.2.3-beta.230",
3
+ "version": "0.2.3-beta.231",
4
4
  "license": "Apache 2.0",
5
5
  "description": "SAML 2.0 service",
6
6
  "main": "dist/index.js",
@@ -56,13 +56,13 @@ export class SAMLConfig implements ISAMLConfig {
56
56
 
57
57
  idpMetadata.provider = providerName ? providerName : 'Unknown';
58
58
 
59
- let clientID = dbutils.keyDigest(
59
+ const clientID = dbutils.keyDigest(
60
60
  dbutils.keyFromParts(tenant, product, idpMetadata.entityID)
61
61
  );
62
62
 
63
63
  let clientSecret;
64
64
 
65
- let exists = await this.configStore.get(clientID);
65
+ const exists = await this.configStore.get(clientID);
66
66
 
67
67
  if (exists) {
68
68
  clientSecret = exists.clientSecret;
@@ -2,7 +2,7 @@ export class JacksonError extends Error {
2
2
  public name: string;
3
3
  public statusCode: number;
4
4
 
5
- constructor(message: string, statusCode: number = 500) {
5
+ constructor(message: string, statusCode = 500) {
6
6
  super(message);
7
7
 
8
8
  this.name = this.constructor.name;
@@ -66,7 +66,7 @@ export class OAuthController implements IOAuthController {
66
66
  product,
67
67
  code_challenge,
68
68
  code_challenge_method = '',
69
- // eslint-disable-next-line no-unused-vars
69
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
70
70
  provider = 'saml',
71
71
  } = body;
72
72
 
@@ -134,7 +134,6 @@ export class OAuthController implements IOAuthController {
134
134
  }
135
135
 
136
136
  const samlReq = saml.request({
137
- // @ts-ignore
138
137
  entityID: this.opts.samlAudience,
139
138
  callbackUrl: this.opts.externalUrl + this.opts.samlPath,
140
139
  signingKey: samlConfig.certs.privateKey,
@@ -190,8 +189,6 @@ export class OAuthController implements IOAuthController {
190
189
 
191
190
  const samlConfigs = await this.configStore.getByIndex({
192
191
  name: IndexNames.EntityID,
193
-
194
- // @ts-ignore
195
192
  value: parsedResp?.issuer,
196
193
  });
197
194
 
@@ -214,7 +211,7 @@ export class OAuthController implements IOAuthController {
214
211
  }
215
212
  }
216
213
 
217
- let validateOpts: any = {
214
+ const validateOpts: Record<string, string> = {
218
215
  thumbprint: samlConfig.idpMetadata.thumbprint,
219
216
  audience: this.opts.samlAudience,
220
217
  };
@@ -228,7 +225,7 @@ export class OAuthController implements IOAuthController {
228
225
  // store details against a code
229
226
  const code = crypto.randomBytes(20).toString('hex');
230
227
 
231
- let codeVal: any = {
228
+ const codeVal: Record<string, unknown> = {
232
229
  profile,
233
230
  clientID: samlConfig.clientID,
234
231
  clientSecret: samlConfig.clientSecret,
@@ -248,7 +245,7 @@ export class OAuthController implements IOAuthController {
248
245
  throw new JacksonError('Redirect URL is not allowed.', 403);
249
246
  }
250
247
 
251
- let params: any = {
248
+ const params: Record<string, string> = {
252
249
  code,
253
250
  };
254
251
 
package/src/db/db.ts CHANGED
@@ -13,7 +13,7 @@ import redis from './redis';
13
13
  import sql from './sql/sql';
14
14
  import store from './store';
15
15
 
16
- const decrypt = (res: Encrypted, encryptionKey: EncryptionKey): any => {
16
+ const decrypt = (res: Encrypted, encryptionKey: EncryptionKey): unknown => {
17
17
  if (res.iv && res.tag) {
18
18
  return JSON.parse(
19
19
  encrypter.decrypt(res.value, res.iv, res.tag, encryptionKey)
@@ -24,15 +24,15 @@ const decrypt = (res: Encrypted, encryptionKey: EncryptionKey): any => {
24
24
  };
25
25
 
26
26
  class DB implements DatabaseDriver {
27
- private db: any;
27
+ private db: DatabaseDriver;
28
28
  private encryptionKey: EncryptionKey;
29
29
 
30
- constructor(db: any, encryptionKey: EncryptionKey) {
30
+ constructor(db: DatabaseDriver, encryptionKey: EncryptionKey) {
31
31
  this.db = db;
32
32
  this.encryptionKey = encryptionKey;
33
33
  }
34
34
 
35
- async get(namespace: string, key: string): Promise<any> {
35
+ async get(namespace: string, key: string): Promise<unknown> {
36
36
  const res = await this.db.get(namespace, key);
37
37
 
38
38
  if (!res) {
@@ -42,7 +42,7 @@ class DB implements DatabaseDriver {
42
42
  return decrypt(res, this.encryptionKey);
43
43
  }
44
44
 
45
- async getByIndex(namespace: string, idx: Index): Promise<any> {
45
+ async getByIndex(namespace: string, idx: Index): Promise<unknown[]> {
46
46
  const res = await this.db.getByIndex(namespace, idx);
47
47
  const encryptionKey = this.encryptionKey;
48
48
  return res.map((r) => {
@@ -54,10 +54,10 @@ class DB implements DatabaseDriver {
54
54
  async put(
55
55
  namespace: string,
56
56
  key: string,
57
- val: any,
58
- ttl: number = 0,
59
- ...indexes: any[]
60
- ): Promise<any> {
57
+ val: unknown,
58
+ ttl = 0,
59
+ ...indexes: Index[]
60
+ ): Promise<unknown> {
61
61
  if (ttl > 0 && indexes && indexes.length > 0) {
62
62
  throw new Error('secondary indexes not allow on a store with ttl');
63
63
  }
@@ -69,11 +69,11 @@ class DB implements DatabaseDriver {
69
69
  return await this.db.put(namespace, key, dbVal, ttl, ...indexes);
70
70
  }
71
71
 
72
- async delete(namespace: string, key: string): Promise<any> {
72
+ async delete(namespace: string, key: string): Promise<unknown> {
73
73
  return await this.db.delete(namespace, key);
74
74
  }
75
75
 
76
- store(namespace: string, ttl: number = 0): Storable {
76
+ store(namespace: string, ttl = 0): Storable {
77
77
  return store.new(namespace, this, ttl);
78
78
  }
79
79
  }
package/src/db/mem.ts CHANGED
@@ -43,7 +43,7 @@ class Mem implements DatabaseDriver {
43
43
  }
44
44
 
45
45
  async get(namespace: string, key: string): Promise<any> {
46
- let res = this.store[dbutils.key(namespace, key)];
46
+ const res = this.store[dbutils.key(namespace, key)];
47
47
  if (res) {
48
48
  return res;
49
49
  }
@@ -66,7 +66,7 @@ class Mem implements DatabaseDriver {
66
66
  namespace: string,
67
67
  key: string,
68
68
  val: Encrypted,
69
- ttl: number = 0,
69
+ ttl = 0,
70
70
  ...indexes: any[]
71
71
  ): Promise<any> {
72
72
  const k = dbutils.key(namespace, key);
package/src/db/mongo.ts CHANGED
@@ -36,7 +36,7 @@ class Mongo implements DatabaseDriver {
36
36
  }
37
37
 
38
38
  async get(namespace: string, key: string): Promise<any> {
39
- let res = await this.collection.findOne({
39
+ const res = await this.collection.findOne({
40
40
  _id: dbutils.key(namespace, key),
41
41
  });
42
42
  if (res && res.value) {
@@ -65,7 +65,7 @@ class Mongo implements DatabaseDriver {
65
65
  namespace: string,
66
66
  key: string,
67
67
  val: Encrypted,
68
- ttl: number = 0,
68
+ ttl = 0,
69
69
  ...indexes: any[]
70
70
  ): Promise<void> {
71
71
  const doc = <Document>{
package/src/db/redis.ts CHANGED
@@ -11,7 +11,7 @@ class Redis implements DatabaseDriver {
11
11
  }
12
12
 
13
13
  async init(): Promise<Redis> {
14
- let opts = {};
14
+ const opts = {};
15
15
 
16
16
  if (this.options && this.options.url) {
17
17
  opts['socket'] = {
@@ -30,7 +30,7 @@ class Redis implements DatabaseDriver {
30
30
  }
31
31
 
32
32
  async get(namespace: string, key: string): Promise<any> {
33
- let res = await this.client.get(dbutils.key(namespace, key));
33
+ const res = await this.client.get(dbutils.key(namespace, key));
34
34
  if (res) {
35
35
  return JSON.parse(res);
36
36
  }
@@ -55,7 +55,7 @@ class Redis implements DatabaseDriver {
55
55
  namespace: string,
56
56
  key: string,
57
57
  val: Encrypted,
58
- ttl: number = 0,
58
+ ttl = 0,
59
59
  ...indexes: any[]
60
60
  ): Promise<void> {
61
61
  let tx = this.client.multi();
package/src/db/store.ts CHANGED
@@ -6,7 +6,7 @@ class Store implements Storable {
6
6
  private db: any;
7
7
  private ttl: number;
8
8
 
9
- constructor(namespace: string, db: any, ttl: number = 0) {
9
+ constructor(namespace: string, db: any, ttl = 0) {
10
10
  this.namespace = namespace;
11
11
  this.db = db;
12
12
  this.ttl = ttl;
@@ -43,7 +43,7 @@ class Store implements Storable {
43
43
  }
44
44
 
45
45
  export default {
46
- new: (namespace: string, db: any, ttl: number = 0): Storable => {
46
+ new: (namespace: string, db: any, ttl = 0): Storable => {
47
47
  return new Store(namespace, db, ttl);
48
48
  },
49
49
  };
package/src/env.ts CHANGED
@@ -9,7 +9,7 @@ const internalHostPort = +(process.env.INTERNAL_HOST_PORT || '6000');
9
9
 
10
10
  const apiKeys = (process.env.JACKSON_API_KEYS || '').split(',');
11
11
 
12
- const samlAudience = process.env.SAML_AUDIENCE;
12
+ const samlAudience = process.env.SAML_AUDIENCE || 'https://saml.boxyhq.com';
13
13
  const preLoadedConfig = process.env.PRE_LOADED_CONFIG;
14
14
 
15
15
  const idpEnabled = process.env.IDP_ENABLED;
package/src/jackson.ts CHANGED
@@ -84,7 +84,6 @@ const server = app.listen(env.hostPort, async () => {
84
84
  `🚀 The path of the righteous server: http://${env.hostUrl}:${env.hostPort}`
85
85
  );
86
86
 
87
- // @ts-ignore
88
87
  const ctrlrModule = await jackson(env);
89
88
 
90
89
  apiController = ctrlrModule.apiController;
package/src/saml/saml.ts CHANGED
@@ -1,7 +1,7 @@
1
- const saml = require('@boxyhq/saml20');
2
- const xml2js = require('xml2js');
3
- const thumbprint = require('thumbprint');
4
- const xmlcrypto = require('xml-crypto');
1
+ import saml from '@boxyhq/saml20';
2
+ import xml2js from 'xml2js';
3
+ import thumbprint from 'thumbprint';
4
+ import xmlcrypto from 'xml-crypto';
5
5
  import * as rambda from 'rambda';
6
6
  import xmlbuilder from 'xmlbuilder';
7
7
  import crypto from 'crypto';
@@ -53,7 +53,8 @@ const request = ({
53
53
  const id = idPrefix + crypto.randomBytes(10).toString('hex');
54
54
  const date = new Date().toISOString();
55
55
 
56
- let samlReq: Record<string, any> = {
56
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
57
+ const samlReq: Record<string, any> = {
57
58
  'samlp:AuthnRequest': {
58
59
  '@xmlns:samlp': 'urn:oasis:names:tc:SAML:2.0:protocol',
59
60
  '@ID': id,
@@ -97,9 +98,7 @@ const request = ({
97
98
  };
98
99
  };
99
100
 
100
- const parseAsync = async (
101
- rawAssertion: string
102
- ): Promise<SAMLProfile | void> => {
101
+ const parseAsync = async (rawAssertion: string): Promise<SAMLProfile> => {
103
102
  return new Promise((resolve, reject) => {
104
103
  saml.parse(
105
104
  rawAssertion,
@@ -118,7 +117,7 @@ const parseAsync = async (
118
117
  const validateAsync = async (
119
118
  rawAssertion: string,
120
119
  options
121
- ): Promise<SAMLProfile | void> => {
120
+ ): Promise<SAMLProfile> => {
122
121
  return new Promise((resolve, reject) => {
123
122
  saml.validate(
124
123
  rawAssertion,
@@ -144,7 +144,7 @@ tap.test('controller/api', async (t) => {
144
144
  t.equal(response.client_id, CLIENT_ID);
145
145
  t.equal(response.provider, PROVIDER);
146
146
 
147
- let savedConf = await apiController.getConfig({
147
+ const savedConf = await apiController.getConfig({
148
148
  clientID: CLIENT_ID,
149
149
  });
150
150
 
package/src/typings.ts CHANGED
@@ -104,7 +104,7 @@ declare module 'saml-jackson' {
104
104
  key: string,
105
105
  val: any,
106
106
  ttl: number,
107
- indexes: Index[]
107
+ ...indexes: Index[]
108
108
  ): Promise<any>;
109
109
  delete(namespace: string, key: string): Promise<any>;
110
110
  getByIndex(namespace: string, idx: Index): Promise<any>;
@@ -159,7 +159,7 @@ declare module 'saml-jackson' {
159
159
  export interface JacksonOption {
160
160
  externalUrl: string;
161
161
  samlPath: string;
162
- samlAudience?: string;
162
+ samlAudience: string;
163
163
  preLoadedConfig?: string;
164
164
  idpEnabled?: boolean;
165
165
  db: DatabaseOption;