@continuoussecuritytooling/keycloak-reporter 1.0.6 → 1.1.0-2363
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/Dockerfile +1 -1
- package/charts/keycloak-reporter/Chart.yaml +1 -1
- package/charts/keycloak-reporter/README.md +2 -2
- package/charts/keycloak-reporter/values.yaml +1 -0
- package/cli.ts +7 -1
- package/config/schema.json +6 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/schema.json +6 -1
- package/dist/lib/client.js +2 -1
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/logger.js +13 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/report.js +8 -7
- package/dist/lib/report.js.map +1 -1
- package/dist/lib/user.js +3 -2
- package/dist/lib/user.js.map +1 -1
- package/dist/lib/utils.js +15 -0
- package/dist/lib/utils.js.map +1 -1
- package/dist/src/commands.js +3 -2
- package/dist/src/commands.js.map +1 -1
- package/e2e/spec/config.js +1 -1
- package/lib/client.ts +2 -1
- package/lib/logger.ts +15 -0
- package/lib/report.ts +8 -7
- package/lib/user.ts +3 -2
- package/lib/utils.ts +24 -0
- package/package.json +4 -2
- package/src/commands.ts +3 -2
- package/continuoussecuritytooling-keycloak-reporting-cli-latest_digest.txt +0 -1
- package/keycloak-reporter-1.3.11.tgz +0 -0
package/Dockerfile
CHANGED
|
@@ -15,7 +15,7 @@ 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.
|
|
18
|
+
version: 1.4.0
|
|
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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# keycloak-reporter
|
|
2
2
|
|
|
3
|
-
  
