@continuoussecuritytooling/keycloak-reporter 0.5.1 → 0.7.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.
Files changed (45) hide show
  1. package/.eslintrc.cjs +4 -3
  2. package/.github/workflows/pipeline.yml +37 -10
  3. package/.github/workflows/release.yml +1 -1
  4. package/.prettierrc +2 -2
  5. package/Dockerfile +19 -2
  6. package/README.md +4 -3
  7. package/artifacthub-repo.yml +6 -0
  8. package/charts/keycloak-reporter/Chart.yaml +9 -3
  9. package/charts/keycloak-reporter/README.md +7 -21
  10. package/charts/keycloak-reporter/templates/_helpers.tpl +8 -8
  11. package/charts/keycloak-reporter/templates/cronjob.yaml +21 -16
  12. package/charts/keycloak-reporter/templates/secret.yaml +6 -8
  13. package/charts/keycloak-reporter/values.yaml +42 -39
  14. package/cli.ts +54 -87
  15. package/config/schema.json +6 -1
  16. package/index.ts +1 -1
  17. package/lib/client.ts +10 -37
  18. package/lib/output.ts +2 -2
  19. package/lib/user.ts +86 -49
  20. package/package.json +5 -4
  21. package/renovate.json +12 -5
  22. package/src/commands.ts +27 -0
  23. package/src/config.ts +6 -18
  24. package/config.json +0 -9
  25. package/dist/cli.js +0 -130
  26. package/dist/cli.js.map +0 -1
  27. package/dist/config/schema.json +0 -65
  28. package/dist/index.js +0 -4
  29. package/dist/index.js.map +0 -1
  30. package/dist/lib/client.js +0 -41
  31. package/dist/lib/client.js.map +0 -1
  32. package/dist/lib/convert.js +0 -9
  33. package/dist/lib/convert.js.map +0 -1
  34. package/dist/lib/output.js +0 -113
  35. package/dist/lib/output.js.map +0 -1
  36. package/dist/lib/user.js +0 -75
  37. package/dist/lib/user.js.map +0 -1
  38. package/dist/src/cli.js +0 -19
  39. package/dist/src/cli.js.map +0 -1
  40. package/dist/src/config.js +0 -57
  41. package/dist/src/config.js.map +0 -1
  42. package/k8s.yaml +0 -51
  43. package/keycloak-reporter-0.5.0.tgz +0 -0
  44. package/src/cli.ts +0 -26
  45. package/test.values.yaml +0 -8
