@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 +27 -2
- package/charts/keycloak-reporter/Chart.yaml +2 -2
- package/cli.ts +6 -100
- package/dist/cli.js +5 -73
- package/dist/cli.js.map +1 -1
- package/dist/lib/client.js +3 -3
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/report.js +49 -0
- package/dist/lib/report.js.map +1 -0
- package/dist/lib/user.js +3 -0
- package/dist/lib/user.js.map +1 -1
- package/dist/lib/utils.js +36 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/src/commands.js +6 -8
- package/dist/src/commands.js.map +1 -1
- package/e2e/spec/config.js +16 -30
- package/lib/client.ts +3 -4
- package/lib/report.ts +55 -0
- package/lib/user.ts +3 -0
- package/lib/utils.ts +63 -0
- package/package.json +1 -1
- package/src/commands.ts +7 -9
- package/test/utils.spec.ts +28 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,31 @@
|
|
|
1
|
-
## [0.8.
|
|
1
|
+
## [0.8.7](https://github.com/ContinuousSecurityTooling/keycloak-reporter/compare/v0.8.6...v0.8.7) (2024-01-29)
|
|
2
2
|
|
|
3
|
-
|
|
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.
|
|
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.
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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":";AAEA,OAAO,
|
|
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"}
|
package/dist/lib/client.js
CHANGED
|
@@ -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.
|
|
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
|
|
22
|
+
return Promise.resolve(kcAdminClient);
|
|
23
23
|
}
|
|
24
24
|
//# sourceMappingURL=client.js.map
|
package/dist/lib/client.js.map
CHANGED
|
@@ -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,
|
|
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,
|
package/dist/lib/user.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../lib/user.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,iCAAiC,CAAC;AA2B5D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAmC;IAEnC,IAAI,UAAU,GAAG,IAAI,KAAK,EAAwC,CAAC;IACnE,IAAI,MAAM,YAAY,aAAa,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;QACtC,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,sBAAsB;YACtB,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC3D,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,eAAe;YACf,MAAM,CAAC,SAAS,CAAC;gBACf,SAAS,EAAE,KAAK,CAAC,KAAK;aACvB,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,KAAK,EAAU,CAAC;YACzC,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC/C,YAAY,CAAC,IAAI,CAAC;oBAChB,MAAM,EAAE,IAAI,CAAC,QAAQ;oBACrB,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,MAAM,EAAE,IAAI,CAAC,YAAY;oBACzB,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;iBAChD,CAAC,CAAC;YACL,CAAC;YACD,UAAU,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,YAAY,CAAC,CAAC;QAChD,CAAC;QACD,uBAAuB;QACvB,MAAM,CAAC,SAAS,CAAC;YACf,SAAS,EAAE,YAAY;SACxB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC;gBACd,MAAM,EAAE,IAAI,CAAC,QAAQ;gBACrB,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,CAAC,YAAY;gBACzB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAmC;IAEnC,IAAI,QAAQ,GAAG,IAAI,KAAK,EAAoC,CAAC;IAC7D,IAAI,MAAM,YAAY,aAAa,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC;QACtC,IAAI,MAAM,CAAC;QACX,sBAAsB;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC3D,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,eAAe;YACf,MAAM,CAAC,SAAS,CAAC;gBACf,SAAS,EAAE,KAAK,CAAC,KAAK;aACvB,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,KAAK,EAAQ,CAAC;YACrC,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC7C,UAAU,CAAC,IAAI,CAAC;oBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,OAAO,EAAE,IAAI,CAAC,OAAO;iBACtB,CAAC,CAAC;YACL,CAAC;YACD,QAAQ,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,UAAU,CAAC,CAAC;QAC1C,CAAC;QACD,uBAAuB;QACvB,MAAM,CAAC,SAAS,CAAC;YACf,SAAS,EAAE,YAAY;SACxB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,QAAQ,CAAC,IAAI,CAAC;gBACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
|
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"}
|
package/dist/src/commands.js
CHANGED
|
@@ -9,22 +9,20 @@ function kcClient(options) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
export async function listUsers(options) {
|
|
12
|
-
|
|
13
|
-
return new Promise((resolve) => resolve(users));
|
|
12
|
+
return userListing(await kcClient(options));
|
|
14
13
|
}
|
|
15
14
|
export async function listClients(options) {
|
|
16
|
-
|
|
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
|
|
27
|
-
return
|
|
24
|
+
console.error(`Connection to ${options.rootUrl} was not successfull`, e);
|
|
25
|
+
return;
|
|
28
26
|
}
|
|
29
27
|
}
|
|
30
28
|
//# sourceMappingURL=commands.js.map
|
package/dist/src/commands.js.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/e2e/spec/config.js
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
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.
|
|
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
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
|
-
|
|
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
|
-
|
|
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)
|
|
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
|
|
35
|
-
return
|
|
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
|
+
});
|