@continuoussecuritytooling/keycloak-reporter 0.8.4 → 0.8.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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,31 @@
1
- ## [0.8.4](https://github.com/ContinuousSecurityTooling/keycloak-reporter/compare/v0.8.2...v0.8.4) (2024-01-26)
1
+ ## [0.8.7](https://github.com/ContinuousSecurityTooling/keycloak-reporter/compare/v0.8.6...v0.8.7) (2024-01-29)
2
2
 
3
- ## [0.8.3](https://github.com/ContinuousSecurityTooling/keycloak-reporter/compare/v0.8.3...v0.8.4) (2024-01-26)
3
+
4
+ ### Bug Fixes
5
+
6
+ * **Tests:** Correcting test assertions ([1619fb6](https://github.com/ContinuousSecurityTooling/keycloak-reporter/commit/1619fb6663a68cbbe5daf07a6dcbb786eac77818))
7
+
8
+
9
+
10
+ ## [0.8.6](https://github.com/ContinuousSecurityTooling/keycloak-reporter/compare/v0.8.5...v0.8.6) (2024-01-29)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **Error-Handling:** Correcting error handling and improve error messages ([25f0ceb](https://github.com/ContinuousSecurityTooling/keycloak-reporter/commit/25f0ceb241446205939b606c4022dc286cc5a965)), closes [#184](https://github.com/ContinuousSecurityTooling/keycloak-reporter/issues/184)
16
+
17
+
18
+
19
+ ## [0.8.5](https://github.com/ContinuousSecurityTooling/keycloak-reporter/compare/v0.8.4...v0.8.5) (2024-01-29)
20
+
21
+
22
+ ### Bug Fixes
23
+
24
+ * **Config:** Correcting TypeError on empty defaults ([c15a76a](https://github.com/ContinuousSecurityTooling/keycloak-reporter/commit/c15a76ade89cea682d56085c1bd789df67dc81e8))
25
+
26
+
27
+
28
+ ## [0.8.4](https://github.com/ContinuousSecurityTooling/keycloak-reporter/compare/0.8.4...v0.8.4) (2024-01-26)
4
29
 
5
30
 
6
31
  ### Bug Fixes
@@ -15,14 +15,14 @@ type: application
15
15
  # This is the chart version. This version number should be incremented each time you make changes
16
16
  # to the chart and its templates, including the app version.
17
17
  # Versions are expected to follow Semantic Versioning (https://semver.org/)
18
- version: 1.2.3
18
+ version: 1.2.4
19
19
 
20
20
  # This is the version number of the application being deployed. This version number should be
21
21
  # incremented each time you make changes to the application. Versions are not expected to
22
22
  # follow Semantic Versioning. They should reflect the version the application is using.
23
23
  # It is recommended to use it with quotes.
24
24
  # renovate: datasource=docker depName=ContinuousSecurityTooling/keycloak-reporter
25
- appVersion: '0.8.4'
25
+ appVersion: '0.8.7'
26
26
  maintainers:
27
27
  # Martin Reinhardt
28
28
  - name: hypery2k
package/cli.ts CHANGED
@@ -1,105 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { writeFileSync } from 'node:fs';
4
- import path from 'path';
5
3
  import yargs from 'yargs/yargs';
6
4
  import { hideBin } from 'yargs/helpers';
7
- import { configTest, listUsers, listClients, Options, convertJSON2CSV, post2Webhook } from './index.js';
5
+ import { convert } from './lib/report.js';
6
+ import { getConvertConfig, getKeycloakConfig } from './lib/utils.js';
7
+ import { configTest, listUsers, listClients } from './index.js';
8
8
  import config from './src/config.js';
9
- class WebhookConfig {
10
- type: string;
11
- url: string;
12
- title: string;
13
- message?: string;
14
- constructor(type: string, url: string, title: string, message?: string) {
15
- this.type = type;
16
- this.url = url;
17
- this.title = title;
18
- this.message = message;
19
- }
20
- }
21
-
22
- class ReportConfig {
23
- name: string;
24
- directory: string;
25
- }
26
-
27
- function getKeycloakConfig(config, argv): Options {
28
- return {
29
- clientId: config.clientId ? config.clientId : (argv.clientId as string),
30
- clientSecret: config.clientSecret ? config.clientSecret : (argv.clientSecret as string),
31
- rootUrl: config.url ? config.url : (argv.url as string),
32
- useAuditingEndpoint: argv.useAuditingEndpoint == true || config.useAuditingEndpoint.toLowerCase() == 'true',
33
- };
34
- }
35
-
36
- function convertData(config, argv, name: string, title: string, json: object) {
37
- convert(
38
- config.format ? config.format : (argv.format as string),
39
- config.output ? config.output : (argv.output as string),
40
- {
41
- name,
42
- directory: argv.reports ? (argv.reports as string) : config.reports,
43
- },
44
- new WebhookConfig(
45
- config.webhookType ? config.webhookType : (argv.webhookType as string),
46
- config.webhookUrl ? config.webhookUrl : (argv.webhookUrl as string),
47
- title,
48
- config.webhookMessage ? config.webhookMessage : (argv.webhookMessage as string)
49
- ),
50
- json
51
- );
52
- }
53
-
54
- async function convert(format: string, output: string, reports: ReportConfig, config: WebhookConfig, json: object) {
55
- let outputContent: string;
56
- switch (format) {
57
- case 'csv':
58
- outputContent = (await convertJSON2CSV(json)).toString();
59
- break;
60
- // defaulting to JSON
61
- default:
62
- outputContent = JSON.stringify(json);
63
- }
64
- if (reports.directory) {
65
- const date = new Date();
66
- writeFileSync(
67
- path.join(
68
- `${reports.directory}`,
69
- `${reports.name}_${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}.${format.toLowerCase()}`
70
- ),
71
- outputContent
72
- );
73
- }
74
- switch (output) {
75
- case 'webhook':
76
- if (!config.url) {
77
- console.error('No valid Webhook URL given');
78
- throw new Error('Please provide a valid --webhookUrl parameter');
79
- }
80
- try {
81
- console.log(`Sending report via webhook to ${config.type} ....`);
82
- await post2Webhook(config.type, config.url, config.title, outputContent, config.message);
83
- console.log('Done sending.');
84
- } catch (e) {
85
- switch (e.code || e.message) {
86
- case 'Request failed with status code 400':
87
- console.error('Invalid Teams Webhook Payload. Check your params.');
88
- throw new Error('Invalid Teams Payload');
89
- case 'slack_webhook_http_error':
90
- console.error('Invalid Slack Webhook Payload. Check your params.');
91
- throw new Error('Invalid Slack Payload');
92
- default:
93
- console.error(`Error during sending webhook.(${e?.code})`, e?.original);
94
- throw e;
95
- }
96
- }
97
- break;
98
- // defaulting to standard out
99
- default:
100
- console.log(outputContent);
101
- }
102
- }
103
9
 
104
10
  yargs(hideBin(process.argv))
105
11
  .env()
@@ -110,7 +16,7 @@ yargs(hideBin(process.argv))
110
16
  () => {},
111
17
  async (argv) => {
112
18
  const users = await listUsers(getKeycloakConfig(config, argv));
113
- convertData(config, argv, 'user_listing', 'User Listing', users);
19
+ convert(getConvertConfig(config, argv, 'user_listing', 'User Listing', users));
114
20
  }
115
21
  )
116
22
  .command(
@@ -120,7 +26,7 @@ yargs(hideBin(process.argv))
120
26
  () => {},
121
27
  async (argv) => {
122
28
  const clients = await listClients(getKeycloakConfig(config, argv));
123
- convertData(config, argv, 'client_listing', 'Client Listing', clients);
29
+ convert(getConvertConfig(config, argv, 'client_listing', 'Client Listing', clients));
124
30
  }
125
31
  )
126
32
  .option('format', {
@@ -167,6 +73,6 @@ yargs(hideBin(process.argv))
167
73
  'validates keycloak configuration by reading data via REST API',
168
74
  // eslint-disable-next-line @typescript-eslint/no-empty-function
169
75
  () => {},
170
- async (argv) => configTest(getKeycloakConfig(config, argv)),
76
+ async (argv) => configTest(getKeycloakConfig(config, argv))
171
77
  )
172
78
  .parse();
package/dist/cli.js CHANGED
@@ -1,91 +1,23 @@
1
1
  #!/usr/bin/env node
2
- import { writeFileSync } from 'node:fs';
3
- import path from 'path';
4
2
  import yargs from 'yargs/yargs';
5
3
  import { hideBin } from 'yargs/helpers';
6
- import { configTest, listUsers, listClients, convertJSON2CSV, post2Webhook } from './index.js';
4
+ import { convert } from './lib/report.js';
5
+ import { getConvertConfig, getKeycloakConfig } from './lib/utils.js';
6
+ import { configTest, listUsers, listClients } from './index.js';
7
7
  import config from './src/config.js';
8
- class WebhookConfig {
9
- constructor(type, url, title, message) {
10
- this.type = type;
11
- this.url = url;
12
- this.title = title;
13
- this.message = message;
14
- }
15
- }
16
- class ReportConfig {
17
- }
18
- function getKeycloakConfig(config, argv) {
19
- return {
20
- clientId: config.clientId ? config.clientId : argv.clientId,
21
- clientSecret: config.clientSecret ? config.clientSecret : argv.clientSecret,
22
- rootUrl: config.url ? config.url : argv.url,
23
- useAuditingEndpoint: argv.useAuditingEndpoint == true || config.useAuditingEndpoint.toLowerCase() == 'true',
24
- };
25
- }
26
- function convertData(config, argv, name, title, json) {
27
- convert(config.format ? config.format : argv.format, config.output ? config.output : argv.output, {
28
- name,
29
- directory: argv.reports ? argv.reports : config.reports,
30
- }, new WebhookConfig(config.webhookType ? config.webhookType : argv.webhookType, config.webhookUrl ? config.webhookUrl : argv.webhookUrl, title, config.webhookMessage ? config.webhookMessage : argv.webhookMessage), json);
31
- }
32
- async function convert(format, output, reports, config, json) {
33
- let outputContent;
34
- switch (format) {
35
- case 'csv':
36
- outputContent = (await convertJSON2CSV(json)).toString();
37
- break;
38
- // defaulting to JSON
39
- default:
40
- outputContent = JSON.stringify(json);
41
- }
42
- if (reports.directory) {
43
- const date = new Date();
44
- writeFileSync(path.join(`${reports.directory}`, `${reports.name}_${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}.${format.toLowerCase()}`), outputContent);
45
- }
46
- switch (output) {
47
- case 'webhook':
48
- if (!config.url) {
49
- console.error('No valid Webhook URL given');
50
- throw new Error('Please provide a valid --webhookUrl parameter');
51
- }
52
- try {
53
- console.log(`Sending report via webhook to ${config.type} ....`);
54
- await post2Webhook(config.type, config.url, config.title, outputContent, config.message);
55
- console.log('Done sending.');
56
- }
57
- catch (e) {
58
- switch (e.code || e.message) {
59
- case 'Request failed with status code 400':
60
- console.error('Invalid Teams Webhook Payload. Check your params.');
61
- throw new Error('Invalid Teams Payload');
62
- case 'slack_webhook_http_error':
63
- console.error('Invalid Slack Webhook Payload. Check your params.');
64
- throw new Error('Invalid Slack Payload');
65
- default:
66
- console.error(`Error during sending webhook.(${e === null || e === void 0 ? void 0 : e.code})`, e === null || e === void 0 ? void 0 : e.original);
67
- throw e;
68
- }
69
- }
70
- break;
71
- // defaulting to standard out
72
- default:
73
- console.log(outputContent);
74
- }
75
- }
76
8
  yargs(hideBin(process.argv))
77
9
  .env()
78
10
  .command('listUsers [url] [clientId] [clientSecret]', 'fetches all users in the realms.',
79
11
  // eslint-disable-next-line @typescript-eslint/no-empty-function
80
12
  () => { }, async (argv) => {
81
13
  const users = await listUsers(getKeycloakConfig(config, argv));
82
- convertData(config, argv, 'user_listing', 'User Listing', users);
14
+ convert(getConvertConfig(config, argv, 'user_listing', 'User Listing', users));
83
15
  })
84
16
  .command('listClients [url] [clientId] [clientSecret]', 'fetches all clients in the realms.',
85
17
  // eslint-disable-next-line @typescript-eslint/no-empty-function
86
18
  () => { }, async (argv) => {
87
19
  const clients = await listClients(getKeycloakConfig(config, argv));
88
- convertData(config, argv, 'client_listing', 'Client Listing', clients);
20
+ convert(getConvertConfig(config, argv, 'client_listing', 'Client Listing', clients));
89
21
  })
90
22
  .option('format', {
91
23
  alias: 'f',
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAErC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACzB,GAAG,EAAE;KACL,OAAO,CACN,2CAA2C,EAC3C,kCAAkC;AAClC,gEAAgE;AAChE,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/D,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;AACjF,CAAC,CACF;KACA,OAAO,CACN,6CAA6C,EAC7C,oCAAoC;AACpC,gEAAgE;AAChE,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,EAAE,IAAI,EAAE,EAAE;IACb,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;AACvF,CAAC,CACF;KACA,MAAM,CAAC,QAAQ,EAAE;IAChB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,8BAA8B;CAC5C,CAAC;KACD,MAAM,CAAC,QAAQ,EAAE;IAChB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,QAAQ;IACjB,WAAW,EAAE,gBAAgB;CAC9B,CAAC;KACD,MAAM,CAAC,aAAa,EAAE;IACrB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,cAAc;CAC5B,CAAC;KACD,MAAM,CAAC,gBAAgB,EAAE;IACxB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,iBAAiB;CAC/B,CAAC;KACD,MAAM,CAAC,YAAY,EAAE;IACpB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,aAAa;CAC3B,CAAC;KACD,MAAM,CAAC,SAAS,EAAE;IACjB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,mBAAmB;CACjC,CAAC;KACD,MAAM,CAAC,qBAAqB,EAAE;IAC7B,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,4BAA4B;CAC1C,CAAC;KACD,OAAO,CACN,4CAA4C,EAC5C,+DAA+D;AAC/D,gEAAgE;AAChE,GAAG,EAAE,GAAE,CAAC,EACR,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAC5D;KACA,KAAK,EAAE,CAAC"}
@@ -16,9 +16,9 @@ export async function createClient(options) {
16
16
  });
17
17
  }
18
18
  catch (e) {
19
- console.error('Check Client Config:', e.response ? e.response.data.error_description : e);
20
- return Promise.reject();
19
+ console.error('Check Client Config:', e.response ? e.responseData.error_description : e);
20
+ return Promise.reject(e.response ? e.responseData.error_description : e);
21
21
  }
22
- return new Promise((resolve) => resolve(kcAdminClient));
22
+ return Promise.resolve(kcAdminClient);
23
23
  }
24
24
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAS1E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB;IACjD,MAAM,aAAa,GAAG,OAAO,CAAC,mBAAmB;QAC/C,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC5C,CAAC,CAAC,IAAI,aAAa,CAAC;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;IACP,IAAI,CAAC;QACH,eAAe;QACf,MAAM,aAAa,CAAC,IAAI,CAAC;YACvB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,SAAS,EAAE,oBAAoB;SAChC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1F,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;AAC1D,CAAC"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAS1E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB;IACjD,MAAM,aAAa,GAAG,OAAO,CAAC,mBAAmB;QAC/C,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC5C,CAAC,CAAC,IAAI,aAAa,CAAC;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;IACP,IAAI,CAAC;QACH,eAAe;QACf,MAAM,aAAa,CAAC,IAAI,CAAC;YACvB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,SAAS,EAAE,oBAAoB;SAChC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import path from 'path';
3
+ import { convertJSON2CSV } from './convert.js';
4
+ import { post2Webhook } from './output.js';
5
+ export async function convert(cfg) {
6
+ let outputContent;
7
+ switch (cfg.format) {
8
+ case 'csv':
9
+ outputContent = (await convertJSON2CSV(cfg.json)).toString();
10
+ break;
11
+ // defaulting to JSON
12
+ default:
13
+ outputContent = JSON.stringify(cfg.json);
14
+ }
15
+ if (cfg.reports.directory) {
16
+ const date = new Date();
17
+ writeFileSync(path.join(`${cfg.reports.directory}`, `${cfg.reports.name}_${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}.${cfg.format.toLowerCase()}`), outputContent);
18
+ }
19
+ switch (cfg.output) {
20
+ case 'webhook':
21
+ if (!cfg.config.url) {
22
+ console.error('No valid Webhook URL given');
23
+ throw new Error('Please provide a valid --webhookUrl parameter');
24
+ }
25
+ try {
26
+ console.log(`Sending report via webhook to ${cfg.config.type} ....`);
27
+ await post2Webhook(cfg.config.type, cfg.config.url, cfg.config.title, outputContent, cfg.config.message);
28
+ console.log('Done sending.');
29
+ }
30
+ catch (e) {
31
+ switch (e.code || e.message) {
32
+ case 'Request failed with status code 400':
33
+ console.error('Invalid Teams Webhook Payload. Check your params.');
34
+ throw new Error('Invalid Teams Payload');
35
+ case 'slack_webhook_http_error':
36
+ console.error('Invalid Slack Webhook Payload. Check your params.');
37
+ throw new Error('Invalid Slack Payload');
38
+ default:
39
+ console.error(`Error during sending webhook.(${e === null || e === void 0 ? void 0 : e.code})`, e === null || e === void 0 ? void 0 : e.original);
40
+ throw e;
41
+ }
42
+ }
43
+ break;
44
+ // defaulting to standard out
45
+ default:
46
+ console.log(outputContent);
47
+ }
48
+ }
49
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../lib/report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAkB;IAC9C,IAAI,aAAqB,CAAC;IAC1B,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,KAAK;YACR,aAAa,GAAG,CAAC,MAAM,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC7D,MAAM;QACR,qBAAqB;QACrB;YACE,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,aAAa,CACX,IAAI,CAAC,IAAI,CACP,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAC1B,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,CACjH,EACD,aAAa,CACd,CAAC;IACJ,CAAC;IACD,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,SAAS;YACZ,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,CAAC,GAAG,CAAC,iCAAiC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC;gBACrE,MAAM,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACzG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;oBAC5B,KAAK,qCAAqC;wBACxC,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;wBACnE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAC3C,KAAK,0BAA0B;wBAC7B,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;wBACnE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAC3C;wBACE,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,GAAG,EAAE,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,QAAQ,CAAC,CAAC;wBACxE,MAAM,CAAC,CAAC;gBACZ,CAAC;YACH,CAAC;YACD,MAAM;QACR,6BAA6B;QAC7B;YACE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
package/dist/lib/user.js CHANGED
@@ -92,6 +92,9 @@ export async function userListing(client) {
92
92
  }
93
93
  else {
94
94
  const users = await client.userListing();
95
+ if ('error' in users) {
96
+ return new Promise((_resolve, reject) => reject(new Error('Auditing endpoint not reachable')));
97
+ }
95
98
  for (const user of users) {
96
99
  allUsers.push({
97
100
  username: user.username,
@@ -1 +1 @@
1
- {"version":3,"file":"user.js","sourceRoot":"","sources":["../../lib/user.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../lib/user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export class WebhookConfig {
2
+ constructor(type, url, title, message) {
3
+ this.type = type;
4
+ this.url = url;
5
+ this.title = title;
6
+ this.message = message;
7
+ }
8
+ }
9
+ class ReportConfig {
10
+ }
11
+ export class ConvertConfig {
12
+ constructor(format, output, reports, config, json) {
13
+ this.format = format;
14
+ this.output = output;
15
+ this.reports = reports;
16
+ this.config = config;
17
+ this.json = json;
18
+ }
19
+ }
20
+ export function getConvertConfig(config, argv, name, title, json) {
21
+ return new ConvertConfig(config.format ? config.format : argv.format, config.output ? config.output : argv.output, {
22
+ name,
23
+ directory: argv.reports ? argv.reports : config.reports,
24
+ }, new WebhookConfig(config.webhookType ? config.webhookType : argv.webhookType, config.webhookUrl ? config.webhookUrl : argv.webhookUrl, title, config.webhookMessage ? config.webhookMessage : argv.webhookMessage), json);
25
+ }
26
+ export function getKeycloakConfig(config, argv) {
27
+ return {
28
+ clientId: config.clientId ? config.clientId : argv === null || argv === void 0 ? void 0 : argv.clientId,
29
+ clientSecret: config.clientSecret ? config.clientSecret : argv === null || argv === void 0 ? void 0 : argv.clientSecret,
30
+ rootUrl: config.url ? config.url : argv === null || argv === void 0 ? void 0 : argv.url,
31
+ useAuditingEndpoint: 'useAuditingEndpoint' in argv
32
+ ? String(argv.useAuditingEndpoint).toLowerCase() == 'true'
33
+ : String(config.useAuditingEndpoint).toLowerCase() == 'true',
34
+ };
35
+ }
36
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IAKxB,YAAY,IAAY,EAAE,GAAW,EAAE,KAAa,EAAE,OAAgB;QACpE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,YAAY;CAGjB;AAED,MAAM,OAAO,aAAa;IAMxB,YAAY,MAAc,EAAE,MAAc,EAAE,OAAqB,EAAE,MAAqB,EAAE,IAAY;QACpG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AACD,MAAM,UAAU,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAY,EAAE,KAAa,EAAE,IAAY;IACtF,OAAO,IAAI,aAAa,CACtB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,IAAI,CAAC,MAAiB,EACvD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,IAAI,CAAC,MAAiB,EACvD;QACE,IAAI;QACJ,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,IAAI,CAAC,OAAkB,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO;KACpE,EACD,IAAI,aAAa,CACf,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAE,IAAI,CAAC,WAAsB,EACtE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAE,IAAI,CAAC,UAAqB,EACnE,KAAK,EACL,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAE,IAAI,CAAC,cAAyB,CAChF,EACD,IAAI,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAM,EAAE,IAAI;IAC5C,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAmB;QACxE,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAuB;QACxF,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAc;QACxD,mBAAmB,EACjB,qBAAqB,IAAI,IAAI;YAC3B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM;YAC1D,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM;KACjE,CAAC;AACJ,CAAC"}
@@ -9,22 +9,20 @@ function kcClient(options) {
9
9
  });
10
10
  }
11
11
  export async function listUsers(options) {
12
- const users = await userListing(await kcClient(options));
13
- return new Promise((resolve) => resolve(users));
12
+ return userListing(await kcClient(options));
14
13
  }
15
14
  export async function listClients(options) {
16
- const clients = await clientListing(await kcClient(options));
17
- return new Promise((resolve) => resolve(clients));
15
+ return clientListing(await kcClient(options));
18
16
  }
19
17
  /* eslint-disable @typescript-eslint/no-explicit-any */
20
18
  export async function configTest(options) {
21
19
  try {
22
- await userListing(await kcClient(options));
23
- console.log(`Connection to ${options.rootUrl} was successfull`);
20
+ const users = await userListing(await kcClient(options));
21
+ console.log(`Connection to ${options.rootUrl} was successfull: ${users.length} users found.`);
24
22
  }
25
23
  catch (e) {
26
- console.error(`Connection to ${options.rootUrl} was not: successfull`, e.response);
27
- return Promise.reject(e.response.statusText);
24
+ console.error(`Connection to ${options.rootUrl} was not successfull`, e);
25
+ return;
28
26
  }
29
27
  }
30
28
  //# sourceMappingURL=commands.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/commands.ts"],"names":[],"mappings":"AAMA,OAAO,EAAW,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAQ,WAAW,EAAE,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAE1E,SAAS,QAAQ,CAAC,OAAgB;IAChC,OAAO,YAAY,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;KACjD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAgB;IAC9C,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB;IAChD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC;AACD,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,OAAO,kBAAkB,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,iBAAiB,OAAO,CAAC,OAAO,uBAAuB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/commands.ts"],"names":[],"mappings":"AAMA,OAAO,EAAW,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAQ,WAAW,EAAE,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAE1E,SAAS,QAAQ,CAAC,OAAgB;IAChC,OAAO,YAAY,CAAC;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;KACjD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAgB;IAC9C,OAAO,WAAW,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB;IAChD,OAAO,aAAa,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAChD,CAAC;AACD,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,OAAO,qBAAqB,KAAK,CAAC,MAAM,eAAe,CAAC,CAAC;IAChG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,iBAAiB,OAAO,CAAC,OAAO,sBAAsB,EAAE,CAAC,CAAC,CAAC;QACzE,OAAO;IACT,CAAC;AACH,CAAC"}
@@ -5,49 +5,35 @@ import { spawn } from 'node:child_process';
5
5
  import path from 'node:path';
6
6
 
7
7
  test('Should use config file', { timeout: 3000 }, (t) => {
8
- const cli = spawn(
9
- path.join(path.dirname('.'), 'node'),
10
- [
11
- 'dist/cli.js',
12
- 'listClients'
13
- ],
14
- {
15
- env: {
16
- CONFIG_FILE: process.cwd() + '/e2e/fixtures/config.json',
17
- ...process.env,
18
- },
19
- }
20
- );
8
+ const cli = spawn(path.join(path.dirname('.'), 'node'), ['dist/cli.js', 'listClients'], {
9
+ env: {
10
+ CONFIG_FILE: process.cwd() + '/e2e/fixtures/config.json',
11
+ ...process.env,
12
+ },
13
+ });
21
14
  cli.stdout.on('data', (chunk) => {
22
15
  console.log('Response', JSON.parse(chunk.toString()));
23
16
  t.equal(JSON.parse(chunk.toString()).length, 24);
24
17
  t.end();
25
18
  });
26
19
  cli.stderr.on('data', (msg) => {
27
- t.fail(msg)
20
+ t.fail(msg);
28
21
  });
29
22
  });
30
23
 
31
24
  test('Should validate config', { timeout: 3000 }, (t) => {
32
- const cli = spawn(
33
- path.join(path.dirname('.'), 'node'),
34
- [
35
- 'dist/cli.js',
36
- 'configTest'
37
- ],
38
- {
39
- env: {
40
- CONFIG_FILE: process.cwd() + '/e2e/fixtures/config.json',
41
- ...process.env,
42
- },
43
- }
44
- );
25
+ const cli = spawn(path.join(path.dirname('.'), 'node'), ['dist/cli.js', 'configTest'], {
26
+ env: {
27
+ CONFIG_FILE: process.cwd() + '/e2e/fixtures/config.json',
28
+ ...process.env,
29
+ },
30
+ });
45
31
  cli.stdout.on('data', (chunk) => {
46
- console.log(chunk.toString())
47
- t.equal(chunk.toString(), 'Connection to http://localhost:8080 was successfull\n');
32
+ console.log(chunk.toString());
33
+ t.equal(chunk.toString(), 'Connection to http://localhost:8080 was successfull: 3 users found.\n');
48
34
  t.end();
49
35
  });
50
36
  cli.stderr.on('data', (msg) => {
51
- t.fail(msg)
37
+ t.fail(msg);
52
38
  });
53
39
  });
package/lib/client.ts CHANGED
@@ -23,9 +23,8 @@ export async function createClient(options: Options): Promise<KcAdminClient | Au
23
23
  grantType: 'client_credentials',
24
24
  });
25
25
  } catch (e) {
26
- console.error('Check Client Config:', e.response ? e.response.data.error_description : e);
27
- return Promise.reject();
26
+ console.error('Check Client Config:', e.response ? e.responseData.error_description : e);
27
+ return Promise.reject(e.response ? e.responseData.error_description : e);
28
28
  }
29
-
30
- return new Promise((resolve) => resolve(kcAdminClient));
29
+ return Promise.resolve(kcAdminClient);
31
30
  }
package/lib/report.ts ADDED
@@ -0,0 +1,55 @@
1
+ import { writeFileSync } from 'node:fs';
2
+ import path from 'path';
3
+ import { convertJSON2CSV } from './convert.js';
4
+ import { post2Webhook } from './output.js';
5
+ import { ConvertConfig } from './utils.js';
6
+
7
+ export async function convert(cfg: ConvertConfig) {
8
+ let outputContent: string;
9
+ switch (cfg.format) {
10
+ case 'csv':
11
+ outputContent = (await convertJSON2CSV(cfg.json)).toString();
12
+ break;
13
+ // defaulting to JSON
14
+ default:
15
+ outputContent = JSON.stringify(cfg.json);
16
+ }
17
+ if (cfg.reports.directory) {
18
+ const date = new Date();
19
+ writeFileSync(
20
+ path.join(
21
+ `${cfg.reports.directory}`,
22
+ `${cfg.reports.name}_${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}.${cfg.format.toLowerCase()}`
23
+ ),
24
+ outputContent
25
+ );
26
+ }
27
+ switch (cfg.output) {
28
+ case 'webhook':
29
+ if (!cfg.config.url) {
30
+ console.error('No valid Webhook URL given');
31
+ throw new Error('Please provide a valid --webhookUrl parameter');
32
+ }
33
+ try {
34
+ console.log(`Sending report via webhook to ${cfg.config.type} ....`);
35
+ await post2Webhook(cfg.config.type, cfg.config.url, cfg.config.title, outputContent, cfg.config.message);
36
+ console.log('Done sending.');
37
+ } catch (e) {
38
+ switch (e.code || e.message) {
39
+ case 'Request failed with status code 400':
40
+ console.error('Invalid Teams Webhook Payload. Check your params.');
41
+ throw new Error('Invalid Teams Payload');
42
+ case 'slack_webhook_http_error':
43
+ console.error('Invalid Slack Webhook Payload. Check your params.');
44
+ throw new Error('Invalid Slack Payload');
45
+ default:
46
+ console.error(`Error during sending webhook.(${e?.code})`, e?.original);
47
+ throw e;
48
+ }
49
+ }
50
+ break;
51
+ // defaulting to standard out
52
+ default:
53
+ console.log(outputContent);
54
+ }
55
+ }
package/lib/user.ts CHANGED
@@ -119,6 +119,9 @@ export async function userListing(
119
119
  });
120
120
  } else {
121
121
  const users = await client.userListing();
122
+ if ('error' in users) {
123
+ return new Promise((_resolve, reject) => reject(new Error('Auditing endpoint not reachable')));
124
+ }
122
125
  for (const user of users) {
123
126
  allUsers.push({
124
127
  username: user.username,
package/lib/utils.ts ADDED
@@ -0,0 +1,63 @@
1
+ import { Options } from './client.js';
2
+
3
+ export class WebhookConfig {
4
+ type: string;
5
+ url: string;
6
+ title: string;
7
+ message?: string;
8
+ constructor(type: string, url: string, title: string, message?: string) {
9
+ this.type = type;
10
+ this.url = url;
11
+ this.title = title;
12
+ this.message = message;
13
+ }
14
+ }
15
+
16
+ class ReportConfig {
17
+ name: string;
18
+ directory: string;
19
+ }
20
+
21
+ export class ConvertConfig {
22
+ format: string;
23
+ output: string;
24
+ reports: ReportConfig;
25
+ config: WebhookConfig;
26
+ json: object;
27
+ constructor(format: string, output: string, reports: ReportConfig, config: WebhookConfig, json: object) {
28
+ this.format = format;
29
+ this.output = output;
30
+ this.reports = reports;
31
+ this.config = config;
32
+ this.json = json;
33
+ }
34
+ }
35
+ export function getConvertConfig(config, argv, name: string, title: string, json: object): ConvertConfig {
36
+ return new ConvertConfig(
37
+ config.format ? config.format : (argv.format as string),
38
+ config.output ? config.output : (argv.output as string),
39
+ {
40
+ name,
41
+ directory: argv.reports ? (argv.reports as string) : config.reports,
42
+ },
43
+ new WebhookConfig(
44
+ config.webhookType ? config.webhookType : (argv.webhookType as string),
45
+ config.webhookUrl ? config.webhookUrl : (argv.webhookUrl as string),
46
+ title,
47
+ config.webhookMessage ? config.webhookMessage : (argv.webhookMessage as string)
48
+ ),
49
+ json
50
+ );
51
+ }
52
+
53
+ export function getKeycloakConfig(config, argv): Options {
54
+ return {
55
+ clientId: config.clientId ? config.clientId : (argv?.clientId as string),
56
+ clientSecret: config.clientSecret ? config.clientSecret : (argv?.clientSecret as string),
57
+ rootUrl: config.url ? config.url : (argv?.url as string),
58
+ useAuditingEndpoint:
59
+ 'useAuditingEndpoint' in argv
60
+ ? String(argv.useAuditingEndpoint).toLowerCase() == 'true'
61
+ : String(config.useAuditingEndpoint).toLowerCase() == 'true',
62
+ };
63
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@continuoussecuritytooling/keycloak-reporter",
3
- "version": "0.8.4",
3
+ "version": "0.8.7",
4
4
  "description": "Reporting Tools for Keycloak",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
package/src/commands.ts CHANGED
@@ -17,21 +17,19 @@ function kcClient(options: Options): Promise<KcAdminClient | AuditClient> {
17
17
  }
18
18
 
19
19
  export async function listUsers(options: Options): Promise<Array<User | AuditedUserRepresentation>> {
20
- const users = await userListing(await kcClient(options));
21
- return new Promise((resolve) => resolve(users));
20
+ return userListing(await kcClient(options));
22
21
  }
23
22
 
24
23
  export async function listClients(options: Options): Promise<Array<Client | AuditedClientRepresentation>> {
25
- const clients = await clientListing(await kcClient(options));
26
- return new Promise((resolve) => resolve(clients));
24
+ return clientListing(await kcClient(options));
27
25
  }
28
26
  /* eslint-disable @typescript-eslint/no-explicit-any */
29
- export async function configTest(options: Options): Promise<any> {
27
+ export async function configTest(options: Options) {
30
28
  try {
31
- await userListing(await kcClient(options));
32
- console.log(`Connection to ${options.rootUrl} was successfull`);
29
+ const users = await userListing(await kcClient(options));
30
+ console.log(`Connection to ${options.rootUrl} was successfull: ${users.length} users found.`);
33
31
  } catch (e) {
34
- console.error(`Connection to ${options.rootUrl} was not: successfull`, e.response);
35
- return Promise.reject(e.response.statusText);
32
+ console.error(`Connection to ${options.rootUrl} was not successfull`, e);
33
+ return;
36
34
  }
37
35
  }
@@ -0,0 +1,28 @@
1
+ /// <reference types="jest-extended" />
2
+ import { getKeycloakConfig } from '../lib/utils';
3
+ test('no config', () => {
4
+ expect(getKeycloakConfig({}, {})).toEqual({
5
+ clientId: undefined,
6
+ clientSecret: undefined,
7
+ rootUrl: undefined,
8
+ useAuditingEndpoint: false,
9
+ });
10
+ });
11
+
12
+ test('config with useAuditingEndpoint', () => {
13
+ expect(getKeycloakConfig({ useAuditingEndpoint: 'true' }, {})).toEqual({
14
+ clientId: undefined,
15
+ clientSecret: undefined,
16
+ rootUrl: undefined,
17
+ useAuditingEndpoint: true,
18
+ });
19
+ });
20
+
21
+ test('argv with useAuditingEndpoint', () => {
22
+ expect(getKeycloakConfig({}, { useAuditingEndpoint: 'true' })).toEqual({
23
+ clientId: undefined,
24
+ clientSecret: undefined,
25
+ rootUrl: undefined,
26
+ useAuditingEndpoint: true,
27
+ });
28
+ });