|
|
4
4
|
|
|
5
5
|
Keycloak user and client reporting tool for automated regular access checks.
|
|
6
6
|
|
|
@@ -22,7 +22,7 @@ Keycloak user and client reporting tool for automated regular access checks.
|
|
|
22
22
|
| image.repository | string | `"continuoussecuritytooling/keycloak-reporting-cli"` | |
|
|
23
23
|
| image.tag | string | `""` | |
|
|
24
24
|
| imagePullSecrets | list | `[]` | |
|
|
25
|
-
| keycloak | map | `{"config":{"clientId":"","clientSecret":"","output":"webhook","url":"","useAuditingEndpoint":false,"webhookMessage":"","webhookType":"","webhookUrl":""},"volumes":{"reports":""}}` | Keycloak configuration |
|
|
25
|
+
| keycloak | map | `{"config":{"clientId":"","clientSecret":"","jsonLogFormat":false,"output":"webhook","url":"","useAuditingEndpoint":false,"webhookMessage":"","webhookType":"","webhookUrl":""},"volumes":{"reports":""}}` | Keycloak configuration |
|
|
26
26
|
| keycloak.config.webhookMessage | string | `""` | optional message for the webhook post |
|
|
27
27
|
| nameOverride | string | `""` | |
|
|
28
28
|
| nodeSelector | object | `{}` | |
|
package/cli.ts
CHANGED
|
@@ -66,7 +66,13 @@ yargs(hideBin(process.argv))
|
|
|
66
66
|
alias: 'a',
|
|
67
67
|
type: 'boolean',
|
|
68
68
|
default: false,
|
|
69
|
-
description: 'use
|
|
69
|
+
description: 'use auditor rest endpoint',
|
|
70
|
+
})
|
|
71
|
+
.option('jsonLogFormat', {
|
|
72
|
+
alias: 'a',
|
|
73
|
+
type: 'boolean',
|
|
74
|
+
default: false,
|
|
75
|
+
description: 'use JSON log format',
|
|
70
76
|
})
|
|
71
77
|
.command(
|
|
72
78
|
'configTest [url] [clientId] [clientSecret]',
|
package/config/schema.json
CHANGED
|
@@ -65,6 +65,11 @@
|
|
|
65
65
|
"type": "boolean",
|
|
66
66
|
"default": "false",
|
|
67
67
|
"description": "Enable usage of keycloak reporter auditing endpoint"
|
|
68
|
+
},
|
|
69
|
+
"jsonLogFormat": {
|
|
70
|
+
"type": "boolean",
|
|
71
|
+
"default": "false",
|
|
72
|
+
"description": "Enable json log format"
|
|
68
73
|
}
|
|
69
74
|
}
|
|
70
|
-
}
|
|
75
|
+
}
|
package/dist/cli.js
CHANGED
|
@@ -56,7 +56,13 @@ yargs(hideBin(process.argv))
|
|
|
56
56
|
alias: 'a',
|
|
57
57
|
type: 'boolean',
|
|
58
58
|
default: false,
|
|
59
|
-
description: 'use
|
|
59
|
+
description: 'use auditor rest endpoint',
|
|
60
|
+
})
|
|
61
|
+
.option('jsonLogFormat', {
|
|
62
|
+
alias: 'a',
|
|
63
|
+
type: 'boolean',
|
|
64
|
+
default: false,
|
|
65
|
+
description: 'use JSON log format',
|
|
60
66
|
})
|
|
61
67
|
.command('configTest [url] [clientId] [clientSecret]', 'validates keycloak configuration by reading data via REST API',
|
|
62
68
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,2BAA2B;CACzC,CAAC;KACD,MAAM,CAAC,eAAe,EAAE;IACvB,KAAK,EAAE,GAAG;IACV,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,KAAK;IACd,WAAW,EAAE,qBAAqB;CACnC,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/config/schema.json
CHANGED
|
@@ -65,6 +65,11 @@
|
|
|
65
65
|
"type": "boolean",
|
|
66
66
|
"default": "false",
|
|
67
67
|
"description": "Enable usage of keycloak reporter auditing endpoint"
|
|
68
|
+
},
|
|
69
|
+
"jsonLogFormat": {
|
|
70
|
+
"type": "boolean",
|
|
71
|
+
"default": "false",
|
|
72
|
+
"description": "Enable json log format"
|
|
68
73
|
}
|
|
69
74
|
}
|
|
70
|
-
}
|
|
75
|
+
}
|
package/dist/lib/client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import KcAdminClient from '@keycloak/keycloak-admin-client';
|
|
2
2
|
import { AuditClient } from '@continuoussecuritytooling/keycloak-auditor';
|
|
3
|
+
import logger from './logger.js';
|
|
3
4
|
export async function createClient(options) {
|
|
4
5
|
const kcAdminClient = options.useAuditingEndpoint
|
|
5
6
|
? new AuditClient(options.rootUrl, 'master')
|
|
@@ -16,7 +17,7 @@ export async function createClient(options) {
|
|
|
16
17
|
});
|
|
17
18
|
}
|
|
18
19
|
catch (e) {
|
|
19
|
-
|
|
20
|
+
logger.error('Check Client Config:', e.response ? e.responseData.error_description : e);
|
|
20
21
|
return Promise.reject(e.response ? e.responseData.error_description : e);
|
|
21
22
|
}
|
|
22
23
|
return Promise.resolve(kcAdminClient);
|
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;
|
|
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;AAC1E,OAAO,MAAM,MAAM,aAAa,CAAC;AASjC,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,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,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,13 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
import { ecsFormat } from '@elastic/ecs-winston-format';
|
|
3
|
+
import config from '../src/config.js';
|
|
4
|
+
import { getAppConfig } from './utils.js';
|
|
5
|
+
const appConfig = getAppConfig(config, process.argv);
|
|
6
|
+
const logger = appConfig.json
|
|
7
|
+
? winston.createLogger({
|
|
8
|
+
format: ecsFormat( /* options */),
|
|
9
|
+
transports: [new winston.transports.Console()],
|
|
10
|
+
})
|
|
11
|
+
: console;
|
|
12
|
+
export default logger;
|
|
13
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AAErD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI;IAC3B,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;QACnB,MAAM,EAAE,SAAS,EAAC,aAAa,CAAC;QAChC,UAAU,EAAE,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;KAC/C,CAAC;IACJ,CAAC,CAAC,OAAO,CAAC;AAEZ,eAAe,MAAM,CAAC"}
|
package/dist/lib/report.js
CHANGED
|
@@ -2,6 +2,7 @@ import { writeFileSync } from 'node:fs';
|
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { convertJSON2CSV } from './convert.js';
|
|
4
4
|
import { post2Webhook } from './output.js';
|
|
5
|
+
import logger from './logger.js';
|
|
5
6
|
export async function convert(cfg) {
|
|
6
7
|
let outputContent;
|
|
7
8
|
switch (cfg.format) {
|
|
@@ -19,31 +20,31 @@ export async function convert(cfg) {
|
|
|
19
20
|
switch (cfg.output) {
|
|
20
21
|
case 'webhook':
|
|
21
22
|
if (!cfg.config.url) {
|
|
22
|
-
|
|
23
|
+
logger.error('No valid Webhook URL given');
|
|
23
24
|
throw new Error('Please provide a valid --webhookUrl parameter');
|
|
24
25
|
}
|
|
25
26
|
try {
|
|
26
|
-
|
|
27
|
+
logger.info(`Sending report via webhook to ${cfg.config.type} ....`);
|
|
27
28
|
await post2Webhook(cfg.config.type, cfg.config.url, cfg.config.title, outputContent, cfg.config.message);
|
|
28
|
-
|
|
29
|
+
logger.info('Done sending.');
|
|
29
30
|
}
|
|
30
31
|
catch (e) {
|
|
31
32
|
switch (e.code || e.message) {
|
|
32
33
|
case 'Request failed with status code 400':
|
|
33
|
-
|
|
34
|
+
logger.error('Invalid Teams Webhook Payload. Check your params.');
|
|
34
35
|
throw new Error('Invalid Teams Payload');
|
|
35
36
|
case 'slack_webhook_http_error':
|
|
36
|
-
|
|
37
|
+
logger.error('Invalid Slack Webhook Payload. Check your params.');
|
|
37
38
|
throw new Error('Invalid Slack Payload');
|
|
38
39
|
default:
|
|
39
|
-
|
|
40
|
+
logger.error(`Error during sending webhook.(${e === null || e === void 0 ? void 0 : e.code})`, e === null || e === void 0 ? void 0 : e.original);
|
|
40
41
|
throw e;
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
44
|
break;
|
|
44
45
|
// defaulting to standard out
|
|
45
46
|
default:
|
|
46
|
-
|
|
47
|
+
logger.info(outputContent);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
//# sourceMappingURL=report.js.map
|
package/dist/lib/report.js.map
CHANGED
|
@@ -1 +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;
|
|
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;AAE3C,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,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,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;gBAC3C,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,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,MAAM,CAAC,IAAI,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,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;wBAClE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAC3C,KAAK,0BAA0B;wBAC7B,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;wBAClE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;oBAC3C;wBACE,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,IAAI,GAAG,EAAE,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,QAAQ,CAAC,CAAC;wBACvE,MAAM,CAAC,CAAC;gBACZ,CAAC;YACH,CAAC;YACD,MAAM;QACR,6BAA6B;QAC7B;YACE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC"}
|
package/dist/lib/user.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import KcAdminClient from '@keycloak/keycloak-admin-client';
|
|
2
|
+
import logger from './logger.js';
|
|
2
3
|
export async function clientListing(client) {
|
|
3
4
|
let allClients = new Array();
|
|
4
5
|
if (client instanceof KcAdminClient) {
|
|
@@ -9,7 +10,7 @@ export async function clientListing(client) {
|
|
|
9
10
|
realms = await client.realms.find();
|
|
10
11
|
}
|
|
11
12
|
catch (e) {
|
|
12
|
-
|
|
13
|
+
logger.error('Check Client role:', e.response.statusText);
|
|
13
14
|
return Promise.reject(new Error('Client Role Error'));
|
|
14
15
|
}
|
|
15
16
|
for (const realm of realms) {
|
|
@@ -63,7 +64,7 @@ export async function userListing(client) {
|
|
|
63
64
|
realms = await client.realms.find();
|
|
64
65
|
}
|
|
65
66
|
catch (e) {
|
|
66
|
-
|
|
67
|
+
logger.error('Check Client role:', e.response.statusText);
|
|
67
68
|
return Promise.reject(new Error('Client Role Error'));
|
|
68
69
|
}
|
|
69
70
|
for (const realm of realms) {
|
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;
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../lib/user.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/utils.js
CHANGED
|
@@ -6,6 +6,11 @@ export class WebhookConfig {
|
|
|
6
6
|
this.message = message;
|
|
7
7
|
}
|
|
8
8
|
}
|
|
9
|
+
export class LogConfig {
|
|
10
|
+
constructor(json = false) {
|
|
11
|
+
this.json = json;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
9
14
|
class ReportConfig {
|
|
10
15
|
}
|
|
11
16
|
export class ConvertConfig {
|
|
@@ -17,12 +22,22 @@ export class ConvertConfig {
|
|
|
17
22
|
this.json = json;
|
|
18
23
|
}
|
|
19
24
|
}
|
|
25
|
+
export class AppConfig {
|
|
26
|
+
constructor(logConfig) {
|
|
27
|
+
this.log = logConfig;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
20
30
|
export function getConvertConfig(config, argv, name, title, json) {
|
|
21
31
|
return new ConvertConfig(config.format ? config.format : argv.format, config.output ? config.output : argv.output, {
|
|
22
32
|
name,
|
|
23
33
|
directory: argv.reports ? argv.reports : config.reports,
|
|
24
34
|
}, new WebhookConfig(config.webhookType ? config.webhookType : argv.webhookType, config.webhookUrl ? config.webhookUrl : argv.webhookUrl, title, config.webhookMessage ? config.webhookMessage : argv.webhookMessage), json);
|
|
25
35
|
}
|
|
36
|
+
export function getAppConfig(config, argv) {
|
|
37
|
+
return new AppConfig(new LogConfig('jsonLogFormat' in argv
|
|
38
|
+
? String(argv.jsonLogFormat).toLowerCase() == 'true'
|
|
39
|
+
: String(config.jsonLogFormat).toLowerCase() == 'true'));
|
|
40
|
+
}
|
|
26
41
|
export function getKeycloakConfig(config, argv) {
|
|
27
42
|
return {
|
|
28
43
|
clientId: config.clientId ? config.clientId : argv === null || argv === void 0 ? void 0 : argv.clientId,
|
package/dist/lib/utils.js.map
CHANGED
|
@@ -1 +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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/src/commands.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createClient } from '../lib/client.js';
|
|
2
2
|
import { userListing, clientListing } from '../lib/user.js';
|
|
3
|
+
import logger from '../lib/logger.js';
|
|
3
4
|
function kcClient(options) {
|
|
4
5
|
return createClient({
|
|
5
6
|
clientId: options.clientId,
|
|
@@ -18,10 +19,10 @@ export async function listClients(options) {
|
|
|
18
19
|
export async function configTest(options) {
|
|
19
20
|
try {
|
|
20
21
|
const users = await userListing(await kcClient(options));
|
|
21
|
-
|
|
22
|
+
logger.info(`Connection to ${options.rootUrl} was successful: ${users.length} users found.`);
|
|
22
23
|
}
|
|
23
24
|
catch (e) {
|
|
24
|
-
|
|
25
|
+
logger.error(`Connection to ${options.rootUrl} was not successful`, e);
|
|
25
26
|
return;
|
|
26
27
|
}
|
|
27
28
|
}
|
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;
|
|
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;AAC1E,OAAO,MAAM,MAAM,kBAAkB,CAAC;AAEtC,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,MAAM,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,OAAO,oBAAoB,KAAK,CAAC,MAAM,eAAe,CAAC,CAAC;IAC/F,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,iBAAiB,OAAO,CAAC,OAAO,qBAAqB,EAAE,CAAC,CAAC,CAAC;QACvE,OAAO;IACT,CAAC;AACH,CAAC"}
|
package/e2e/spec/config.js
CHANGED
|
@@ -30,7 +30,7 @@ test('Should validate config', { timeout: 3000 }, (t) => {
|
|
|
30
30
|
});
|
|
31
31
|
cli.stdout.on('data', (chunk) => {
|
|
32
32
|
console.log(chunk.toString());
|
|
33
|
-
t.equal(chunk.toString(), 'Connection to http://localhost:8080 was
|
|
33
|
+
t.equal(chunk.toString(), 'Connection to http://localhost:8080 was successful: 3 users found.\n');
|
|
34
34
|
t.end();
|
|
35
35
|
});
|
|
36
36
|
cli.stderr.on('data', (msg) => {
|
package/lib/client.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import KcAdminClient from '@keycloak/keycloak-admin-client';
|
|
2
2
|
import { AuditClient } from '@continuoussecuritytooling/keycloak-auditor';
|
|
3
|
+
import logger from './logger.js';
|
|
3
4
|
|
|
4
5
|
export interface Options {
|
|
5
6
|
clientId: string;
|
|
@@ -23,7 +24,7 @@ export async function createClient(options: Options): Promise<KcAdminClient | Au
|
|
|
23
24
|
grantType: 'client_credentials',
|
|
24
25
|
});
|
|
25
26
|
} catch (e) {
|
|
26
|
-
|
|
27
|
+
logger.error('Check Client Config:', e.response ? e.responseData.error_description : e);
|
|
27
28
|
return Promise.reject(e.response ? e.responseData.error_description : e);
|
|
28
29
|
}
|
|
29
30
|
return Promise.resolve(kcAdminClient);
|
package/lib/logger.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import winston from 'winston';
|
|
2
|
+
import { ecsFormat } from '@elastic/ecs-winston-format';
|
|
3
|
+
import config from '../src/config.js';
|
|
4
|
+
import { getAppConfig } from './utils.js';
|
|
5
|
+
|
|
6
|
+
const appConfig = getAppConfig(config, process.argv);
|
|
7
|
+
|
|
8
|
+
const logger = appConfig.json
|
|
9
|
+
? winston.createLogger({
|
|
10
|
+
format: ecsFormat(/* options */),
|
|
11
|
+
transports: [new winston.transports.Console()],
|
|
12
|
+
})
|
|
13
|
+
: console;
|
|
14
|
+
|
|
15
|
+
export default logger;
|
package/lib/report.ts
CHANGED
|
@@ -3,6 +3,7 @@ import path from 'path';
|
|
|
3
3
|
import { convertJSON2CSV } from './convert.js';
|
|
4
4
|
import { post2Webhook } from './output.js';
|
|
5
5
|
import { ConvertConfig } from './utils.js';
|
|
6
|
+
import logger from './logger.js';
|
|
6
7
|
|
|
7
8
|
export async function convert(cfg: ConvertConfig) {
|
|
8
9
|
let outputContent: string;
|
|
@@ -27,29 +28,29 @@ export async function convert(cfg: ConvertConfig) {
|
|
|
27
28
|
switch (cfg.output) {
|
|
28
29
|
case 'webhook':
|
|
29
30
|
if (!cfg.config.url) {
|
|
30
|
-
|
|
31
|
+
logger.error('No valid Webhook URL given');
|
|
31
32
|
throw new Error('Please provide a valid --webhookUrl parameter');
|
|
32
33
|
}
|
|
33
34
|
try {
|
|
34
|
-
|
|
35
|
+
logger.info(`Sending report via webhook to ${cfg.config.type} ....`);
|
|
35
36
|
await post2Webhook(cfg.config.type, cfg.config.url, cfg.config.title, outputContent, cfg.config.message);
|
|
36
|
-
|
|
37
|
+
logger.info('Done sending.');
|
|
37
38
|
} catch (e) {
|
|
38
39
|
switch (e.code || e.message) {
|
|
39
40
|
case 'Request failed with status code 400':
|
|
40
|
-
|
|
41
|
+
logger.error('Invalid Teams Webhook Payload. Check your params.');
|
|
41
42
|
throw new Error('Invalid Teams Payload');
|
|
42
43
|
case 'slack_webhook_http_error':
|
|
43
|
-
|
|
44
|
+
logger.error('Invalid Slack Webhook Payload. Check your params.');
|
|
44
45
|
throw new Error('Invalid Slack Payload');
|
|
45
46
|
default:
|
|
46
|
-
|
|
47
|
+
logger.error(`Error during sending webhook.(${e?.code})`, e?.original);
|
|
47
48
|
throw e;
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
51
|
break;
|
|
51
52
|
// defaulting to standard out
|
|
52
53
|
default:
|
|
53
|
-
|
|
54
|
+
logger.info(outputContent);
|
|
54
55
|
}
|
|
55
56
|
}
|
package/lib/user.ts
CHANGED
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
AuditedClientRepresentation,
|
|
5
5
|
AuditedUserRepresentation,
|
|
6
6
|
} from '@continuoussecuritytooling/keycloak-auditor';
|
|
7
|
+
import logger from './logger.js';
|
|
7
8
|
|
|
8
9
|
export interface User {
|
|
9
10
|
username: string;
|
|
@@ -36,7 +37,7 @@ export async function clientListing(
|
|
|
36
37
|
// iterate over realms
|
|
37
38
|
realms = await client.realms.find();
|
|
38
39
|
} catch (e) {
|
|
39
|
-
|
|
40
|
+
logger.error('Check Client role:', e.response.statusText);
|
|
40
41
|
return Promise.reject(new Error('Client Role Error'));
|
|
41
42
|
}
|
|
42
43
|
for (const realm of realms) {
|
|
@@ -91,7 +92,7 @@ export async function userListing(
|
|
|
91
92
|
try {
|
|
92
93
|
realms = await client.realms.find();
|
|
93
94
|
} catch (e) {
|
|
94
|
-
|
|
95
|
+
logger.error('Check Client role:', e.response.statusText);
|
|
95
96
|
return Promise.reject(new Error('Client Role Error'));
|
|
96
97
|
}
|
|
97
98
|
for (const realm of realms) {
|
package/lib/utils.ts
CHANGED
|
@@ -12,6 +12,12 @@ export class WebhookConfig {
|
|
|
12
12
|
this.message = message;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
+
export class LogConfig {
|
|
16
|
+
json: boolean;
|
|
17
|
+
constructor(json: boolean = false) {
|
|
18
|
+
this.json = json;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
15
21
|
|
|
16
22
|
class ReportConfig {
|
|
17
23
|
name: string;
|
|
@@ -32,6 +38,14 @@ export class ConvertConfig {
|
|
|
32
38
|
this.json = json;
|
|
33
39
|
}
|
|
34
40
|
}
|
|
41
|
+
|
|
42
|
+
export class AppConfig {
|
|
43
|
+
log: LogConfig;
|
|
44
|
+
json: object;
|
|
45
|
+
constructor(logConfig: LogConfig) {
|
|
46
|
+
this.log = logConfig;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
35
49
|
export function getConvertConfig(config, argv, name: string, title: string, json: object): ConvertConfig {
|
|
36
50
|
return new ConvertConfig(
|
|
37
51
|
config.format ? config.format : (argv.format as string),
|
|
@@ -50,6 +64,16 @@ export function getConvertConfig(config, argv, name: string, title: string, json
|
|
|
50
64
|
);
|
|
51
65
|
}
|
|
52
66
|
|
|
67
|
+
export function getAppConfig(config, argv): AppConfig {
|
|
68
|
+
return new AppConfig(
|
|
69
|
+
new LogConfig(
|
|
70
|
+
'jsonLogFormat' in argv
|
|
71
|
+
? String(argv.jsonLogFormat).toLowerCase() == 'true'
|
|
72
|
+
: String(config.jsonLogFormat).toLowerCase() == 'true'
|
|
73
|
+
)
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
53
77
|
export function getKeycloakConfig(config, argv): Options {
|
|
54
78
|
return {
|
|
55
79
|
clientId: config.clientId ? config.clientId : (argv?.clientId as string),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@continuoussecuritytooling/keycloak-reporter",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0-2363",
|
|
4
4
|
"description": "Reporting Tools for Keycloak",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"homepage": "https://github.com/ContinuousSecurityTooling/keycloak-reporter#readme",
|
|
34
34
|
"dependencies": {
|
|
35
35
|
"@continuoussecuritytooling/keycloak-auditor": "^2.0.0",
|
|
36
|
+
"@elastic/ecs-winston-format": "^1.5.3",
|
|
36
37
|
"@json2csv/node": "^7.0.0",
|
|
37
38
|
"@keycloak/keycloak-admin-client": "^26.0.0",
|
|
38
39
|
"@slack/webhook": "^7.0.0",
|
|
@@ -42,10 +43,11 @@
|
|
|
42
43
|
"npm": "^10.0.0",
|
|
43
44
|
"openid-client": "^6.0.0",
|
|
44
45
|
"ramda": "^0.30.0",
|
|
46
|
+
"winston": "^3.17.0",
|
|
45
47
|
"yargs": "^17.7.2"
|
|
46
48
|
},
|
|
47
49
|
"devDependencies": {
|
|
48
|
-
"@octokit/rest": "^
|
|
50
|
+
"@octokit/rest": "^22.0.0",
|
|
49
51
|
"@types/jest": "^29.5.1",
|
|
50
52
|
"@types/node": "^22.0.0",
|
|
51
53
|
"@types/yargs": "^17.0.24",
|
package/src/commands.ts
CHANGED
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
} from '@continuoussecuritytooling/keycloak-auditor';
|
|
7
7
|
import { Options, createClient } from '../lib/client.js';
|
|
8
8
|
import { User, userListing, clientListing, Client } from '../lib/user.js';
|
|
9
|
+
import logger from '../lib/logger.js';
|
|
9
10
|
|
|
10
11
|
function kcClient(options: Options): Promise<KcAdminClient | AuditClient> {
|
|
11
12
|
return createClient({
|
|
@@ -27,9 +28,9 @@ export async function listClients(options: Options): Promise<Array<Client | Audi
|
|
|
27
28
|
export async function configTest(options: Options) {
|
|
28
29
|
try {
|
|
29
30
|
const users = await userListing(await kcClient(options));
|
|
30
|
-
|
|
31
|
+
logger.info(`Connection to ${options.rootUrl} was successful: ${users.length} users found.`);
|
|
31
32
|
} catch (e) {
|
|
32
|
-
|
|
33
|
+
logger.error(`Connection to ${options.rootUrl} was not successful`, e);
|
|
33
34
|
return;
|
|
34
35
|
}
|
|
35
36
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
sha256:097c00840fabfabe73ed97347e99d1730c461a277fc5910d6cd68f25b906ebc8
|
|
Binary file
|