package/dist/cli.js DELETED
@@ -1,130 +0,0 @@
1
- #!/usr/bin/env node
2
- import { writeFileSync } from 'node:fs';
3
- import path from 'path';
4
- import yargs from 'yargs/yargs';
5
- import { hideBin } from 'yargs/helpers';
6
- import { listUsers, listClients, convertJSON2CSV, post2Webhook } from './index.js';
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
- async function convert(format, output, reports, config, json) {
19
- let outputContent;
20
- console.log(output);
21
- switch (format) {
22
- case 'csv':
23
- outputContent = (await convertJSON2CSV(json)).toString();
24
- break;
25
- // defaulting to JSON
26
- default:
27
- outputContent = JSON.stringify(json);
28
- }
29
- if (reports.directory) {
30
- const date = new Date();
31
- writeFileSync(path.join(`${reports.directory}`, `${reports.name}_${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}.${format.toLowerCase()}`), outputContent);
32
- }
33
- switch (output) {
34
- case 'webhook':
35
- try {
36
- await post2Webhook(config.type, config.url, config.title, outputContent, config.message);
37
- }
38
- catch (e) {
39
- switch (e.code || e.message) {
40
- case 'Request failed with status code 400':
41
- console.error('Invalid Teams Webhook Payload. Check your params.');
42
- throw new Error('Invalid Teams Payload');
43
- case 'slack_webhook_http_error':
44
- console.error('Invalid Slack Webhook Payload. Check your params.');
45
- throw new Error('Invalid Slack Payload');
46
- default:
47
- console.error(`Error during sending webhook.(${e === null || e === void 0 ? void 0 : e.code})`, e === null || e === void 0 ? void 0 : e.original);
48
- throw e;
49
- }
50
- }
51
- break;
52
- // defaulting to standard out
53
- default:
54
- console.log(outputContent);
55
- }
56
- }
57
- yargs(hideBin(process.argv))
58
- .command('listUsers [url] [clientId] [clientSecret]', 'fetches all users in the realms.',
59
- // eslint-disable-next-line @typescript-eslint/no-empty-function
60
- () => { }, async (argv) => {
61
- const users = await listUsers({
62
- clientId: argv.clientId ? argv.clientId : config.clientId,
63
- clientSecret: argv.clientSecret
64
- ? argv.clientSecret
65
- : config.clientSecret,
66
- rootUrl: argv.url ? argv.url : config.url
67
- });
68
- await convert(config.format ? config.format : argv.format, config.output ? config.output : argv.output, {
69
- name: 'user_listing',
70
- directory: argv.reports ? argv.reports : config.reports
71
- }, new WebhookConfig(config.webhookType
72
- ? config.webhookType
73
- : argv.webhookType, config.webhookUrl ? config.webhookUrl : argv.webhookUrl, 'User Listing', argv.webhookMessage
74
- ? argv.webhookMessage
75
- : config.webhookMessage), users);
76
- })
77
- .command('listClients [url] [clientId] [clientSecret]', 'fetches all clients in the realms.',
78
- // eslint-disable-next-line @typescript-eslint/no-empty-function
79
- () => { }, async (argv) => {
80
- const clients = await listClients({
81
- clientId: argv.clientId ? argv.clientId : config.clientId,
82
- clientSecret: argv.clientSecret
83
- ? argv.clientSecret
84
- : config.clientSecret,
85
- rootUrl: argv.url ? argv.url : config.url
86
- });
87
- await convert(config.format ? config.format : argv.format, config.output ? config.output : argv.output, {
88
- name: 'client_listing',
89
- directory: argv.reports ? argv.reports : config.reports
90
- }, new WebhookConfig(config.webhookType
91
- ? config.webhookType
92
- : argv.webhookType, config.webhookUrl ? config.webhookUrl : argv.webhookUrl, 'Client Listing', argv.webhookMessage
93
- ? argv.webhookMessage
94
- : config.webhookMessage), clients);
95
- })
96
- .option('format', {
97
- alias: 'f',
98
- type: 'string',
99
- default: 'json',
100
- description: 'output format, e.g. JSON|CSV'
101
- })
102
- .option('output', {
103
- alias: 'o',
104
- type: 'string',
105
- default: 'stdout',
106
- description: 'output channel'
107
- })
108
- .option('webhookType', {
109
- alias: 'w',
110
- type: 'string',
111
- default: 'slack',
112
- description: 'Webhook Type'
113
- })
114
- .option('webhookMessage', {
115
- alias: 'm',
116
- type: 'string',
117
- description: 'Webhook Message'
118
- })
119
- .option('webhookUrl', {
120
- alias: 't',
121
- type: 'string',
122
- description: 'Webhook URL'
123
- })
124
- .option('reports', {
125
- alias: 'r',
126
- type: 'string',
127
- description: 'Reports directory'
128
- })
129
- .parse();
130
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- {
2
- "$id": "https://github.com/ContinuousSecurityTooling/keycloak-reporter/blob/main/config/schema.json",
3
- "$schema": "http://json-schema.org/draft-07/schema#",
4
- "title": "Keycloak Reporter Config",
5
- "type": "object",
6
- "definitions": {},
7
- "required": ["url", "clientId", "clientSecret"],
8
- "properties": {
9
- "command": {
10
- "type": "array",
11
- "items": {
12
- "type": "string",
13
- "enum": ["listClients", "listUsers"]
14
- }
15
- },
16
- "url": {
17
- "type": "string",
18
- "description": "Keycloak Server URL"
19
- },
20
- "clientId": {
21
- "type": "string",
22
- "description": "Keycloak Client used for reporting"
23
- },
24
- "clientSecret": {
25
- "type": "string",
26
- "description": "Keycloak Client Secret used for reporting"
27
- },
28
- "output": {
29
- "type": "array",
30
- "items": {
31
- "type": "string",
32
- "enum": ["webhook", "stdout"]
33
- },
34
- "description": "Output channel to use"
35
- },
36
- "format": {
37
- "type": "array",
38
- "items": {
39
- "type": "string",
40
- "enum": ["json", "csv"]
41
- },
42
- "description": "Report format"
43
- },
44
- "webhookType": {
45
- "type": "array",
46
- "items": {
47
- "type": "string",
48
- "enum": ["slack", "teams"]
49
- },
50
- "description": "Type of webhook"
51
- },
52
- "webhookMessage": {
53
- "type": "string",
54
- "description": "Message added to the webhook post"
55
- },
56
- "webhookUrl": {
57
- "type": "string",
58
- "description": "URL of the webhook"
59
- },
60
- "reports": {
61
- "type": "string",
62
- "description": "Reports directory"
63
- }
64
- }
65
- }
package/dist/index.js DELETED
@@ -1,4 +0,0 @@
1
- export { listUsers, listClients } from './src/cli.js';
2
- export { convertJSON2CSV } from './lib/convert.js';
3
- export { post2Webhook } from './lib/output.js';
4
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,41 +0,0 @@
1
- import { Issuer } from 'openid-client';
2
- import KcAdminClient from '@keycloak/keycloak-admin-client';
3
- // Token refresh interval 60 seconds
4
- const TOKEN_REFRESH = 60;
5
- export async function createClient(options) {
6
- const kcAdminClient = new KcAdminClient({
7
- baseUrl: options.rootUrl,
8
- realmName: 'master',
9
- });
10
- try {
11
- // client login
12
- await kcAdminClient.auth({
13
- clientId: options.clientId,
14
- clientSecret: options.clientSecret,
15
- grantType: 'client_credentials',
16
- });
17
- }
18
- catch (e) {
19
- console.error('Check Client Config:', e.response ? e.response.data.error_description : e);
20
- return Promise.reject();
21
- }
22
- const keycloakIssuer = await Issuer.discover(`${options.rootUrl}/realms/master`);
23
- const client = new keycloakIssuer.Client({
24
- client_id: options.clientId,
25
- token_endpoint_auth_method: 'none', // to send only client_id in the header
26
- });
27
- // Use the grant type 'password'
28
- const tokenSet = await client.grant({
29
- client_id: options.clientId,
30
- client_secret: options.clientSecret,
31
- grant_type: 'client_credentials',
32
- });
33
- /*
34
- // TODO: FIXME - Periodically using refresh_token grant flow to get new access token here
35
- setInterval(async () => {
36
- const refreshToken = tokenSet.refresh_token;
37
- kcAdminClient.setAccessToken((await client.refresh(refreshToken)).access_token);
38
- }, TOKEN_REFRESH * 1000); */
39
- return new Promise((resolve) => resolve(kcAdminClient));
40
- }
41
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../lib/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,aAAa,MAAM,iCAAiC,CAAC;AAE5D,oCAAoC;AACpC,MAAM,aAAa,GAAG,EAAE,CAAC;AAQzB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB;IACjD,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC;QACtC,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAC;IAEH,IAAI;QACF,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;KACJ;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,KAAK,CACX,sBAAsB,EACtB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CACnD,CAAC;QACF,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;KACzB;IAED,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,QAAQ,CAC1C,GAAG,OAAO,CAAC,OAAO,gBAAgB,CACnC,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,CAAC;QACvC,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,0BAA0B,EAAE,MAAM,EAAE,uCAAuC;KAC5E,CAAC,CAAC;IAEH,gCAAgC;IAChC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;QAClC,SAAS,EAAE,OAAO,CAAC,QAAQ;QAC3B,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,UAAU,EAAE,oBAAoB;KACjC,CAAC,CAAC;IAEH;;;;;gCAK4B;IAE5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;AAC1D,CAAC"}
@@ -1,9 +0,0 @@
1
- import { AsyncParser } from '@json2csv/node';
2
- export async function convertJSON2CSV(json) {
3
- const opts = {};
4
- const transformOpts = {};
5
- const asyncOpts = {};
6
- const parser = new AsyncParser(opts, transformOpts, asyncOpts);
7
- return await parser.parse(json).promise();
8
- }
9
- //# sourceMappingURL=convert.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../lib/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,MAAM,aAAa,GAAG,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;IAC/D,OAAO,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;AAC5C,CAAC"}
@@ -1,113 +0,0 @@
1
- import { IncomingWebhook as TeamsWebhook } from 'ms-teams-webhook';
2
- import { IncomingWebhook as SlackWebhook } from '@slack/webhook';
3
- var WebhookType;
4
- (function (WebhookType) {
5
- WebhookType["SLACK"] = "slack";
6
- WebhookType["TEAMS"] = "teams";
7
- })(WebhookType || (WebhookType = {}));
8
- export async function post2Webhook(type, url, title, reportContent, text) {
9
- //const title= 'Keycloak Reporting';
10
- const date = new Date();
11
- switch (type) {
12
- case WebhookType.TEAMS.toString():
13
- return new TeamsWebhook(url).send({
14
- type: 'message',
15
- attachments: [
16
- {
17
- contentType: 'application/vnd.microsoft.card.adaptive',
18
- content: {
19
- $schema: 'http://adaptivecards.io/schemas/adaptive-card.json',
20
- type: 'AdaptiveCard',
21
- version: '1.2',
22
- body: [
23
- {
24
- type: 'FactSet',
25
- facts: [
26
- {
27
- title: 'Type',
28
- value: title
29
- },
30
- {
31
- title: 'Date',
32
- value: `${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`
33
- }
34
- ]
35
- },
36
- {
37
- type: 'TextBlock',
38
- text: text != null ? text : '',
39
- wrap: true
40
- }
41
- ],
42
- actions: [
43
- {
44
- type: 'Action.ShowCard',
45
- title: 'Show raw report data',
46
- card: {
47
- type: 'AdaptiveCard',
48
- body: [
49
- {
50
- type: 'TextBlock',
51
- text: reportContent,
52
- wrap: true
53
- }
54
- ],
55
- $schema: 'http://adaptivecards.io/schemas/adaptive-card.json'
56
- }
57
- }
58
- ]
59
- }
60
- }
61
- ]
62
- });
63
- // defaulting to Slack
64
- default:
65
- // eslint-disable-next-line no-case-declarations
66
- const blockEntries = [
67
- {
68
- type: 'section',
69
- fields: [
70
- { type: 'mrkdwn', text: `*Type*: ${title}` },
71
- {
72
- type: 'mrkdwn',
73
- text: `*Date*: ${date.getDate()}-${date.getMonth() + 1}-${date.getFullYear()}`
74
- }
75
- ]
76
- },
77
- {
78
- type: 'divider'
79
- }
80
- ];
81
- if (text != null) {
82
- blockEntries.push({
83
- type: 'context',
84
- elements: [{ type: 'plain_text', text: text }]
85
- });
86
- blockEntries.push({
87
- type: 'divider'
88
- });
89
- }
90
- blockEntries.push({
91
- type: 'context',
92
- elements: [
93
- {
94
- type: 'mrkdwn',
95
- text: `
96
- \`\`\`
97
- ${reportContent}
98
- \`\`\`
99
- `
100
- }
101
- ]
102
- }, {
103
- type: 'context',
104
- elements: [{ type: 'plain_text', text: 'Raw report data' }]
105
- });
106
- return new SlackWebhook(url).send({
107
- blocks: blockEntries
108
- });
109
- }
110
- }
111
- /*
112
- */
113
- //# sourceMappingURL=output.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../lib/output.ts"],"names":[],"mappings":"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"}
package/dist/lib/user.js DELETED
@@ -1,75 +0,0 @@
1
- export async function clientListing(client) {
2
- const currentRealm = client.realmName;
3
- let realms;
4
- try {
5
- // iterate over realms
6
- realms = await client.realms.find();
7
- }
8
- catch (e) {
9
- console.error('Check Client role:', e.response.statusText);
10
- return Promise.reject();
11
- }
12
- let allClients = new Array();
13
- for (const realm of realms) {
14
- // switch realm
15
- client.setConfig({
16
- realmName: realm.realm,
17
- });
18
- const realmClients = new Array();
19
- for (const user of await client.clients.find()) {
20
- realmClients.push({
21
- client: user.clientId,
22
- id: user.id,
23
- description: user.description,
24
- realm: realm.realm,
25
- enabled: user.enabled,
26
- public: user.publicClient,
27
- allowedOrigins: JSON.stringify(user.webOrigins),
28
- });
29
- }
30
- allClients = [...allClients, ...realmClients];
31
- }
32
- // switch back to realm
33
- client.setConfig({
34
- realmName: currentRealm,
35
- });
36
- return new Promise((resolve) => resolve(allClients));
37
- }
38
- export async function userListing(client) {
39
- const currentRealm = client.realmName;
40
- let realms;
41
- // iterate over realms
42
- try {
43
- realms = await client.realms.find();
44
- }
45
- catch (e) {
46
- console.error('Check Client role:', e.response.statusText);
47
- return Promise.reject();
48
- }
49
- let allUsers = new Array();
50
- for (const realm of realms) {
51
- // switch realm
52
- client.setConfig({
53
- realmName: realm.realm,
54
- });
55
- const realmUsers = new Array();
56
- for (const user of await client.users.find()) {
57
- realmUsers.push({
58
- username: user.username,
59
- id: user.id,
60
- firstName: user.firstName,
61
- lastName: user.lastName,
62
- email: user.email,
63
- realm: realm.realm,
64
- enabled: user.enabled,
65
- });
66
- }
67
- allUsers = [...allUsers, ...realmUsers];
68
- }
69
- // switch back to realm
70
- client.setConfig({
71
- realmName: currentRealm,
72
- });
73
- return new Promise((resolve) => resolve(allUsers));
74
- }
75
- //# sourceMappingURL=user.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"user.js","sourceRoot":"","sources":["../../lib/user.ts"],"names":[],"mappings":"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"}
package/dist/src/cli.js DELETED
@@ -1,19 +0,0 @@
1
- import { createClient } from '../lib/client.js';
2
- import { userListing, clientListing } from '../lib/user.js';
3
- export async function listUsers(options) {
4
- const users = await userListing(await createClient({
5
- clientId: options.clientId,
6
- clientSecret: options.clientSecret,
7
- rootUrl: options.rootUrl,
8
- }));
9
- return new Promise((resolve) => resolve(users));
10
- }
11
- export async function listClients(options) {
12
- const clients = await clientListing(await createClient({
13
- clientId: options.clientId,
14
- clientSecret: options.clientSecret,
15
- rootUrl: options.rootUrl,
16
- }));
17
- return new Promise((resolve) => resolve(clients));
18
- }
19
- //# sourceMappingURL=cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAQ,WAAW,EAAE,aAAa,EAAU,MAAM,gBAAgB,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAgB;IAC9C,MAAM,KAAK,GAAG,MAAM,WAAW,CAC7B,MAAM,YAAY,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CACH,CAAC;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAgB;IAChD,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,MAAM,YAAY,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CACH,CAAC;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -1,57 +0,0 @@
1
- import { assoc, pick, mergeAll, mergeDeepRight } from 'ramda';
2
- import Ajv from 'ajv';
3
- import path from 'path';
4
- import { fileURLToPath } from 'url';
5
- import fs from 'fs';
6
- const schema = JSON.parse(fs.readFileSync(fileURLToPath(path.join(import.meta.url, '../../config/schema.json')), 'utf8'));
7
- const ajv = new Ajv.default();
8
- const ajvValidate = ajv.compile(schema);
9
- // import the config file
10
- function buildConfigFromFile(filePath) {
11
- if (!filePath)
12
- return {};
13
- const isAbsolutePath = filePath.charAt(0) === '/';
14
- return JSON.parse(isAbsolutePath
15
- ? fs.readFileSync(filePath, 'utf8')
16
- : fs.readFileSync(fileURLToPath(path.join(import.meta.url, '../config', filePath)), 'utf8'));
17
- }
18
- // build an object using the defaults in the schema
19
- function buildDefaults(schema, definitions) {
20
- return Object.keys(schema.properties).reduce((acc, prop) => {
21
- let spec = schema.properties[prop];
22
- if (spec.$ref) {
23
- spec = definitions[spec.$ref.replace('#/definitions/', '')];
24
- if (spec && spec.type === 'object') {
25
- return assoc(prop, buildDefaults(spec, definitions), acc);
26
- }
27
- }
28
- return assoc(prop, spec.default, acc);
29
- }, {});
30
- }
31
- // build an object of config values taken from process.env
32
- function buildEnvironmentVariablesConfig(schema) {
33
- const trueRx = /^true$/i;
34
- const configKeys = Object.keys(schema.properties);
35
- const env = pick(configKeys, process.env);
36
- return Object.keys(env).reduce((acc, key) => {
37
- const { type } = schema.properties[key];
38
- switch (type) {
39
- case 'integer':
40
- return assoc(key, parseInt(env[key], 10), acc);
41
- case 'boolean':
42
- return assoc(key, trueRx.test(env[key]), acc);
43
- default:
44
- return assoc(key, env[key], acc);
45
- }
46
- }, {});
47
- }
48
- function validate(data) {
49
- const valid = ajvValidate(data);
50
- if (valid)
51
- return true;
52
- throw new Error(ajv.errorsText());
53
- }
54
- // merge the environment variables, config file values, and defaults
55
- const config = mergeAll(mergeDeepRight(buildDefaults(schema, schema.definitions), buildConfigFromFile(process.env.CONFIG_FILE)), buildEnvironmentVariablesConfig(schema));
56
- export default config;
57
- //# sourceMappingURL=config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC9D,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACvB,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC,EAAE,MAAM,CAAC,CAC/F,CAAC;AAEF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;AAC9B,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAExC,yBAAyB;AACzB,SAAS,mBAAmB,CAAC,QAAQ;IACnC,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc;QAC9B,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;QACnC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACjG,CAAC;AACD,mDAAmD;AACnD,SAAS,aAAa,CAAC,MAAM,EAAE,WAAW;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACzD,IAAI,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;YAC5D,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAClC,OAAO,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3D;SACF;QACD,OAAO,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,0DAA0D;AAC1D,SAAS,+BAA+B,CAAC,MAAM;IAC7C,MAAM,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACxC,QAAQ,IAAI,EAAE;YACZ,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACjD,KAAK,SAAS;gBACZ,OAAO,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAChD;gBACE,OAAO,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;SACpC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,QAAQ,CAAC,IAAI;IACpB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,oEAAoE;AACpE,MAAM,MAAM,GAAG,QAAQ,CACrB,cAAc,CACZ,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,EACzC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAC7C,EACD,+BAA+B,CAAC,MAAM,CAAC,CACxC,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/k8s.yaml DELETED
@@ -1,51 +0,0 @@
1
- apiVersion: batch/v1
2
- kind: Job
3
- metadata:
4
- name: test-job
5
- namespace: kc-reporter
6
- spec:
7
- suspend: false
8
- template:
9
- spec:
10
- containers:
11
- - command:
12
- - /bin/sh
13
- - -c
14
- - |
15
- while true; do sleep 30; done;
16
- env:
17
- - name: CONFIG_FILE
18
- value: /app/config.json
19
- image: continuoussecuritytooling/keycloak-reporting-cli:0.5.1
20
- imagePullPolicy: IfNotPresent
21
- name: users
22
- resources: {}
23
- terminationMessagePath: /dev/termination-log
24
- terminationMessagePolicy: File
25
- volumeMounts:
26
- - mountPath: /app/config.json
27
- name: config-file
28
- readOnly: true
29
- subPath: config.json
30
- dnsPolicy: ClusterFirst
31
- restartPolicy: OnFailure
32
- schedulerName: default-scheduler
33
- securityContext: {}
34
- terminationGracePeriodSeconds: 30
35
- volumes:
36
- - name: config-file
37
- secret:
38
- defaultMode: 420
39
- secretName: kc-reporter-test-keycloak-reporter
40
- status:
41
- conditions:
42
- - lastProbeTime: "2023-10-07T07:43:08Z"
43
- lastTransitionTime: "2023-10-07T07:43:08Z"
44
- message: Job has reached the specified backoff limit
45
- reason: BackoffLimitExceeded
46
- status: "True"
47
- type: Failed
48
- failed: 1
49
- ready: 0
50
- startTime: "2023-10-07T07:37:15Z"
51
- uncountedTerminatedPods: {}
Binary file
package/src/cli.ts DELETED
@@ -1,26 +0,0 @@
1
- import { Options, createClient } from '../lib/client.js';
2
- import { User, userListing, clientListing, Client } from '../lib/user.js';
3
-
4
- export async function listUsers(options: Options): Promise<Array<User>> {
5
- const users = await userListing(
6
- await createClient({
7
- clientId: options.clientId,
8
- clientSecret: options.clientSecret,
9
- rootUrl: options.rootUrl,
10
- })
11
- );
12
-
13
- return new Promise((resolve) => resolve(users));
14
- }
15
-
16
- export async function listClients(options: Options): Promise<Array<Client>> {
17
- const clients = await clientListing(
18
- await createClient({
19
- clientId: options.clientId,
20
- clientSecret: options.clientSecret,
21
- rootUrl: options.rootUrl,
22
- })
23
- );
24
-
25
- return new Promise((resolve) => resolve(clients));
26
- }
package/test.values.yaml DELETED
@@ -1,8 +0,0 @@
1
- installCRDs: true
2
- keycloak:
3
- config:
4
- clientId: admin-cli
5
- clientSecret: PWkJ98Atq36QFP5Z25YXJDWs4tvsGvkI
6
- webhookType: teams
7
- webhookUrl: https://m13t4mgmt.webhook.office.com/webhookb2/02950819-c8ca-4c83-9751-808d801e8810@09f6f098-3af9-474c-a398-d17786fff1bf/IncomingWebhook/b06222e267a04255aaa32a341acb1749/a4f92b5b-01c7-40a8-91ff-0695e08d76ff
8
- webhookMessage: TEST