@continuoussecuritytooling/keycloak-reporter 1.2.1 → 1.3.0
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/.claude/settings.local.json +15 -0
- package/.github/workflows/pipeline.yml +0 -22
- package/.github/workflows/release.yml +0 -2
- package/Dockerfile +1 -1
- package/charts/keycloak-reporter/Chart.yaml +3 -3
- package/charts/keycloak-reporter/README.md +1 -1
- package/cli.ts +0 -3
- package/continuoussecuritytooling-keycloak-reporting-cli-latest_digest.txt +1 -1
- package/dist/cli.js +3 -9
- package/dist/cli.js.map +1 -1
- package/dist/lib/client.js +4 -2
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/logger.js +1 -1
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/report.js +3 -2
- package/dist/lib/report.js.map +1 -1
- package/dist/lib/user.js +6 -2
- package/dist/lib/user.js.map +1 -1
- package/dist/lib/utils.js +6 -6
- package/dist/lib/utils.js.map +1 -1
- package/dist/src/commands.js +0 -1
- package/dist/src/commands.js.map +1 -1
- package/dist/src/config.js +12 -5
- package/dist/src/config.js.map +1 -1
- package/jest.config.js +4 -1
- package/keycloak-reporter-1.4.13.tgz +0 -0
- package/lib/client.ts +3 -2
- package/lib/logger.ts +1 -1
- package/lib/report.ts +3 -2
- package/lib/user.ts +17 -15
- package/lib/utils.ts +15 -15
- package/package.json +3 -2
- package/sonar-project.properties +1 -0
- package/src/commands.ts +0 -1
- package/src/config.ts +29 -18
- package/test/output.spec.ts +15 -7
- package/tsconfig.test.json +8 -0
- package/types/jest-globals.d.ts +5 -0
- package/keycloak-reporter-1.4.12.tgz +0 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(npm run:*)",
|
|
5
|
+
"Bash(npm install:*)",
|
|
6
|
+
"Bash(git -C /Users/mreinhardt/git/job/keycloak-reporter log --oneline -10)",
|
|
7
|
+
"Bash(git -C /Users/mreinhardt/git/job/keycloak-reporter log --oneline --all)",
|
|
8
|
+
"Bash(git -C /Users/mreinhardt/git/job/keycloak-reporter diff HEAD~5 HEAD -- e2e/fixtures/)",
|
|
9
|
+
"Bash(npm ls:*)",
|
|
10
|
+
"Bash(node -e \"const f=JSON.parse\\(require\\(''fs''\\).readFileSync\\(''/Users/mreinhardt/git/job/keycloak-reporter/e2e/fixtures/auth-utils/test-realm.json'',''utf8''\\)\\); console.log\\(Array.isArray\\(f\\), f.length, f.map\\(r=>r.realm||r.id\\)\\)\")",
|
|
11
|
+
"Bash(node -e \":*)",
|
|
12
|
+
"Bash(curl -s -X POST http://localhost:8080/realms/master/protocol/openid-connect/token -d 'grant_type=client_credentials' -d 'client_id=keycloak-reporter' -d 'client_secret=3UYhI2hryFwoVtcd7ljlaDuD9HXrGV5r')"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -94,7 +94,6 @@ jobs:
|
|
|
94
94
|
path: dist
|
|
95
95
|
|
|
96
96
|
end2end:
|
|
97
|
-
# TODO: Docker End2End
|
|
98
97
|
name: 'End2End Test on Node ${{ matrix.node_version }} and ${{ matrix.os }}'
|
|
99
98
|
runs-on: '${{ matrix.os }}'
|
|
100
99
|
strategy:
|
|
@@ -199,24 +198,3 @@ jobs:
|
|
|
199
198
|
build-args: |
|
|
200
199
|
BUILD_DATE=${{env.BUILD_DATE}}
|
|
201
200
|
APP_VERSION=${{env.APP_VERSION}}
|
|
202
|
-
|
|
203
|
-
- name: Push To NPM Registry
|
|
204
|
-
id: push-to-npm-preview
|
|
205
|
-
env:
|
|
206
|
-
NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
|
|
207
|
-
run: |
|
|
208
|
-
echo "//registry.npmjs.org/:_authToken=$NODE_AUTH_TOKEN" >> ~/.npmrc
|
|
209
|
-
npm version --no-git-tag-version ${{env.APP_VERSION}}-${{ github.run_number }}
|
|
210
|
-
npm publish --tag next
|
|
211
|
-
if: github.ref == 'refs/heads/develop'
|
|
212
|
-
|
|
213
|
-
- name: Push To Docker Hub
|
|
214
|
-
id: push-to-dockerhub-preview
|
|
215
|
-
uses: redhat-actions/push-to-registry@v2
|
|
216
|
-
with:
|
|
217
|
-
image: ${{ steps.build-image.outputs.image }}
|
|
218
|
-
tags: 'next ${{env.APP_VERSION}}_rc'
|
|
219
|
-
registry: registry.hub.docker.com
|
|
220
|
-
username: continuoussecuritytooling
|
|
221
|
-
password: ${{ secrets.DOCKER_HUB_TOKEN }}
|
|
222
|
-
if: github.ref == 'refs/heads/develop'
|
package/Dockerfile
CHANGED
|
@@ -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.4.
|
|
18
|
+
version: 1.4.13
|
|
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
|
-
# renovate: datasource=docker depName=
|
|
25
|
-
appVersion: 1.
|
|
24
|
+
# renovate: datasource=docker depName=continuoussecuritytooling/keycloak-reporting-cli
|
|
25
|
+
appVersion: 1.3.0
|
|
26
26
|
maintainers:
|
|
27
27
|
# Martin Reinhardt
|
|
28
28
|
- name: hypery2k
|
|
@@ -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
|
|
package/cli.ts
CHANGED
|
@@ -12,7 +12,6 @@ yargs(hideBin(process.argv))
|
|
|
12
12
|
.command(
|
|
13
13
|
'listUsers [url] [clientId] [clientSecret]',
|
|
14
14
|
'fetches all users in the realms.',
|
|
15
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
16
15
|
() => {},
|
|
17
16
|
async (argv) => {
|
|
18
17
|
const users = await listUsers(getKeycloakConfig(config, argv));
|
|
@@ -22,7 +21,6 @@ yargs(hideBin(process.argv))
|
|
|
22
21
|
.command(
|
|
23
22
|
'listClients [url] [clientId] [clientSecret]',
|
|
24
23
|
'fetches all clients in the realms.',
|
|
25
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
26
24
|
() => {},
|
|
27
25
|
async (argv) => {
|
|
28
26
|
const clients = await listClients(getKeycloakConfig(config, argv));
|
|
@@ -77,7 +75,6 @@ yargs(hideBin(process.argv))
|
|
|
77
75
|
.command(
|
|
78
76
|
'configTest [url] [clientId] [clientSecret]',
|
|
79
77
|
'validates keycloak configuration by reading data via REST API',
|
|
80
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
81
78
|
() => {},
|
|
82
79
|
async (argv) => configTest(getKeycloakConfig(config, argv))
|
|
83
80
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
sha256:
|
|
1
|
+
sha256:3fa0013844a332d40513603fa2692782c5c478ce519d41bf39e393100d4ef5fa
|
package/dist/cli.js
CHANGED
|
@@ -7,15 +7,11 @@ import { configTest, listUsers, listClients } from './index.js';
|
|
|
7
7
|
import config from './src/config.js';
|
|
8
8
|
yargs(hideBin(process.argv))
|
|
9
9
|
.env()
|
|
10
|
-
.command('listUsers [url] [clientId] [clientSecret]', 'fetches all users in the realms.',
|
|
11
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
12
|
-
() => { }, async (argv) => {
|
|
10
|
+
.command('listUsers [url] [clientId] [clientSecret]', 'fetches all users in the realms.', () => { }, async (argv) => {
|
|
13
11
|
const users = await listUsers(getKeycloakConfig(config, argv));
|
|
14
12
|
convert(getConvertConfig(config, argv, 'user_listing', 'User Listing', users));
|
|
15
13
|
})
|
|
16
|
-
.command('listClients [url] [clientId] [clientSecret]', 'fetches all clients in the realms.',
|
|
17
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
18
|
-
() => { }, async (argv) => {
|
|
14
|
+
.command('listClients [url] [clientId] [clientSecret]', 'fetches all clients in the realms.', () => { }, async (argv) => {
|
|
19
15
|
const clients = await listClients(getKeycloakConfig(config, argv));
|
|
20
16
|
convert(getConvertConfig(config, argv, 'client_listing', 'Client Listing', clients));
|
|
21
17
|
})
|
|
@@ -64,8 +60,6 @@ yargs(hideBin(process.argv))
|
|
|
64
60
|
default: false,
|
|
65
61
|
description: 'use JSON log format',
|
|
66
62
|
})
|
|
67
|
-
.command('configTest [url] [clientId] [clientSecret]', 'validates keycloak configuration by reading data via REST API',
|
|
68
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
69
|
-
() => { }, async (argv) => configTest(getKeycloakConfig(config, argv)))
|
|
63
|
+
.command('configTest [url] [clientId] [clientSecret]', 'validates keycloak configuration by reading data via REST API', () => { }, async (argv) => configTest(getKeycloakConfig(config, argv)))
|
|
70
64
|
.parse();
|
|
71
65
|
//# sourceMappingURL=cli.js.map
|
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
|
|
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,EAClC,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,EACpC,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,EAC/D,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
|
@@ -2,6 +2,7 @@ import KcAdminClient from '@keycloak/keycloak-admin-client';
|
|
|
2
2
|
import { AuditClient } from '@continuoussecuritytooling/keycloak-auditor';
|
|
3
3
|
import logger from './logger.js';
|
|
4
4
|
export async function createClient(options) {
|
|
5
|
+
var _a, _b;
|
|
5
6
|
const kcAdminClient = options.useAuditingEndpoint
|
|
6
7
|
? new AuditClient(options.rootUrl, 'master')
|
|
7
8
|
: new KcAdminClient({
|
|
@@ -17,8 +18,9 @@ export async function createClient(options) {
|
|
|
17
18
|
});
|
|
18
19
|
}
|
|
19
20
|
catch (e) {
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
const err = e;
|
|
22
|
+
logger.error('Check Client Config:', err.response ? (_a = err.responseData) === null || _a === void 0 ? void 0 : _a.error_description : e);
|
|
23
|
+
return Promise.reject(err.response ? (_b = err.responseData) === null || _b === void 0 ? void 0 : _b.error_description : e);
|
|
22
24
|
}
|
|
23
25
|
return Promise.resolve(kcAdminClient);
|
|
24
26
|
}
|
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;AAC1E,OAAO,MAAM,MAAM,aAAa,CAAC;AASjC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB
|
|
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,GAAG,GAAG,CAA0E,CAAC;QACvF,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAA,GAAG,CAAC,YAAY,0CAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAA,GAAG,CAAC,YAAY,0CAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;AACxC,CAAC"}
|
package/dist/lib/logger.js
CHANGED
|
@@ -2,7 +2,7 @@ import winston from 'winston';
|
|
|
2
2
|
import { ecsFormat } from '@elastic/ecs-winston-format';
|
|
3
3
|
import config from '../src/config.js';
|
|
4
4
|
import { getAppConfig } from './utils.js';
|
|
5
|
-
const appConfig = getAppConfig(config,
|
|
5
|
+
const appConfig = getAppConfig(config, {});
|
|
6
6
|
const logger = appConfig.json
|
|
7
7
|
? winston.createLogger({
|
|
8
8
|
format: ecsFormat( /* options */),
|
package/dist/lib/logger.js.map
CHANGED
|
@@ -1 +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,
|
|
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,EAAE,CAAC,CAAC;AAE3C,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
|
@@ -29,7 +29,8 @@ export async function convert(cfg) {
|
|
|
29
29
|
logger.info('Done sending.');
|
|
30
30
|
}
|
|
31
31
|
catch (e) {
|
|
32
|
-
|
|
32
|
+
const err = e;
|
|
33
|
+
switch (err.code || err.message) {
|
|
33
34
|
case 'Request failed with status code 400':
|
|
34
35
|
logger.error('Invalid Teams Webhook Payload. Check your params.');
|
|
35
36
|
throw new Error('Invalid Teams Payload', { cause: e });
|
|
@@ -40,7 +41,7 @@ export async function convert(cfg) {
|
|
|
40
41
|
logger.error('Generic Webhook request failed. Check your URL and params.');
|
|
41
42
|
throw new Error('Invalid Generic Webhook request', { cause: e });
|
|
42
43
|
default:
|
|
43
|
-
logger.error(`Error during sending webhook.(${
|
|
44
|
+
logger.error(`Error during sending webhook.(${err.code})`, err.original);
|
|
44
45
|
throw e;
|
|
45
46
|
}
|
|
46
47
|
}
|
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;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,
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../lib/report.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/user.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import KcAdminClient from '@keycloak/keycloak-admin-client';
|
|
2
2
|
import logger from './logger.js';
|
|
3
3
|
export async function clientListing(client) {
|
|
4
|
+
var _a;
|
|
4
5
|
let allClients = new Array();
|
|
5
6
|
if (client instanceof KcAdminClient) {
|
|
6
7
|
const currentRealm = client.realmName;
|
|
@@ -10,7 +11,8 @@ export async function clientListing(client) {
|
|
|
10
11
|
realms = await client.realms.find();
|
|
11
12
|
}
|
|
12
13
|
catch (e) {
|
|
13
|
-
|
|
14
|
+
const err = e;
|
|
15
|
+
logger.error('Check Client role:', (_a = err.response) === null || _a === void 0 ? void 0 : _a.statusText);
|
|
14
16
|
return Promise.reject(new Error('Client Role Error'));
|
|
15
17
|
}
|
|
16
18
|
for (const realm of realms) {
|
|
@@ -55,6 +57,7 @@ export async function clientListing(client) {
|
|
|
55
57
|
return Promise.resolve(allClients);
|
|
56
58
|
}
|
|
57
59
|
export async function userListing(client) {
|
|
60
|
+
var _a;
|
|
58
61
|
let allUsers = new Array();
|
|
59
62
|
if (client instanceof KcAdminClient) {
|
|
60
63
|
const currentRealm = client.realmName;
|
|
@@ -64,7 +67,8 @@ export async function userListing(client) {
|
|
|
64
67
|
realms = await client.realms.find();
|
|
65
68
|
}
|
|
66
69
|
catch (e) {
|
|
67
|
-
|
|
70
|
+
const err = e;
|
|
71
|
+
logger.error('Check Client role:', (_a = err.response) === null || _a === void 0 ? void 0 : _a.statusText);
|
|
68
72
|
return Promise.reject(new Error('Client Role Error'));
|
|
69
73
|
}
|
|
70
74
|
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;AAM5D,OAAO,MAAM,MAAM,aAAa,CAAC;AAsBjC,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAmC
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../lib/user.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/utils.js
CHANGED
|
@@ -28,10 +28,10 @@ export class AppConfig {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
export function getConvertConfig(config, argv, name, title, json) {
|
|
31
|
-
return new ConvertConfig(config.format
|
|
31
|
+
return new ConvertConfig((config.format || argv.format), (config.output || argv.output), {
|
|
32
32
|
name,
|
|
33
|
-
directory: argv.reports
|
|
34
|
-
}, new WebhookConfig(config.webhookType
|
|
33
|
+
directory: (argv.reports || config.reports),
|
|
34
|
+
}, new WebhookConfig((config.webhookType || argv.webhookType), (config.webhookUrl || argv.webhookUrl), title, (config.webhookMessage || argv.webhookMessage)), json);
|
|
35
35
|
}
|
|
36
36
|
export function getAppConfig(config, argv) {
|
|
37
37
|
return new AppConfig(new LogConfig('jsonLogFormat' in argv
|
|
@@ -40,9 +40,9 @@ export function getAppConfig(config, argv) {
|
|
|
40
40
|
}
|
|
41
41
|
export function getKeycloakConfig(config, argv) {
|
|
42
42
|
return {
|
|
43
|
-
clientId: config.clientId
|
|
44
|
-
clientSecret: config.clientSecret
|
|
45
|
-
rootUrl: config.url
|
|
43
|
+
clientId: (config.clientId || argv.clientId),
|
|
44
|
+
clientSecret: (config.clientSecret || argv.clientSecret),
|
|
45
|
+
rootUrl: (config.url || argv.url),
|
|
46
46
|
useAuditingEndpoint: 'useAuditingEndpoint' in argv
|
|
47
47
|
? String(argv.useAuditingEndpoint).toLowerCase() == 'true'
|
|
48
48
|
: String(config.useAuditingEndpoint).toLowerCase() == 'true',
|
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;AACD,MAAM,OAAO,SAAS;IAEpB,YAAY,OAAgB,KAAK;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,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;AAED,MAAM,OAAO,SAAS;IAGpB,YAAY,SAAoB;QAC9B,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;IACvB,CAAC;CACF;AACD,MAAM,UAAU,gBAAgB,CAAC,
|
|
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;AACD,MAAM,OAAO,SAAS;IAEpB,YAAY,OAAgB,KAAK;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,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;AAED,MAAM,OAAO,SAAS;IAGpB,YAAY,SAAoB;QAC9B,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;IACvB,CAAC;CACF;AACD,MAAM,UAAU,gBAAgB,CAAC,MAA+B,EAAE,IAA6B,EAAE,IAAY,EAAE,KAAa,EAAE,IAAY;IACxI,OAAO,IAAI,aAAa,CACtB,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAW,EACxC,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAW,EACxC;QACE,IAAI;QACJ,SAAS,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAW;KACtD,EACD,IAAI,aAAa,CACf,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAW,EAClD,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAW,EAChD,KAAK,EACL,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAuB,CACrE,EACD,IAAI,CACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAA+B,EAAE,IAA6B;IACzF,OAAO,IAAI,SAAS,CAClB,IAAI,SAAS,CACX,eAAe,IAAI,IAAI;QACrB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM;QACpD,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,IAAI,MAAM,CACzD,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAA+B,EAAE,IAA6B;IAC9F,OAAO;QACL,QAAQ,EAAE,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAW;QACtD,YAAY,EAAE,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAW;QAClE,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAW;QAC3C,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
|
@@ -15,7 +15,6 @@ export async function listUsers(options) {
|
|
|
15
15
|
export async function listClients(options) {
|
|
16
16
|
return clientListing(await kcClient(options));
|
|
17
17
|
}
|
|
18
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
19
18
|
export async function configTest(options) {
|
|
20
19
|
try {
|
|
21
20
|
const users = await userListing(await kcClient(options));
|
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;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,
|
|
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,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/dist/src/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { assoc, pick, mergeAll
|
|
1
|
+
import { assoc, pick, mergeAll } from 'ramda';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
import fs from 'fs';
|
|
@@ -17,10 +17,12 @@ function buildDefaults(schema, definitions) {
|
|
|
17
17
|
return Object.keys(schema.properties).reduce((acc, prop) => {
|
|
18
18
|
let spec = schema.properties[prop];
|
|
19
19
|
if (spec.$ref) {
|
|
20
|
-
|
|
21
|
-
if (
|
|
22
|
-
return assoc(prop, buildDefaults(
|
|
20
|
+
const def = definitions[spec.$ref.replace('#/definitions/', '')];
|
|
21
|
+
if ((def === null || def === void 0 ? void 0 : def.type) === 'object') {
|
|
22
|
+
return assoc(prop, buildDefaults(def, definitions), acc);
|
|
23
23
|
}
|
|
24
|
+
if (def)
|
|
25
|
+
spec = def;
|
|
24
26
|
}
|
|
25
27
|
return assoc(prop, spec.default, acc);
|
|
26
28
|
}, {});
|
|
@@ -28,6 +30,7 @@ function buildDefaults(schema, definitions) {
|
|
|
28
30
|
// build an object of config values taken from process.env
|
|
29
31
|
function buildEnvironmentVariablesConfig(schema) {
|
|
30
32
|
const trueRx = /^true$/i;
|
|
33
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
31
34
|
const configKeys = Object.keys(schema.properties);
|
|
32
35
|
const env = pick(configKeys, process.env);
|
|
33
36
|
return Object.keys(env).reduce((acc, key) => {
|
|
@@ -43,6 +46,10 @@ function buildEnvironmentVariablesConfig(schema) {
|
|
|
43
46
|
}, {});
|
|
44
47
|
}
|
|
45
48
|
// merge the environment variables, config file values, and defaults
|
|
46
|
-
const config = mergeAll(
|
|
49
|
+
const config = mergeAll([
|
|
50
|
+
buildDefaults(schema, schema.definitions),
|
|
51
|
+
buildConfigFromFile(process.env.CONFIG_FILE),
|
|
52
|
+
buildEnvironmentVariablesConfig(schema),
|
|
53
|
+
]);
|
|
47
54
|
export default config;
|
|
48
55
|
//# sourceMappingURL=config.js.map
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
package/jest.config.js
CHANGED
|
@@ -19,6 +19,9 @@ export default {
|
|
|
19
19
|
'node_modules/(?!(string-width|strip-ansi|ansi-regex|test-json-import)/)',
|
|
20
20
|
],
|
|
21
21
|
'transform': {
|
|
22
|
-
'^.+\\.(ts|tsx)$': 'ts-jest',
|
|
22
|
+
'^.+\\.(ts|tsx)$': ['ts-jest', {
|
|
23
|
+
tsconfig: './tsconfig.test.json',
|
|
24
|
+
diagnostics: { ignoreCodes: [151002] },
|
|
25
|
+
}],
|
|
23
26
|
},
|
|
24
27
|
};
|
|
Binary file
|
package/lib/client.ts
CHANGED
|
@@ -24,8 +24,9 @@ export async function createClient(options: Options): Promise<KcAdminClient | Au
|
|
|
24
24
|
grantType: 'client_credentials',
|
|
25
25
|
});
|
|
26
26
|
} catch (e) {
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
const err = e as { response?: unknown; responseData?: { error_description?: string } };
|
|
28
|
+
logger.error('Check Client Config:', err.response ? err.responseData?.error_description : e);
|
|
29
|
+
return Promise.reject(err.response ? err.responseData?.error_description : e);
|
|
29
30
|
}
|
|
30
31
|
return Promise.resolve(kcAdminClient);
|
|
31
32
|
}
|
package/lib/logger.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { ecsFormat } from '@elastic/ecs-winston-format';
|
|
|
3
3
|
import config from '../src/config.js';
|
|
4
4
|
import { getAppConfig } from './utils.js';
|
|
5
5
|
|
|
6
|
-
const appConfig = getAppConfig(config,
|
|
6
|
+
const appConfig = getAppConfig(config, {});
|
|
7
7
|
|
|
8
8
|
const logger = appConfig.json
|
|
9
9
|
? winston.createLogger({
|
package/lib/report.ts
CHANGED
|
@@ -36,7 +36,8 @@ export async function convert(cfg: ConvertConfig) {
|
|
|
36
36
|
await post2Webhook(cfg.config.type, cfg.config.url, cfg.config.title, outputContent, cfg.config.message);
|
|
37
37
|
logger.info('Done sending.');
|
|
38
38
|
} catch (e) {
|
|
39
|
-
|
|
39
|
+
const err = e as { code?: string; message?: string; original?: unknown };
|
|
40
|
+
switch (err.code || err.message) {
|
|
40
41
|
case 'Request failed with status code 400':
|
|
41
42
|
logger.error('Invalid Teams Webhook Payload. Check your params.');
|
|
42
43
|
throw new Error('Invalid Teams Payload', { cause: e });
|
|
@@ -47,7 +48,7 @@ export async function convert(cfg: ConvertConfig) {
|
|
|
47
48
|
logger.error('Generic Webhook request failed. Check your URL and params.');
|
|
48
49
|
throw new Error('Invalid Generic Webhook request', { cause: e });
|
|
49
50
|
default:
|
|
50
|
-
logger.error(`Error during sending webhook.(${
|
|
51
|
+
logger.error(`Error during sending webhook.(${err.code})`, err.original);
|
|
51
52
|
throw e;
|
|
52
53
|
}
|
|
53
54
|
}
|
package/lib/user.ts
CHANGED
|
@@ -37,7 +37,8 @@ export async function clientListing(
|
|
|
37
37
|
// iterate over realms
|
|
38
38
|
realms = await client.realms.find();
|
|
39
39
|
} catch (e) {
|
|
40
|
-
|
|
40
|
+
const err = e as { response?: { statusText?: string } };
|
|
41
|
+
logger.error('Check Client role:', err.response?.statusText);
|
|
41
42
|
return Promise.reject(new Error('Client Role Error'));
|
|
42
43
|
}
|
|
43
44
|
for (const realm of realms) {
|
|
@@ -48,12 +49,12 @@ export async function clientListing(
|
|
|
48
49
|
const realmClients = new Array<Client>();
|
|
49
50
|
for (const user of await client.clients.find()) {
|
|
50
51
|
realmClients.push({
|
|
51
|
-
client: user.clientId
|
|
52
|
-
id: user.id
|
|
53
|
-
description: user.description
|
|
54
|
-
realm: realm.realm
|
|
55
|
-
enabled: user.enabled
|
|
56
|
-
public: user.publicClient
|
|
52
|
+
client: user.clientId!,
|
|
53
|
+
id: user.id!,
|
|
54
|
+
description: user.description!,
|
|
55
|
+
realm: realm.realm!,
|
|
56
|
+
enabled: user.enabled!,
|
|
57
|
+
public: user.publicClient!,
|
|
57
58
|
allowedOrigins: JSON.stringify(user.webOrigins),
|
|
58
59
|
});
|
|
59
60
|
}
|
|
@@ -92,7 +93,8 @@ export async function userListing(
|
|
|
92
93
|
try {
|
|
93
94
|
realms = await client.realms.find();
|
|
94
95
|
} catch (e) {
|
|
95
|
-
|
|
96
|
+
const err = e as { response?: { statusText?: string } };
|
|
97
|
+
logger.error('Check Client role:', err.response?.statusText);
|
|
96
98
|
return Promise.reject(new Error('Client Role Error'));
|
|
97
99
|
}
|
|
98
100
|
for (const realm of realms) {
|
|
@@ -103,13 +105,13 @@ export async function userListing(
|
|
|
103
105
|
const realmUsers = new Array<User>();
|
|
104
106
|
for (const user of await client.users.find()) {
|
|
105
107
|
realmUsers.push({
|
|
106
|
-
username: user.username
|
|
107
|
-
id: user.id
|
|
108
|
-
firstName: user.firstName
|
|
109
|
-
lastName: user.lastName
|
|
110
|
-
email: user.email
|
|
111
|
-
realm: realm.realm
|
|
112
|
-
enabled: user.enabled
|
|
108
|
+
username: user.username!,
|
|
109
|
+
id: user.id!,
|
|
110
|
+
firstName: user.firstName!,
|
|
111
|
+
lastName: user.lastName!,
|
|
112
|
+
email: user.email!,
|
|
113
|
+
realm: realm.realm!,
|
|
114
|
+
enabled: user.enabled!,
|
|
113
115
|
});
|
|
114
116
|
}
|
|
115
117
|
allUsers = [...allUsers, ...realmUsers];
|
package/lib/utils.ts
CHANGED
|
@@ -20,8 +20,8 @@ export class LogConfig {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
class ReportConfig {
|
|
23
|
-
name
|
|
24
|
-
directory
|
|
23
|
+
name!: string;
|
|
24
|
+
directory!: string;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export class ConvertConfig {
|
|
@@ -41,30 +41,30 @@ export class ConvertConfig {
|
|
|
41
41
|
|
|
42
42
|
export class AppConfig {
|
|
43
43
|
log: LogConfig;
|
|
44
|
-
json
|
|
44
|
+
json?: object;
|
|
45
45
|
constructor(logConfig: LogConfig) {
|
|
46
46
|
this.log = logConfig;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
export function getConvertConfig(config, argv, name: string, title: string, json: object): ConvertConfig {
|
|
49
|
+
export function getConvertConfig(config: Record<string, unknown>, argv: Record<string, unknown>, name: string, title: string, json: object): ConvertConfig {
|
|
50
50
|
return new ConvertConfig(
|
|
51
|
-
config.format
|
|
52
|
-
config.output
|
|
51
|
+
(config.format || argv.format) as string,
|
|
52
|
+
(config.output || argv.output) as string,
|
|
53
53
|
{
|
|
54
54
|
name,
|
|
55
|
-
directory: argv.reports
|
|
55
|
+
directory: (argv.reports || config.reports) as string,
|
|
56
56
|
},
|
|
57
57
|
new WebhookConfig(
|
|
58
|
-
config.webhookType
|
|
59
|
-
config.webhookUrl
|
|
58
|
+
(config.webhookType || argv.webhookType) as string,
|
|
59
|
+
(config.webhookUrl || argv.webhookUrl) as string,
|
|
60
60
|
title,
|
|
61
|
-
config.webhookMessage
|
|
61
|
+
(config.webhookMessage || argv.webhookMessage) as string | undefined
|
|
62
62
|
),
|
|
63
63
|
json
|
|
64
64
|
);
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export function getAppConfig(config, argv): AppConfig {
|
|
67
|
+
export function getAppConfig(config: Record<string, unknown>, argv: Record<string, unknown>): AppConfig {
|
|
68
68
|
return new AppConfig(
|
|
69
69
|
new LogConfig(
|
|
70
70
|
'jsonLogFormat' in argv
|
|
@@ -74,11 +74,11 @@ export function getAppConfig(config, argv): AppConfig {
|
|
|
74
74
|
);
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
export function getKeycloakConfig(config, argv): Options {
|
|
77
|
+
export function getKeycloakConfig(config: Record<string, unknown>, argv: Record<string, unknown>): Options {
|
|
78
78
|
return {
|
|
79
|
-
clientId: config.clientId
|
|
80
|
-
clientSecret: config.clientSecret
|
|
81
|
-
rootUrl: config.url
|
|
79
|
+
clientId: (config.clientId || argv.clientId) as string,
|
|
80
|
+
clientSecret: (config.clientSecret || argv.clientSecret) as string,
|
|
81
|
+
rootUrl: (config.url || argv.url) as string,
|
|
82
82
|
useAuditingEndpoint:
|
|
83
83
|
'useAuditingEndpoint' in argv
|
|
84
84
|
? String(argv.useAuditingEndpoint).toLowerCase() == 'true'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@continuoussecuritytooling/keycloak-reporter",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Reporting Tools for Keycloak",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -51,6 +51,7 @@
|
|
|
51
51
|
"@octokit/rest": "^22.0.0",
|
|
52
52
|
"@types/jest": "^30.0.0",
|
|
53
53
|
"@types/node": "^24.0.0",
|
|
54
|
+
"@types/ramda": "^0.31.1",
|
|
54
55
|
"@types/yargs": "^17.0.24",
|
|
55
56
|
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
56
57
|
"@typescript-eslint/parser": "^8.0.0",
|
|
@@ -67,6 +68,6 @@
|
|
|
67
68
|
"tape": "^5.6.3",
|
|
68
69
|
"tar-fs": "^3.0.0",
|
|
69
70
|
"ts-jest": "^29.1.0",
|
|
70
|
-
"typescript": "^
|
|
71
|
+
"typescript": "^6.0.0"
|
|
71
72
|
}
|
|
72
73
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sonar.exclusions=e2e/**,dist/**,node_modules/**,src/**/*.spec.ts,src/**/*.test.ts
|
package/src/commands.ts
CHANGED
|
@@ -24,7 +24,6 @@ export async function listUsers(options: Options): Promise<Array<User | AuditedU
|
|
|
24
24
|
export async function listClients(options: Options): Promise<Array<Client | AuditedClientRepresentation>> {
|
|
25
25
|
return clientListing(await kcClient(options));
|
|
26
26
|
}
|
|
27
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
28
27
|
export async function configTest(options: Options) {
|
|
29
28
|
try {
|
|
30
29
|
const users = await userListing(await kcClient(options));
|
package/src/config.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import { assoc, pick, mergeAll
|
|
1
|
+
import { assoc, pick, mergeAll } from 'ramda';
|
|
2
|
+
|
|
3
|
+
type SchemaSpec = {
|
|
4
|
+
type?: string;
|
|
5
|
+
$ref?: string;
|
|
6
|
+
default?: unknown;
|
|
7
|
+
properties?: Record<string, SchemaSpec>;
|
|
8
|
+
definitions?: Record<string, SchemaSpec>;
|
|
9
|
+
};
|
|
2
10
|
import path from 'path';
|
|
3
11
|
import { fileURLToPath } from 'url';
|
|
4
12
|
import fs from 'fs';
|
|
@@ -8,7 +16,7 @@ const schema = JSON.parse(
|
|
|
8
16
|
);
|
|
9
17
|
|
|
10
18
|
// import the config file
|
|
11
|
-
function buildConfigFromFile(filePath) {
|
|
19
|
+
function buildConfigFromFile(filePath: string | undefined) {
|
|
12
20
|
if (!filePath) return {};
|
|
13
21
|
const isAbsolutePath = filePath.charAt(0) === '/';
|
|
14
22
|
return JSON.parse(
|
|
@@ -18,31 +26,33 @@ function buildConfigFromFile(filePath) {
|
|
|
18
26
|
);
|
|
19
27
|
}
|
|
20
28
|
// build an object using the defaults in the schema
|
|
21
|
-
function buildDefaults(schema, definitions) {
|
|
22
|
-
return Object.keys(schema.properties).reduce((acc, prop) => {
|
|
23
|
-
let spec = schema.properties[prop];
|
|
29
|
+
function buildDefaults(schema: SchemaSpec, definitions: Record<string, SchemaSpec>): Record<string, unknown> {
|
|
30
|
+
return Object.keys(schema.properties!).reduce((acc: Record<string, unknown>, prop) => {
|
|
31
|
+
let spec: SchemaSpec = schema.properties![prop];
|
|
24
32
|
if (spec.$ref) {
|
|
25
|
-
|
|
26
|
-
if (
|
|
27
|
-
return assoc(prop, buildDefaults(
|
|
33
|
+
const def = definitions[spec.$ref.replace('#/definitions/', '')];
|
|
34
|
+
if (def?.type === 'object') {
|
|
35
|
+
return assoc(prop, buildDefaults(def, definitions), acc) as Record<string, unknown>;
|
|
28
36
|
}
|
|
37
|
+
if (def) spec = def;
|
|
29
38
|
}
|
|
30
|
-
return assoc(prop, spec.default, acc)
|
|
39
|
+
return assoc(prop, spec.default, acc) as Record<string, unknown>;
|
|
31
40
|
}, {});
|
|
32
41
|
}
|
|
33
42
|
|
|
34
43
|
// build an object of config values taken from process.env
|
|
35
|
-
function buildEnvironmentVariablesConfig(schema) {
|
|
44
|
+
function buildEnvironmentVariablesConfig(schema: SchemaSpec): Record<string, unknown> {
|
|
36
45
|
const trueRx = /^true$/i;
|
|
37
|
-
|
|
46
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
47
|
+
const configKeys = Object.keys(schema.properties as any);
|
|
38
48
|
const env = pick(configKeys, process.env);
|
|
39
49
|
return Object.keys(env).reduce((acc, key) => {
|
|
40
|
-
const { type } = schema.properties[key];
|
|
50
|
+
const { type } = (schema.properties as any)[key];
|
|
41
51
|
switch (type) {
|
|
42
52
|
case 'integer':
|
|
43
|
-
return assoc(key, parseInt(env[key]
|
|
53
|
+
return assoc(key, parseInt(env[key]!, 10), acc);
|
|
44
54
|
case 'boolean':
|
|
45
|
-
return assoc(key, trueRx.test(env[key]), acc);
|
|
55
|
+
return assoc(key, trueRx.test(env[key]!), acc);
|
|
46
56
|
default:
|
|
47
57
|
return assoc(key, env[key], acc);
|
|
48
58
|
}
|
|
@@ -50,9 +60,10 @@ function buildEnvironmentVariablesConfig(schema) {
|
|
|
50
60
|
}
|
|
51
61
|
|
|
52
62
|
// merge the environment variables, config file values, and defaults
|
|
53
|
-
const config = mergeAll(
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
)
|
|
63
|
+
const config = mergeAll([
|
|
64
|
+
buildDefaults(schema, schema.definitions),
|
|
65
|
+
buildConfigFromFile(process.env.CONFIG_FILE),
|
|
66
|
+
buildEnvironmentVariablesConfig(schema),
|
|
67
|
+
]);
|
|
57
68
|
|
|
58
69
|
export default config;
|
package/test/output.spec.ts
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
/// <reference types="jest-extended" />
|
|
2
2
|
import { post2Webhook } from '../lib/output';
|
|
3
3
|
|
|
4
|
+
type Block = {
|
|
5
|
+
type: string;
|
|
6
|
+
text?: string;
|
|
7
|
+
elements?: Array<{ text: string }>;
|
|
8
|
+
fields?: Array<{ text: string }>;
|
|
9
|
+
facts?: Array<{ title: string; value: string }>;
|
|
10
|
+
};
|
|
11
|
+
|
|
4
12
|
const mockSlackSend = jest.fn();
|
|
5
13
|
jest.mock('@slack/webhook', () => ({
|
|
6
14
|
IncomingWebhook: jest.fn().mockImplementation(() => ({
|
|
@@ -33,15 +41,15 @@ describe('post2Webhook - Slack', () => {
|
|
|
33
41
|
await post2Webhook('slack', 'https://hooks.slack.com/test', 'Users Report', 'report content', 'Hello from CI');
|
|
34
42
|
expect(mockSlackSend).toHaveBeenCalledTimes(1);
|
|
35
43
|
const blocks = mockSlackSend.mock.calls[0][0].blocks;
|
|
36
|
-
const contextBlock = blocks.find((b) => b.type === 'context' && b.elements?.[0]?.text === 'Hello from CI');
|
|
44
|
+
const contextBlock = (blocks as Block[]).find((b) => b.type === 'context' && b.elements?.[0]?.text === 'Hello from CI');
|
|
37
45
|
expect(contextBlock).toBeDefined();
|
|
38
46
|
});
|
|
39
47
|
|
|
40
48
|
test('Slack payload includes title and date fields', async () => {
|
|
41
49
|
await post2Webhook('slack', 'https://hooks.slack.com/test', 'My Title', 'content');
|
|
42
50
|
const blocks = mockSlackSend.mock.calls[0][0].blocks;
|
|
43
|
-
const sectionBlock = blocks.find((b) => b.type === 'section');
|
|
44
|
-
expect(sectionBlock
|
|
51
|
+
const sectionBlock = (blocks as Block[]).find((b) => b.type === 'section');
|
|
52
|
+
expect(sectionBlock!.fields![0].text).toContain('My Title');
|
|
45
53
|
});
|
|
46
54
|
});
|
|
47
55
|
|
|
@@ -63,16 +71,16 @@ describe('post2Webhook - Teams', () => {
|
|
|
63
71
|
await post2Webhook('teams', 'https://outlook.office.com/webhook/test', 'Clients Report', 'report content', 'Hello from CI');
|
|
64
72
|
expect(mockTeamsSend).toHaveBeenCalledTimes(1);
|
|
65
73
|
const attachment = mockTeamsSend.mock.calls[0][0].attachments[0];
|
|
66
|
-
const textBlock = attachment.content.body.find((b) => b.type === 'TextBlock' && b.text === 'Hello from CI');
|
|
74
|
+
const textBlock = (attachment.content.body as Block[]).find((b) => b.type === 'TextBlock' && b.text === 'Hello from CI');
|
|
67
75
|
expect(textBlock).toBeDefined();
|
|
68
76
|
});
|
|
69
77
|
|
|
70
78
|
test('Teams payload includes title in FactSet', async () => {
|
|
71
79
|
await post2Webhook('teams', 'https://outlook.office.com/webhook/test', 'My Title', 'content');
|
|
72
80
|
const attachment = mockTeamsSend.mock.calls[0][0].attachments[0];
|
|
73
|
-
const factSet = attachment.content.body.find((b) => b.type === 'FactSet');
|
|
74
|
-
const typeFact = factSet
|
|
75
|
-
expect(typeFact
|
|
81
|
+
const factSet = (attachment.content.body as Block[]).find((b) => b.type === 'FactSet');
|
|
82
|
+
const typeFact = factSet!.facts!.find((f) => f.title === 'Type');
|
|
83
|
+
expect(typeFact!.value).toBe('My Title');
|
|
76
84
|
});
|
|
77
85
|
});
|
|
78
86
|
|
|
Binary file
|