From 3c6fff78ce2acca52f662f1dd54eeb81d897add0 Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Tue, 31 Mar 2026 07:58:13 -0600 Subject: [PATCH 01/69] feat(mcp): introduce Model Context Protocol (MCP) command and server management - Added new MCP command group for managing Model Context Protocol integrations. - Implemented `frodo mcp server start` command to start an MCP server session. - Created `frodo mcp server tools` command to list current MCP tools. - Integrated HTTP and stdio transport options for MCP server. - Enhanced package dependencies with `@modelcontextprotocol/sdk` and updated `@rockcarver/frodo-lib`. - Added utility functions for handling MCP server operations and transport wiring. --- package-lock.json | 847 ++++++++++++++++++++++++++++- package.json | 6 +- src/app.ts | 2 + src/cli/mcp/mcp.ts | 15 + src/cli/mcp/server/server-start.ts | 190 +++++++ src/cli/mcp/server/server-tools.ts | 100 ++++ src/cli/mcp/server/server.ts | 17 + src/ops/McpServerOps.ts | 401 ++++++++++++++ 8 files changed, 1571 insertions(+), 7 deletions(-) create mode 100644 src/cli/mcp/mcp.ts create mode 100644 src/cli/mcp/server/server-start.ts create mode 100644 src/cli/mcp/server/server-tools.ts create mode 100644 src/cli/mcp/server/server.ts create mode 100644 src/ops/McpServerOps.ts diff --git a/package-lock.json b/package-lock.json index 5ff0b325f..eb4d92562 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,8 @@ "frodo": "dist/launch.cjs" }, "devDependencies": { - "@rockcarver/frodo-lib": "4.0.0-34", + "@modelcontextprotocol/sdk": "^1.29.0", + "@rockcarver/frodo-lib": "4.0.0-35", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", @@ -55,7 +56,8 @@ "tsup": "^8.1.0", "typescript": "^5.2.2", "uuid": "^11.1.0", - "yesno": "^0.4.0" + "yesno": "^0.4.0", + "zod": "^4.3.6" }, "engines": { "node": ">=20" @@ -1117,6 +1119,19 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@hono/node-server": { + "version": "1.19.12", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.12.tgz", + "integrity": "sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -1701,6 +1716,71 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz", + "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1753,9 +1833,9 @@ } }, "node_modules/@rockcarver/frodo-lib": { - "version": "4.0.0-34", - "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.0.0-34.tgz", - "integrity": "sha512-C5B4MwFMwkuwyhCQma/asR9ky0uH1uLzn7Oo+M6CnnqTkQRp1HRdo8wXD40IuRG6xPcoVOOnAOfB3l4huIEHoQ==", + "version": "4.0.0-35", + "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.0.0-35.tgz", + "integrity": "sha512-N3Cluq5cuj4K0INGNo/dw5UQc4DEm5eBHKdpA8C8+fel23InEAk3RZ5KSl5dvVMUEoi5A45CVDJrPusTQxFSwg==", "dev": true, "license": "MIT", "engines": { @@ -2631,6 +2711,20 @@ "pkg-fetch": "lib-es5/bin.js" } }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -2684,6 +2778,48 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3295,6 +3431,31 @@ "dev": true, "license": "MIT" }, + "node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/brace-expansion": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", @@ -3436,6 +3597,16 @@ "esbuild": ">=0.18" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -3756,6 +3927,30 @@ "node": "^14.18.0 || >=16.10.0" } }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3763,6 +3958,26 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, "node_modules/copyfiles": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", @@ -3814,6 +4029,24 @@ "dev": true, "license": "MIT" }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -4097,6 +4330,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -4165,6 +4408,13 @@ "readable-stream": "^2.0.2" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.286", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", @@ -4192,6 +4442,16 @@ "dev": true, "license": "MIT" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -4413,6 +4673,13 @@ "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4903,6 +5170,16 @@ "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/events-universal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", @@ -4913,6 +5190,29 @@ "bare-events": "^2.7.0" } }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -4973,6 +5273,69 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.2.tgz", + "integrity": "sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5038,6 +5401,23 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -5102,6 +5482,28 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -5186,6 +5588,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -5634,6 +6056,16 @@ "node": ">= 0.4" } }, + "node_modules/hono": { + "version": "4.12.9", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.9.tgz", + "integrity": "sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -5641,6 +6073,27 @@ "dev": true, "license": "MIT" }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -5665,6 +6118,23 @@ "node": ">=10.17.0" } }, + "node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -5801,6 +6271,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -6101,6 +6591,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -7024,6 +7521,16 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jose": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.2.tgz", + "integrity": "sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, "node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", @@ -7088,6 +7595,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -7379,6 +7893,29 @@ "node": ">= 0.4" } }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7423,6 +7960,33 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -7601,6 +8165,16 @@ "dev": true, "license": "MIT" }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", @@ -7824,6 +8398,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -7990,6 +8577,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8054,6 +8651,17 @@ "node": "20 || >=22" } }, + "node_modules/path-to-regexp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.1.tgz", + "integrity": "sha512-fvU78fIjZ+SBM9YwCknCvKOUKkLVqtWDVctl0s7xIqfmfb38t2TT4ZU2gHm+Z8xGwgW+QWEU3oQSAzIbo89Ggw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -8091,6 +8699,16 @@ "node": ">= 6" } }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -8432,6 +9050,20 @@ "url": "https://github.com/steveukx/properties?sponsor=1" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/pump": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", @@ -8470,6 +9102,22 @@ ], "license": "MIT" }, + "node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -8491,6 +9139,32 @@ ], "license": "MIT" }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -8627,6 +9301,16 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -8799,6 +9483,23 @@ "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8899,6 +9600,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, "node_modules/sanitize-filename": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", @@ -8922,6 +9630,53 @@ "node": ">=10" } }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -8971,6 +9726,13 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -9223,6 +9985,16 @@ "node": ">=8" } }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -9708,6 +10480,16 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -9979,6 +10761,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", @@ -10141,6 +10938,16 @@ "node": ">= 10.0.0" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -10249,6 +11056,16 @@ "node": ">=10.12.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -10530,6 +11347,26 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } } } } diff --git a/package.json b/package.json index f94d8a170..7a74efe4f 100644 --- a/package.json +++ b/package.json @@ -95,7 +95,8 @@ ] }, "devDependencies": { - "@rockcarver/frodo-lib": "4.0.0-34", + "@modelcontextprotocol/sdk": "^1.29.0", + "@rockcarver/frodo-lib": "4.0.0-35", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", @@ -138,6 +139,7 @@ "tsup": "^8.1.0", "typescript": "^5.2.2", "uuid": "^11.1.0", - "yesno": "^0.4.0" + "yesno": "^0.4.0", + "zod": "^4.3.6" } } diff --git a/src/app.ts b/src/app.ts index 964692a19..21024e0a0 100755 --- a/src/app.ts +++ b/src/app.ts @@ -26,6 +26,7 @@ import info from './cli/info/info'; import journey from './cli/journey/journey'; import log from './cli/log/log'; import mapping from './cli/mapping/mapping'; +import mcp from './cli/mcp/mcp'; import node from './cli/node/node'; import oauth from './cli/oauth/oauth'; import promote from './cli/promote/promote'; @@ -93,6 +94,7 @@ process.argv = normalizeExpandedHelpArgv(process.argv); program.addCommand(journey()); program.addCommand(log()); program.addCommand(mapping()); + program.addCommand(mcp().helpGroup(utilitiesCommandsHeading)); program.addCommand(node()); program.addCommand(oauth()); program.addCommand(promote()); diff --git a/src/cli/mcp/mcp.ts b/src/cli/mcp/mcp.ts new file mode 100644 index 000000000..e2df62f28 --- /dev/null +++ b/src/cli/mcp/mcp.ts @@ -0,0 +1,15 @@ +import { FrodoStubCommand } from '../FrodoCommand'; +import mcpServer from './server/server.js'; + +/** + * Top-level MCP command group. + */ +export default function setup() { + const program = new FrodoStubCommand('mcp') + .description('Manage Model Context Protocol (MCP) integrations.') + .withStability('experimental'); + + program.addCommand(mcpServer()); + + return program; +} diff --git a/src/cli/mcp/server/server-start.ts b/src/cli/mcp/server/server-start.ts new file mode 100644 index 000000000..3e30ff99d --- /dev/null +++ b/src/cli/mcp/server/server-start.ts @@ -0,0 +1,190 @@ +import { createMcpService, frodo, state } from '@rockcarver/frodo-lib'; +import { Option } from 'commander'; + +import { + startHttpTransport, + startStdioTransport, +} from '../../../ops/McpServerOps.js'; +import { printMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +type McpPolicyPreset = 'read-only' | 'standard' | 'admin'; + +/** Parsed options for `frodo mcp server start`. */ +type McpStartOptions = { + /** Policy preset controlling capability exposure. */ + policy: McpPolicyPreset; + /** Optional allow-list of top-level capability domains. */ + includeDomains?: string[]; + /** Optional deny-list of top-level capability domains. */ + excludeDomains?: string[]; + /** Whether to include the `utils` top-level domain. */ + includeUtils?: boolean; + /** Transport mode to launch. */ + transport?: 'stdio' | 'http'; + /** Bind host for HTTP transport. */ + bindHost?: string; + /** Bind port for HTTP transport. */ + port?: string; + /** Build and validate service composition without launching transport. */ + dryRun?: boolean; + /** Print startup summary as JSON. */ + json?: boolean; +}; + +/** + * MCP server start command. + */ +export default function setup() { + const program = new FrodoCommand('frodo mcp server start', []) + .description('Start an MCP server session from frodo-lib capabilities.') + .withStability('experimental') + .addOption( + new Option('--policy ', 'Capability policy preset.') + .choices(['read-only', 'standard', 'admin']) + .default('standard') + ) + .addOption( + new Option( + '--include-domains ', + 'Only include the listed top-level domains in capability discovery.' + ) + ) + .addOption( + new Option( + '--exclude-domains ', + 'Exclude listed top-level domains from capability discovery.' + ) + ) + .addOption( + new Option( + '--include-utils', + 'Include the utils domain in discovery.' + ).default(false) + ) + .addOption( + new Option('--transport ', 'Server transport mode.') + .choices(['stdio', 'http']) + .default('stdio') + ) + .addOption( + new Option('--bind-host ', 'Bind host for HTTP transport.').default( + '127.0.0.1' + ) + ) + .addOption( + new Option('--port ', 'Bind port for HTTP transport.').default( + '6277' + ) + ) + .addOption( + new Option( + '--dry-run', + 'Build and validate MCP service composition, then exit.' + ).default(false) + ) + .addOption( + new Option('--json', 'Print startup summary as JSON.').default(false) + ) + .action(async (host, realm, username, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + username, + password, + options, + command + ); + + const opts = options as McpStartOptions; + const service = createMcpService({ + policyPreset: opts.policy, + inventoryOptions: { + includeTopLevelDomains: opts.includeDomains, + excludeTopLevelDomains: opts.excludeDomains, + includeUtils: !!opts.includeUtils, + }, + // Reuse the preconfigured frodo singleton; the CLI has already + // applied connection credentials via handleDefaultArgsAndOpts. + runtimeOptions: { + resolveFrodoForRequest: async () => frodo, + }, + }); + + const startupSummary = { + policy: service.policy.name, + transport: opts.transport, + http: { + bindHost: opts.bindHost, + port: Number(opts.port), + }, + authMode: inferAuthModeFromState(), + toolCounts: { + total: service.manifest.totalToolCount, + generic: service.manifest.genericTools.length, + special: service.manifest.specialTools.length, + }, + descriptorCount: service.manifest.backingDescriptorCount, + }; + + if (opts.json) { + printMessage(JSON.stringify(startupSummary, null, 2), 'data'); + } else { + printMessage('MCP server startup summary:', 'info'); + printMessage(` Policy: ${startupSummary.policy}`); + printMessage(` Transport: ${startupSummary.transport}`); + printMessage(` Auth mode: ${startupSummary.authMode}`); + printMessage( + ` Tools: ${startupSummary.toolCounts.total} total (${startupSummary.toolCounts.generic} generic, ${startupSummary.toolCounts.special} special)` + ); + printMessage( + ` Backing descriptors: ${startupSummary.descriptorCount}` + ); + if (opts.transport === 'http') { + printMessage( + ` HTTP endpoint (planned): http://${startupSummary.http.bindHost}:${startupSummary.http.port}/mcp` + ); + } + } + + if (opts.dryRun) { + printMessage('Dry run completed successfully.', 'info'); + return; + } + + const transport = opts.transport ?? 'stdio'; + if (transport === 'stdio') { + await startStdioTransport(service); + } else { + await startHttpTransport( + service, + opts.bindHost ?? '127.0.0.1', + Number(opts.port ?? '6277') + ); + } + }); + + return program; +} + +/** + * Infers runtime auth mode from currently configured global state. + */ +function inferAuthModeFromState(): + | 'service-account' + | 'admin-account' + | 'state-config' { + const serviceAccountId = state.getServiceAccountId(); + const serviceAccountJwk = state.getServiceAccountJwk(); + if (serviceAccountId && serviceAccountJwk) { + return 'service-account'; + } + + const username = state.getUsername(); + const password = state.getPassword(); + if (username && password) { + return 'admin-account'; + } + + return 'state-config'; +} diff --git a/src/cli/mcp/server/server-tools.ts b/src/cli/mcp/server/server-tools.ts new file mode 100644 index 000000000..fffee391a --- /dev/null +++ b/src/cli/mcp/server/server-tools.ts @@ -0,0 +1,100 @@ +import { createMcpService } from '@rockcarver/frodo-lib'; +import { Option } from 'commander'; + +import { printMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +type McpPolicyPreset = 'read-only' | 'standard' | 'admin'; + +/** Parsed options for `frodo mcp server tools`. */ +type McpToolsOptions = { + /** Policy preset controlling capability exposure. */ + policy: McpPolicyPreset; + /** Optional allow-list of top-level capability domains. */ + includeDomains?: string[]; + /** Optional deny-list of top-level capability domains. */ + excludeDomains?: string[]; + /** Whether to include the `utils` top-level domain. */ + includeUtils?: boolean; + /** Print tool definitions as JSON. */ + json?: boolean; +}; + +/** + * Lists the current MCP tool surface derived from frodo-lib descriptors. + */ +export default function setup() { + const program = new FrodoCommand('frodo mcp server tools', ['realm']) + .description('List MCP tools exposed under the current policy/profile.') + .withStability('experimental') + .addOption( + new Option('--policy ', 'Capability policy preset.') + .choices(['read-only', 'standard', 'admin']) + .default('standard') + ) + .addOption( + new Option( + '--include-domains ', + 'Only include the listed top-level domains in capability discovery.' + ) + ) + .addOption( + new Option( + '--exclude-domains ', + 'Exclude listed top-level domains from capability discovery.' + ) + ) + .addOption( + new Option( + '--include-utils', + 'Include the utils domain in discovery.' + ).default(false) + ) + .addOption(new Option('--json', 'Print tool list as JSON.').default(false)) + .action(async (host, username, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + username, + password, + options, + command + ); + + const opts = options as McpToolsOptions; + const service = createMcpService({ + policyPreset: opts.policy, + inventoryOptions: { + includeTopLevelDomains: opts.includeDomains, + excludeTopLevelDomains: opts.excludeDomains, + includeUtils: !!opts.includeUtils, + }, + }); + + const tools = service.listTools(); + if (opts.json) { + printMessage( + JSON.stringify( + { + policy: service.policy.name, + total: tools.length, + tools, + }, + null, + 2 + ), + 'data' + ); + return; + } + + printMessage( + `MCP tools (${tools.length}) for policy '${service.policy.name}':`, + 'info' + ); + for (const tool of tools) { + printMessage(`- ${tool.name}: ${tool.description}`); + } + }); + + return program; +} diff --git a/src/cli/mcp/server/server.ts b/src/cli/mcp/server/server.ts new file mode 100644 index 000000000..8e1ceb540 --- /dev/null +++ b/src/cli/mcp/server/server.ts @@ -0,0 +1,17 @@ +import { FrodoStubCommand } from '../../FrodoCommand'; +import startCmd from './server-start.js'; +import toolsCmd from './server-tools.js'; + +/** + * MCP server command group. + */ +export default function setup() { + const program = new FrodoStubCommand('server') + .description('Manage Frodo MCP server lifecycle and metadata.') + .withStability('experimental'); + + program.addCommand(startCmd().name('start')); + program.addCommand(toolsCmd().name('tools')); + + return program; +} diff --git a/src/ops/McpServerOps.ts b/src/ops/McpServerOps.ts new file mode 100644 index 000000000..e8ea3503c --- /dev/null +++ b/src/ops/McpServerOps.ts @@ -0,0 +1,401 @@ +/** + * MCP transport wiring for `frodo mcp server start`. + * + * This module is transport-specific: it bridges the transport-agnostic + * {@link McpService} from frodo-lib with the `@modelcontextprotocol/sdk` + * transports (stdio and HTTP). + * + * stdio transport — single-session, process lifetime, reads JSON-RPC from + * stdin and writes responses to stdout. + * + * HTTP transport — multi-session stateful server using StreamableHTTP. + * Each initialize request creates a new MCP session. + * Sessions are cleaned up when the client disconnects. + * The same McpServer instance is reused across sessions. + * + * @remarks + * Both transports recycle the frodo singleton that was configured by + * `handleDefaultArgsAndOpts` before the transport starts. A custom + * `resolveFrodoForRequest` passed to {@link createMcpService} bypasses the + * default per-request Frodo instantiation and returns the singleton directly. + */ + +import { randomUUID } from 'node:crypto'; +import { + createServer, + type IncomingMessage, + type ServerResponse, +} from 'node:http'; + +import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; +import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; +import type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'; +import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js'; +import { + type McpRuntimeRequestContext, + type McpService, +} from '@rockcarver/frodo-lib'; +import { z } from 'zod'; + +import { printMessage } from '../utils/Console.js'; + +// --------------------------------------------------------------------------- +// Internal constants +// --------------------------------------------------------------------------- + +/** + * Dummy request context used when the transport ignores per-request auth. + * The custom `resolveFrodoForRequest` registered by the `start` command + * returns the preconfigured frodo singleton instead, so the context fields + * are never read by the runtime. + */ +const CLI_REQUEST_CONTEXT: McpRuntimeRequestContext = { + auth: { mode: 'state-config', config: {} }, +}; + +// Zod v4 schema shapes reused for generic and special tools. +const GENERIC_SHAPE = { + domain: z.string().describe('Top-level capability domain key (e.g. "authn")'), + objectType: z + .string() + .describe( + 'Object type within the domain (e.g. "Journey"). Use frodo_discover to enumerate available types.' + ), + positionalArgs: z + .array(z.unknown()) + .optional() + .describe('Ordered arguments forwarded to the underlying Frodo method.'), + namedArgs: z + .record(z.string(), z.unknown()) + .optional() + .describe( + 'Named argument map forwarded as a single object to the Frodo method.' + ), +} as const; + +const SPECIAL_SHAPE = { + positionalArgs: z + .array(z.unknown()) + .optional() + .describe('Ordered arguments forwarded to the underlying Frodo method.'), + namedArgs: z + .record(z.string(), z.unknown()) + .optional() + .describe( + 'Named argument map forwarded as a single object to the Frodo method.' + ), +} as const; + +// --------------------------------------------------------------------------- +// Server builder +// --------------------------------------------------------------------------- + +/** + * Constructs an `McpServer` with all tools from the service registered. + * + * Tools are registered once and the server instance is reused across + * transport connections (important for the multi-session HTTP transport). + * + * @param service Fully composed MCP service from `createMcpService`. + * @returns Configured `McpServer` ready to connect to a transport. + */ +function buildMcpServer(service: McpService): McpServer { + const server = new McpServer({ name: 'frodo-mcp', version: '1.0.0' }); + const { manifest } = service; + + for (const tool of service.listTools()) { + const isDiscovery = tool.name === manifest.discoveryTool.toolName; + const isGeneric = manifest.genericTools.some( + (t) => t.toolName === tool.name + ); + const annotations: ToolAnnotations | undefined = tool.annotations + ? { ...tool.annotations } + : undefined; + + if (isDiscovery) { + server.registerTool( + tool.name, + { description: tool.description }, + async () => { + try { + const result = await service.executeTool({ + toolName: tool.name, + context: CLI_REQUEST_CONTEXT, + }); + return { + content: [ + { + type: 'text' as const, + text: JSON.stringify(result.data, null, 2), + }, + ], + }; + } catch (err) { + return buildErrorResult(err); + } + } + ); + } else if (isGeneric) { + server.registerTool( + tool.name, + { + description: tool.description, + inputSchema: GENERIC_SHAPE, + annotations, + }, + async (args) => { + try { + const result = await service.executeTool({ + toolName: tool.name, + arguments: args, + context: CLI_REQUEST_CONTEXT, + }); + return { + content: [ + { + type: 'text' as const, + text: JSON.stringify(result.data, null, 2), + }, + ], + }; + } catch (err) { + return buildErrorResult(err); + } + } + ); + } else { + server.registerTool( + tool.name, + { + description: tool.description, + inputSchema: SPECIAL_SHAPE, + annotations, + }, + async (args) => { + try { + const result = await service.executeTool({ + toolName: tool.name, + arguments: args, + context: CLI_REQUEST_CONTEXT, + }); + return { + content: [ + { + type: 'text' as const, + text: JSON.stringify(result.data, null, 2), + }, + ], + }; + } catch (err) { + return buildErrorResult(err); + } + } + ); + } + } + + return server; +} + +// --------------------------------------------------------------------------- +// Public transport functions +// --------------------------------------------------------------------------- + +/** + * Starts an MCP stdio server that reads JSON-RPC from stdin and writes + * responses to stdout. The process runs until stdin is closed. + * + * @param service Fully composed MCP service. + */ +export async function startStdioTransport(service: McpService): Promise { + const server = buildMcpServer(service); + const transport = new StdioServerTransport(); + await server.connect(transport); + // server.connect() resolves once stdin closes +} + +/** + * Starts a stateful MCP HTTP server using the Streamable HTTP transport. + * + * Each `POST /mcp` initialize request creates a new session. + * Sessions are removed when the client sends `DELETE /mcp` or disconnects. + * A `GET /health` endpoint is provided for liveness probing. + * + * The function resolves when the server is stopped via SIGTERM or SIGINT. + * + * @param service Fully composed MCP service. + * @param bindHost Host interface to bind (e.g. `"127.0.0.1"`). + * @param port TCP port to listen on. + */ +export async function startHttpTransport( + service: McpService, + bindHost: string, + port: number +): Promise { + const mcpServer = buildMcpServer(service); + const sessions = new Map(); + + const httpServer = createServer( + async (req: IncomingMessage, res: ServerResponse) => { + try { + await handleHttpRequest(req, res, mcpServer, sessions); + } catch (err) { + printMessage( + `MCP HTTP handler error: ${err instanceof Error ? err.message : String(err)}`, + 'error' + ); + if (!res.headersSent) { + res.writeHead(500).end('Internal server error'); + } + } + } + ); + + return new Promise((resolve, reject) => { + httpServer.listen(port, bindHost, () => { + printMessage( + `MCP HTTP server listening on http://${bindHost}:${port}/mcp`, + 'info' + ); + }); + + httpServer.on('error', (err) => { + printMessage(`MCP HTTP server error: ${err.message}`, 'error'); + reject(err); + }); + + const shutdown = () => { + httpServer.close(() => resolve()); + }; + process.once('SIGTERM', shutdown); + process.once('SIGINT', shutdown); + }); +} + +// --------------------------------------------------------------------------- +// Private helpers +// --------------------------------------------------------------------------- + +/** + * Routes a single HTTP request to the appropriate MCP transport handler. + */ +async function handleHttpRequest( + req: IncomingMessage, + res: ServerResponse, + mcpServer: McpServer, + sessions: Map +): Promise { + // Health probe + if (req.method === 'GET' && req.url === '/health') { + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(JSON.stringify({ status: 'ok' })); + return; + } + + if (req.url !== '/mcp') { + res.writeHead(404).end('Not found'); + return; + } + + const sessionId = req.headers['mcp-session-id'] as string | undefined; + + // Retrieve existing session for GET / DELETE + if (req.method === 'GET' || req.method === 'DELETE') { + if (!sessionId || !sessions.has(sessionId)) { + res.writeHead(400).end('Invalid or missing session ID'); + return; + } + await sessions.get(sessionId)!.handleRequest(req, res); + return; + } + + if (req.method !== 'POST') { + res.writeHead(405).end('Method not allowed'); + return; + } + + // Parse body for POST + let body: unknown; + try { + body = await readJsonBody(req); + } catch { + res.writeHead(400).end('Invalid JSON body'); + return; + } + + // Enforce dual Accept header (MCP spec requirement) + const accept = (req.headers['accept'] ?? '').toLowerCase(); + if ( + !accept.includes('application/json') || + !accept.includes('text/event-stream') + ) { + res + .writeHead(406) + .end( + 'Not Acceptable: Client must accept both application/json and text/event-stream' + ); + return; + } + + let transport: StreamableHTTPServerTransport; + + if (sessionId && sessions.has(sessionId)) { + transport = sessions.get(sessionId)!; + } else if (!sessionId && isInitializeRequest(body)) { + transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: () => randomUUID(), + onsessioninitialized: (sid) => { + sessions.set(sid, transport); + }, + enableDnsRebindingProtection: false, + }); + transport.onclose = () => { + if (transport.sessionId) { + sessions.delete(transport.sessionId); + } + }; + await mcpServer.connect(transport); + } else { + res.writeHead(400).end('Bad Request: No valid session ID provided'); + return; + } + + await transport.handleRequest(req, res, body); +} + +/** + * Reads and parses the JSON body from an incoming HTTP request. + */ +function readJsonBody(req: IncomingMessage): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + req.on('data', (chunk: Buffer) => chunks.push(chunk)); + req.on('end', () => { + try { + resolve(JSON.parse(Buffer.concat(chunks).toString('utf8'))); + } catch (err) { + reject(err); + } + }); + req.on('error', reject); + }); +} + +/** + * Builds a standardized error result for tool execution failures. + */ +function buildErrorResult(err: unknown): { + content: { type: 'text'; text: string }[]; + isError: true; +} { + return { + content: [ + { + type: 'text' as const, + text: `Error: ${err instanceof Error ? err.message : String(err)}`, + }, + ], + isError: true as const, + }; +} From 665fa6800795ce8d0d876186c663071bfcac281a Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Tue, 31 Mar 2026 15:59:34 -0600 Subject: [PATCH 02/69] feat(mcp): add pre-authentication for MCP server and enhance error handling --- src/cli/mcp/server/server-start.ts | 10 ++++++++++ src/ops/McpServerOps.ts | 26 +++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/cli/mcp/server/server-start.ts b/src/cli/mcp/server/server-start.ts index 3e30ff99d..580ef13a9 100644 --- a/src/cli/mcp/server/server-start.ts +++ b/src/cli/mcp/server/server-start.ts @@ -96,6 +96,16 @@ export default function setup() { command ); + // Pre-authenticate the frodo singleton before starting the MCP server. + // This ensures subsequent tool calls can access APIs without hitting 401 errors. + try { + await frodo.login.getTokens(); + } catch (error) { + throw new Error( + `Failed to authenticate MCP server: ${error instanceof Error ? error.message : String(error)}` + ); + } + const opts = options as McpStartOptions; const service = createMcpService({ policyPreset: opts.policy, diff --git a/src/ops/McpServerOps.ts b/src/ops/McpServerOps.ts index e8ea3503c..9300ae6f6 100644 --- a/src/ops/McpServerOps.ts +++ b/src/ops/McpServerOps.ts @@ -384,16 +384,40 @@ function readJsonBody(req: IncomingMessage): Promise { /** * Builds a standardized error result for tool execution failures. + * Extracts full error context from FrodoError chains and HTTP error details. */ function buildErrorResult(err: unknown): { content: { type: 'text'; text: string }[]; isError: true; } { + let errorText = 'Error: '; + + if (err instanceof Error) { + // If it's a FrodoError with nested originalErrors, get combined message + if (typeof (err as any).getCombinedMessage === 'function') { + errorText += (err as any).getCombinedMessage(); + } else if ( + (err as any).originalErrors && + Array.isArray((err as any).originalErrors) + ) { + // Fallback: manually build chain for non-getCombinedMessage errors + errorText += err.message; + const originalErrors = (err as any).originalErrors as Error[]; + for (const nested of originalErrors) { + errorText += `\n → ${nested.name || 'Error'}: ${nested.message}`; + } + } else { + errorText += err.message; + } + } else { + errorText += String(err); + } + return { content: [ { type: 'text' as const, - text: `Error: ${err instanceof Error ? err.message : String(err)}`, + text: errorText, }, ], isError: true as const, From d4230c08cc5e5e4a35d65a2eb063fdba930dad7b Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Tue, 31 Mar 2026 22:00:06 -0600 Subject: [PATCH 03/69] refactor(mcp): streamline request context handling and improve transport documentation --- src/cli/mcp/server/server-start.ts | 7 +- src/ops/McpServerOps.ts | 112 +++++++++++++++++++++++------ 2 files changed, 93 insertions(+), 26 deletions(-) diff --git a/src/cli/mcp/server/server-start.ts b/src/cli/mcp/server/server-start.ts index 580ef13a9..d8f6aea8c 100644 --- a/src/cli/mcp/server/server-start.ts +++ b/src/cli/mcp/server/server-start.ts @@ -114,11 +114,6 @@ export default function setup() { excludeTopLevelDomains: opts.excludeDomains, includeUtils: !!opts.includeUtils, }, - // Reuse the preconfigured frodo singleton; the CLI has already - // applied connection credentials via handleDefaultArgsAndOpts. - runtimeOptions: { - resolveFrodoForRequest: async () => frodo, - }, }); const startupSummary = { @@ -152,7 +147,7 @@ export default function setup() { ); if (opts.transport === 'http') { printMessage( - ` HTTP endpoint (planned): http://${startupSummary.http.bindHost}:${startupSummary.http.port}/mcp` + ` HTTP endpoint: http://${startupSummary.http.bindHost}:${startupSummary.http.port}/mcp` ); } } diff --git a/src/ops/McpServerOps.ts b/src/ops/McpServerOps.ts index 9300ae6f6..e48ce263f 100644 --- a/src/ops/McpServerOps.ts +++ b/src/ops/McpServerOps.ts @@ -14,10 +14,9 @@ * The same McpServer instance is reused across sessions. * * @remarks - * Both transports recycle the frodo singleton that was configured by - * `handleDefaultArgsAndOpts` before the transport starts. A custom - * `resolveFrodoForRequest` passed to {@link createMcpService} bypasses the - * default per-request Frodo instantiation and returns the singleton directly. + * Both transports derive request-scoped auth context from the active shared + * state configured by `handleDefaultArgsAndOpts` before startup. Generic tool + * calls may additionally override realm per request. */ import { randomUUID } from 'node:crypto'; @@ -33,8 +32,10 @@ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/ import type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'; import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js'; import { + type McpGenericExecutionArguments, type McpRuntimeRequestContext, type McpService, + state, } from '@rockcarver/frodo-lib'; import { z } from 'zod'; @@ -44,16 +45,6 @@ import { printMessage } from '../utils/Console.js'; // Internal constants // --------------------------------------------------------------------------- -/** - * Dummy request context used when the transport ignores per-request auth. - * The custom `resolveFrodoForRequest` registered by the `start` command - * returns the preconfigured frodo singleton instead, so the context fields - * are never read by the runtime. - */ -const CLI_REQUEST_CONTEXT: McpRuntimeRequestContext = { - auth: { mode: 'state-config', config: {} }, -}; - // Zod v4 schema shapes reused for generic and special tools. const GENERIC_SHAPE = { domain: z.string().describe('Top-level capability domain key (e.g. "authn")'), @@ -62,6 +53,32 @@ const GENERIC_SHAPE = { .describe( 'Object type within the domain (e.g. "Journey"). Use frodo_discover to enumerate available types.' ), + realm: z + .string() + .optional() + .describe( + 'Optional realm override for request-scoped execution context (e.g. "/alpha").' + ), + pageSize: z + .number() + .int() + .positive() + .optional() + .describe('Optional page size hint for paginated operations.'), + pageOffset: z + .number() + .int() + .nonnegative() + .optional() + .describe('Optional page offset hint for paginated operations.'), + pageToken: z + .string() + .optional() + .describe('Optional page token/cursor hint for paginated operations.'), + includeTotal: z + .boolean() + .optional() + .describe('Optional request for exact total counts when supported.'), positionalArgs: z .array(z.unknown()) .optional() @@ -121,13 +138,13 @@ function buildMcpServer(service: McpService): McpServer { try { const result = await service.executeTool({ toolName: tool.name, - context: CLI_REQUEST_CONTEXT, + context: buildRequestContext(), }); return { content: [ { type: 'text' as const, - text: JSON.stringify(result.data, null, 2), + text: JSON.stringify(result, null, 2), }, ], }; @@ -146,16 +163,17 @@ function buildMcpServer(service: McpService): McpServer { }, async (args) => { try { + const genericArgs = args as McpGenericExecutionArguments; const result = await service.executeTool({ toolName: tool.name, arguments: args, - context: CLI_REQUEST_CONTEXT, + context: buildRequestContext(genericArgs.realm), }); return { content: [ { type: 'text' as const, - text: JSON.stringify(result.data, null, 2), + text: JSON.stringify(result, null, 2), }, ], }; @@ -177,13 +195,13 @@ function buildMcpServer(service: McpService): McpServer { const result = await service.executeTool({ toolName: tool.name, arguments: args, - context: CLI_REQUEST_CONTEXT, + context: buildRequestContext(), }); return { content: [ { type: 'text' as const, - text: JSON.stringify(result.data, null, 2), + text: JSON.stringify(result, null, 2), }, ], }; @@ -423,3 +441,57 @@ function buildErrorResult(err: unknown): { isError: true as const, }; } + +/** + * Builds request-scoped runtime auth context from active frodo state. + */ +function buildRequestContext(realmOverride?: string): McpRuntimeRequestContext { + const host = state.getHost(); + const realm = realmOverride ?? state.getRealm(); + + const serviceAccountId = state.getServiceAccountId(); + const serviceAccountJwk = state.getServiceAccountJwk(); + if (host && serviceAccountId && serviceAccountJwk) { + return { + auth: { + mode: 'service-account', + host, + serviceAccountId, + serviceAccountJwk: JSON.stringify(serviceAccountJwk), + realm, + deploymentType: state.getDeploymentType(), + allowInsecureConnection: state.getAllowInsecureConnection(), + debug: state.getDebug(), + curlirize: state.getCurlirize(), + }, + }; + } + + const username = state.getUsername(); + const password = state.getPassword(); + if (host && username && password) { + return { + auth: { + mode: 'admin-account', + host, + username, + password, + realm, + deploymentType: state.getDeploymentType(), + allowInsecureConnection: state.getAllowInsecureConnection(), + debug: state.getDebug(), + curlirize: state.getCurlirize(), + }, + }; + } + + return { + auth: { + mode: 'state-config', + config: { + ...state.getState(), + realm, + }, + }, + }; +} From 4339480ab62118e0e1f030b698eca28725abbdf7 Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Thu, 2 Apr 2026 21:11:01 -0600 Subject: [PATCH 04/69] feat(mcp): summarize oversized MCP responses --- src/ops/McpServerOps.ts | 131 ++++++++++++++++++++++++++++++++-------- 1 file changed, 107 insertions(+), 24 deletions(-) diff --git a/src/ops/McpServerOps.ts b/src/ops/McpServerOps.ts index e48ce263f..f2450959c 100644 --- a/src/ops/McpServerOps.ts +++ b/src/ops/McpServerOps.ts @@ -46,6 +46,8 @@ import { printMessage } from '../utils/Console.js'; // --------------------------------------------------------------------------- // Zod v4 schema shapes reused for generic and special tools. +const MAX_INLINE_RESULT_BYTES = 256 * 1024; + const GENERIC_SHAPE = { domain: z.string().describe('Top-level capability domain key (e.g. "authn")'), objectType: z @@ -53,6 +55,12 @@ const GENERIC_SHAPE = { .describe( 'Object type within the domain (e.g. "Journey"). Use frodo_discover to enumerate available types.' ), + scope: z + .string() + .optional() + .describe( + 'Optional scope selector for ambiguous generic operations (for example "single" or "bulk"). Use frodo_discover for supported values.' + ), realm: z .string() .optional() @@ -140,14 +148,7 @@ function buildMcpServer(service: McpService): McpServer { toolName: tool.name, context: buildRequestContext(), }); - return { - content: [ - { - type: 'text' as const, - text: JSON.stringify(result, null, 2), - }, - ], - }; + return buildSuccessResult(result); } catch (err) { return buildErrorResult(err); } @@ -169,14 +170,7 @@ function buildMcpServer(service: McpService): McpServer { arguments: args, context: buildRequestContext(genericArgs.realm), }); - return { - content: [ - { - type: 'text' as const, - text: JSON.stringify(result, null, 2), - }, - ], - }; + return buildSuccessResult(result); } catch (err) { return buildErrorResult(err); } @@ -197,14 +191,7 @@ function buildMcpServer(service: McpService): McpServer { arguments: args, context: buildRequestContext(), }); - return { - content: [ - { - type: 'text' as const, - text: JSON.stringify(result, null, 2), - }, - ], - }; + return buildSuccessResult(result); } catch (err) { return buildErrorResult(err); } @@ -404,6 +391,102 @@ function readJsonBody(req: IncomingMessage): Promise { * Builds a standardized error result for tool execution failures. * Extracts full error context from FrodoError chains and HTTP error details. */ +function buildSuccessResult(result: unknown): { + content: { type: 'text'; text: string }[]; +} { + const serialized = safeJsonStringify(result); + const payloadSizeBytes = Buffer.byteLength(serialized, 'utf8'); + if (payloadSizeBytes <= MAX_INLINE_RESULT_BYTES) { + return { + content: [ + { + type: 'text' as const, + text: serialized, + }, + ], + }; + } + + const truncatedPayload = buildTruncatedSuccessPayload( + result, + payloadSizeBytes + ); + return { + content: [ + { + type: 'text' as const, + text: safeJsonStringify(truncatedPayload), + }, + ], + }; +} + +/** + * Replaces oversized inline payloads with a summary/truncation envelope. + */ +function buildTruncatedSuccessPayload( + result: unknown, + payloadSizeBytes: number +): unknown { + const warning = + 'Result exceeded the inline response limit. Narrow the request using scope, deps=false, paging, or a more specific read/export.'; + const resultObject = + result && typeof result === 'object' + ? (result as Record) + : { data: result }; + const metadataObject = + resultObject.metadata && typeof resultObject.metadata === 'object' + ? (resultObject.metadata as Record) + : {}; + const existingResultMetadata = + metadataObject.result && typeof metadataObject.result === 'object' + ? (metadataObject.result as Record) + : {}; + + return { + ...resultObject, + data: { + _truncated: true, + message: warning, + }, + metadata: { + ...metadataObject, + result: { + ...existingResultMetadata, + payloadSizeBytes, + payloadSizeHuman: formatByteSize(payloadSizeBytes), + isLarge: true, + isTruncated: true, + warning, + }, + }, + }; +} + +/** + * Safely stringifies a payload for MCP transport output. + */ +function safeJsonStringify(payload: unknown): string { + try { + return JSON.stringify(payload, null, 2) ?? 'null'; + } catch { + return JSON.stringify(String(payload), null, 2); + } +} + +/** + * Formats byte counts for human-readable MCP payload metadata. + */ +function formatByteSize(bytes: number): string { + if (bytes < 1024) { + return `${bytes} B`; + } + if (bytes < 1024 * 1024) { + return `${(bytes / 1024).toFixed(1)} KiB`; + } + return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`; +} + function buildErrorResult(err: unknown): { content: { type: 'text'; text: string }[]; isError: true; From 3fb027893af116b593b28582bdcd90ae7a76a399 Mon Sep 17 00:00:00 2001 From: dallinjsevy Date: Fri, 3 Apr 2026 07:34:47 -0600 Subject: [PATCH 05/69] feat: Add config-manager push managed-objects (#579) * feat: Add config-manager push managed-objects * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * Updated changelog and version for release v4.0.0-35 * feat: Add config-manager push org-privileges command. (#574) * feat: Add config-manager push org-privileges command. * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * feat: Add config-manager push org-privileges command. * Rebase and update to frodo-lib 4.0.0-34 * Update snapshots * Updated snapshots * Updated snapshots * Updated snapshots --------- Co-authored-by: Volker Scheuber * Updated changelog and version for release v4.0.0-36 * adjusted path string to pull csp not cps (#578) * Updated changelog and version for release v4.0.0-37 * feat: Add config-manager push managed-objects * Update snapshots * chore: update @rockcarver/frodo-lib to version 4.0.0-35 --------- Co-authored-by: Huston Franklin Co-authored-by: Volker Scheuber Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: devintrivir --- .../config-manager-push-managed-objects.ts | 59 + .../config-manager-push.ts | 2 + .../FrConfigManagedObjectsOps.ts | 76 +- ...-manager-push-managed-objects.test.js.snap | 27 + .../config-manager-push.test.js.snap | 1 + ...onfig-manager-push-managed-objects.test.js | 10 + ...ager-push-managed-objects.e2e.test.js.snap | 5 + ...g-manager-push-managed-objects.e2e.test.js | 79 + .../application/application.json | 331 +++++ .../assignment/assignment.json | 254 ++++ .../forgeops/managed-objects/group/group.json | 111 ++ .../organization/organization.json | 395 +++++ .../forgeops/managed-objects/role/role.json | 244 ++++ .../testObject/testObject.json | 186 +++ .../testObject/testObject.onCreate.js | 1 + .../testObject/testObject.onUpdate.js | 1 + .../testObject/testObject.onValidate.js | 1 + .../testObject/testObject.postCreate.js | 1 + .../testObject/testObject.postDelete.js | 1 + .../testObject/testObject.testObj.onStore.js | 1 + .../forgeops/managed-objects/user/user.json | 1281 +++++++++++++++++ .../am_1076162899/recording.har | 631 ++++++++ .../oauth2_393036114/recording.har | 289 ++++ .../openidm_3290118515/recording.har | 167 +++ .../am_1076162899/recording.har | 631 ++++++++ .../oauth2_393036114/recording.har | 289 ++++ .../openidm_3290118515/recording.har | 316 ++++ 27 files changed, 5389 insertions(+), 1 deletion(-) create mode 100644 src/cli/config-manager/config-manager-push/config-manager-push-managed-objects.ts create mode 100644 test/client_cli/en/__snapshots__/config-manager-push-managed-objects.test.js.snap create mode 100644 test/client_cli/en/config-manager-push-managed-objects.test.js create mode 100644 test/e2e/__snapshots__/config-manager-push-managed-objects.e2e.test.js.snap create mode 100644 test/e2e/config-manager-push-managed-objects.e2e.test.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/application/application.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/assignment/assignment.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/group/group.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/organization/organization.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/role/role.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onCreate.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onUpdate.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onValidate.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.postCreate.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.postDelete.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.testObj.onStore.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/managed-objects/user/user.json create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/openidm_3290118515/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/openidm_3290118515/recording.har diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-managed-objects.ts b/src/cli/config-manager/config-manager-push/config-manager-push-managed-objects.ts new file mode 100644 index 000000000..f56bff29e --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-managed-objects.ts @@ -0,0 +1,59 @@ +import { frodo } from '@rockcarver/frodo-lib'; +import { Option } from 'commander'; + +import { configManagerImportManagedObjects } from '../../../configManagerOps/FrConfigManagedObjectsOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { printMessage, verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push managed-objects', + [], + deploymentTypes + ); + + program + .description('Import managed objects.') + .addOption( + new Option( + '-n, --name ', + 'Managed object name; imports only the specified managed object.' + ) + ) + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + + if (await getTokens(false, true, deploymentTypes)) { + verboseMessage('Importing managed objects'); + const outcome = await configManagerImportManagedObjects(options.name); + if (!outcome) process.exitCode = 1; + } + // unrecognized combination of options or no options + else { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + program.help(); + process.exitCode = 1; + } + }); + + return program; +} diff --git a/src/cli/config-manager/config-manager-push/config-manager-push.ts b/src/cli/config-manager/config-manager-push/config-manager-push.ts index cc54bc258..e35727fe4 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push.ts @@ -5,6 +5,7 @@ import Endpoints from './config-manager-push-endpoints'; import InternalRoles from './config-manager-push-internal-roles'; import Kba from './config-manager-push-kba'; import Locales from './config-manager-push-locales'; +import ManagedObjects from './config-manager-push-managed-objects'; import OrgPrivileges from './config-manager-push-org-privileges'; import PasswordPolicy from './config-manager-push-password-policy'; import Schedules from './config-manager-push-schedules'; @@ -27,6 +28,7 @@ export default function setup() { program.addCommand(EmailTemplates().name('email-templates')); program.addCommand(Schedules().name('schedules')); program.addCommand(OrgPrivileges().name('org-privileges')); + program.addCommand(ManagedObjects().name('managed-objects')); return program; } diff --git a/src/configManagerOps/FrConfigManagedObjectsOps.ts b/src/configManagerOps/FrConfigManagedObjectsOps.ts index 8f077b3ef..97d8fef88 100644 --- a/src/configManagerOps/FrConfigManagedObjectsOps.ts +++ b/src/configManagerOps/FrConfigManagedObjectsOps.ts @@ -1,10 +1,13 @@ import { frodo } from '@rockcarver/frodo-lib'; import { IdObjectSkeletonInterface } from '@rockcarver/frodo-lib/types/api/ApiTypes'; +import fs from 'fs'; +import path from 'path'; import { extractFrConfigDataToFile } from '../utils/Config'; import { printError } from '../utils/Console'; -const { readConfigEntity } = frodo.idm.config; +const { readConfigEntity, importConfigEntities, importSubConfigEntity } = + frodo.idm.config; const { getFilePath, saveTextToFile } = frodo.utils; const { stringify } = frodo.utils.json; @@ -110,3 +113,74 @@ function processManagedObjects(managedObjects, targetDir, name) { printError(err); } } + +/** + * Helper that recursively reads in extracted files and stores them back in the managed object + * @param obj The managed object configuration + * @param managedObjectDirectory The directory where the managed object resides + */ +function getExtractedFiles(obj: any, managedObjectDirectory: string): void { + if (!obj || typeof obj !== 'object') return; + for (const key of Object.keys(obj)) { + const value = obj[key]; + if (value?.type === 'text/javascript' && value.file) { + const scriptPath = path.join(managedObjectDirectory, value.file); + if (fs.existsSync(scriptPath)) { + value.source = fs.readFileSync(scriptPath, { encoding: 'utf-8' }); + delete value.file; + } + } else if (typeof value === 'object') { + getExtractedFiles(value, managedObjectDirectory); + } + } +} + +/** + * Helper that returns the import data for a managed object given the file where it is saved + * @param file The file where the managed object is saved + * @returns The managed object data from the file, including data from any extracted files + */ +function getManagedObjectImportData(file: string): object { + const readManagedObject = fs.readFileSync(file, 'utf-8'); + const importData = JSON.parse(readManagedObject); + const managedObjectDirectory = path.dirname(file); + getExtractedFiles(importData, managedObjectDirectory); + return importData; +} + +/** + * Import an IDM managed object in the fr-config-manager format. + * @param {string} objectName Optional managed object name. If not specified, imports all the managed objects. + * @return {Promise} a promise that resolves to true if successful, false otherwise + */ +export async function configManagerImportManagedObjects( + objectName?: string +): Promise { + try { + if (objectName) { + const filePath = getFilePath( + `managed-objects/${objectName}/${objectName}.json` + ); + const importData = getManagedObjectImportData(filePath) as any; + await importSubConfigEntity('managed', importData); + } else { + const managedObjectsPath = getFilePath('managed-objects'); + const managedObjectsFiles = fs.readdirSync(managedObjectsPath, 'utf-8'); + const importManagedObjectData = { + idm: { managed: { _id: 'managed', objects: [] } }, + }; + for (const managedObjectsFile of managedObjectsFiles) { + const filePath = getFilePath( + `managed-objects/${managedObjectsFile}/${managedObjectsFile}.json` + ); + const importData = getManagedObjectImportData(filePath); + importManagedObjectData.idm.managed.objects.push(importData); + } + await importConfigEntities(importManagedObjectData); + } + return true; + } catch (error) { + printError(error, `Error exporting config entity endpoints`); + } + return false; +} diff --git a/test/client_cli/en/__snapshots__/config-manager-push-managed-objects.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-managed-objects.test.js.snap new file mode 100644 index 000000000..be96efc71 --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-managed-objects.test.js.snap @@ -0,0 +1,27 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push managed-objects' should be expected english 1`] = ` +"Usage: frodo config-manager push managed-objects [options] [host] [realm] [username] [password] + +[Experimental] Import managed objects. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. To use a + connection profile, just specify a unique substring or + alias. + realm Realm. Specify realm as '/' for the root realm or 'realm' + or '/parent/child' otherwise. (default: "alpha" for + Identity Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication journeys/trees. + password Password. + +Options: + -n, --name Managed object name; imports only the specified managed + object. + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and usage + examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap index 41ff30a2c..4bf39cf85 100644 --- a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap @@ -20,6 +20,7 @@ Commands: internal-roles [Experimental] Import internal roles. kba [Experimental] Import kba configuration. locales [Experimental] Import custom locales objects. + managed-objects [Experimental] Import managed objects. org-privileges [Experimental] Import organization privileges config. password-policy [Experimental] Import password-policy objects. schedules [Experimental] Import schedules. diff --git a/test/client_cli/en/config-manager-push-managed-objects.test.js b/test/client_cli/en/config-manager-push-managed-objects.test.js new file mode 100644 index 000000000..1c12db036 --- /dev/null +++ b/test/client_cli/en/config-manager-push-managed-objects.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager push managed-objects --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push managed-objects' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); \ No newline at end of file diff --git a/test/e2e/__snapshots__/config-manager-push-managed-objects.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-managed-objects.e2e.test.js.snap new file mode 100644 index 000000000..bd46dcd88 --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-managed-objects.e2e.test.js.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager push managed-objects "frodo config-manager push managed-objects -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import the managed-objects into forgeops" 1`] = `""`; + +exports[`frodo config-manager push managed-objects "frodo config-manager push managed-objects -n testObject -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import a specific managed-object by name into forgeops" 1`] = `""`; diff --git a/test/e2e/config-manager-push-managed-objects.e2e.test.js b/test/e2e/config-manager-push-managed-objects.e2e.test.js new file mode 100644 index 000000000..e4b7c11ec --- /dev/null +++ b/test/e2e/config-manager-push-managed-objects.e2e.test.js @@ -0,0 +1,79 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +// ForgeOps +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/am frodo config-manager push managed-objects -D test/e2e/exports/fr-config-manager/forgeops -m forgeops +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/am frodo config-manager push managed-objects -n testObject -D test/e2e/exports/fr-config-manager/forgeops -m forgeops +*/ + +import cp from 'child_process'; +import { promisify } from 'util'; +import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { forgeops_connection as fc } from './utils/TestConfig'; + +const exec = promisify(cp.exec); + +process.env['FRODO_MOCK'] = '1'; +const forgeopsEnv = getEnv(fc); + +const allDirectory = "test/e2e/exports/fr-config-manager/forgeops"; + +describe('frodo config-manager push managed-objects', () => { + test(`"frodo config-manager push managed-objects -D ${allDirectory} -m forgeops": should import the managed-objects into forgeops"`, async () => { + const CMD = `frodo config-manager push managed-objects -D ${allDirectory} -m forgeops`; + const { stdout } = await exec(CMD, forgeopsEnv); + expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + }); + + test(`"frodo config-manager push managed-objects -n testObject -D ${allDirectory} -m forgeops": should import a specific managed-object by name into forgeops"`, async () => { + const CMD = `frodo config-manager push managed-objects -n testObject -D ${allDirectory} -m forgeops`; + const { stdout } = await exec(CMD, forgeopsEnv); + expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + }); +}); \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/application/application.json b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/application/application.json new file mode 100644 index 000000000..108ac9b54 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/application/application.json @@ -0,0 +1,331 @@ +{ + "name": "application", + "schema": { + "$schema": "http://forgerock.org/json-schema#", + "icon": "fa-folder", + "order": [ + "name", + "description", + "url", + "icon", + "mappingNames", + "owners", + "roles", + "members" + ], + "properties": { + "_id": { + "description": "Application ID", + "isPersonal": false, + "searchable": false, + "type": "string", + "userEditable": false, + "viewable": false + }, + "authoritative": { + "description": "Is this an authoritative application", + "searchable": false, + "title": "Authoritative", + "type": "boolean", + "viewable": false + }, + "connectorId": { + "description": "Id of the connector associated with the application", + "searchable": false, + "title": "Connector ID", + "type": "string", + "userEditable": false, + "viewable": false + }, + "description": { + "description": "Application Description", + "searchable": true, + "title": "Description", + "type": "string", + "viewable": true + }, + "icon": { + "searchable": true, + "title": "Icon", + "type": "string", + "userEditable": true, + "viewable": true + }, + "mappingNames": { + "description": "Names of the sync mappings used by an application with provisioning configured.", + "items": { + "title": "Mapping Name Items", + "type": "string" + }, + "searchable": true, + "title": "Sync Mapping Names", + "type": "array", + "viewable": true + }, + "members": { + "description": "Members directly granted an application", + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:Application:members:items", + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_accountType": { + "description": "Account type", + "type": "string" + }, + "_grantType": { + "description": "Grant Type", + "label": "Grant Type", + "type": "string" + }, + "_id": { + "propName": "_id", + "required": false, + "type": "string" + }, + "_uniqueId": { + "description": "Unique identifier", + "type": "string" + } + }, + "title": "Application Members Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "User", + "notify": true, + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "applications", + "reverseRelationship": true, + "title": "Application Members Items", + "type": "relationship", + "validate": true + }, + "policies": [], + "returnByDefault": false, + "searchable": false, + "title": "Members", + "type": "array", + "userEditable": false, + "viewable": true + }, + "name": { + "description": "Application name", + "notifyRelationships": [ + "roles", + "members" + ], + "policies": [ + { + "policyId": "unique" + } + ], + "returnByDefault": true, + "searchable": true, + "title": "Name", + "type": "string", + "userEditable": true, + "viewable": true + }, + "owners": { + "description": "Application Owners", + "items": { + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "User", + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "ownerOfApp", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "searchable": false, + "title": "Owners", + "type": "array", + "userEditable": false, + "viewable": true + }, + "roles": { + "description": "Roles granting users the application", + "items": { + "notifySelf": true, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_accountType": { + "description": "Account type", + "type": "string" + }, + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Role", + "notify": true, + "path": "managed/role", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true", + "sortKeys": [] + } + } + ], + "reversePropertyName": "applications", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "searchable": false, + "title": "Roles", + "type": "array", + "userEditable": false, + "viewable": true + }, + "ssoEntities": { + "description": "SSO Entity Id", + "properties": { + "domain": { + "type": "string" + }, + "federatedDomain": { + "type": "string" + }, + "idpLocation": { + "type": "string" + }, + "idpLoginUrl": { + "type": "string" + }, + "idpPrivateId": { + "type": "string" + }, + "key": { + "type": "string" + }, + "oidcId": { + "type": "string" + }, + "pfApcId": { + "type": "string" + }, + "pfIdpAdapterId": { + "type": "string" + }, + "pfPolicyId": { + "type": "string" + }, + "pfSigningCertId": { + "type": "string" + }, + "pfSpConnectionId": { + "type": "string" + }, + "spLocation": { + "type": "string" + }, + "spPrivate": { + "type": "string" + }, + "spPrivateId": { + "type": "string" + } + }, + "searchable": false, + "title": "SSO Entity Id", + "type": "object", + "userEditable": false, + "viewable": false + }, + "templateName": { + "description": "Name of the template the application was created from", + "searchable": false, + "title": "Template Name", + "type": "string", + "userEditable": false, + "viewable": false + }, + "templateVersion": { + "description": "The template version", + "searchable": false, + "title": "Template Version", + "type": "string", + "userEditable": false, + "viewable": false + }, + "uiConfig": { + "description": "UI Config", + "isPersonal": false, + "properties": {}, + "searchable": false, + "title": "UI Config", + "type": "object", + "usageDescription": "", + "viewable": false + }, + "url": { + "searchable": true, + "title": "Url", + "type": "string", + "userEditable": true, + "viewable": true + } + }, + "required": [ + "name" + ], + "title": "Application", + "type": "object" + } +} \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/assignment/assignment.json b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/assignment/assignment.json new file mode 100644 index 000000000..e9b5b0b16 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/assignment/assignment.json @@ -0,0 +1,254 @@ +{ + "attributeEncryption": {}, + "name": "assignment", + "schema": { + "$schema": "http://forgerock.org/json-schema#", + "description": "A role assignment", + "icon": "fa-key", + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:Assignment", + "mat-icon": "vpn_key", + "order": [ + "_id", + "name", + "description", + "type", + "mapping", + "attributes", + "linkQualifiers", + "roles", + "members", + "condition", + "weight" + ], + "properties": { + "_id": { + "description": "The assignment ID", + "searchable": false, + "title": "Name", + "type": "string", + "viewable": false + }, + "attributes": { + "description": "The attributes operated on by this assignment.", + "items": { + "order": [ + "assignmentOperation", + "unassignmentOperation", + "name", + "value" + ], + "properties": { + "assignmentOperation": { + "description": "Assignment operation", + "type": "string" + }, + "name": { + "description": "Name", + "type": "string" + }, + "unassignmentOperation": { + "description": "Unassignment operation", + "type": "string" + }, + "value": { + "description": "Value", + "type": "string" + } + }, + "required": [], + "title": "Assignment Attributes Items", + "type": "object" + }, + "notifyRelationships": [ + "roles", + "members" + ], + "title": "Assignment Attributes", + "type": "array", + "viewable": true + }, + "condition": { + "description": "A conditional filter for this assignment", + "isConditional": true, + "searchable": false, + "title": "Condition", + "type": "string", + "viewable": false + }, + "description": { + "description": "The assignment description, used for display purposes.", + "searchable": true, + "title": "Description", + "type": "string", + "viewable": true + }, + "linkQualifiers": { + "description": "Conditional link qualifiers to restrict this assignment to.", + "items": { + "title": "Link Qualifiers Items", + "type": "string" + }, + "title": "Link Qualifiers", + "type": "array", + "viewable": true + }, + "mapping": { + "description": "The name of the mapping this assignment applies to", + "policies": [ + { + "policyId": "mapping-exists" + } + ], + "searchable": true, + "title": "Mapping", + "type": "string", + "viewable": true + }, + "members": { + "description": "Assignment Members", + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:members:items", + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_accountType": { + "description": "Account type", + "type": "string" + }, + "_grantType": { + "description": "Grant Type", + "label": "Grant Type", + "type": "string" + }, + "_id": { + "description": "_refProperties object ID", + "type": "string" + }, + "_uniqueId": { + "description": "Unique identifier", + "type": "string" + } + }, + "title": "Assignment Members Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "conditionalAssociation": true, + "label": "User", + "notify": true, + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "assignments", + "reverseRelationship": true, + "title": "Assignment Members Items", + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "title": "Assignment Members", + "type": "array", + "viewable": true + }, + "name": { + "description": "The assignment name, used for display purposes.", + "searchable": true, + "title": "Name", + "type": "string", + "viewable": true + }, + "roles": { + "description": "Managed Roles", + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:roles:items", + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_accountType": { + "description": "Account type", + "type": "string" + }, + "_id": { + "description": "_refProperties object ID", + "type": "string" + } + }, + "title": "Managed Roles Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Role", + "notify": true, + "path": "managed/role", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "assignments", + "reverseRelationship": true, + "title": "Managed Roles Items", + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "title": "Managed Roles", + "type": "array", + "userEditable": false, + "viewable": true + }, + "type": { + "description": "The type of object this assignment represents", + "title": "Type", + "type": "string", + "viewable": true + }, + "weight": { + "description": "The weight of the assignment.", + "notifyRelationships": [ + "roles", + "members" + ], + "searchable": false, + "title": "Weight", + "type": [ + "number", + "null" + ], + "viewable": true + } + }, + "required": [ + "name", + "description", + "mapping" + ], + "title": "Assignment", + "type": "object" + } +} \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/group/group.json b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/group/group.json new file mode 100644 index 000000000..aee387bf0 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/group/group.json @@ -0,0 +1,111 @@ +{ + "name": "group", + "schema": { + "$schema": "http://json-schema.org/draft-03/schema", + "icon": "fa-group", + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:Group", + "mat-icon": "group", + "order": [ + "_id", + "name", + "description", + "condition", + "members" + ], + "properties": { + "_id": { + "description": "Group ID", + "isPersonal": false, + "searchable": false, + "type": "string", + "usageDescription": "", + "userEditable": false, + "viewable": false + }, + "condition": { + "description": "A filter for conditionally assigned members", + "isConditional": true, + "searchable": false, + "title": "Condition", + "type": "string", + "viewable": false + }, + "description": { + "description": "Group Description", + "searchable": true, + "title": "Description", + "type": "string", + "userEditable": false, + "viewable": true + }, + "members": { + "description": "Group Members", + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:Group:members:items", + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_grantType": { + "description": "Grant Type", + "label": "Grant Type", + "type": "string" + }, + "_id": { + "description": "_refProperties object ID", + "type": "string" + } + }, + "title": "Group Members Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "conditionalAssociation": true, + "label": "User", + "notify": true, + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "groups", + "reverseRelationship": true, + "title": "Group Members Items", + "type": "relationship", + "validate": true + }, + "policies": [], + "returnByDefault": false, + "searchable": false, + "title": "Members", + "type": "array", + "userEditable": false, + "viewable": true + }, + "name": { + "description": "Group Name", + "searchable": true, + "title": "Name", + "type": "string", + "viewable": true + } + }, + "required": [ + "name" + ], + "title": "Group", + "viewable": true + } +} \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/organization/organization.json b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/organization/organization.json new file mode 100644 index 000000000..943d5821d --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/organization/organization.json @@ -0,0 +1,395 @@ +{ + "name": "organization", + "schema": { + "$schema": "http://forgerock.org/json-schema#", + "description": "An organization or tenant, whose resources are managed by organizational admins.", + "icon": "fa-building", + "mat-icon": "domain", + "order": [ + "name", + "description", + "owners", + "admins", + "members", + "parent", + "children", + "adminIDs", + "ownerIDs", + "parentAdminIDs", + "parentOwnerIDs", + "parentIDs" + ], + "properties": { + "adminIDs": { + "isVirtual": true, + "items": { + "title": "admin ids", + "type": "string" + }, + "queryConfig": { + "flattenProperties": true, + "referencedObjectFields": [ + "_id" + ], + "referencedRelationshipFields": [ + "admins" + ] + }, + "returnByDefault": true, + "searchable": false, + "title": "Admin user ids", + "type": "array", + "userEditable": false, + "viewable": false + }, + "admins": { + "items": { + "notifySelf": true, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "User", + "notify": false, + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true", + "sortKeys": [] + } + } + ], + "reversePropertyName": "adminOfOrg", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "notifyRelationships": [ + "children" + ], + "returnByDefault": false, + "searchable": false, + "title": "Administrators", + "type": "array", + "userEditable": false, + "viewable": true + }, + "children": { + "description": "Child Organizations", + "items": { + "notifySelf": true, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Organization", + "notify": true, + "path": "managed/organization", + "query": { + "fields": [ + "name", + "description" + ], + "queryFilter": "true", + "sortKeys": [] + } + } + ], + "reversePropertyName": "parent", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "policies": [], + "returnByDefault": false, + "searchable": false, + "title": "Child Organizations", + "type": "array", + "userEditable": false, + "viewable": false + }, + "description": { + "searchable": true, + "title": "Description", + "type": "string", + "userEditable": true, + "viewable": true + }, + "members": { + "items": { + "notifySelf": false, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "User", + "notify": true, + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true", + "sortKeys": [] + } + } + ], + "reversePropertyName": "memberOfOrg", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "searchable": false, + "title": "Members", + "type": "array", + "userEditable": false, + "viewable": true + }, + "name": { + "searchable": true, + "title": "Name", + "type": "string", + "userEditable": true, + "viewable": true + }, + "ownerIDs": { + "isVirtual": true, + "items": { + "title": "owner ids", + "type": "string" + }, + "queryConfig": { + "flattenProperties": true, + "referencedObjectFields": [ + "_id" + ], + "referencedRelationshipFields": [ + "owners" + ] + }, + "returnByDefault": true, + "searchable": false, + "title": "Owner user ids", + "type": "array", + "userEditable": false, + "viewable": false + }, + "owners": { + "items": { + "notifySelf": true, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "User", + "notify": false, + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true", + "sortKeys": [] + } + } + ], + "reversePropertyName": "ownerOfOrg", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "notifyRelationships": [ + "children" + ], + "returnByDefault": false, + "searchable": false, + "title": "Owner", + "type": "array", + "userEditable": false, + "viewable": true + }, + "parent": { + "description": "Parent Organization", + "notifyRelationships": [ + "children", + "members" + ], + "notifySelf": true, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Organization", + "notify": true, + "path": "managed/organization", + "query": { + "fields": [ + "name", + "description" + ], + "queryFilter": "true", + "sortKeys": [] + } + } + ], + "returnByDefault": false, + "reversePropertyName": "children", + "reverseRelationship": true, + "searchable": false, + "title": "Parent Organization", + "type": "relationship", + "userEditable": false, + "validate": true, + "viewable": true + }, + "parentAdminIDs": { + "isVirtual": true, + "items": { + "title": "user ids of parent admins", + "type": "string" + }, + "queryConfig": { + "flattenProperties": true, + "referencedObjectFields": [ + "adminIDs", + "parentAdminIDs" + ], + "referencedRelationshipFields": [ + "parent" + ] + }, + "returnByDefault": true, + "searchable": false, + "title": "user ids of parent admins", + "type": "array", + "userEditable": false, + "viewable": false + }, + "parentIDs": { + "isVirtual": true, + "items": { + "title": "parent org ids", + "type": "string" + }, + "queryConfig": { + "flattenProperties": true, + "referencedObjectFields": [ + "_id", + "parentIDs" + ], + "referencedRelationshipFields": [ + "parent" + ] + }, + "returnByDefault": true, + "searchable": false, + "title": "parent org ids", + "type": "array", + "userEditable": false, + "viewable": false + }, + "parentOwnerIDs": { + "isVirtual": true, + "items": { + "title": "user ids of parent owners", + "type": "string" + }, + "queryConfig": { + "flattenProperties": true, + "referencedObjectFields": [ + "ownerIDs", + "parentOwnerIDs" + ], + "referencedRelationshipFields": [ + "parent" + ] + }, + "returnByDefault": true, + "searchable": false, + "title": "user ids of parent owners", + "type": "array", + "userEditable": false, + "viewable": false + } + }, + "required": [ + "name" + ], + "title": "Organization", + "type": "object" + } +} \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/role/role.json b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/role/role.json new file mode 100644 index 000000000..8f2e55673 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/role/role.json @@ -0,0 +1,244 @@ +{ + "name": "role", + "schema": { + "$schema": "http://forgerock.org/json-schema#", + "description": "", + "icon": "fa-check-square-o", + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:Role", + "mat-icon": "assignment_ind", + "order": [ + "_id", + "name", + "description", + "members", + "assignments", + "applications", + "condition", + "temporalConstraints" + ], + "properties": { + "_id": { + "description": "Role ID", + "searchable": false, + "title": "Name", + "type": "string", + "viewable": false + }, + "applications": { + "description": "Role Applications", + "items": { + "notifySelf": true, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_accountType": { + "description": "Account type", + "type": "string" + }, + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Application", + "path": "managed/application", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "roles", + "reverseRelationship": true, + "title": "Role Application Items", + "type": "relationship", + "validate": true + }, + "notifyRelationships": [ + "members" + ], + "relationshipGrantTemporalConstraintsEnforced": true, + "returnByDefault": false, + "title": "Applications", + "type": "array", + "viewable": false + }, + "assignments": { + "description": "Managed Assignments", + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:Role:assignments:items", + "notifySelf": true, + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_accountType": { + "description": "Account type", + "type": "string" + }, + "_id": { + "description": "_refProperties object ID", + "type": "string" + } + }, + "title": "Managed Assignments Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Assignment", + "path": "managed/assignment", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "roles", + "reverseRelationship": true, + "title": "Managed Assignments Items", + "type": "relationship", + "validate": true + }, + "notifyRelationships": [ + "members" + ], + "returnByDefault": false, + "title": "Managed Assignments", + "type": "array", + "viewable": true + }, + "condition": { + "description": "A conditional filter for this role", + "isConditional": true, + "searchable": false, + "title": "Condition", + "type": "string", + "viewable": false + }, + "description": { + "description": "The role description, used for display purposes.", + "searchable": true, + "title": "Description", + "type": "string", + "viewable": true + }, + "members": { + "description": "Role Members", + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:Role:members:items", + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_grantType": { + "description": "Grant Type", + "label": "Grant Type", + "type": "string" + }, + "_id": { + "description": "_refProperties object ID", + "type": "string" + } + }, + "title": "Role Members Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "conditionalAssociation": true, + "label": "User", + "notify": true, + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "roles", + "reverseRelationship": true, + "title": "Role Members Items", + "type": "relationship", + "validate": true + }, + "relationshipGrantTemporalConstraintsEnforced": true, + "returnByDefault": false, + "title": "Role Members", + "type": "array", + "viewable": true + }, + "name": { + "description": "The role name, used for display purposes.", + "policies": [ + { + "policyId": "unique" + } + ], + "searchable": true, + "title": "Name", + "type": "string", + "viewable": true + }, + "temporalConstraints": { + "description": "An array of temporal constraints for a role", + "isTemporalConstraint": true, + "items": { + "order": [ + "duration" + ], + "properties": { + "duration": { + "description": "Duration", + "type": "string" + } + }, + "required": [ + "duration" + ], + "title": "Temporal Constraints Items", + "type": "object" + }, + "notifyRelationships": [ + "members" + ], + "returnByDefault": true, + "title": "Temporal Constraints", + "type": "array", + "viewable": false + } + }, + "required": [ + "name" + ], + "title": "Role", + "type": "object" + } +} \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.json b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.json new file mode 100644 index 000000000..6f2e779fe --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.json @@ -0,0 +1,186 @@ +{ + "name": "testObject", + "onCreate": { + "file": "testObject.onCreate.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "onRead": { + "globals": {}, + "source": "//groovy export", + "type": "groovy" + }, + "onSync": { + "globals": { + "test": 8 + }, + "source": "//test", + "type": "groovy" + }, + "onUpdate": { + "file": "testObject.onUpdate.js", + "globals": { + "test": [ + "test" + ] + }, + "type": "text/javascript" + }, + "onValidate": { + "file": "testObject.onValidate.js", + "globals": { + "test": "test" + }, + "type": "text/javascript" + }, + "postCreate": { + "file": "testObject.postCreate.js", + "globals": { + "test": null + }, + "type": "text/javascript" + }, + "postDelete": { + "file": "testObject.postDelete.js", + "globals": { + "test": "test" + }, + "type": "text/javascript" + }, + "postUpdate": { + "globals": { + "test": 1 + }, + "source": "//test", + "type": "groovy" + }, + "schema": { + "$schema": "http://forgerock.org/json-schema#", + "description": "test", + "icon": "fa-anchor", + "mat-icon": "", + "order": [ + "testObj", + "testString" + ], + "properties": { + "testObj": { + "description": null, + "isVirtual": false, + "nullable": false, + "onRetrieve": { + "globals": { + "four": false, + "one": null, + "three": 3, + "two": "number" + }, + "source": "//second", + "type": "groovy" + }, + "onStore": { + "file": "testObject.testObj.onStore.js", + "globals": { + "test": {} + }, + "type": "text/javascript" + }, + "onValidate": { + "globals": { + "test": null + }, + "source": "//groovy script test", + "type": "groovy" + }, + "order": [ + "testObject", + "testString" + ], + "properties": { + "testObject": { + "description": null, + "isVirtual": false, + "onRetrieve": { + "globals": { + "test": null + }, + "source": "//test", + "type": "text/javascript" + }, + "onStore": { + "globals": { + "test": null + }, + "source": "//test", + "type": "groovy" + }, + "order": [], + "properties": {}, + "required": [], + "searchable": false, + "title": "test", + "type": "object", + "userEditable": true, + "viewable": true + }, + "testString": { + "description": null, + "format": null, + "isVirtual": false, + "onRetrieve": { + "globals": { + "test": 1 + }, + "source": "//test", + "type": "groovy" + }, + "onStore": { + "globals": { + "test": [ + "test", + 1, + false + ] + }, + "source": "//test", + "type": "text/javascript" + }, + "searchable": false, + "title": "test", + "type": "string", + "userEditable": true, + "viewable": true + } + }, + "required": [], + "searchable": false, + "title": "TestObj", + "type": "object", + "userEditable": true, + "viewable": true + }, + "testString": { + "description": null, + "format": null, + "isVirtual": false, + "onStore": { + "globals": { + "test": null + }, + "source": "//test", + "type": "groovy" + }, + "searchable": false, + "title": "test", + "type": "string", + "userEditable": true, + "viewable": true + } + }, + "required": [], + "title": "Test", + "type": "object" + } +} diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onCreate.js b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onCreate.js new file mode 100644 index 000000000..d29038fa8 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onCreate.js @@ -0,0 +1 @@ +// test script diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onUpdate.js b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onUpdate.js new file mode 100644 index 000000000..0ae040b69 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onUpdate.js @@ -0,0 +1 @@ +//test diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onValidate.js b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onValidate.js new file mode 100644 index 000000000..0ae040b69 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.onValidate.js @@ -0,0 +1 @@ +//test diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.postCreate.js b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.postCreate.js new file mode 100644 index 000000000..12341cb2e --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.postCreate.js @@ -0,0 +1 @@ +// another test diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.postDelete.js b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.postDelete.js new file mode 100644 index 000000000..0ae040b69 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.postDelete.js @@ -0,0 +1 @@ +//test diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.testObj.onStore.js b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.testObj.onStore.js new file mode 100644 index 000000000..0ae040b69 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/testObject/testObject.testObj.onStore.js @@ -0,0 +1 @@ +//test diff --git a/test/e2e/exports/fr-config-manager/forgeops/managed-objects/user/user.json b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/user/user.json new file mode 100644 index 000000000..69f300f11 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/managed-objects/user/user.json @@ -0,0 +1,1281 @@ +{ + "lastSync": { + "effectiveAssignmentsProperty": "effectiveAssignments", + "lastSyncProperty": "lastSync" + }, + "meta": { + "property": "_meta", + "resourceCollection": "internal/usermeta", + "trackedProperties": [ + "createDate", + "lastChanged" + ] + }, + "name": "user", + "notifications": {}, + "schema": { + "$schema": "http://json-schema.org/draft-03/schema", + "icon": "fa-user", + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User", + "mat-icon": "people", + "order": [ + "_id", + "userName", + "password", + "givenName", + "cn", + "sn", + "mail", + "profileImage", + "description", + "accountStatus", + "telephoneNumber", + "postalAddress", + "city", + "postalCode", + "country", + "stateProvince", + "assignedDashboard", + "roles", + "assignments", + "groups", + "applications", + "manager", + "authzRoles", + "reports", + "effectiveRoles", + "effectiveAssignments", + "effectiveGroups", + "effectiveApplications", + "lastSync", + "kbaInfo", + "preferences", + "consentedMappings", + "ownerOfOrg", + "adminOfOrg", + "memberOfOrg", + "memberOfOrgIDs", + "activeDate", + "inactiveDate", + "ownerOfApp", + "passwordLastChangedTime", + "passwordExpirationTime", + "devicePrintProfiles", + "deviceProfiles", + "oathDeviceProfiles", + "pushDeviceProfiles", + "webauthnDeviceProfiles" + ], + "properties": { + "_id": { + "description": "User ID", + "isPersonal": false, + "policies": [ + { + "params": { + "forbiddenChars": [ + "/" + ] + }, + "policyId": "cannot-contain-characters" + } + ], + "searchable": false, + "type": "string", + "usageDescription": "", + "userEditable": false, + "viewable": false + }, + "accountStatus": { + "default": "active", + "description": "Status", + "isPersonal": false, + "searchable": false, + "title": "Status", + "type": "string", + "usageDescription": "", + "userEditable": false, + "viewable": true + }, + "activeDate": { + "description": "Active Date", + "format": "datetime", + "isPersonal": false, + "policies": [ + { + "policyId": "valid-datetime" + } + ], + "searchable": false, + "title": "Active Date", + "type": "string", + "usageDescription": "", + "userEditable": false, + "viewable": true + }, + "adminOfOrg": { + "items": { + "notifySelf": false, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Organization", + "notify": true, + "path": "managed/organization", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true", + "sortKeys": [] + } + } + ], + "reversePropertyName": "admins", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "policies": [], + "returnByDefault": false, + "searchable": false, + "title": "Organizations I Administer", + "type": "array", + "userEditable": false, + "viewable": true + }, + "aliasList": { + "description": "List of identity aliases used primarily to record social IdP subjects for this user", + "isVirtual": false, + "items": { + "title": "User Alias Names Items", + "type": "string" + }, + "returnByDefault": false, + "searchable": false, + "title": "User Alias Names List", + "type": "array", + "userEditable": true, + "viewable": false + }, + "applications": { + "description": "Applications", + "isPersonal": false, + "items": { + "notifySelf": true, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_accountType": { + "description": "Account type", + "type": "string" + }, + "_id": { + "propName": "_id", + "required": false, + "type": "string" + }, + "_uniqueId": { + "description": "Unique identifier", + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Application", + "path": "managed/application", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true", + "sortKeys": [ + "name" + ] + } + } + ], + "reversePropertyName": "members", + "reverseRelationship": true, + "title": "Application Items", + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "title": "Applications", + "type": "array", + "usageDescription": "", + "userEditable": false, + "viewable": false + }, + "assignedDashboard": { + "description": "List of items to click on for this user", + "isVirtual": true, + "items": { + "title": "Assigned Dashboard Items", + "type": "string" + }, + "queryConfig": { + "flattenProperties": true, + "referencedObjectFields": [ + "name" + ], + "referencedRelationshipFields": [ + [ + "roles", + "applications" + ], + [ + "applications" + ] + ] + }, + "searchable": false, + "title": "Assigned Dashboard", + "type": "array", + "userEditable": false, + "viewable": true + }, + "assignments": { + "description": "Assignments", + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments", + "isPersonal": false, + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments:items", + "notifySelf": true, + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_accountType": { + "description": "Account type", + "type": "string" + }, + "_grantType": { + "description": "Grant Type", + "label": "Grant Type", + "type": "string" + }, + "_id": { + "description": "_refProperties object ID", + "type": "string" + }, + "_uniqueId": { + "description": "Unique identifier", + "type": "string" + } + }, + "title": "Provisioning Roles Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "conditionalAssociationField": "condition", + "label": "Assignment", + "path": "managed/assignment", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "members", + "reverseRelationship": true, + "title": "Assignments Items", + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "title": "Assignments", + "type": "array", + "usageDescription": "", + "userEditable": false, + "viewable": true + }, + "authzRoles": { + "description": "Authorization Roles", + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles", + "isPersonal": false, + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles:items", + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_id": { + "description": "_refProperties object ID", + "type": "string" + } + }, + "title": "Authorization Roles Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "conditionalAssociationField": "condition", + "label": "Internal Role", + "path": "internal/role", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "authzMembers", + "reverseRelationship": true, + "title": "Authorization Roles Items", + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "title": "Authorization Roles", + "type": "array", + "usageDescription": "", + "userEditable": false, + "viewable": true + }, + "city": { + "description": "City", + "isPersonal": false, + "title": "City", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "cn": { + "default": "{{givenName}} {{sn}}", + "description": "Common Name", + "isPersonal": true, + "scope": "private", + "searchable": false, + "title": "Common Name", + "type": "string", + "userEditable": false, + "viewable": false + }, + "consentedMappings": { + "description": "Consented Mappings", + "isPersonal": false, + "isVirtual": false, + "items": { + "items": { + "order": [ + "mapping", + "consentDate" + ], + "properties": { + "consentDate": { + "description": "Consent Date", + "format": "datetime", + "policies": [ + { + "policyId": "valid-datetime" + } + ], + "searchable": false, + "title": "Consent Date", + "type": "string", + "userEditable": true, + "viewable": true + }, + "mapping": { + "description": "Mapping", + "searchable": false, + "title": "Mapping", + "type": "string", + "userEditable": true, + "viewable": true + } + }, + "required": [ + "mapping", + "consentDate" + ], + "title": "Consented Mappings Item", + "type": "object" + }, + "title": "Consented Mappings Items", + "type": "array" + }, + "returnByDefault": false, + "searchable": false, + "title": "Consented Mappings", + "type": "array", + "usageDescription": "", + "userEditable": true, + "viewable": false + }, + "country": { + "description": "Country", + "isPersonal": false, + "title": "Country", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "description": { + "description": "Description", + "isPersonal": false, + "searchable": false, + "title": "Description", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "devicePrintProfiles": { + "description": "Device Print Profiles Information", + "isPersonal": false, + "items": { + "title": "Profile", + "type": "string" + }, + "searchable": false, + "title": "Device Print Profiles", + "type": "array", + "userEditable": true, + "viewable": true + }, + "deviceProfiles": { + "description": "Device Profiles", + "isPersonal": false, + "items": { + "title": "Profile", + "type": "string" + }, + "searchable": false, + "title": "Device Profiles", + "type": "array", + "userEditable": true, + "viewable": true + }, + "effectiveApplications": { + "description": "Effective Applications", + "isPersonal": false, + "isVirtual": true, + "items": { + "title": "Effective Application Items", + "type": "object" + }, + "queryConfig": { + "referencedObjectFields": [ + "name" + ], + "referencedRelationshipFields": [ + [ + "roles", + "applications" + ], + [ + "applications" + ] + ] + }, + "returnByDefault": true, + "title": "Effective Applications", + "type": "array", + "viewable": false + }, + "effectiveAssignments": { + "description": "Effective Assignments", + "isPersonal": false, + "isVirtual": true, + "items": { + "title": "Effective Assignments Items", + "type": "object" + }, + "queryConfig": { + "referencedObjectFields": [ + "*" + ], + "referencedRelationshipFields": [ + [ + "roles", + "assignments" + ], + [ + "assignments" + ] + ] + }, + "returnByDefault": true, + "title": "Effective Assignments", + "type": "array", + "usageDescription": "", + "viewable": false + }, + "effectiveGroups": { + "description": "Effective Groups", + "isPersonal": false, + "isVirtual": true, + "items": { + "title": "Effective Groups Items", + "type": "object" + }, + "queryConfig": { + "referencedRelationshipFields": [ + "groups" + ] + }, + "returnByDefault": true, + "title": "Effective Groups", + "type": "array", + "usageDescription": "", + "viewable": false + }, + "effectiveRoles": { + "description": "Effective Roles", + "isPersonal": false, + "isVirtual": true, + "items": { + "title": "Effective Roles Items", + "type": "object" + }, + "queryConfig": { + "referencedRelationshipFields": [ + "roles" + ] + }, + "returnByDefault": true, + "title": "Effective Roles", + "type": "array", + "usageDescription": "", + "viewable": false + }, + "givenName": { + "description": "First Name", + "isPersonal": true, + "searchable": true, + "title": "First Name", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "groups": { + "description": "Groups", + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User:groups", + "isPersonal": false, + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User:groups:items", + "notifySelf": true, + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_grantType": { + "description": "Grant Type", + "label": "Grant Type", + "type": "string" + }, + "_id": { + "description": "_refProperties object ID", + "type": "string" + } + }, + "title": "Groups Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "conditionalAssociationField": "condition", + "label": "Group", + "path": "managed/group", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true", + "sortKeys": [ + "name" + ] + } + } + ], + "reversePropertyName": "members", + "reverseRelationship": true, + "title": "Groups Items", + "type": "relationship", + "validate": true + }, + "relationshipGrantTemporalConstraintsEnforced": false, + "returnByDefault": false, + "title": "Group", + "type": "array", + "usageDescription": "", + "userEditable": false, + "viewable": true + }, + "inactiveDate": { + "description": "Inactive Date", + "format": "datetime", + "isPersonal": false, + "policies": [ + { + "policyId": "valid-datetime" + } + ], + "searchable": false, + "title": "Inactive Date", + "type": "string", + "usageDescription": "", + "userEditable": false, + "viewable": true + }, + "kbaInfo": { + "description": "KBA Info", + "isPersonal": true, + "items": { + "order": [ + "answer", + "customQuestion", + "questionId" + ], + "properties": { + "answer": { + "description": "Answer", + "type": "string" + }, + "customQuestion": { + "description": "Custom question", + "type": "string" + }, + "questionId": { + "description": "Question ID", + "type": "string" + } + }, + "required": [], + "title": "KBA Info Items", + "type": "object" + }, + "type": "array", + "usageDescription": "", + "userEditable": true, + "viewable": false + }, + "lastSync": { + "description": "Last Sync timestamp", + "isPersonal": false, + "order": [ + "effectiveAssignments", + "timestamp" + ], + "properties": { + "effectiveAssignments": { + "description": "Effective Assignments", + "items": { + "title": "Effective Assignments Items", + "type": "object" + }, + "title": "Effective Assignments", + "type": "array" + }, + "timestamp": { + "description": "Timestamp", + "format": "datetime", + "policies": [ + { + "policyId": "valid-datetime" + } + ], + "type": "string" + } + }, + "required": [], + "scope": "private", + "searchable": false, + "title": "Last Sync timestamp", + "type": "object", + "usageDescription": "", + "viewable": false + }, + "mail": { + "description": "Email Address", + "isPersonal": true, + "policies": [ + { + "policyId": "valid-email-address-format" + } + ], + "searchable": true, + "title": "Email Address", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "manager": { + "description": "Manager", + "isPersonal": false, + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_id": { + "description": "_refProperties object ID", + "type": "string" + } + }, + "title": "Manager _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "User", + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "reports", + "reverseRelationship": true, + "searchable": false, + "title": "Manager", + "type": "relationship", + "usageDescription": "", + "userEditable": false, + "validate": true, + "viewable": true + }, + "memberOfOrg": { + "items": { + "notifySelf": true, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Organization", + "notify": false, + "path": "managed/organization", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true", + "sortKeys": [] + } + } + ], + "reversePropertyName": "members", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "policies": [], + "returnByDefault": false, + "searchable": false, + "title": "Organizations to which I Belong", + "type": "array", + "userEditable": false, + "viewable": true + }, + "memberOfOrgIDs": { + "isVirtual": true, + "items": { + "title": "org identifiers", + "type": "string" + }, + "queryConfig": { + "flattenProperties": true, + "referencedObjectFields": [ + "_id", + "parentIDs" + ], + "referencedRelationshipFields": [ + "memberOfOrg" + ] + }, + "returnByDefault": true, + "searchable": false, + "title": "MemberOfOrgIDs", + "type": "array", + "userEditable": false, + "viewable": false + }, + "oathDeviceProfiles": { + "description": "Oath Device Profiles", + "isPersonal": false, + "items": { + "title": "Profile", + "type": "string" + }, + "searchable": false, + "title": "Oath Device Profiles", + "type": "array", + "userEditable": true, + "viewable": true + }, + "ownerOfApp": { + "items": { + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Application", + "path": "managed/application", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true", + "sortKeys": [ + "name" + ] + } + } + ], + "reversePropertyName": "owners", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "searchable": false, + "title": "Applications I Own", + "type": "array", + "userEditable": false, + "viewable": true + }, + "ownerOfOrg": { + "items": { + "notifySelf": false, + "properties": { + "_ref": { + "type": "string" + }, + "_refProperties": { + "properties": { + "_id": { + "propName": "_id", + "required": false, + "type": "string" + } + }, + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "Organization", + "notify": true, + "path": "managed/organization", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true", + "sortKeys": [] + } + } + ], + "reversePropertyName": "owners", + "reverseRelationship": true, + "type": "relationship", + "validate": true + }, + "policies": [], + "returnByDefault": false, + "searchable": false, + "title": "Organizations I Own", + "type": "array", + "userEditable": false, + "viewable": true + }, + "password": { + "description": "Password", + "isPersonal": false, + "isProtected": true, + "policies": [ + { + "params": { + "minLength": 8 + }, + "policyId": "minimum-length" + }, + { + "params": { + "numCaps": 1 + }, + "policyId": "at-least-X-capitals" + }, + { + "params": { + "numNums": 1 + }, + "policyId": "at-least-X-numbers" + }, + { + "params": { + "disallowedFields": [ + "userName", + "givenName", + "sn" + ] + }, + "policyId": "cannot-contain-others" + } + ], + "scope": "private", + "searchable": false, + "title": "Password", + "type": "string", + "usageDescription": "", + "userEditable": false, + "viewable": false + }, + "passwordExpirationTime": { + "description": "Password Expiration Time", + "searchable": true, + "title": "Password Expiration Time", + "type": "string", + "userEditable": false, + "viewable": true + }, + "passwordLastChangedTime": { + "description": "Password Last Changed Time", + "searchable": true, + "title": "Password Last Changed Time", + "type": "string", + "userEditable": false, + "viewable": true + }, + "postalAddress": { + "description": "Address 1", + "isPersonal": true, + "title": "Address 1", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "postalCode": { + "description": "Postal Code", + "isPersonal": false, + "title": "Postal Code", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "preferences": { + "description": "Preferences", + "isPersonal": false, + "order": [ + "updates", + "marketing" + ], + "properties": { + "marketing": { + "description": "Send me special offers and services", + "type": "boolean" + }, + "updates": { + "description": "Send me news and updates", + "type": "boolean" + } + }, + "required": [], + "searchable": false, + "title": "Preferences", + "type": "object", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "profileImage": { + "description": "Profile Image", + "isPersonal": true, + "searchable": false, + "title": "Profile Image", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": false + }, + "pushDeviceProfiles": { + "description": "Push Device Profiles", + "isPersonal": false, + "items": { + "title": "Profile", + "type": "string" + }, + "searchable": false, + "title": "Push Device Profiles", + "type": "array", + "userEditable": true, + "viewable": true + }, + "reports": { + "description": "Direct Reports", + "isPersonal": false, + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User:reports:items", + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_id": { + "description": "_refProperties object ID", + "type": "string" + } + }, + "title": "Direct Reports Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "label": "User", + "path": "managed/user", + "query": { + "fields": [ + "userName", + "givenName", + "sn" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "manager", + "reverseRelationship": true, + "title": "Direct Reports Items", + "type": "relationship", + "validate": true + }, + "returnByDefault": false, + "title": "Direct Reports", + "type": "array", + "usageDescription": "", + "userEditable": false, + "viewable": true + }, + "roles": { + "description": "Provisioning Roles", + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User:roles", + "isPersonal": false, + "items": { + "id": "urn:jsonschema:org:forgerock:openidm:managed:api:User:roles:items", + "notifySelf": true, + "properties": { + "_ref": { + "description": "References a relationship from a managed object", + "type": "string" + }, + "_refProperties": { + "description": "Supports metadata within the relationship", + "properties": { + "_grantType": { + "description": "Grant Type", + "label": "Grant Type", + "type": "string" + }, + "_id": { + "description": "_refProperties object ID", + "type": "string" + } + }, + "title": "Provisioning Roles Items _refProperties", + "type": "object" + } + }, + "resourceCollection": [ + { + "conditionalAssociationField": "condition", + "label": "Role", + "path": "managed/role", + "query": { + "fields": [ + "name" + ], + "queryFilter": "true" + } + } + ], + "reversePropertyName": "members", + "reverseRelationship": true, + "title": "Provisioning Roles Items", + "type": "relationship", + "validate": true + }, + "relationshipGrantTemporalConstraintsEnforced": true, + "returnByDefault": false, + "title": "Provisioning Roles", + "type": "array", + "usageDescription": "", + "userEditable": false, + "viewable": true + }, + "sn": { + "description": "Last Name", + "isPersonal": true, + "searchable": true, + "title": "Last Name", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "stateProvince": { + "description": "State/Province", + "isPersonal": false, + "title": "State/Province", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "telephoneNumber": { + "description": "Telephone Number", + "isPersonal": true, + "pattern": "^\\+?([0-9\\- \\(\\)])*$", + "searchable": true, + "title": "Telephone Number", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "userName": { + "description": "Username", + "isPersonal": true, + "policies": [ + { + "policyId": "valid-username" + }, + { + "params": { + "forbiddenChars": [ + "/" + ] + }, + "policyId": "cannot-contain-characters" + }, + { + "params": { + "minLength": 1 + }, + "policyId": "minimum-length" + }, + { + "params": { + "maxLength": 255 + }, + "policyId": "maximum-length" + } + ], + "searchable": true, + "title": "Username", + "type": "string", + "usageDescription": "", + "userEditable": true, + "viewable": true + }, + "webauthnDeviceProfiles": { + "description": "Web AuthN Device Profiles", + "isPersonal": false, + "items": { + "title": "Profile", + "type": "string" + }, + "searchable": false, + "title": "Web AuthN Device Profiles", + "type": "array", + "userEditable": true, + "viewable": true + } + }, + "required": [ + "userName", + "givenName", + "sn", + "mail" + ], + "title": "User", + "type": "object", + "viewable": true + } +} \ No newline at end of file diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/am_1076162899/recording.har new file mode 100644 index 000000000..c4268aa7d --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/am_1076162899/recording.har @@ -0,0 +1,631 @@ +{ + "log": { + "_recordingName": "config-manager/push/managed-objects/0_D_m/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-785ab35c-42c5-412a-9064-81faaa60246d" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 370, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 587, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 587, + "text": "{\"_id\":\"*\",\"_rev\":\"2075994313\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"nodeDesignerXuiEnabled\":true}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 27 Mar 2026 18:59:24 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "587" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2075994313\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-27T18:59:25.279Z", + "time": 9, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 9 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-785ab35c-42c5-412a-9064-81faaa60246d" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "41ghjnKpNFAFU/HXw82HbFbitYNOOJ0g" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 497, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 167, + "content": { + "mimeType": "application/json", + "size": 167, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 27 Mar 2026 18:59:24 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "167" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 693, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-27T18:59:25.294Z", + "time": 20, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 20 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 128, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-785ab35c-42c5-412a-9064-81faaa60246d" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "128" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "https://platform.dev.trivir.com/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 291, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 291, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,ou=am-config\",\"realm\":\"/\",\"latestAccessTime\":\"2026-03-27T18:59:24Z\",\"maxIdleExpirationTime\":\"2026-03-27T19:29:24Z\",\"maxSessionExpirationTime\":\"2026-03-27T20:59:23Z\",\"properties\":{\"AMCtxId\":\"2290f5e0-a308-4911-9d82-33600d3abf08-25584\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 27 Mar 2026 18:59:24 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "291" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 610, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-27T18:59:25.321Z", + "time": 4, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 4 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-785ab35c-42c5-412a-9064-81faaa60246d" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 520, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 257, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 257, + "text": "{\"_id\":\"version\",\"_rev\":\"-466575464\",\"version\":\"8.0.1\",\"fullVersion\":\"ForgeRock Access Management 8.0.1 Build b59bc0908346197b0c33afcb9e733d0400feeea1 (2025-April-15 11:37)\",\"revision\":\"b59bc0908346197b0c33afcb9e733d0400feeea1\",\"date\":\"2025-April-15 11:37\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 27 Mar 2026 18:59:24 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "257" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-466575464\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-27T18:59:25.333Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/oauth2_393036114/recording.har new file mode 100644 index 000000000..4aaa4c14e --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/managed-objects/0_D_m/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "a684e2f67fd67a4263878c3124af167a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 365, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-785ab35c-42c5-412a-9064-81faaa60246d" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "content-length", + "value": "365" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 565, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&scope=fr:idm:* openid&response_type=code&client_id=idm-admin-ui&csrf=7yIwoReO-zgRcpbQaWDJGXwXYvU.*AAJTSQACMDIAAlNLABx2dHI4a29UQU5oUFpRbmxzUmZSYytIWDlXUUk9AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=qpYrXUbR_8zGRVjdj0jB7RIjhuMsT1OfkSw9OhySQvQ&code_challenge_method=S256" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/authorize" + }, + "response": { + "bodySize": 0, + "content": { + "mimeType": "text/plain", + "size": 0 + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "expires": "1970-01-01T00:00:00.000Z", + "httpOnly": true, + "name": "OAUTH_REQUEST_ATTRIBUTES", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 27 Mar 2026 18:59:24 GMT" + }, + { + "name": "content-length", + "value": "0" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "OAUTH_REQUEST_ATTRIBUTES=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "location", + "value": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=BNYwW0qQhtO_WGnKSZo8g0Ng1AY&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 673, + "httpVersion": "HTTP/1.1", + "redirectURL": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=BNYwW0qQhtO_WGnKSZo8g0Ng1AY&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-03-27T18:59:25.347Z", + "time": 16, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 16 + } + }, + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 224, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-785ab35c-42c5-412a-9064-81faaa60246d" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "224" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "client_id=idm-admin-ui&redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&grant_type=authorization_code&code=BNYwW0qQhtO_WGnKSZo8g0Ng1AY&code_verifier=Fo4t1zVjWrikia1fIHK--Z8elfebyHB64yKQMueFmM0" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1249, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1249, + "text": "{\"access_token\":\"\",\"scope\":\"openid fr:idm:*\",\"id_token\":\"\",\"token_type\":\"Bearer\",\"expires_in\":239}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 27 Mar 2026 18:59:24 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1249" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 405, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-27T18:59:25.371Z", + "time": 31, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 31 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/openidm_3290118515/recording.har new file mode 100644 index 000000000..2e40f4cee --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_D_m_314327836/openidm_3290118515/recording.har @@ -0,0 +1,167 @@ +{ + "log": { + "_recordingName": "config-manager/push/managed-objects/0_D_m/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "7322535748e88337224313514e419364", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 42604, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-785ab35c-42c5-412a-9064-81faaa60246d" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "42604" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 412, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"managed\",\"objects\":[{\"name\":\"application\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"icon\":\"fa-folder\",\"order\":[\"name\",\"description\",\"url\",\"icon\",\"mappingNames\",\"owners\",\"roles\",\"members\"],\"properties\":{\"_id\":{\"description\":\"Application ID\",\"isPersonal\":false,\"searchable\":false,\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"authoritative\":{\"description\":\"Is this an authoritative application\",\"searchable\":false,\"title\":\"Authoritative\",\"type\":\"boolean\",\"viewable\":false},\"connectorId\":{\"description\":\"Id of the connector associated with the application\",\"searchable\":false,\"title\":\"Connector ID\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"description\":{\"description\":\"Application Description\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"icon\":{\"searchable\":true,\"title\":\"Icon\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"mappingNames\":{\"description\":\"Names of the sync mappings used by an application with provisioning configured.\",\"items\":{\"title\":\"Mapping Name Items\",\"type\":\"string\"},\"searchable\":true,\"title\":\"Sync Mapping Names\",\"type\":\"array\",\"viewable\":true},\"members\":{\"description\":\"Members directly granted an application\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Application:members:items\",\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Application Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"applications\",\"reverseRelationship\":true,\"title\":\"Application Members Items\",\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"description\":\"Application name\",\"notifyRelationships\":[\"roles\",\"members\"],\"policies\":[{\"policyId\":\"unique\"}],\"returnByDefault\":true,\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"owners\":{\"description\":\"Application Owners\",\"items\":{\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"ownerOfApp\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Owners\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"roles\":{\"description\":\"Roles granting users the application\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Role\",\"notify\":true,\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"applications\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Roles\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"ssoEntities\":{\"description\":\"SSO Entity Id\",\"properties\":{\"domain\":{\"type\":\"string\"},\"federatedDomain\":{\"type\":\"string\"},\"idpLocation\":{\"type\":\"string\"},\"idpLoginUrl\":{\"type\":\"string\"},\"idpPrivateId\":{\"type\":\"string\"},\"key\":{\"type\":\"string\"},\"oidcId\":{\"type\":\"string\"},\"pfApcId\":{\"type\":\"string\"},\"pfIdpAdapterId\":{\"type\":\"string\"},\"pfPolicyId\":{\"type\":\"string\"},\"pfSigningCertId\":{\"type\":\"string\"},\"pfSpConnectionId\":{\"type\":\"string\"},\"spLocation\":{\"type\":\"string\"},\"spPrivate\":{\"type\":\"string\"},\"spPrivateId\":{\"type\":\"string\"}},\"searchable\":false,\"title\":\"SSO Entity Id\",\"type\":\"object\",\"userEditable\":false,\"viewable\":false},\"templateName\":{\"description\":\"Name of the template the application was created from\",\"searchable\":false,\"title\":\"Template Name\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"templateVersion\":{\"description\":\"The template version\",\"searchable\":false,\"title\":\"Template Version\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"uiConfig\":{\"description\":\"UI Config\",\"isPersonal\":false,\"properties\":{},\"searchable\":false,\"title\":\"UI Config\",\"type\":\"object\",\"usageDescription\":\"\",\"viewable\":false},\"url\":{\"searchable\":true,\"title\":\"Url\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"name\"],\"title\":\"Application\",\"type\":\"object\"}},{\"attributeEncryption\":{},\"name\":\"assignment\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"A role assignment\",\"icon\":\"fa-key\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment\",\"mat-icon\":\"vpn_key\",\"order\":[\"_id\",\"name\",\"description\",\"type\",\"mapping\",\"attributes\",\"linkQualifiers\",\"roles\",\"members\",\"condition\",\"weight\"],\"properties\":{\"_id\":{\"description\":\"The assignment ID\",\"searchable\":false,\"title\":\"Name\",\"type\":\"string\",\"viewable\":false},\"attributes\":{\"description\":\"The attributes operated on by this assignment.\",\"items\":{\"order\":[\"assignmentOperation\",\"unassignmentOperation\",\"name\",\"value\"],\"properties\":{\"assignmentOperation\":{\"description\":\"Assignment operation\",\"type\":\"string\"},\"name\":{\"description\":\"Name\",\"type\":\"string\"},\"unassignmentOperation\":{\"description\":\"Unassignment operation\",\"type\":\"string\"},\"value\":{\"description\":\"Value\",\"type\":\"string\"}},\"required\":[],\"title\":\"Assignment Attributes Items\",\"type\":\"object\"},\"notifyRelationships\":[\"roles\",\"members\"],\"title\":\"Assignment Attributes\",\"type\":\"array\",\"viewable\":true},\"condition\":{\"description\":\"A conditional filter for this assignment\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"The assignment description, used for display purposes.\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"linkQualifiers\":{\"description\":\"Conditional link qualifiers to restrict this assignment to.\",\"items\":{\"title\":\"Link Qualifiers Items\",\"type\":\"string\"},\"title\":\"Link Qualifiers\",\"type\":\"array\",\"viewable\":true},\"mapping\":{\"description\":\"The name of the mapping this assignment applies to\",\"policies\":[{\"policyId\":\"mapping-exists\"}],\"searchable\":true,\"title\":\"Mapping\",\"type\":\"string\",\"viewable\":true},\"members\":{\"description\":\"Assignment Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Assignment Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"assignments\",\"reverseRelationship\":true,\"title\":\"Assignment Members Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Assignment Members\",\"type\":\"array\",\"viewable\":true},\"name\":{\"description\":\"The assignment name, used for display purposes.\",\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true},\"roles\":{\"description\":\"Managed Roles\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:roles:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Managed Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Role\",\"notify\":true,\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"assignments\",\"reverseRelationship\":true,\"title\":\"Managed Roles Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Managed Roles\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"type\":{\"description\":\"The type of object this assignment represents\",\"title\":\"Type\",\"type\":\"string\",\"viewable\":true},\"weight\":{\"description\":\"The weight of the assignment.\",\"notifyRelationships\":[\"roles\",\"members\"],\"searchable\":false,\"title\":\"Weight\",\"type\":[\"number\",\"null\"],\"viewable\":true}},\"required\":[\"name\",\"description\",\"mapping\"],\"title\":\"Assignment\",\"type\":\"object\"}},{\"name\":\"group\",\"schema\":{\"$schema\":\"http://json-schema.org/draft-03/schema\",\"icon\":\"fa-group\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Group\",\"mat-icon\":\"group\",\"order\":[\"_id\",\"name\",\"description\",\"condition\",\"members\"],\"properties\":{\"_id\":{\"description\":\"Group ID\",\"isPersonal\":false,\"searchable\":false,\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"condition\":{\"description\":\"A filter for conditionally assigned members\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"Group Description\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"members\":{\"description\":\"Group Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Group:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Group Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"groups\",\"reverseRelationship\":true,\"title\":\"Group Members Items\",\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"description\":\"Group Name\",\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true}},\"required\":[\"name\"],\"title\":\"Group\",\"viewable\":true}},{\"name\":\"organization\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"An organization or tenant, whose resources are managed by organizational admins.\",\"icon\":\"fa-building\",\"mat-icon\":\"domain\",\"order\":[\"name\",\"description\",\"owners\",\"admins\",\"members\",\"parent\",\"children\",\"adminIDs\",\"ownerIDs\",\"parentAdminIDs\",\"parentOwnerIDs\",\"parentIDs\"],\"properties\":{\"adminIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"admin ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\"],\"referencedRelationshipFields\":[\"admins\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"Admin user ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"admins\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":false,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"adminOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"children\"],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Administrators\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"children\":{\"description\":\"Child Organizations\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\",\"description\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"parent\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Child Organizations\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"description\":{\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"members\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"memberOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"ownerIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"owner ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\"],\"referencedRelationshipFields\":[\"owners\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"Owner user ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"owners\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":false,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"ownerOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"children\"],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Owner\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"parent\":{\"description\":\"Parent Organization\",\"notifyRelationships\":[\"children\",\"members\"],\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\",\"description\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"returnByDefault\":false,\"reversePropertyName\":\"children\",\"reverseRelationship\":true,\"searchable\":false,\"title\":\"Parent Organization\",\"type\":\"relationship\",\"userEditable\":false,\"validate\":true,\"viewable\":true},\"parentAdminIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"user ids of parent admins\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"adminIDs\",\"parentAdminIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"user ids of parent admins\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"parentIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"parent org ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\",\"parentIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"parent org ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"parentOwnerIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"user ids of parent owners\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"ownerIDs\",\"parentOwnerIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"user ids of parent owners\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false}},\"required\":[\"name\"],\"title\":\"Organization\",\"type\":\"object\"}},{\"name\":\"role\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"\",\"icon\":\"fa-check-square-o\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role\",\"mat-icon\":\"assignment_ind\",\"order\":[\"_id\",\"name\",\"description\",\"members\",\"assignments\",\"applications\",\"condition\",\"temporalConstraints\"],\"properties\":{\"_id\":{\"description\":\"Role ID\",\"searchable\":false,\"title\":\"Name\",\"type\":\"string\",\"viewable\":false},\"applications\":{\"description\":\"Role Applications\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Role Application Items\",\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"members\"],\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Applications\",\"type\":\"array\",\"viewable\":false},\"assignments\":{\"description\":\"Managed Assignments\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role:assignments:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Managed Assignments Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Assignment\",\"path\":\"managed/assignment\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Managed Assignments Items\",\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"members\"],\"returnByDefault\":false,\"title\":\"Managed Assignments\",\"type\":\"array\",\"viewable\":true},\"condition\":{\"description\":\"A conditional filter for this role\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"The role description, used for display purposes.\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"members\":{\"description\":\"Role Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Role Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Role Members Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Role Members\",\"type\":\"array\",\"viewable\":true},\"name\":{\"description\":\"The role name, used for display purposes.\",\"policies\":[{\"policyId\":\"unique\"}],\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true},\"temporalConstraints\":{\"description\":\"An array of temporal constraints for a role\",\"isTemporalConstraint\":true,\"items\":{\"order\":[\"duration\"],\"properties\":{\"duration\":{\"description\":\"Duration\",\"type\":\"string\"}},\"required\":[\"duration\"],\"title\":\"Temporal Constraints Items\",\"type\":\"object\"},\"notifyRelationships\":[\"members\"],\"returnByDefault\":true,\"title\":\"Temporal Constraints\",\"type\":\"array\",\"viewable\":false}},\"required\":[\"name\"],\"title\":\"Role\",\"type\":\"object\"}},{\"name\":\"testObject\",\"onCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// test script\\n\"},\"onRead\":{\"globals\":{},\"source\":\"//groovy export\",\"type\":\"groovy\"},\"onSync\":{\"globals\":{\"test\":8},\"source\":\"//test\",\"type\":\"groovy\"},\"onUpdate\":{\"globals\":{\"test\":[\"test\"]},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"onValidate\":{\"globals\":{\"test\":\"test\"},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"postCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// another test\\n\"},\"postDelete\":{\"globals\":{\"test\":\"test\"},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"postUpdate\":{\"globals\":{\"test\":1},\"source\":\"//test\",\"type\":\"groovy\"},\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"test\",\"icon\":\"fa-anchor\",\"mat-icon\":\"\",\"order\":[\"testObj\",\"testString\"],\"properties\":{\"testObj\":{\"description\":null,\"isVirtual\":false,\"nullable\":false,\"onRetrieve\":{\"globals\":{\"four\":false,\"one\":null,\"three\":3,\"two\":\"number\"},\"source\":\"//second\",\"type\":\"groovy\"},\"onStore\":{\"globals\":{\"test\":{}},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"onValidate\":{\"globals\":{\"test\":null},\"source\":\"//groovy script test\",\"type\":\"groovy\"},\"order\":[\"testObject\",\"testString\"],\"properties\":{\"testObject\":{\"description\":null,\"isVirtual\":false,\"onRetrieve\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"text/javascript\"},\"onStore\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"groovy\"},\"order\":[],\"properties\":{},\"required\":[],\"searchable\":false,\"title\":\"test\",\"type\":\"object\",\"userEditable\":true,\"viewable\":true},\"testString\":{\"description\":null,\"format\":null,\"isVirtual\":false,\"onRetrieve\":{\"globals\":{\"test\":1},\"source\":\"//test\",\"type\":\"groovy\"},\"onStore\":{\"globals\":{\"test\":[\"test\",1,false]},\"source\":\"//test\",\"type\":\"text/javascript\"},\"searchable\":false,\"title\":\"test\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[],\"searchable\":false,\"title\":\"TestObj\",\"type\":\"object\",\"userEditable\":true,\"viewable\":true},\"testString\":{\"description\":null,\"format\":null,\"isVirtual\":false,\"onStore\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"groovy\"},\"searchable\":false,\"title\":\"test\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[],\"title\":\"Test\",\"type\":\"object\"}},{\"lastSync\":{\"effectiveAssignmentsProperty\":\"effectiveAssignments\",\"lastSyncProperty\":\"lastSync\"},\"meta\":{\"property\":\"_meta\",\"resourceCollection\":\"internal/usermeta\",\"trackedProperties\":[\"createDate\",\"lastChanged\"]},\"name\":\"user\",\"notifications\":{},\"schema\":{\"$schema\":\"http://json-schema.org/draft-03/schema\",\"icon\":\"fa-user\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User\",\"mat-icon\":\"people\",\"order\":[\"_id\",\"userName\",\"password\",\"givenName\",\"cn\",\"sn\",\"mail\",\"profileImage\",\"description\",\"accountStatus\",\"telephoneNumber\",\"postalAddress\",\"city\",\"postalCode\",\"country\",\"stateProvince\",\"assignedDashboard\",\"roles\",\"assignments\",\"groups\",\"applications\",\"manager\",\"authzRoles\",\"reports\",\"effectiveRoles\",\"effectiveAssignments\",\"effectiveGroups\",\"effectiveApplications\",\"lastSync\",\"kbaInfo\",\"preferences\",\"consentedMappings\",\"ownerOfOrg\",\"adminOfOrg\",\"memberOfOrg\",\"memberOfOrgIDs\",\"activeDate\",\"inactiveDate\",\"ownerOfApp\",\"passwordLastChangedTime\",\"passwordExpirationTime\",\"devicePrintProfiles\",\"deviceProfiles\",\"oathDeviceProfiles\",\"pushDeviceProfiles\",\"webauthnDeviceProfiles\"],\"properties\":{\"_id\":{\"description\":\"User ID\",\"isPersonal\":false,\"policies\":[{\"params\":{\"forbiddenChars\":[\"/\"]},\"policyId\":\"cannot-contain-characters\"}],\"searchable\":false,\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"accountStatus\":{\"default\":\"active\",\"description\":\"Status\",\"isPersonal\":false,\"searchable\":false,\"title\":\"Status\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"activeDate\":{\"description\":\"Active Date\",\"format\":\"datetime\",\"isPersonal\":false,\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Active Date\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"adminOfOrg\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"admins\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations I Administer\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"aliasList\":{\"description\":\"List of identity aliases used primarily to record social IdP subjects for this user\",\"isVirtual\":false,\"items\":{\"title\":\"User Alias Names Items\",\"type\":\"string\"},\"returnByDefault\":false,\"searchable\":false,\"title\":\"User Alias Names List\",\"type\":\"array\",\"userEditable\":true,\"viewable\":false},\"applications\":{\"description\":\"Applications\",\"isPersonal\":false,\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Application Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Applications\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"assignedDashboard\":{\"description\":\"List of items to click on for this user\",\"isVirtual\":true,\"items\":{\"title\":\"Assigned Dashboard Items\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"name\"],\"referencedRelationshipFields\":[[\"roles\",\"applications\"],[\"applications\"]]},\"searchable\":false,\"title\":\"Assigned Dashboard\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"assignments\":{\"description\":\"Assignments\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Provisioning Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Assignment\",\"path\":\"managed/assignment\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Assignments Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Assignments\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"authzRoles\":{\"description\":\"Authorization Roles\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Authorization Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Internal Role\",\"path\":\"internal/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"authzMembers\",\"reverseRelationship\":true,\"title\":\"Authorization Roles Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Authorization Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"city\":{\"description\":\"City\",\"isPersonal\":false,\"title\":\"City\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"cn\":{\"default\":\"{{givenName}} {{sn}}\",\"description\":\"Common Name\",\"isPersonal\":true,\"scope\":\"private\",\"searchable\":false,\"title\":\"Common Name\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"consentedMappings\":{\"description\":\"Consented Mappings\",\"isPersonal\":false,\"isVirtual\":false,\"items\":{\"items\":{\"order\":[\"mapping\",\"consentDate\"],\"properties\":{\"consentDate\":{\"description\":\"Consent Date\",\"format\":\"datetime\",\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Consent Date\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"mapping\":{\"description\":\"Mapping\",\"searchable\":false,\"title\":\"Mapping\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"mapping\",\"consentDate\"],\"title\":\"Consented Mappings Item\",\"type\":\"object\"},\"title\":\"Consented Mappings Items\",\"type\":\"array\"},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Consented Mappings\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"country\":{\"description\":\"Country\",\"isPersonal\":false,\"title\":\"Country\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"description\":{\"description\":\"Description\",\"isPersonal\":false,\"searchable\":false,\"title\":\"Description\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"devicePrintProfiles\":{\"description\":\"Device Print Profiles Information\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Device Print Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"deviceProfiles\":{\"description\":\"Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"effectiveApplications\":{\"description\":\"Effective Applications\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Application Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedObjectFields\":[\"name\"],\"referencedRelationshipFields\":[[\"roles\",\"applications\"],[\"applications\"]]},\"returnByDefault\":true,\"title\":\"Effective Applications\",\"type\":\"array\",\"viewable\":false},\"effectiveAssignments\":{\"description\":\"Effective Assignments\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Assignments Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedObjectFields\":[\"*\"],\"referencedRelationshipFields\":[[\"roles\",\"assignments\"],[\"assignments\"]]},\"returnByDefault\":true,\"title\":\"Effective Assignments\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"effectiveGroups\":{\"description\":\"Effective Groups\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Groups Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedRelationshipFields\":[\"groups\"]},\"returnByDefault\":true,\"title\":\"Effective Groups\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"effectiveRoles\":{\"description\":\"Effective Roles\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Roles Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedRelationshipFields\":[\"roles\"]},\"returnByDefault\":true,\"title\":\"Effective Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"givenName\":{\"description\":\"First Name\",\"isPersonal\":true,\"searchable\":true,\"title\":\"First Name\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"groups\":{\"description\":\"Groups\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:groups\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:groups:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Groups Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Group\",\"path\":\"managed/group\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Groups Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":false,\"returnByDefault\":false,\"title\":\"Group\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"inactiveDate\":{\"description\":\"Inactive Date\",\"format\":\"datetime\",\"isPersonal\":false,\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Inactive Date\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"kbaInfo\":{\"description\":\"KBA Info\",\"isPersonal\":true,\"items\":{\"order\":[\"answer\",\"customQuestion\",\"questionId\"],\"properties\":{\"answer\":{\"description\":\"Answer\",\"type\":\"string\"},\"customQuestion\":{\"description\":\"Custom question\",\"type\":\"string\"},\"questionId\":{\"description\":\"Question ID\",\"type\":\"string\"}},\"required\":[],\"title\":\"KBA Info Items\",\"type\":\"object\"},\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"lastSync\":{\"description\":\"Last Sync timestamp\",\"isPersonal\":false,\"order\":[\"effectiveAssignments\",\"timestamp\"],\"properties\":{\"effectiveAssignments\":{\"description\":\"Effective Assignments\",\"items\":{\"title\":\"Effective Assignments Items\",\"type\":\"object\"},\"title\":\"Effective Assignments\",\"type\":\"array\"},\"timestamp\":{\"description\":\"Timestamp\",\"format\":\"datetime\",\"policies\":[{\"policyId\":\"valid-datetime\"}],\"type\":\"string\"}},\"required\":[],\"scope\":\"private\",\"searchable\":false,\"title\":\"Last Sync timestamp\",\"type\":\"object\",\"usageDescription\":\"\",\"viewable\":false},\"mail\":{\"description\":\"Email Address\",\"isPersonal\":true,\"policies\":[{\"policyId\":\"valid-email-address-format\"}],\"searchable\":true,\"title\":\"Email Address\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"manager\":{\"description\":\"Manager\",\"isPersonal\":false,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Manager _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"reports\",\"reverseRelationship\":true,\"searchable\":false,\"title\":\"Manager\",\"type\":\"relationship\",\"usageDescription\":\"\",\"userEditable\":false,\"validate\":true,\"viewable\":true},\"memberOfOrg\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":false,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations to which I Belong\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"memberOfOrgIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"org identifiers\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\",\"parentIDs\"],\"referencedRelationshipFields\":[\"memberOfOrg\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"MemberOfOrgIDs\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"oathDeviceProfiles\":{\"description\":\"Oath Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Oath Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"ownerOfApp\":{\"items\":{\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"owners\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Applications I Own\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"ownerOfOrg\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"owners\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations I Own\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"password\":{\"description\":\"Password\",\"isPersonal\":false,\"isProtected\":true,\"policies\":[{\"params\":{\"minLength\":8},\"policyId\":\"minimum-length\"},{\"params\":{\"numCaps\":1},\"policyId\":\"at-least-X-capitals\"},{\"params\":{\"numNums\":1},\"policyId\":\"at-least-X-numbers\"},{\"params\":{\"disallowedFields\":[\"userName\",\"givenName\",\"sn\"]},\"policyId\":\"cannot-contain-others\"}],\"scope\":\"private\",\"searchable\":false,\"title\":\"Password\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"passwordExpirationTime\":{\"description\":\"Password Expiration Time\",\"searchable\":true,\"title\":\"Password Expiration Time\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"passwordLastChangedTime\":{\"description\":\"Password Last Changed Time\",\"searchable\":true,\"title\":\"Password Last Changed Time\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"postalAddress\":{\"description\":\"Address 1\",\"isPersonal\":true,\"title\":\"Address 1\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"postalCode\":{\"description\":\"Postal Code\",\"isPersonal\":false,\"title\":\"Postal Code\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"preferences\":{\"description\":\"Preferences\",\"isPersonal\":false,\"order\":[\"updates\",\"marketing\"],\"properties\":{\"marketing\":{\"description\":\"Send me special offers and services\",\"type\":\"boolean\"},\"updates\":{\"description\":\"Send me news and updates\",\"type\":\"boolean\"}},\"required\":[],\"searchable\":false,\"title\":\"Preferences\",\"type\":\"object\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"profileImage\":{\"description\":\"Profile Image\",\"isPersonal\":true,\"searchable\":false,\"title\":\"Profile Image\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"pushDeviceProfiles\":{\"description\":\"Push Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Push Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"reports\":{\"description\":\"Direct Reports\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:reports:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Direct Reports Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"manager\",\"reverseRelationship\":true,\"title\":\"Direct Reports Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Direct Reports\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"roles\":{\"description\":\"Provisioning Roles\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:roles\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:roles:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Provisioning Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Role\",\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Provisioning Roles Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Provisioning Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"sn\":{\"description\":\"Last Name\",\"isPersonal\":true,\"searchable\":true,\"title\":\"Last Name\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"stateProvince\":{\"description\":\"State/Province\",\"isPersonal\":false,\"title\":\"State/Province\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"telephoneNumber\":{\"description\":\"Telephone Number\",\"isPersonal\":true,\"pattern\":\"^\\\\+?([0-9\\\\- \\\\(\\\\)])*$\",\"searchable\":true,\"title\":\"Telephone Number\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"userName\":{\"description\":\"Username\",\"isPersonal\":true,\"policies\":[{\"policyId\":\"valid-username\"},{\"params\":{\"forbiddenChars\":[\"/\"]},\"policyId\":\"cannot-contain-characters\"},{\"params\":{\"minLength\":1},\"policyId\":\"minimum-length\"},{\"params\":{\"maxLength\":255},\"policyId\":\"maximum-length\"}],\"searchable\":true,\"title\":\"Username\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"webauthnDeviceProfiles\":{\"description\":\"Web AuthN Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Web AuthN Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"userName\",\"givenName\",\"sn\",\"mail\"],\"title\":\"User\",\"type\":\"object\",\"viewable\":true}}]}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/config/managed" + }, + "response": { + "bodySize": 42604, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 42604, + "text": "{\"_id\":\"managed\",\"objects\":[{\"name\":\"application\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"icon\":\"fa-folder\",\"order\":[\"name\",\"description\",\"url\",\"icon\",\"mappingNames\",\"owners\",\"roles\",\"members\"],\"properties\":{\"_id\":{\"description\":\"Application ID\",\"isPersonal\":false,\"searchable\":false,\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"authoritative\":{\"description\":\"Is this an authoritative application\",\"searchable\":false,\"title\":\"Authoritative\",\"type\":\"boolean\",\"viewable\":false},\"connectorId\":{\"description\":\"Id of the connector associated with the application\",\"searchable\":false,\"title\":\"Connector ID\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"description\":{\"description\":\"Application Description\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"icon\":{\"searchable\":true,\"title\":\"Icon\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"mappingNames\":{\"description\":\"Names of the sync mappings used by an application with provisioning configured.\",\"items\":{\"title\":\"Mapping Name Items\",\"type\":\"string\"},\"searchable\":true,\"title\":\"Sync Mapping Names\",\"type\":\"array\",\"viewable\":true},\"members\":{\"description\":\"Members directly granted an application\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Application:members:items\",\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Application Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"applications\",\"reverseRelationship\":true,\"title\":\"Application Members Items\",\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"description\":\"Application name\",\"notifyRelationships\":[\"roles\",\"members\"],\"policies\":[{\"policyId\":\"unique\"}],\"returnByDefault\":true,\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"owners\":{\"description\":\"Application Owners\",\"items\":{\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"ownerOfApp\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Owners\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"roles\":{\"description\":\"Roles granting users the application\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Role\",\"notify\":true,\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"applications\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Roles\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"ssoEntities\":{\"description\":\"SSO Entity Id\",\"properties\":{\"domain\":{\"type\":\"string\"},\"federatedDomain\":{\"type\":\"string\"},\"idpLocation\":{\"type\":\"string\"},\"idpLoginUrl\":{\"type\":\"string\"},\"idpPrivateId\":{\"type\":\"string\"},\"key\":{\"type\":\"string\"},\"oidcId\":{\"type\":\"string\"},\"pfApcId\":{\"type\":\"string\"},\"pfIdpAdapterId\":{\"type\":\"string\"},\"pfPolicyId\":{\"type\":\"string\"},\"pfSigningCertId\":{\"type\":\"string\"},\"pfSpConnectionId\":{\"type\":\"string\"},\"spLocation\":{\"type\":\"string\"},\"spPrivate\":{\"type\":\"string\"},\"spPrivateId\":{\"type\":\"string\"}},\"searchable\":false,\"title\":\"SSO Entity Id\",\"type\":\"object\",\"userEditable\":false,\"viewable\":false},\"templateName\":{\"description\":\"Name of the template the application was created from\",\"searchable\":false,\"title\":\"Template Name\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"templateVersion\":{\"description\":\"The template version\",\"searchable\":false,\"title\":\"Template Version\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"uiConfig\":{\"description\":\"UI Config\",\"isPersonal\":false,\"properties\":{},\"searchable\":false,\"title\":\"UI Config\",\"type\":\"object\",\"usageDescription\":\"\",\"viewable\":false},\"url\":{\"searchable\":true,\"title\":\"Url\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"name\"],\"title\":\"Application\",\"type\":\"object\"}},{\"attributeEncryption\":{},\"name\":\"assignment\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"A role assignment\",\"icon\":\"fa-key\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment\",\"mat-icon\":\"vpn_key\",\"order\":[\"_id\",\"name\",\"description\",\"type\",\"mapping\",\"attributes\",\"linkQualifiers\",\"roles\",\"members\",\"condition\",\"weight\"],\"properties\":{\"_id\":{\"description\":\"The assignment ID\",\"searchable\":false,\"title\":\"Name\",\"type\":\"string\",\"viewable\":false},\"attributes\":{\"description\":\"The attributes operated on by this assignment.\",\"items\":{\"order\":[\"assignmentOperation\",\"unassignmentOperation\",\"name\",\"value\"],\"properties\":{\"assignmentOperation\":{\"description\":\"Assignment operation\",\"type\":\"string\"},\"name\":{\"description\":\"Name\",\"type\":\"string\"},\"unassignmentOperation\":{\"description\":\"Unassignment operation\",\"type\":\"string\"},\"value\":{\"description\":\"Value\",\"type\":\"string\"}},\"required\":[],\"title\":\"Assignment Attributes Items\",\"type\":\"object\"},\"notifyRelationships\":[\"roles\",\"members\"],\"title\":\"Assignment Attributes\",\"type\":\"array\",\"viewable\":true},\"condition\":{\"description\":\"A conditional filter for this assignment\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"The assignment description, used for display purposes.\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"linkQualifiers\":{\"description\":\"Conditional link qualifiers to restrict this assignment to.\",\"items\":{\"title\":\"Link Qualifiers Items\",\"type\":\"string\"},\"title\":\"Link Qualifiers\",\"type\":\"array\",\"viewable\":true},\"mapping\":{\"description\":\"The name of the mapping this assignment applies to\",\"policies\":[{\"policyId\":\"mapping-exists\"}],\"searchable\":true,\"title\":\"Mapping\",\"type\":\"string\",\"viewable\":true},\"members\":{\"description\":\"Assignment Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Assignment Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"assignments\",\"reverseRelationship\":true,\"title\":\"Assignment Members Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Assignment Members\",\"type\":\"array\",\"viewable\":true},\"name\":{\"description\":\"The assignment name, used for display purposes.\",\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true},\"roles\":{\"description\":\"Managed Roles\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:roles:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Managed Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Role\",\"notify\":true,\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"assignments\",\"reverseRelationship\":true,\"title\":\"Managed Roles Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Managed Roles\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"type\":{\"description\":\"The type of object this assignment represents\",\"title\":\"Type\",\"type\":\"string\",\"viewable\":true},\"weight\":{\"description\":\"The weight of the assignment.\",\"notifyRelationships\":[\"roles\",\"members\"],\"searchable\":false,\"title\":\"Weight\",\"type\":[\"number\",\"null\"],\"viewable\":true}},\"required\":[\"name\",\"description\",\"mapping\"],\"title\":\"Assignment\",\"type\":\"object\"}},{\"name\":\"group\",\"schema\":{\"$schema\":\"http://json-schema.org/draft-03/schema\",\"icon\":\"fa-group\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Group\",\"mat-icon\":\"group\",\"order\":[\"_id\",\"name\",\"description\",\"condition\",\"members\"],\"properties\":{\"_id\":{\"description\":\"Group ID\",\"isPersonal\":false,\"searchable\":false,\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"condition\":{\"description\":\"A filter for conditionally assigned members\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"Group Description\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"members\":{\"description\":\"Group Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Group:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Group Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"groups\",\"reverseRelationship\":true,\"title\":\"Group Members Items\",\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"description\":\"Group Name\",\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true}},\"required\":[\"name\"],\"title\":\"Group\",\"viewable\":true}},{\"name\":\"organization\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"An organization or tenant, whose resources are managed by organizational admins.\",\"icon\":\"fa-building\",\"mat-icon\":\"domain\",\"order\":[\"name\",\"description\",\"owners\",\"admins\",\"members\",\"parent\",\"children\",\"adminIDs\",\"ownerIDs\",\"parentAdminIDs\",\"parentOwnerIDs\",\"parentIDs\"],\"properties\":{\"adminIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"admin ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\"],\"referencedRelationshipFields\":[\"admins\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"Admin user ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"admins\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":false,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"adminOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"children\"],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Administrators\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"children\":{\"description\":\"Child Organizations\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\",\"description\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"parent\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Child Organizations\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"description\":{\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"members\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"memberOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"ownerIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"owner ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\"],\"referencedRelationshipFields\":[\"owners\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"Owner user ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"owners\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":false,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"ownerOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"children\"],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Owner\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"parent\":{\"description\":\"Parent Organization\",\"notifyRelationships\":[\"children\",\"members\"],\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\",\"description\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"returnByDefault\":false,\"reversePropertyName\":\"children\",\"reverseRelationship\":true,\"searchable\":false,\"title\":\"Parent Organization\",\"type\":\"relationship\",\"userEditable\":false,\"validate\":true,\"viewable\":true},\"parentAdminIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"user ids of parent admins\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"adminIDs\",\"parentAdminIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"user ids of parent admins\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"parentIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"parent org ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\",\"parentIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"parent org ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"parentOwnerIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"user ids of parent owners\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"ownerIDs\",\"parentOwnerIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"user ids of parent owners\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false}},\"required\":[\"name\"],\"title\":\"Organization\",\"type\":\"object\"}},{\"name\":\"role\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"\",\"icon\":\"fa-check-square-o\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role\",\"mat-icon\":\"assignment_ind\",\"order\":[\"_id\",\"name\",\"description\",\"members\",\"assignments\",\"applications\",\"condition\",\"temporalConstraints\"],\"properties\":{\"_id\":{\"description\":\"Role ID\",\"searchable\":false,\"title\":\"Name\",\"type\":\"string\",\"viewable\":false},\"applications\":{\"description\":\"Role Applications\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Role Application Items\",\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"members\"],\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Applications\",\"type\":\"array\",\"viewable\":false},\"assignments\":{\"description\":\"Managed Assignments\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role:assignments:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Managed Assignments Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Assignment\",\"path\":\"managed/assignment\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Managed Assignments Items\",\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"members\"],\"returnByDefault\":false,\"title\":\"Managed Assignments\",\"type\":\"array\",\"viewable\":true},\"condition\":{\"description\":\"A conditional filter for this role\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"The role description, used for display purposes.\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"members\":{\"description\":\"Role Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Role Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Role Members Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Role Members\",\"type\":\"array\",\"viewable\":true},\"name\":{\"description\":\"The role name, used for display purposes.\",\"policies\":[{\"policyId\":\"unique\"}],\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true},\"temporalConstraints\":{\"description\":\"An array of temporal constraints for a role\",\"isTemporalConstraint\":true,\"items\":{\"order\":[\"duration\"],\"properties\":{\"duration\":{\"description\":\"Duration\",\"type\":\"string\"}},\"required\":[\"duration\"],\"title\":\"Temporal Constraints Items\",\"type\":\"object\"},\"notifyRelationships\":[\"members\"],\"returnByDefault\":true,\"title\":\"Temporal Constraints\",\"type\":\"array\",\"viewable\":false}},\"required\":[\"name\"],\"title\":\"Role\",\"type\":\"object\"}},{\"name\":\"testObject\",\"onCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// test script\\n\"},\"onRead\":{\"globals\":{},\"source\":\"//groovy export\",\"type\":\"groovy\"},\"onSync\":{\"globals\":{\"test\":8},\"source\":\"//test\",\"type\":\"groovy\"},\"onUpdate\":{\"globals\":{\"test\":[\"test\"]},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"onValidate\":{\"globals\":{\"test\":\"test\"},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"postCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// another test\\n\"},\"postDelete\":{\"globals\":{\"test\":\"test\"},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"postUpdate\":{\"globals\":{\"test\":1},\"source\":\"//test\",\"type\":\"groovy\"},\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"test\",\"icon\":\"fa-anchor\",\"mat-icon\":\"\",\"order\":[\"testObj\",\"testString\"],\"properties\":{\"testObj\":{\"description\":null,\"isVirtual\":false,\"nullable\":false,\"onRetrieve\":{\"globals\":{\"four\":false,\"one\":null,\"three\":3,\"two\":\"number\"},\"source\":\"//second\",\"type\":\"groovy\"},\"onStore\":{\"globals\":{\"test\":{}},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"onValidate\":{\"globals\":{\"test\":null},\"source\":\"//groovy script test\",\"type\":\"groovy\"},\"order\":[\"testObject\",\"testString\"],\"properties\":{\"testObject\":{\"description\":null,\"isVirtual\":false,\"onRetrieve\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"text/javascript\"},\"onStore\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"groovy\"},\"order\":[],\"properties\":{},\"required\":[],\"searchable\":false,\"title\":\"test\",\"type\":\"object\",\"userEditable\":true,\"viewable\":true},\"testString\":{\"description\":null,\"format\":null,\"isVirtual\":false,\"onRetrieve\":{\"globals\":{\"test\":1},\"source\":\"//test\",\"type\":\"groovy\"},\"onStore\":{\"globals\":{\"test\":[\"test\",1,false]},\"source\":\"//test\",\"type\":\"text/javascript\"},\"searchable\":false,\"title\":\"test\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[],\"searchable\":false,\"title\":\"TestObj\",\"type\":\"object\",\"userEditable\":true,\"viewable\":true},\"testString\":{\"description\":null,\"format\":null,\"isVirtual\":false,\"onStore\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"groovy\"},\"searchable\":false,\"title\":\"test\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[],\"title\":\"Test\",\"type\":\"object\"}},{\"lastSync\":{\"effectiveAssignmentsProperty\":\"effectiveAssignments\",\"lastSyncProperty\":\"lastSync\"},\"meta\":{\"property\":\"_meta\",\"resourceCollection\":\"internal/usermeta\",\"trackedProperties\":[\"createDate\",\"lastChanged\"]},\"name\":\"user\",\"notifications\":{},\"schema\":{\"$schema\":\"http://json-schema.org/draft-03/schema\",\"icon\":\"fa-user\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User\",\"mat-icon\":\"people\",\"order\":[\"_id\",\"userName\",\"password\",\"givenName\",\"cn\",\"sn\",\"mail\",\"profileImage\",\"description\",\"accountStatus\",\"telephoneNumber\",\"postalAddress\",\"city\",\"postalCode\",\"country\",\"stateProvince\",\"assignedDashboard\",\"roles\",\"assignments\",\"groups\",\"applications\",\"manager\",\"authzRoles\",\"reports\",\"effectiveRoles\",\"effectiveAssignments\",\"effectiveGroups\",\"effectiveApplications\",\"lastSync\",\"kbaInfo\",\"preferences\",\"consentedMappings\",\"ownerOfOrg\",\"adminOfOrg\",\"memberOfOrg\",\"memberOfOrgIDs\",\"activeDate\",\"inactiveDate\",\"ownerOfApp\",\"passwordLastChangedTime\",\"passwordExpirationTime\",\"devicePrintProfiles\",\"deviceProfiles\",\"oathDeviceProfiles\",\"pushDeviceProfiles\",\"webauthnDeviceProfiles\"],\"properties\":{\"_id\":{\"description\":\"User ID\",\"isPersonal\":false,\"policies\":[{\"params\":{\"forbiddenChars\":[\"/\"]},\"policyId\":\"cannot-contain-characters\"}],\"searchable\":false,\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"accountStatus\":{\"default\":\"active\",\"description\":\"Status\",\"isPersonal\":false,\"searchable\":false,\"title\":\"Status\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"activeDate\":{\"description\":\"Active Date\",\"format\":\"datetime\",\"isPersonal\":false,\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Active Date\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"adminOfOrg\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"admins\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations I Administer\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"aliasList\":{\"description\":\"List of identity aliases used primarily to record social IdP subjects for this user\",\"isVirtual\":false,\"items\":{\"title\":\"User Alias Names Items\",\"type\":\"string\"},\"returnByDefault\":false,\"searchable\":false,\"title\":\"User Alias Names List\",\"type\":\"array\",\"userEditable\":true,\"viewable\":false},\"applications\":{\"description\":\"Applications\",\"isPersonal\":false,\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Application Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Applications\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"assignedDashboard\":{\"description\":\"List of items to click on for this user\",\"isVirtual\":true,\"items\":{\"title\":\"Assigned Dashboard Items\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"name\"],\"referencedRelationshipFields\":[[\"roles\",\"applications\"],[\"applications\"]]},\"searchable\":false,\"title\":\"Assigned Dashboard\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"assignments\":{\"description\":\"Assignments\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Provisioning Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Assignment\",\"path\":\"managed/assignment\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Assignments Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Assignments\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"authzRoles\":{\"description\":\"Authorization Roles\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Authorization Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Internal Role\",\"path\":\"internal/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"authzMembers\",\"reverseRelationship\":true,\"title\":\"Authorization Roles Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Authorization Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"city\":{\"description\":\"City\",\"isPersonal\":false,\"title\":\"City\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"cn\":{\"default\":\"{{givenName}} {{sn}}\",\"description\":\"Common Name\",\"isPersonal\":true,\"scope\":\"private\",\"searchable\":false,\"title\":\"Common Name\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"consentedMappings\":{\"description\":\"Consented Mappings\",\"isPersonal\":false,\"isVirtual\":false,\"items\":{\"items\":{\"order\":[\"mapping\",\"consentDate\"],\"properties\":{\"consentDate\":{\"description\":\"Consent Date\",\"format\":\"datetime\",\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Consent Date\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"mapping\":{\"description\":\"Mapping\",\"searchable\":false,\"title\":\"Mapping\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"mapping\",\"consentDate\"],\"title\":\"Consented Mappings Item\",\"type\":\"object\"},\"title\":\"Consented Mappings Items\",\"type\":\"array\"},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Consented Mappings\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"country\":{\"description\":\"Country\",\"isPersonal\":false,\"title\":\"Country\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"description\":{\"description\":\"Description\",\"isPersonal\":false,\"searchable\":false,\"title\":\"Description\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"devicePrintProfiles\":{\"description\":\"Device Print Profiles Information\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Device Print Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"deviceProfiles\":{\"description\":\"Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"effectiveApplications\":{\"description\":\"Effective Applications\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Application Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedObjectFields\":[\"name\"],\"referencedRelationshipFields\":[[\"roles\",\"applications\"],[\"applications\"]]},\"returnByDefault\":true,\"title\":\"Effective Applications\",\"type\":\"array\",\"viewable\":false},\"effectiveAssignments\":{\"description\":\"Effective Assignments\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Assignments Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedObjectFields\":[\"*\"],\"referencedRelationshipFields\":[[\"roles\",\"assignments\"],[\"assignments\"]]},\"returnByDefault\":true,\"title\":\"Effective Assignments\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"effectiveGroups\":{\"description\":\"Effective Groups\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Groups Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedRelationshipFields\":[\"groups\"]},\"returnByDefault\":true,\"title\":\"Effective Groups\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"effectiveRoles\":{\"description\":\"Effective Roles\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Roles Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedRelationshipFields\":[\"roles\"]},\"returnByDefault\":true,\"title\":\"Effective Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"givenName\":{\"description\":\"First Name\",\"isPersonal\":true,\"searchable\":true,\"title\":\"First Name\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"groups\":{\"description\":\"Groups\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:groups\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:groups:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Groups Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Group\",\"path\":\"managed/group\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Groups Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":false,\"returnByDefault\":false,\"title\":\"Group\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"inactiveDate\":{\"description\":\"Inactive Date\",\"format\":\"datetime\",\"isPersonal\":false,\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Inactive Date\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"kbaInfo\":{\"description\":\"KBA Info\",\"isPersonal\":true,\"items\":{\"order\":[\"answer\",\"customQuestion\",\"questionId\"],\"properties\":{\"answer\":{\"description\":\"Answer\",\"type\":\"string\"},\"customQuestion\":{\"description\":\"Custom question\",\"type\":\"string\"},\"questionId\":{\"description\":\"Question ID\",\"type\":\"string\"}},\"required\":[],\"title\":\"KBA Info Items\",\"type\":\"object\"},\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"lastSync\":{\"description\":\"Last Sync timestamp\",\"isPersonal\":false,\"order\":[\"effectiveAssignments\",\"timestamp\"],\"properties\":{\"effectiveAssignments\":{\"description\":\"Effective Assignments\",\"items\":{\"title\":\"Effective Assignments Items\",\"type\":\"object\"},\"title\":\"Effective Assignments\",\"type\":\"array\"},\"timestamp\":{\"description\":\"Timestamp\",\"format\":\"datetime\",\"policies\":[{\"policyId\":\"valid-datetime\"}],\"type\":\"string\"}},\"required\":[],\"scope\":\"private\",\"searchable\":false,\"title\":\"Last Sync timestamp\",\"type\":\"object\",\"usageDescription\":\"\",\"viewable\":false},\"mail\":{\"description\":\"Email Address\",\"isPersonal\":true,\"policies\":[{\"policyId\":\"valid-email-address-format\"}],\"searchable\":true,\"title\":\"Email Address\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"manager\":{\"description\":\"Manager\",\"isPersonal\":false,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Manager _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"reports\",\"reverseRelationship\":true,\"searchable\":false,\"title\":\"Manager\",\"type\":\"relationship\",\"usageDescription\":\"\",\"userEditable\":false,\"validate\":true,\"viewable\":true},\"memberOfOrg\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":false,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations to which I Belong\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"memberOfOrgIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"org identifiers\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\",\"parentIDs\"],\"referencedRelationshipFields\":[\"memberOfOrg\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"MemberOfOrgIDs\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"oathDeviceProfiles\":{\"description\":\"Oath Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Oath Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"ownerOfApp\":{\"items\":{\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"owners\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Applications I Own\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"ownerOfOrg\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"owners\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations I Own\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"password\":{\"description\":\"Password\",\"isPersonal\":false,\"isProtected\":true,\"policies\":[{\"params\":{\"minLength\":8},\"policyId\":\"minimum-length\"},{\"params\":{\"numCaps\":1},\"policyId\":\"at-least-X-capitals\"},{\"params\":{\"numNums\":1},\"policyId\":\"at-least-X-numbers\"},{\"params\":{\"disallowedFields\":[\"userName\",\"givenName\",\"sn\"]},\"policyId\":\"cannot-contain-others\"}],\"scope\":\"private\",\"searchable\":false,\"title\":\"Password\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"passwordExpirationTime\":{\"description\":\"Password Expiration Time\",\"searchable\":true,\"title\":\"Password Expiration Time\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"passwordLastChangedTime\":{\"description\":\"Password Last Changed Time\",\"searchable\":true,\"title\":\"Password Last Changed Time\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"postalAddress\":{\"description\":\"Address 1\",\"isPersonal\":true,\"title\":\"Address 1\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"postalCode\":{\"description\":\"Postal Code\",\"isPersonal\":false,\"title\":\"Postal Code\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"preferences\":{\"description\":\"Preferences\",\"isPersonal\":false,\"order\":[\"updates\",\"marketing\"],\"properties\":{\"marketing\":{\"description\":\"Send me special offers and services\",\"type\":\"boolean\"},\"updates\":{\"description\":\"Send me news and updates\",\"type\":\"boolean\"}},\"required\":[],\"searchable\":false,\"title\":\"Preferences\",\"type\":\"object\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"profileImage\":{\"description\":\"Profile Image\",\"isPersonal\":true,\"searchable\":false,\"title\":\"Profile Image\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"pushDeviceProfiles\":{\"description\":\"Push Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Push Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"reports\":{\"description\":\"Direct Reports\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:reports:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Direct Reports Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"manager\",\"reverseRelationship\":true,\"title\":\"Direct Reports Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Direct Reports\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"roles\":{\"description\":\"Provisioning Roles\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:roles\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:roles:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Provisioning Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Role\",\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Provisioning Roles Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Provisioning Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"sn\":{\"description\":\"Last Name\",\"isPersonal\":true,\"searchable\":true,\"title\":\"Last Name\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"stateProvince\":{\"description\":\"State/Province\",\"isPersonal\":false,\"title\":\"State/Province\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"telephoneNumber\":{\"description\":\"Telephone Number\",\"isPersonal\":true,\"pattern\":\"^\\\\+?([0-9\\\\- \\\\(\\\\)])*$\",\"searchable\":true,\"title\":\"Telephone Number\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"userName\":{\"description\":\"Username\",\"isPersonal\":true,\"policies\":[{\"policyId\":\"valid-username\"},{\"params\":{\"forbiddenChars\":[\"/\"]},\"policyId\":\"cannot-contain-characters\"},{\"params\":{\"minLength\":1},\"policyId\":\"minimum-length\"},{\"params\":{\"maxLength\":255},\"policyId\":\"maximum-length\"}],\"searchable\":true,\"title\":\"Username\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"webauthnDeviceProfiles\":{\"description\":\"Web AuthN Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Web AuthN Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"userName\",\"givenName\",\"sn\",\"mail\"],\"title\":\"User\",\"type\":\"object\",\"viewable\":true}}]}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 27 Mar 2026 18:59:24 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 644, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-27T18:59:25.420Z", + "time": 35, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 35 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/am_1076162899/recording.har new file mode 100644 index 000000000..740bde91b --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/am_1076162899/recording.har @@ -0,0 +1,631 @@ +{ + "log": { + "_recordingName": "config-manager/push/managed-objects/0_n_D_m/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-0e96d5e7-cfeb-4cba-baee-0431f5b05225" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 370, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 587, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 587, + "text": "{\"_id\":\"*\",\"_rev\":\"2075994313\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"nodeDesignerXuiEnabled\":true}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 16:59:04 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "587" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2075994313\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T16:59:04.056Z", + "time": 39, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 39 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-0e96d5e7-cfeb-4cba-baee-0431f5b05225" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "41ghjnKpNFAFU/HXw82HbFbitYNOOJ0g" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 497, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 167, + "content": { + "mimeType": "application/json", + "size": 167, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 16:59:04 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "167" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 692, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T16:59:04.103Z", + "time": 33, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 33 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 128, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-0e96d5e7-cfeb-4cba-baee-0431f5b05225" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "128" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "https://platform.dev.trivir.com/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 290, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 290, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,ou=am-config\",\"realm\":\"/\",\"latestAccessTime\":\"2026-03-30T16:59:04Z\",\"maxIdleExpirationTime\":\"2026-03-30T17:29:04Z\",\"maxSessionExpirationTime\":\"2026-03-30T18:59:03Z\",\"properties\":{\"AMCtxId\":\"d9827ef5-6bcc-4305-82e6-b8df93f734be-1943\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 16:59:04 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "290" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 610, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T16:59:04.146Z", + "time": 10, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 10 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-0e96d5e7-cfeb-4cba-baee-0431f5b05225" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 520, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 257, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 257, + "text": "{\"_id\":\"version\",\"_rev\":\"-466575464\",\"version\":\"8.0.1\",\"fullVersion\":\"ForgeRock Access Management 8.0.1 Build b59bc0908346197b0c33afcb9e733d0400feeea1 (2025-April-15 11:37)\",\"revision\":\"b59bc0908346197b0c33afcb9e733d0400feeea1\",\"date\":\"2025-April-15 11:37\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 16:59:04 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "257" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-466575464\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T16:59:04.165Z", + "time": 9, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 9 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/oauth2_393036114/recording.har new file mode 100644 index 000000000..6edaee0ca --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/managed-objects/0_n_D_m/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "a684e2f67fd67a4263878c3124af167a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 365, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-0e96d5e7-cfeb-4cba-baee-0431f5b05225" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "content-length", + "value": "365" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 565, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&scope=fr:idm:* openid&response_type=code&client_id=idm-admin-ui&csrf=pcHjRZOjGm3F0y2bwwflgkRNyTs.*AAJTSQACMDIAAlNLABxJb0JEcWFPcGNqRGU3dk5QSUxBOGRPQzQ5ZG89AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=K4je4x7lJaF_3o8z3gNHGjiDl7W9l-g4WhgTqk8FE7g&code_challenge_method=S256" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/authorize" + }, + "response": { + "bodySize": 0, + "content": { + "mimeType": "text/plain", + "size": 0 + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "expires": "1970-01-01T00:00:00.000Z", + "httpOnly": true, + "name": "OAUTH_REQUEST_ATTRIBUTES", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 16:59:04 GMT" + }, + { + "name": "content-length", + "value": "0" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "OAUTH_REQUEST_ATTRIBUTES=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "location", + "value": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=XYv2nfRpJSETy8EC7e2aHKThXuM&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 673, + "httpVersion": "HTTP/1.1", + "redirectURL": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=XYv2nfRpJSETy8EC7e2aHKThXuM&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-03-30T16:59:04.183Z", + "time": 23, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 23 + } + }, + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 224, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-0e96d5e7-cfeb-4cba-baee-0431f5b05225" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "224" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "client_id=idm-admin-ui&redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&grant_type=authorization_code&code=XYv2nfRpJSETy8EC7e2aHKThXuM&code_verifier=VE7uFYDaO79hyRBhM6TAEKlzfageCSsCmfQGe9DYYjg" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1247, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1247, + "text": "{\"access_token\":\"\",\"scope\":\"openid fr:idm:*\",\"id_token\":\"\",\"token_type\":\"Bearer\",\"expires_in\":239}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 16:59:04 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1247" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 405, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T16:59:04.215Z", + "time": 58, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 58 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/openidm_3290118515/recording.har new file mode 100644 index 000000000..1bdcc3e04 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/managed-objects_1198917719/0_n_D_m_1348920437/openidm_3290118515/recording.har @@ -0,0 +1,316 @@ +{ + "log": { + "_recordingName": "config-manager/push/managed-objects/0_n_D_m/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "a691ccd864d3d6bd4cec893c7df77b9c", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-0e96d5e7-cfeb-4cba-baee-0431f5b05225" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 389, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/config/managed" + }, + "response": { + "bodySize": 7106, + "content": { + "encoding": "base64", + "mimeType": "application/json;charset=utf-8", + "size": 7106, + "text": "[\"H4sIAAAAAAAA/w==\",\"7T1pc9w2sn8Fxbcf9piJkpfaqn3z5ZUiOVtTm1haW/FulaWXgkjMiDGHpHlInlXpv7/GRQLEwWOow44/JB7h7G50N7obDfA++DWOglWwwynekihYBNn1bySsymD1/j5IcFm93adhsLoPyGYD5fEtOS7LeJvuSFqV50WWk6LawwC2ahhNjqC0bAZ9WAQ7UmE6eN5W/8rKFkFByqwuQnKSJQkdOUuhMk4rUqQ4OapLUoiGVYHDDyQSM8SEgh6EBcEVOYX/BBAnNzilCF7BrCneERiMjgG1aVbFmzjEdAroew8NyvCG7Bhgf5A/g5uqyldHR7+VWbrkhd9kxfYoKvCmWn77/ZFouAjikIG6wUsxASNwXaQr2pc3W0HX1Qb+R4os/LACyNM42q3EKqxwHq9+4Z13uFqKEXOS5QnFJysiqAMs6dotGB6vKUqLIMdleQfV8HMLa5GK4jCF/5UpGy5OaLsi28QJWe9gOvgzImVYxDkj8iLAYZjVafW2wlVN17AiCclvspS8rnfXDKg8KyucHEcRLBJtEcawdLL4JIvYnHSMghZDYUVgeW7jNKQ1mHEIiU5xeXOdYQZtkSWkbOok92yLrM5ZcZ4nzRItBLdSSHBd3fznjehckDwrWMeGG2WVgz2b4r/LmdqG+pQN1y6CD9d4nW4yRkayIQUBtBgVoCWMS6KfAdw43dKy7C4lxdnmrNhSYKNdnMo/doQS0/LX+pRhzIAQDByn2p9iUIBQWfKfWia/iDVmePUpjwuGiKiIyG0cwoqANJ1zRiiV0qYgw9XNabcwr0uz8I5c04VIOxVXCynYTCrvua6519htFVBGR+tTimZ5TgqQEZwEqw1OSkJZChaByzRoCVzgHRsIROc6jiKSAsYFE/gjJtms+X5NBS7EKUj2EhalwnG6DKEhEBHGDx4ArpLgAoquQZ7kVNU+p1qhrIAuWyZWwGOnGqhC2F5FcaV1vY3JnVLw0JUhhvMG10kFg/Cl7EjdKmjEzUIFG7RxRf9qu80CflXUHPqG24zlOmZ1SLAiLARoKCiO4O+Ks1fvMraLdIuTOFo2fV0rI3DVp54V4VYyAeG4IpzN2Nawf0uSTYuJztCgAOi/OiwwIK0415paJYEWvua7EdflBflYxwXsU3aufHhoSvg+zUpsWyXbva8JLEEAWOE0/g8W6p0jxVGnSqK6aff/o0xv+7EmoMKpwMUkiZigsc3zSlT9GCcV3YoCOhhV9aB//0H2tOHVA13NgtwCLxC5/QtcGbm5xmbVb0jCFe1NnEvABJqFWrXgDMP4Uqycwllsugo22h/2p1La+gVIpU6J1uiYwhaXFdteBBC4KPB+ODMlMS5/giFM4aGlKNugGFQXALBHrC0pEYwcobyId7iIkz2qMlSQEHQ3KrMwxglaR+eorLlphkDoUHUTs17MwCjfxUVVK/LWcLDEkinZYzoZomsAiLIWBn9NIqExOEO+h3p8lS2aU913Te2j78oWVWMVXsHrM8muUO4XrKOpH1klYsNa6DtV8qFnncYgdWvbHspqBFuBrBbmzFM0h0LtwFAVWKs8QFOIhh59wa2jPoUhd4kWri6X9ykTF+9bhi5t/H2IwWAYxW7lQZGiKiIEYD4gQNOjEDhtDH1wLKZDzXxujcDW7yRLNzHbHTdAw4qkqoTwSRpjODpjHPajwQltC3UBm3bvWzdAJfTV4n2ngJp6PjvBQG6yKle8BVPSNVdiupe30p0en06bZ5JVLJZ6qIrU8X7TOD0II1Wk0KbIdlAm5kZC0dhUmaFiO8ZwnTNXDlEfH0QUo7sYGDwFLieoI8WzKudtgV19/06r0AXvKTWkVujS9fo4Ou6CSNwBegSVL0SCud8l9IQKxJxiLu+osxIjNgnwrEB+YsqoIAnUTKF/MGGm7pesVYjVCoxlN1Hrxm0ms20crYTMvnFoEj7HviEVVBv/MJkd6rJCmLZIRkIOUSFqsOWx1FQzR6OlPn+ddJgaUMTYsqTPIMdrEYVlALSi3ARnC148mxQznvh5lCi76DSjSFula0bRZkFVg21OeKjVIn0SMNFiSnik65NJSFI9gnV/3wSXHx7Q/X2ZPjwY8ayTbLcDwogItAovn6UMMwYgOL23PKDjsej0wUzUBpnYZnzWpK5sgpQYrk3TuT3u5kcTpd/xodoIMQtgGcFRtdIFmC/sNk+MrTORn9QOfpEIG1j83FDCA0HbaMLkD6oj7SF9B11lwZmeMPVnbxdD+qfFUqwcOEGruMIr8ljGwmHyvManW5pGM6oXDY4uWOqQY2Pjet9ZITYPUCyQ00aItUKyGaInR1R2nfgYrrroajNZvLhbZh8bk+ug24tpM8sT4HUQRvZTPgOxV7IZGhB37I25WEfr6o5W33TCLk8bXTE0l25fOQnTWQxT/1gPYn2E742NjKG728ObQPc/jyO6ggijufr3OJKPdyY96yBOvj1L0JyNH0h9Ps4EwlspK5MDRpGuQeVQqjlc7nYmn5s8gmZW12UyyTgvjqLYKMfGJFibhWLQ6se4KCuPf6DsATpwWscZd/WtQxJa/p8e1tj6ZGiGsAkf/4sO7L6o0KziD6hq7UnDMGxiM5K6FcUv50TOrvj7AzBtPVvLC7ID3qEJZiksAwbDtnxFrelQOTTti9pIms0Yp9GSswyWWovaZ0mY6U4+Z8qMzIIzMP7HD8dI5MeZWt2MjuC0vGOHF2FdVtnunzUp2yNl9hMQN4IlopcZ85ajGQLfGd70f1k9+tjObzsIlQAZ3eXALm2hRCWU8IOklXuHn9H1V7N5OyfLUINoFaJcVVZ4l9vZslk1Rz5l291YsQMN/wON+lFW9IOKiAHihUKiA+NwfWwyKkZqX0SdEsMNN5YobC4PLUZt4q8p4H7sCe2/xLz/UlCvq8Q6pmhnyhkNPplGbIlTyvxim2r+7C2p2UwfQacDrB5py4hs944pI9JZLJaMkvOuJrqX6fjTpTZr3GPKeOPVklnshs2YTVazgWwcqySNuxJV5811e/48VSl2z5GoOszMfZZM1SpDdzdxeIPW6AeSZOqBybgcp87VA8pWvQEKoL6SefJIWWOc03IMtRWFrD/apsmHJ8zhk+buRYxxNJXbp+XuhKFyz6ANesrYuWPCKQF05QqKqoc+Q63zUnJcGUXn0TQTdIsaxgeNcnaXTlUnyo2nr1cpHn+HmpFtZr9KcQAXNRcZDa153l5xtMbWgT4VrBxdd5tH0lwh28XpTyTd0iX7m0Seuyr0/seu3i0TXv2wULul9e4E0yjxd3onXEF78MCW/16GOAf0ktLs+breeXumNTc39I5RXOIkye5I9OMQ+1cfvXMNLgPvQF6BG+NcKlSf9Z6c446ic9VR2xCJ24xu19HTaWQKUYcru3ct3eAyp1w0HQGwrdtEkLWruma8jFeg76zOfLM7KK1m9L+V+8ImBVkdEpeJPSkpesM5oVMu95rgaTd/fZGyOqdKlt9aLj6QisJlBMfaKtPPJ2kEPj4qc8JugmUbmLhEGEoBC2rLKTbcdZaBLknptinndQ6Ykjs+TAthdxQzIOXREBpFhoWdBq6DclfdshCsFsmr7P6DRANmvfMc3NNoNvOitAk8tHlSD8Ax4RQPQIZNzGwgYJewQm+asMojHXkKAL6miZtxOX0JDj6afAFBuvbFhwHnjTb0x5w7+o8QDf6e8SyxsKeVmLd3goOyEYrHvcNRaNc3vuYiPF0uwou45qXfCpFqYu5LIaMyEFx0GaMVxmQjyNCmX5NYxXpGbVJajrmZZzEh6UrtN6ORrb8NZIoorT5S3g7yOAJG2xnB7D6BZB4KywaoeSTJcjZKQ+AFbf5/l5d/+d8/vv92+T+Xl0t0efnHy8s/Xf3pz3/weoeWOWZEsdmsDdyoTk9dHOM/761lVz2icdjzPQtHGKcTV/GGcXb4k+z233/9a6cj/qR19B5PK8SZcTEcDyoZS/Mvco3oRbTXT+pF+GYd70roTqbHaBRJCVc68S3OpjHBvXzyTWxCnvfdGvOGve6mvPb2X0H3hlugvvUGbcIPy/JjjQuyzCabZ2LvVF59a/PEf41T9kCf/vqbYD79Cbd2c9TfFui8o6bu3pW5nw18wIvCzA0TD884to6x77+wubqXMb7QF19e1GmWL4GieX6v1w7rLt9YK4yvsDqDcuwrTojnt9PG3nHxvhrys/BbHPlt09XG1xc+RgjjbMlPkZl/OEOk5elfyhghxE7E55Vjv0zaxcgpmvIme7PhmYyDFE8XbRjd2oeVhOEQlydtowEB5hN1g+3d+rwXYS+oXFD1qRQv+LtxFMooLvME71FeF3lWkvIbryvhvxnrSBFybcftywxzaDEx1xcU1n2pwSJ18R4pTCT5rhNB9uZNPE3S50ibRSPT80aNOjLXp/JSq0/faBNa3aNGXC4+f5uqxz/utfubCIvpflhudyCGJ30FT3agalv2YCjgVlmb1HbfQ4lqniFgOj1NjXnUJWt6Uvm1wdtwjkBAQdl9gWHCjtmNHpnT9RuzHTykbaHyok1L3Ae4Akpc1xV5lYbFXu5pDT8GmhUzjz9+zDlaG7l10D+Q/WSvXDPHFN/8Nk9/5eMOccqFSdq+SdLQiD0wHqcf/lmDApEZtVJFtb686q7fkXh7Uw300Km0t2SZ0VdvEbDP2dQjCiOmz5qA03e950ZVC9I3gU0k2/oz1ptjXqf2ckFz0MG15XUdWx9Tv7Q0ypSRjT3YrlOtZHtwAWyGWZVm/uk5isYA71hxjypShFfB9rhdqLEaqMumfRM8ppWui/7z2urKYj6Dxd7RJgaECmkQbYs+No3549N0aDAhO2SFOk1Um9MhOkQ7n/stWUeHAUzhfFSKEpsKJDMK4LdoaIDOol+EouexaUTnJfkUl5X5qYCuI+x6qWq4B6XIyGx+VDvmF+hNfX3f1fowpMFGvzePTj/oGPXc63Tvbuirr7P4a4ouG+C1He6SOZKRZOStyUOaTVnpeUO/d1U1e6B6nnygTpaPV/Bnfwh2rIxbUJ9PvLuCMOmiS2VlDirutIbaNGKRu+ZMQXJYoebdBeHk25jJml/AvEfrvLxOWlO6jzbcB/CmD7DJJZjvg1Sms6R1ws73/RkC9hNvYYtZ3Q97iEJEIjr3tGaKRaRIHRdRD4WkYEss0N0NqGgkpQvWtCCNmgLPWO0Gxjn/VM43Wijjuo6TiK+sEoyIsh2OUzUWYSVUc2Gs+QhPG2Dgd21ppOEGZoDfshm/Csu68p+85XFbxwvOui3Evd2OLy67rYbcNWatwQ56xFvGV/03iwW1pl0qZnRiH+fQ8Rh5qVjAsPrSLv53bEj7hf/5jMhxn6mSX+g7/H6lQ3k2suY59ezjrZhGdKvMZmAOfGxcAmFGCmgN0q52Bk+Sc/N5X+vV1e6BjNjo5RdwydfOD9MUWieINjX6NeyxnzYC84VdSn9aF3zk2ynzqc8JvOr0uocpRemKjw==\",\"dqWHP6Ex/MUV2vrZrSBhPE6zgphxeLgVJGD4agU9kRxrnzB+qVYQ462pci62V8P0OWflyGoduBHQ3OAvgjNfknlk5ww75ypLMu1pNzsD2Bl92oNuHT960FYgNSgN0fD+qPHlH2FrwF0nv4F2wIYhRGvahjEA0ZF7RxuUGERpMSl/7ezlvHJ2EFFdOE2i5NkoG8aynk006hEoa4SrGmifgXG7iI4id08Wll0/WUKd8mlwT4xTiWqyKGdU4E21/Pb7I9FQjUPK4aYd/MinuJUQphxwSDaVmgylbLgDsqHYxPzQZOD3hCZc7HMKjje5RUloUY5fkz2SnwdGbbD2GfNbOAV1p3we593/SKXleI6DMlvqBBvuC8yaeFF5D8rZpLZ8v7eUheajIEO/oTA1UeHgoN9MgRSb6Er6HZiu0LNFys3GfTVYvxw59RSw3Rw3WRIxHvIfx9VFIrs1h5gU4+a8zZYKPGyf0+5ZHrLbDTuc4t9DrTB9Xd8EZl2KE+wUaS1Rh+6egw5tggZO+ViZY69NQT1khS3Bah3JM+6mGd1mmdYANU1VKz8BHwrgSTOMRelNjYm7l3Se7df8nEnYF4xfhwdE4VUOt2ZQl3JVSvopg538xCbLdbreM/5RiMBWKVffUQmZy1CDHrBmqoqcTaZ23GmqbuTZBxbUQQblrrqsF6nPI/amFNh5bJ8GTHU0D7drFMYZaN2Mj0i9wMzM0eGxOVMyFTady8B5cSZM50GJIWmXLrJ87uaMipjY6oenSw24YzcgDDHz4ZQtXV1B8kyaJ4/0/Pt8ZyrPIRnKC/nPdPp5Ni3k5M/+5ZmUTFnTHZCOVVrMpK9vsjxBpuzwRKbhWvrRuPGgLFkwy18BwznCIm/PEKvdo3Vk2DMiLdLGYhsS8UuJp+42cZT/lIXNlT17/TZOfykSV/05f2B9bVNqi4DeH7WVZ3EUOrrkoFXcdesoP45wDnzibHLebDDW6rfxlprSJ0BEd5tcuDux/B6eaUT7KVdKwvhrrYM/eFmtyxC6xA72xOgNcxADYn8V77Vy5Uy27CpCdIdLFBaEOZQ0DOh3IC/kMIN27l6434GQW73ICxXkW9FqGGTvmtYTgavj9kynY12vkajq/+yaf/3Vkcy1H/b9u5rLs+fhPxa4mWBc9USq9Be83Gc5FSmrM4lVlp4wLqMgb5Psmn59gkoNtAlWNKueEoztUdDz6AjRCsRpcKlMU5FP1dFv+BbzKqaG0jcER/q4+mDbIstu94h8orHpdixezIeQX500QPubPhQrtI7wSx650HvP/70yh+pF7V2zr1nG5f+MHpV+1GDcYuCUfZUDDRz8lCRkfpA9BP5u2CLNc3FCjN7GUXEa3mRFoJ0TqlFVIQcUIvj1lguiESCVrbpahy6H9kV2oUpouaZbqBzA2OS2S6MNUEZpReSY1U1B4I/v4dddBjCLSy46LUtCjywcQlNlhX1B7h/m5nWTK4VU8xGQUzA7qyAOtvoXgjYcuhZO0rtg16G1UsNN3L7hTOS7OOoK/sq7VeljOywUh4+ukNlOSvl12omEHSj3PmIK3bz4bsGmtOho7zoNJtz0/de/PBetcnmmFZqDUZ+GjCrNLJbL1cP/A/+CZaVspgAA\"]" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 16:59:04 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Accept-Encoding, Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-encoding", + "value": "gzip" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 685, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T16:59:04.280Z", + "time": 44, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 44 + } + }, + { + "_id": "f290f9b5fc4c3f78c01d5c74c585f010", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 42604, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-33" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-0e96d5e7-cfeb-4cba-baee-0431f5b05225" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "42604" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 412, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"managed\",\"objects\":[{\"lastSync\":{\"effectiveAssignmentsProperty\":\"effectiveAssignments\",\"lastSyncProperty\":\"lastSync\"},\"meta\":{\"property\":\"_meta\",\"resourceCollection\":\"internal/usermeta\",\"trackedProperties\":[\"createDate\",\"lastChanged\"]},\"name\":\"user\",\"notifications\":{},\"schema\":{\"$schema\":\"http://json-schema.org/draft-03/schema\",\"icon\":\"fa-user\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User\",\"mat-icon\":\"people\",\"order\":[\"_id\",\"userName\",\"password\",\"givenName\",\"cn\",\"sn\",\"mail\",\"profileImage\",\"description\",\"accountStatus\",\"telephoneNumber\",\"postalAddress\",\"city\",\"postalCode\",\"country\",\"stateProvince\",\"assignedDashboard\",\"roles\",\"assignments\",\"groups\",\"applications\",\"manager\",\"authzRoles\",\"reports\",\"effectiveRoles\",\"effectiveAssignments\",\"effectiveGroups\",\"effectiveApplications\",\"lastSync\",\"kbaInfo\",\"preferences\",\"consentedMappings\",\"ownerOfOrg\",\"adminOfOrg\",\"memberOfOrg\",\"memberOfOrgIDs\",\"activeDate\",\"inactiveDate\",\"ownerOfApp\",\"passwordLastChangedTime\",\"passwordExpirationTime\",\"devicePrintProfiles\",\"deviceProfiles\",\"oathDeviceProfiles\",\"pushDeviceProfiles\",\"webauthnDeviceProfiles\"],\"properties\":{\"_id\":{\"description\":\"User ID\",\"isPersonal\":false,\"policies\":[{\"params\":{\"forbiddenChars\":[\"/\"]},\"policyId\":\"cannot-contain-characters\"}],\"searchable\":false,\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"accountStatus\":{\"default\":\"active\",\"description\":\"Status\",\"isPersonal\":false,\"searchable\":false,\"title\":\"Status\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"activeDate\":{\"description\":\"Active Date\",\"format\":\"datetime\",\"isPersonal\":false,\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Active Date\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"adminOfOrg\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"admins\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations I Administer\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"aliasList\":{\"description\":\"List of identity aliases used primarily to record social IdP subjects for this user\",\"isVirtual\":false,\"items\":{\"title\":\"User Alias Names Items\",\"type\":\"string\"},\"returnByDefault\":false,\"searchable\":false,\"title\":\"User Alias Names List\",\"type\":\"array\",\"userEditable\":true,\"viewable\":false},\"applications\":{\"description\":\"Applications\",\"isPersonal\":false,\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Application Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Applications\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"assignedDashboard\":{\"description\":\"List of items to click on for this user\",\"isVirtual\":true,\"items\":{\"title\":\"Assigned Dashboard Items\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"name\"],\"referencedRelationshipFields\":[[\"roles\",\"applications\"],[\"applications\"]]},\"searchable\":false,\"title\":\"Assigned Dashboard\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"assignments\":{\"description\":\"Assignments\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Provisioning Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Assignment\",\"path\":\"managed/assignment\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Assignments Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Assignments\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"authzRoles\":{\"description\":\"Authorization Roles\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Authorization Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Internal Role\",\"path\":\"internal/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"authzMembers\",\"reverseRelationship\":true,\"title\":\"Authorization Roles Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Authorization Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"city\":{\"description\":\"City\",\"isPersonal\":false,\"title\":\"City\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"cn\":{\"default\":\"{{givenName}} {{sn}}\",\"description\":\"Common Name\",\"isPersonal\":true,\"scope\":\"private\",\"searchable\":false,\"title\":\"Common Name\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"consentedMappings\":{\"description\":\"Consented Mappings\",\"isPersonal\":false,\"isVirtual\":false,\"items\":{\"items\":{\"order\":[\"mapping\",\"consentDate\"],\"properties\":{\"consentDate\":{\"description\":\"Consent Date\",\"format\":\"datetime\",\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Consent Date\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"mapping\":{\"description\":\"Mapping\",\"searchable\":false,\"title\":\"Mapping\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"mapping\",\"consentDate\"],\"title\":\"Consented Mappings Item\",\"type\":\"object\"},\"title\":\"Consented Mappings Items\",\"type\":\"array\"},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Consented Mappings\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"country\":{\"description\":\"Country\",\"isPersonal\":false,\"title\":\"Country\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"description\":{\"description\":\"Description\",\"isPersonal\":false,\"searchable\":false,\"title\":\"Description\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"devicePrintProfiles\":{\"description\":\"Device Print Profiles Information\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Device Print Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"deviceProfiles\":{\"description\":\"Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"effectiveApplications\":{\"description\":\"Effective Applications\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Application Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedObjectFields\":[\"name\"],\"referencedRelationshipFields\":[[\"roles\",\"applications\"],[\"applications\"]]},\"returnByDefault\":true,\"title\":\"Effective Applications\",\"type\":\"array\",\"viewable\":false},\"effectiveAssignments\":{\"description\":\"Effective Assignments\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Assignments Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedObjectFields\":[\"*\"],\"referencedRelationshipFields\":[[\"roles\",\"assignments\"],[\"assignments\"]]},\"returnByDefault\":true,\"title\":\"Effective Assignments\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"effectiveGroups\":{\"description\":\"Effective Groups\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Groups Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedRelationshipFields\":[\"groups\"]},\"returnByDefault\":true,\"title\":\"Effective Groups\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"effectiveRoles\":{\"description\":\"Effective Roles\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Roles Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedRelationshipFields\":[\"roles\"]},\"returnByDefault\":true,\"title\":\"Effective Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"givenName\":{\"description\":\"First Name\",\"isPersonal\":true,\"searchable\":true,\"title\":\"First Name\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"groups\":{\"description\":\"Groups\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:groups\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:groups:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Groups Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Group\",\"path\":\"managed/group\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Groups Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":false,\"returnByDefault\":false,\"title\":\"Group\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"inactiveDate\":{\"description\":\"Inactive Date\",\"format\":\"datetime\",\"isPersonal\":false,\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Inactive Date\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"kbaInfo\":{\"description\":\"KBA Info\",\"isPersonal\":true,\"items\":{\"order\":[\"answer\",\"customQuestion\",\"questionId\"],\"properties\":{\"answer\":{\"description\":\"Answer\",\"type\":\"string\"},\"customQuestion\":{\"description\":\"Custom question\",\"type\":\"string\"},\"questionId\":{\"description\":\"Question ID\",\"type\":\"string\"}},\"required\":[],\"title\":\"KBA Info Items\",\"type\":\"object\"},\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"lastSync\":{\"description\":\"Last Sync timestamp\",\"isPersonal\":false,\"order\":[\"effectiveAssignments\",\"timestamp\"],\"properties\":{\"effectiveAssignments\":{\"description\":\"Effective Assignments\",\"items\":{\"title\":\"Effective Assignments Items\",\"type\":\"object\"},\"title\":\"Effective Assignments\",\"type\":\"array\"},\"timestamp\":{\"description\":\"Timestamp\",\"format\":\"datetime\",\"policies\":[{\"policyId\":\"valid-datetime\"}],\"type\":\"string\"}},\"required\":[],\"scope\":\"private\",\"searchable\":false,\"title\":\"Last Sync timestamp\",\"type\":\"object\",\"usageDescription\":\"\",\"viewable\":false},\"mail\":{\"description\":\"Email Address\",\"isPersonal\":true,\"policies\":[{\"policyId\":\"valid-email-address-format\"}],\"searchable\":true,\"title\":\"Email Address\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"manager\":{\"description\":\"Manager\",\"isPersonal\":false,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Manager _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"reports\",\"reverseRelationship\":true,\"searchable\":false,\"title\":\"Manager\",\"type\":\"relationship\",\"usageDescription\":\"\",\"userEditable\":false,\"validate\":true,\"viewable\":true},\"memberOfOrg\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":false,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations to which I Belong\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"memberOfOrgIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"org identifiers\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\",\"parentIDs\"],\"referencedRelationshipFields\":[\"memberOfOrg\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"MemberOfOrgIDs\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"oathDeviceProfiles\":{\"description\":\"Oath Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Oath Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"ownerOfApp\":{\"items\":{\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"owners\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Applications I Own\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"ownerOfOrg\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"owners\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations I Own\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"password\":{\"description\":\"Password\",\"isPersonal\":false,\"isProtected\":true,\"policies\":[{\"params\":{\"minLength\":8},\"policyId\":\"minimum-length\"},{\"params\":{\"numCaps\":1},\"policyId\":\"at-least-X-capitals\"},{\"params\":{\"numNums\":1},\"policyId\":\"at-least-X-numbers\"},{\"params\":{\"disallowedFields\":[\"userName\",\"givenName\",\"sn\"]},\"policyId\":\"cannot-contain-others\"}],\"scope\":\"private\",\"searchable\":false,\"title\":\"Password\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"passwordExpirationTime\":{\"description\":\"Password Expiration Time\",\"searchable\":true,\"title\":\"Password Expiration Time\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"passwordLastChangedTime\":{\"description\":\"Password Last Changed Time\",\"searchable\":true,\"title\":\"Password Last Changed Time\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"postalAddress\":{\"description\":\"Address 1\",\"isPersonal\":true,\"title\":\"Address 1\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"postalCode\":{\"description\":\"Postal Code\",\"isPersonal\":false,\"title\":\"Postal Code\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"preferences\":{\"description\":\"Preferences\",\"isPersonal\":false,\"order\":[\"updates\",\"marketing\"],\"properties\":{\"marketing\":{\"description\":\"Send me special offers and services\",\"type\":\"boolean\"},\"updates\":{\"description\":\"Send me news and updates\",\"type\":\"boolean\"}},\"required\":[],\"searchable\":false,\"title\":\"Preferences\",\"type\":\"object\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"profileImage\":{\"description\":\"Profile Image\",\"isPersonal\":true,\"searchable\":false,\"title\":\"Profile Image\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"pushDeviceProfiles\":{\"description\":\"Push Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Push Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"reports\":{\"description\":\"Direct Reports\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:reports:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Direct Reports Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"manager\",\"reverseRelationship\":true,\"title\":\"Direct Reports Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Direct Reports\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"roles\":{\"description\":\"Provisioning Roles\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:roles\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:roles:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Provisioning Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Role\",\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Provisioning Roles Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Provisioning Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"sn\":{\"description\":\"Last Name\",\"isPersonal\":true,\"searchable\":true,\"title\":\"Last Name\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"stateProvince\":{\"description\":\"State/Province\",\"isPersonal\":false,\"title\":\"State/Province\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"telephoneNumber\":{\"description\":\"Telephone Number\",\"isPersonal\":true,\"pattern\":\"^\\\\+?([0-9\\\\- \\\\(\\\\)])*$\",\"searchable\":true,\"title\":\"Telephone Number\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"userName\":{\"description\":\"Username\",\"isPersonal\":true,\"policies\":[{\"policyId\":\"valid-username\"},{\"params\":{\"forbiddenChars\":[\"/\"]},\"policyId\":\"cannot-contain-characters\"},{\"params\":{\"minLength\":1},\"policyId\":\"minimum-length\"},{\"params\":{\"maxLength\":255},\"policyId\":\"maximum-length\"}],\"searchable\":true,\"title\":\"Username\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"webauthnDeviceProfiles\":{\"description\":\"Web AuthN Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Web AuthN Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"userName\",\"givenName\",\"sn\",\"mail\"],\"title\":\"User\",\"type\":\"object\",\"viewable\":true}},{\"name\":\"role\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"\",\"icon\":\"fa-check-square-o\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role\",\"mat-icon\":\"assignment_ind\",\"order\":[\"_id\",\"name\",\"description\",\"members\",\"assignments\",\"applications\",\"condition\",\"temporalConstraints\"],\"properties\":{\"_id\":{\"description\":\"Role ID\",\"searchable\":false,\"title\":\"Name\",\"type\":\"string\",\"viewable\":false},\"applications\":{\"description\":\"Role Applications\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Role Application Items\",\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"members\"],\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Applications\",\"type\":\"array\",\"viewable\":false},\"assignments\":{\"description\":\"Managed Assignments\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role:assignments:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Managed Assignments Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Assignment\",\"path\":\"managed/assignment\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Managed Assignments Items\",\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"members\"],\"returnByDefault\":false,\"title\":\"Managed Assignments\",\"type\":\"array\",\"viewable\":true},\"condition\":{\"description\":\"A conditional filter for this role\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"The role description, used for display purposes.\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"members\":{\"description\":\"Role Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Role Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Role Members Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Role Members\",\"type\":\"array\",\"viewable\":true},\"name\":{\"description\":\"The role name, used for display purposes.\",\"policies\":[{\"policyId\":\"unique\"}],\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true},\"temporalConstraints\":{\"description\":\"An array of temporal constraints for a role\",\"isTemporalConstraint\":true,\"items\":{\"order\":[\"duration\"],\"properties\":{\"duration\":{\"description\":\"Duration\",\"type\":\"string\"}},\"required\":[\"duration\"],\"title\":\"Temporal Constraints Items\",\"type\":\"object\"},\"notifyRelationships\":[\"members\"],\"returnByDefault\":true,\"title\":\"Temporal Constraints\",\"type\":\"array\",\"viewable\":false}},\"required\":[\"name\"],\"title\":\"Role\",\"type\":\"object\"}},{\"attributeEncryption\":{},\"name\":\"assignment\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"A role assignment\",\"icon\":\"fa-key\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment\",\"mat-icon\":\"vpn_key\",\"order\":[\"_id\",\"name\",\"description\",\"type\",\"mapping\",\"attributes\",\"linkQualifiers\",\"roles\",\"members\",\"condition\",\"weight\"],\"properties\":{\"_id\":{\"description\":\"The assignment ID\",\"searchable\":false,\"title\":\"Name\",\"type\":\"string\",\"viewable\":false},\"attributes\":{\"description\":\"The attributes operated on by this assignment.\",\"items\":{\"order\":[\"assignmentOperation\",\"unassignmentOperation\",\"name\",\"value\"],\"properties\":{\"assignmentOperation\":{\"description\":\"Assignment operation\",\"type\":\"string\"},\"name\":{\"description\":\"Name\",\"type\":\"string\"},\"unassignmentOperation\":{\"description\":\"Unassignment operation\",\"type\":\"string\"},\"value\":{\"description\":\"Value\",\"type\":\"string\"}},\"required\":[],\"title\":\"Assignment Attributes Items\",\"type\":\"object\"},\"notifyRelationships\":[\"roles\",\"members\"],\"title\":\"Assignment Attributes\",\"type\":\"array\",\"viewable\":true},\"condition\":{\"description\":\"A conditional filter for this assignment\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"The assignment description, used for display purposes.\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"linkQualifiers\":{\"description\":\"Conditional link qualifiers to restrict this assignment to.\",\"items\":{\"title\":\"Link Qualifiers Items\",\"type\":\"string\"},\"title\":\"Link Qualifiers\",\"type\":\"array\",\"viewable\":true},\"mapping\":{\"description\":\"The name of the mapping this assignment applies to\",\"policies\":[{\"policyId\":\"mapping-exists\"}],\"searchable\":true,\"title\":\"Mapping\",\"type\":\"string\",\"viewable\":true},\"members\":{\"description\":\"Assignment Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Assignment Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"assignments\",\"reverseRelationship\":true,\"title\":\"Assignment Members Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Assignment Members\",\"type\":\"array\",\"viewable\":true},\"name\":{\"description\":\"The assignment name, used for display purposes.\",\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true},\"roles\":{\"description\":\"Managed Roles\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:roles:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Managed Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Role\",\"notify\":true,\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"assignments\",\"reverseRelationship\":true,\"title\":\"Managed Roles Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Managed Roles\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"type\":{\"description\":\"The type of object this assignment represents\",\"title\":\"Type\",\"type\":\"string\",\"viewable\":true},\"weight\":{\"description\":\"The weight of the assignment.\",\"notifyRelationships\":[\"roles\",\"members\"],\"searchable\":false,\"title\":\"Weight\",\"type\":[\"number\",\"null\"],\"viewable\":true}},\"required\":[\"name\",\"description\",\"mapping\"],\"title\":\"Assignment\",\"type\":\"object\"}},{\"name\":\"organization\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"An organization or tenant, whose resources are managed by organizational admins.\",\"icon\":\"fa-building\",\"mat-icon\":\"domain\",\"order\":[\"name\",\"description\",\"owners\",\"admins\",\"members\",\"parent\",\"children\",\"adminIDs\",\"ownerIDs\",\"parentAdminIDs\",\"parentOwnerIDs\",\"parentIDs\"],\"properties\":{\"adminIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"admin ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\"],\"referencedRelationshipFields\":[\"admins\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"Admin user ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"admins\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":false,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"adminOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"children\"],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Administrators\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"children\":{\"description\":\"Child Organizations\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\",\"description\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"parent\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Child Organizations\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"description\":{\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"members\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"memberOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"ownerIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"owner ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\"],\"referencedRelationshipFields\":[\"owners\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"Owner user ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"owners\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":false,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"ownerOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"children\"],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Owner\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"parent\":{\"description\":\"Parent Organization\",\"notifyRelationships\":[\"children\",\"members\"],\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\",\"description\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"returnByDefault\":false,\"reversePropertyName\":\"children\",\"reverseRelationship\":true,\"searchable\":false,\"title\":\"Parent Organization\",\"type\":\"relationship\",\"userEditable\":false,\"validate\":true,\"viewable\":true},\"parentAdminIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"user ids of parent admins\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"adminIDs\",\"parentAdminIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"user ids of parent admins\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"parentIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"parent org ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\",\"parentIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"parent org ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"parentOwnerIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"user ids of parent owners\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"ownerIDs\",\"parentOwnerIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"user ids of parent owners\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false}},\"required\":[\"name\"],\"title\":\"Organization\",\"type\":\"object\"}},{\"name\":\"group\",\"schema\":{\"$schema\":\"http://json-schema.org/draft-03/schema\",\"icon\":\"fa-group\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Group\",\"mat-icon\":\"group\",\"order\":[\"_id\",\"name\",\"description\",\"condition\",\"members\"],\"properties\":{\"_id\":{\"description\":\"Group ID\",\"isPersonal\":false,\"searchable\":false,\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"condition\":{\"description\":\"A filter for conditionally assigned members\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"Group Description\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"members\":{\"description\":\"Group Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Group:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Group Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"groups\",\"reverseRelationship\":true,\"title\":\"Group Members Items\",\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"description\":\"Group Name\",\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true}},\"required\":[\"name\"],\"title\":\"Group\",\"viewable\":true}},{\"name\":\"application\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"icon\":\"fa-folder\",\"order\":[\"name\",\"description\",\"url\",\"icon\",\"mappingNames\",\"owners\",\"roles\",\"members\"],\"properties\":{\"_id\":{\"description\":\"Application ID\",\"isPersonal\":false,\"searchable\":false,\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"authoritative\":{\"description\":\"Is this an authoritative application\",\"searchable\":false,\"title\":\"Authoritative\",\"type\":\"boolean\",\"viewable\":false},\"connectorId\":{\"description\":\"Id of the connector associated with the application\",\"searchable\":false,\"title\":\"Connector ID\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"description\":{\"description\":\"Application Description\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"icon\":{\"searchable\":true,\"title\":\"Icon\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"mappingNames\":{\"description\":\"Names of the sync mappings used by an application with provisioning configured.\",\"items\":{\"title\":\"Mapping Name Items\",\"type\":\"string\"},\"searchable\":true,\"title\":\"Sync Mapping Names\",\"type\":\"array\",\"viewable\":true},\"members\":{\"description\":\"Members directly granted an application\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Application:members:items\",\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Application Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"applications\",\"reverseRelationship\":true,\"title\":\"Application Members Items\",\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"description\":\"Application name\",\"notifyRelationships\":[\"roles\",\"members\"],\"policies\":[{\"policyId\":\"unique\"}],\"returnByDefault\":true,\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"owners\":{\"description\":\"Application Owners\",\"items\":{\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"ownerOfApp\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Owners\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"roles\":{\"description\":\"Roles granting users the application\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Role\",\"notify\":true,\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"applications\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Roles\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"ssoEntities\":{\"description\":\"SSO Entity Id\",\"properties\":{\"domain\":{\"type\":\"string\"},\"federatedDomain\":{\"type\":\"string\"},\"idpLocation\":{\"type\":\"string\"},\"idpLoginUrl\":{\"type\":\"string\"},\"idpPrivateId\":{\"type\":\"string\"},\"key\":{\"type\":\"string\"},\"oidcId\":{\"type\":\"string\"},\"pfApcId\":{\"type\":\"string\"},\"pfIdpAdapterId\":{\"type\":\"string\"},\"pfPolicyId\":{\"type\":\"string\"},\"pfSigningCertId\":{\"type\":\"string\"},\"pfSpConnectionId\":{\"type\":\"string\"},\"spLocation\":{\"type\":\"string\"},\"spPrivate\":{\"type\":\"string\"},\"spPrivateId\":{\"type\":\"string\"}},\"searchable\":false,\"title\":\"SSO Entity Id\",\"type\":\"object\",\"userEditable\":false,\"viewable\":false},\"templateName\":{\"description\":\"Name of the template the application was created from\",\"searchable\":false,\"title\":\"Template Name\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"templateVersion\":{\"description\":\"The template version\",\"searchable\":false,\"title\":\"Template Version\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"uiConfig\":{\"description\":\"UI Config\",\"isPersonal\":false,\"properties\":{},\"searchable\":false,\"title\":\"UI Config\",\"type\":\"object\",\"usageDescription\":\"\",\"viewable\":false},\"url\":{\"searchable\":true,\"title\":\"Url\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"name\"],\"title\":\"Application\",\"type\":\"object\"}},{\"name\":\"testObject\",\"onCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// test script\\n\"},\"onRead\":{\"globals\":{},\"source\":\"//groovy export\",\"type\":\"groovy\"},\"onSync\":{\"globals\":{\"test\":8},\"source\":\"//test\",\"type\":\"groovy\"},\"onUpdate\":{\"globals\":{\"test\":[\"test\"]},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"onValidate\":{\"globals\":{\"test\":\"test\"},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"postCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// another test\\n\"},\"postDelete\":{\"globals\":{\"test\":\"test\"},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"postUpdate\":{\"globals\":{\"test\":1},\"source\":\"//test\",\"type\":\"groovy\"},\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"test\",\"icon\":\"fa-anchor\",\"mat-icon\":\"\",\"order\":[\"testObj\",\"testString\"],\"properties\":{\"testObj\":{\"description\":null,\"isVirtual\":false,\"nullable\":false,\"onRetrieve\":{\"globals\":{\"four\":false,\"one\":null,\"three\":3,\"two\":\"number\"},\"source\":\"//second\",\"type\":\"groovy\"},\"onStore\":{\"globals\":{\"test\":{}},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"onValidate\":{\"globals\":{\"test\":null},\"source\":\"//groovy script test\",\"type\":\"groovy\"},\"order\":[\"testObject\",\"testString\"],\"properties\":{\"testObject\":{\"description\":null,\"isVirtual\":false,\"onRetrieve\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"text/javascript\"},\"onStore\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"groovy\"},\"order\":[],\"properties\":{},\"required\":[],\"searchable\":false,\"title\":\"test\",\"type\":\"object\",\"userEditable\":true,\"viewable\":true},\"testString\":{\"description\":null,\"format\":null,\"isVirtual\":false,\"onRetrieve\":{\"globals\":{\"test\":1},\"source\":\"//test\",\"type\":\"groovy\"},\"onStore\":{\"globals\":{\"test\":[\"test\",1,false]},\"source\":\"//test\",\"type\":\"text/javascript\"},\"searchable\":false,\"title\":\"test\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[],\"searchable\":false,\"title\":\"TestObj\",\"type\":\"object\",\"userEditable\":true,\"viewable\":true},\"testString\":{\"description\":null,\"format\":null,\"isVirtual\":false,\"onStore\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"groovy\"},\"searchable\":false,\"title\":\"test\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[],\"title\":\"Test\",\"type\":\"object\"}}]}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/config/managed" + }, + "response": { + "bodySize": 42604, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 42604, + "text": "{\"_id\":\"managed\",\"objects\":[{\"lastSync\":{\"effectiveAssignmentsProperty\":\"effectiveAssignments\",\"lastSyncProperty\":\"lastSync\"},\"meta\":{\"property\":\"_meta\",\"resourceCollection\":\"internal/usermeta\",\"trackedProperties\":[\"createDate\",\"lastChanged\"]},\"name\":\"user\",\"notifications\":{},\"schema\":{\"$schema\":\"http://json-schema.org/draft-03/schema\",\"icon\":\"fa-user\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User\",\"mat-icon\":\"people\",\"order\":[\"_id\",\"userName\",\"password\",\"givenName\",\"cn\",\"sn\",\"mail\",\"profileImage\",\"description\",\"accountStatus\",\"telephoneNumber\",\"postalAddress\",\"city\",\"postalCode\",\"country\",\"stateProvince\",\"assignedDashboard\",\"roles\",\"assignments\",\"groups\",\"applications\",\"manager\",\"authzRoles\",\"reports\",\"effectiveRoles\",\"effectiveAssignments\",\"effectiveGroups\",\"effectiveApplications\",\"lastSync\",\"kbaInfo\",\"preferences\",\"consentedMappings\",\"ownerOfOrg\",\"adminOfOrg\",\"memberOfOrg\",\"memberOfOrgIDs\",\"activeDate\",\"inactiveDate\",\"ownerOfApp\",\"passwordLastChangedTime\",\"passwordExpirationTime\",\"devicePrintProfiles\",\"deviceProfiles\",\"oathDeviceProfiles\",\"pushDeviceProfiles\",\"webauthnDeviceProfiles\"],\"properties\":{\"_id\":{\"description\":\"User ID\",\"isPersonal\":false,\"policies\":[{\"params\":{\"forbiddenChars\":[\"/\"]},\"policyId\":\"cannot-contain-characters\"}],\"searchable\":false,\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"accountStatus\":{\"default\":\"active\",\"description\":\"Status\",\"isPersonal\":false,\"searchable\":false,\"title\":\"Status\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"activeDate\":{\"description\":\"Active Date\",\"format\":\"datetime\",\"isPersonal\":false,\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Active Date\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"adminOfOrg\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"admins\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations I Administer\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"aliasList\":{\"description\":\"List of identity aliases used primarily to record social IdP subjects for this user\",\"isVirtual\":false,\"items\":{\"title\":\"User Alias Names Items\",\"type\":\"string\"},\"returnByDefault\":false,\"searchable\":false,\"title\":\"User Alias Names List\",\"type\":\"array\",\"userEditable\":true,\"viewable\":false},\"applications\":{\"description\":\"Applications\",\"isPersonal\":false,\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Application Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Applications\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"assignedDashboard\":{\"description\":\"List of items to click on for this user\",\"isVirtual\":true,\"items\":{\"title\":\"Assigned Dashboard Items\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"name\"],\"referencedRelationshipFields\":[[\"roles\",\"applications\"],[\"applications\"]]},\"searchable\":false,\"title\":\"Assigned Dashboard\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"assignments\":{\"description\":\"Assignments\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:assignments:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Provisioning Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Assignment\",\"path\":\"managed/assignment\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Assignments Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Assignments\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"authzRoles\":{\"description\":\"Authorization Roles\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:authzRoles:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Authorization Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Internal Role\",\"path\":\"internal/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"authzMembers\",\"reverseRelationship\":true,\"title\":\"Authorization Roles Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Authorization Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"city\":{\"description\":\"City\",\"isPersonal\":false,\"title\":\"City\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"cn\":{\"default\":\"{{givenName}} {{sn}}\",\"description\":\"Common Name\",\"isPersonal\":true,\"scope\":\"private\",\"searchable\":false,\"title\":\"Common Name\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"consentedMappings\":{\"description\":\"Consented Mappings\",\"isPersonal\":false,\"isVirtual\":false,\"items\":{\"items\":{\"order\":[\"mapping\",\"consentDate\"],\"properties\":{\"consentDate\":{\"description\":\"Consent Date\",\"format\":\"datetime\",\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Consent Date\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"mapping\":{\"description\":\"Mapping\",\"searchable\":false,\"title\":\"Mapping\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"mapping\",\"consentDate\"],\"title\":\"Consented Mappings Item\",\"type\":\"object\"},\"title\":\"Consented Mappings Items\",\"type\":\"array\"},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Consented Mappings\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"country\":{\"description\":\"Country\",\"isPersonal\":false,\"title\":\"Country\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"description\":{\"description\":\"Description\",\"isPersonal\":false,\"searchable\":false,\"title\":\"Description\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"devicePrintProfiles\":{\"description\":\"Device Print Profiles Information\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Device Print Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"deviceProfiles\":{\"description\":\"Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"effectiveApplications\":{\"description\":\"Effective Applications\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Application Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedObjectFields\":[\"name\"],\"referencedRelationshipFields\":[[\"roles\",\"applications\"],[\"applications\"]]},\"returnByDefault\":true,\"title\":\"Effective Applications\",\"type\":\"array\",\"viewable\":false},\"effectiveAssignments\":{\"description\":\"Effective Assignments\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Assignments Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedObjectFields\":[\"*\"],\"referencedRelationshipFields\":[[\"roles\",\"assignments\"],[\"assignments\"]]},\"returnByDefault\":true,\"title\":\"Effective Assignments\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"effectiveGroups\":{\"description\":\"Effective Groups\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Groups Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedRelationshipFields\":[\"groups\"]},\"returnByDefault\":true,\"title\":\"Effective Groups\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"effectiveRoles\":{\"description\":\"Effective Roles\",\"isPersonal\":false,\"isVirtual\":true,\"items\":{\"title\":\"Effective Roles Items\",\"type\":\"object\"},\"queryConfig\":{\"referencedRelationshipFields\":[\"roles\"]},\"returnByDefault\":true,\"title\":\"Effective Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"viewable\":false},\"givenName\":{\"description\":\"First Name\",\"isPersonal\":true,\"searchable\":true,\"title\":\"First Name\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"groups\":{\"description\":\"Groups\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:groups\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:groups:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Groups Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Group\",\"path\":\"managed/group\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Groups Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":false,\"returnByDefault\":false,\"title\":\"Group\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"inactiveDate\":{\"description\":\"Inactive Date\",\"format\":\"datetime\",\"isPersonal\":false,\"policies\":[{\"policyId\":\"valid-datetime\"}],\"searchable\":false,\"title\":\"Inactive Date\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"kbaInfo\":{\"description\":\"KBA Info\",\"isPersonal\":true,\"items\":{\"order\":[\"answer\",\"customQuestion\",\"questionId\"],\"properties\":{\"answer\":{\"description\":\"Answer\",\"type\":\"string\"},\"customQuestion\":{\"description\":\"Custom question\",\"type\":\"string\"},\"questionId\":{\"description\":\"Question ID\",\"type\":\"string\"}},\"required\":[],\"title\":\"KBA Info Items\",\"type\":\"object\"},\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"lastSync\":{\"description\":\"Last Sync timestamp\",\"isPersonal\":false,\"order\":[\"effectiveAssignments\",\"timestamp\"],\"properties\":{\"effectiveAssignments\":{\"description\":\"Effective Assignments\",\"items\":{\"title\":\"Effective Assignments Items\",\"type\":\"object\"},\"title\":\"Effective Assignments\",\"type\":\"array\"},\"timestamp\":{\"description\":\"Timestamp\",\"format\":\"datetime\",\"policies\":[{\"policyId\":\"valid-datetime\"}],\"type\":\"string\"}},\"required\":[],\"scope\":\"private\",\"searchable\":false,\"title\":\"Last Sync timestamp\",\"type\":\"object\",\"usageDescription\":\"\",\"viewable\":false},\"mail\":{\"description\":\"Email Address\",\"isPersonal\":true,\"policies\":[{\"policyId\":\"valid-email-address-format\"}],\"searchable\":true,\"title\":\"Email Address\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"manager\":{\"description\":\"Manager\",\"isPersonal\":false,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Manager _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"reports\",\"reverseRelationship\":true,\"searchable\":false,\"title\":\"Manager\",\"type\":\"relationship\",\"usageDescription\":\"\",\"userEditable\":false,\"validate\":true,\"viewable\":true},\"memberOfOrg\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":false,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations to which I Belong\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"memberOfOrgIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"org identifiers\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\",\"parentIDs\"],\"referencedRelationshipFields\":[\"memberOfOrg\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"MemberOfOrgIDs\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"oathDeviceProfiles\":{\"description\":\"Oath Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Oath Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"ownerOfApp\":{\"items\":{\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[\"name\"]}}],\"reversePropertyName\":\"owners\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Applications I Own\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"ownerOfOrg\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"owners\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Organizations I Own\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"password\":{\"description\":\"Password\",\"isPersonal\":false,\"isProtected\":true,\"policies\":[{\"params\":{\"minLength\":8},\"policyId\":\"minimum-length\"},{\"params\":{\"numCaps\":1},\"policyId\":\"at-least-X-capitals\"},{\"params\":{\"numNums\":1},\"policyId\":\"at-least-X-numbers\"},{\"params\":{\"disallowedFields\":[\"userName\",\"givenName\",\"sn\"]},\"policyId\":\"cannot-contain-others\"}],\"scope\":\"private\",\"searchable\":false,\"title\":\"Password\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"passwordExpirationTime\":{\"description\":\"Password Expiration Time\",\"searchable\":true,\"title\":\"Password Expiration Time\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"passwordLastChangedTime\":{\"description\":\"Password Last Changed Time\",\"searchable\":true,\"title\":\"Password Last Changed Time\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"postalAddress\":{\"description\":\"Address 1\",\"isPersonal\":true,\"title\":\"Address 1\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"postalCode\":{\"description\":\"Postal Code\",\"isPersonal\":false,\"title\":\"Postal Code\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"preferences\":{\"description\":\"Preferences\",\"isPersonal\":false,\"order\":[\"updates\",\"marketing\"],\"properties\":{\"marketing\":{\"description\":\"Send me special offers and services\",\"type\":\"boolean\"},\"updates\":{\"description\":\"Send me news and updates\",\"type\":\"boolean\"}},\"required\":[],\"searchable\":false,\"title\":\"Preferences\",\"type\":\"object\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"profileImage\":{\"description\":\"Profile Image\",\"isPersonal\":true,\"searchable\":false,\"title\":\"Profile Image\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":false},\"pushDeviceProfiles\":{\"description\":\"Push Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Push Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true},\"reports\":{\"description\":\"Direct Reports\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:reports:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Direct Reports Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"manager\",\"reverseRelationship\":true,\"title\":\"Direct Reports Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Direct Reports\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"roles\":{\"description\":\"Provisioning Roles\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:roles\",\"isPersonal\":false,\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:User:roles:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Provisioning Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociationField\":\"condition\",\"label\":\"Role\",\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"members\",\"reverseRelationship\":true,\"title\":\"Provisioning Roles Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Provisioning Roles\",\"type\":\"array\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":true},\"sn\":{\"description\":\"Last Name\",\"isPersonal\":true,\"searchable\":true,\"title\":\"Last Name\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"stateProvince\":{\"description\":\"State/Province\",\"isPersonal\":false,\"title\":\"State/Province\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"telephoneNumber\":{\"description\":\"Telephone Number\",\"isPersonal\":true,\"pattern\":\"^\\\\+?([0-9\\\\- \\\\(\\\\)])*$\",\"searchable\":true,\"title\":\"Telephone Number\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"userName\":{\"description\":\"Username\",\"isPersonal\":true,\"policies\":[{\"policyId\":\"valid-username\"},{\"params\":{\"forbiddenChars\":[\"/\"]},\"policyId\":\"cannot-contain-characters\"},{\"params\":{\"minLength\":1},\"policyId\":\"minimum-length\"},{\"params\":{\"maxLength\":255},\"policyId\":\"maximum-length\"}],\"searchable\":true,\"title\":\"Username\",\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":true,\"viewable\":true},\"webauthnDeviceProfiles\":{\"description\":\"Web AuthN Device Profiles\",\"isPersonal\":false,\"items\":{\"title\":\"Profile\",\"type\":\"string\"},\"searchable\":false,\"title\":\"Web AuthN Device Profiles\",\"type\":\"array\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"userName\",\"givenName\",\"sn\",\"mail\"],\"title\":\"User\",\"type\":\"object\",\"viewable\":true}},{\"name\":\"role\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"\",\"icon\":\"fa-check-square-o\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role\",\"mat-icon\":\"assignment_ind\",\"order\":[\"_id\",\"name\",\"description\",\"members\",\"assignments\",\"applications\",\"condition\",\"temporalConstraints\"],\"properties\":{\"_id\":{\"description\":\"Role ID\",\"searchable\":false,\"title\":\"Name\",\"type\":\"string\",\"viewable\":false},\"applications\":{\"description\":\"Role Applications\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Application\",\"path\":\"managed/application\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Role Application Items\",\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"members\"],\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Applications\",\"type\":\"array\",\"viewable\":false},\"assignments\":{\"description\":\"Managed Assignments\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role:assignments:items\",\"notifySelf\":true,\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Managed Assignments Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Assignment\",\"path\":\"managed/assignment\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Managed Assignments Items\",\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"members\"],\"returnByDefault\":false,\"title\":\"Managed Assignments\",\"type\":\"array\",\"viewable\":true},\"condition\":{\"description\":\"A conditional filter for this role\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"The role description, used for display purposes.\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"members\":{\"description\":\"Role Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Role:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Role Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"roles\",\"reverseRelationship\":true,\"title\":\"Role Members Items\",\"type\":\"relationship\",\"validate\":true},\"relationshipGrantTemporalConstraintsEnforced\":true,\"returnByDefault\":false,\"title\":\"Role Members\",\"type\":\"array\",\"viewable\":true},\"name\":{\"description\":\"The role name, used for display purposes.\",\"policies\":[{\"policyId\":\"unique\"}],\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true},\"temporalConstraints\":{\"description\":\"An array of temporal constraints for a role\",\"isTemporalConstraint\":true,\"items\":{\"order\":[\"duration\"],\"properties\":{\"duration\":{\"description\":\"Duration\",\"type\":\"string\"}},\"required\":[\"duration\"],\"title\":\"Temporal Constraints Items\",\"type\":\"object\"},\"notifyRelationships\":[\"members\"],\"returnByDefault\":true,\"title\":\"Temporal Constraints\",\"type\":\"array\",\"viewable\":false}},\"required\":[\"name\"],\"title\":\"Role\",\"type\":\"object\"}},{\"attributeEncryption\":{},\"name\":\"assignment\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"A role assignment\",\"icon\":\"fa-key\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment\",\"mat-icon\":\"vpn_key\",\"order\":[\"_id\",\"name\",\"description\",\"type\",\"mapping\",\"attributes\",\"linkQualifiers\",\"roles\",\"members\",\"condition\",\"weight\"],\"properties\":{\"_id\":{\"description\":\"The assignment ID\",\"searchable\":false,\"title\":\"Name\",\"type\":\"string\",\"viewable\":false},\"attributes\":{\"description\":\"The attributes operated on by this assignment.\",\"items\":{\"order\":[\"assignmentOperation\",\"unassignmentOperation\",\"name\",\"value\"],\"properties\":{\"assignmentOperation\":{\"description\":\"Assignment operation\",\"type\":\"string\"},\"name\":{\"description\":\"Name\",\"type\":\"string\"},\"unassignmentOperation\":{\"description\":\"Unassignment operation\",\"type\":\"string\"},\"value\":{\"description\":\"Value\",\"type\":\"string\"}},\"required\":[],\"title\":\"Assignment Attributes Items\",\"type\":\"object\"},\"notifyRelationships\":[\"roles\",\"members\"],\"title\":\"Assignment Attributes\",\"type\":\"array\",\"viewable\":true},\"condition\":{\"description\":\"A conditional filter for this assignment\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"The assignment description, used for display purposes.\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"linkQualifiers\":{\"description\":\"Conditional link qualifiers to restrict this assignment to.\",\"items\":{\"title\":\"Link Qualifiers Items\",\"type\":\"string\"},\"title\":\"Link Qualifiers\",\"type\":\"array\",\"viewable\":true},\"mapping\":{\"description\":\"The name of the mapping this assignment applies to\",\"policies\":[{\"policyId\":\"mapping-exists\"}],\"searchable\":true,\"title\":\"Mapping\",\"type\":\"string\",\"viewable\":true},\"members\":{\"description\":\"Assignment Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Assignment Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"assignments\",\"reverseRelationship\":true,\"title\":\"Assignment Members Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Assignment Members\",\"type\":\"array\",\"viewable\":true},\"name\":{\"description\":\"The assignment name, used for display purposes.\",\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true},\"roles\":{\"description\":\"Managed Roles\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Assignment:roles:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Managed Roles Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Role\",\"notify\":true,\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"assignments\",\"reverseRelationship\":true,\"title\":\"Managed Roles Items\",\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"title\":\"Managed Roles\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"type\":{\"description\":\"The type of object this assignment represents\",\"title\":\"Type\",\"type\":\"string\",\"viewable\":true},\"weight\":{\"description\":\"The weight of the assignment.\",\"notifyRelationships\":[\"roles\",\"members\"],\"searchable\":false,\"title\":\"Weight\",\"type\":[\"number\",\"null\"],\"viewable\":true}},\"required\":[\"name\",\"description\",\"mapping\"],\"title\":\"Assignment\",\"type\":\"object\"}},{\"name\":\"organization\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"An organization or tenant, whose resources are managed by organizational admins.\",\"icon\":\"fa-building\",\"mat-icon\":\"domain\",\"order\":[\"name\",\"description\",\"owners\",\"admins\",\"members\",\"parent\",\"children\",\"adminIDs\",\"ownerIDs\",\"parentAdminIDs\",\"parentOwnerIDs\",\"parentIDs\"],\"properties\":{\"adminIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"admin ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\"],\"referencedRelationshipFields\":[\"admins\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"Admin user ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"admins\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":false,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"adminOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"children\"],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Administrators\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"children\":{\"description\":\"Child Organizations\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\",\"description\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"parent\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Child Organizations\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"description\":{\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"members\":{\"items\":{\"notifySelf\":false,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"memberOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"ownerIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"owner ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\"],\"referencedRelationshipFields\":[\"owners\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"Owner user ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"owners\":{\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":false,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"ownerOfOrg\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"notifyRelationships\":[\"children\"],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Owner\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"parent\":{\"description\":\"Parent Organization\",\"notifyRelationships\":[\"children\",\"members\"],\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Organization\",\"notify\":true,\"path\":\"managed/organization\",\"query\":{\"fields\":[\"name\",\"description\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"returnByDefault\":false,\"reversePropertyName\":\"children\",\"reverseRelationship\":true,\"searchable\":false,\"title\":\"Parent Organization\",\"type\":\"relationship\",\"userEditable\":false,\"validate\":true,\"viewable\":true},\"parentAdminIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"user ids of parent admins\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"adminIDs\",\"parentAdminIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"user ids of parent admins\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"parentIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"parent org ids\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"_id\",\"parentIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"parent org ids\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false},\"parentOwnerIDs\":{\"isVirtual\":true,\"items\":{\"title\":\"user ids of parent owners\",\"type\":\"string\"},\"queryConfig\":{\"flattenProperties\":true,\"referencedObjectFields\":[\"ownerIDs\",\"parentOwnerIDs\"],\"referencedRelationshipFields\":[\"parent\"]},\"returnByDefault\":true,\"searchable\":false,\"title\":\"user ids of parent owners\",\"type\":\"array\",\"userEditable\":false,\"viewable\":false}},\"required\":[\"name\"],\"title\":\"Organization\",\"type\":\"object\"}},{\"name\":\"group\",\"schema\":{\"$schema\":\"http://json-schema.org/draft-03/schema\",\"icon\":\"fa-group\",\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Group\",\"mat-icon\":\"group\",\"order\":[\"_id\",\"name\",\"description\",\"condition\",\"members\"],\"properties\":{\"_id\":{\"description\":\"Group ID\",\"isPersonal\":false,\"searchable\":false,\"type\":\"string\",\"usageDescription\":\"\",\"userEditable\":false,\"viewable\":false},\"condition\":{\"description\":\"A filter for conditionally assigned members\",\"isConditional\":true,\"searchable\":false,\"title\":\"Condition\",\"type\":\"string\",\"viewable\":false},\"description\":{\"description\":\"Group Description\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"userEditable\":false,\"viewable\":true},\"members\":{\"description\":\"Group Members\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Group:members:items\",\"properties\":{\"_ref\":{\"description\":\"References a relationship from a managed object\",\"type\":\"string\"},\"_refProperties\":{\"description\":\"Supports metadata within the relationship\",\"properties\":{\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"description\":\"_refProperties object ID\",\"type\":\"string\"}},\"title\":\"Group Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"conditionalAssociation\":true,\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"groups\",\"reverseRelationship\":true,\"title\":\"Group Members Items\",\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"description\":\"Group Name\",\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"viewable\":true}},\"required\":[\"name\"],\"title\":\"Group\",\"viewable\":true}},{\"name\":\"application\",\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"icon\":\"fa-folder\",\"order\":[\"name\",\"description\",\"url\",\"icon\",\"mappingNames\",\"owners\",\"roles\",\"members\"],\"properties\":{\"_id\":{\"description\":\"Application ID\",\"isPersonal\":false,\"searchable\":false,\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"authoritative\":{\"description\":\"Is this an authoritative application\",\"searchable\":false,\"title\":\"Authoritative\",\"type\":\"boolean\",\"viewable\":false},\"connectorId\":{\"description\":\"Id of the connector associated with the application\",\"searchable\":false,\"title\":\"Connector ID\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"description\":{\"description\":\"Application Description\",\"searchable\":true,\"title\":\"Description\",\"type\":\"string\",\"viewable\":true},\"icon\":{\"searchable\":true,\"title\":\"Icon\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"mappingNames\":{\"description\":\"Names of the sync mappings used by an application with provisioning configured.\",\"items\":{\"title\":\"Mapping Name Items\",\"type\":\"string\"},\"searchable\":true,\"title\":\"Sync Mapping Names\",\"type\":\"array\",\"viewable\":true},\"members\":{\"description\":\"Members directly granted an application\",\"items\":{\"id\":\"urn:jsonschema:org:forgerock:openidm:managed:api:Application:members:items\",\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_grantType\":{\"description\":\"Grant Type\",\"label\":\"Grant Type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"},\"_uniqueId\":{\"description\":\"Unique identifier\",\"type\":\"string\"}},\"title\":\"Application Members Items _refProperties\",\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"notify\":true,\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"applications\",\"reverseRelationship\":true,\"title\":\"Application Members Items\",\"type\":\"relationship\",\"validate\":true},\"policies\":[],\"returnByDefault\":false,\"searchable\":false,\"title\":\"Members\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"name\":{\"description\":\"Application name\",\"notifyRelationships\":[\"roles\",\"members\"],\"policies\":[{\"policyId\":\"unique\"}],\"returnByDefault\":true,\"searchable\":true,\"title\":\"Name\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true},\"owners\":{\"description\":\"Application Owners\",\"items\":{\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_id\":{\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"User\",\"path\":\"managed/user\",\"query\":{\"fields\":[\"userName\",\"givenName\",\"sn\"],\"queryFilter\":\"true\"}}],\"reversePropertyName\":\"ownerOfApp\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Owners\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"roles\":{\"description\":\"Roles granting users the application\",\"items\":{\"notifySelf\":true,\"properties\":{\"_ref\":{\"type\":\"string\"},\"_refProperties\":{\"properties\":{\"_accountType\":{\"description\":\"Account type\",\"type\":\"string\"},\"_id\":{\"propName\":\"_id\",\"required\":false,\"type\":\"string\"}},\"type\":\"object\"}},\"resourceCollection\":[{\"label\":\"Role\",\"notify\":true,\"path\":\"managed/role\",\"query\":{\"fields\":[\"name\"],\"queryFilter\":\"true\",\"sortKeys\":[]}}],\"reversePropertyName\":\"applications\",\"reverseRelationship\":true,\"type\":\"relationship\",\"validate\":true},\"returnByDefault\":false,\"searchable\":false,\"title\":\"Roles\",\"type\":\"array\",\"userEditable\":false,\"viewable\":true},\"ssoEntities\":{\"description\":\"SSO Entity Id\",\"properties\":{\"domain\":{\"type\":\"string\"},\"federatedDomain\":{\"type\":\"string\"},\"idpLocation\":{\"type\":\"string\"},\"idpLoginUrl\":{\"type\":\"string\"},\"idpPrivateId\":{\"type\":\"string\"},\"key\":{\"type\":\"string\"},\"oidcId\":{\"type\":\"string\"},\"pfApcId\":{\"type\":\"string\"},\"pfIdpAdapterId\":{\"type\":\"string\"},\"pfPolicyId\":{\"type\":\"string\"},\"pfSigningCertId\":{\"type\":\"string\"},\"pfSpConnectionId\":{\"type\":\"string\"},\"spLocation\":{\"type\":\"string\"},\"spPrivate\":{\"type\":\"string\"},\"spPrivateId\":{\"type\":\"string\"}},\"searchable\":false,\"title\":\"SSO Entity Id\",\"type\":\"object\",\"userEditable\":false,\"viewable\":false},\"templateName\":{\"description\":\"Name of the template the application was created from\",\"searchable\":false,\"title\":\"Template Name\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"templateVersion\":{\"description\":\"The template version\",\"searchable\":false,\"title\":\"Template Version\",\"type\":\"string\",\"userEditable\":false,\"viewable\":false},\"uiConfig\":{\"description\":\"UI Config\",\"isPersonal\":false,\"properties\":{},\"searchable\":false,\"title\":\"UI Config\",\"type\":\"object\",\"usageDescription\":\"\",\"viewable\":false},\"url\":{\"searchable\":true,\"title\":\"Url\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[\"name\"],\"title\":\"Application\",\"type\":\"object\"}},{\"name\":\"testObject\",\"onCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// test script\\n\"},\"onRead\":{\"globals\":{},\"source\":\"//groovy export\",\"type\":\"groovy\"},\"onSync\":{\"globals\":{\"test\":8},\"source\":\"//test\",\"type\":\"groovy\"},\"onUpdate\":{\"globals\":{\"test\":[\"test\"]},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"onValidate\":{\"globals\":{\"test\":\"test\"},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"postCreate\":{\"globals\":{\"test\":null},\"type\":\"text/javascript\",\"source\":\"// another test\\n\"},\"postDelete\":{\"globals\":{\"test\":\"test\"},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"postUpdate\":{\"globals\":{\"test\":1},\"source\":\"//test\",\"type\":\"groovy\"},\"schema\":{\"$schema\":\"http://forgerock.org/json-schema#\",\"description\":\"test\",\"icon\":\"fa-anchor\",\"mat-icon\":\"\",\"order\":[\"testObj\",\"testString\"],\"properties\":{\"testObj\":{\"description\":null,\"isVirtual\":false,\"nullable\":false,\"onRetrieve\":{\"globals\":{\"four\":false,\"one\":null,\"three\":3,\"two\":\"number\"},\"source\":\"//second\",\"type\":\"groovy\"},\"onStore\":{\"globals\":{\"test\":{}},\"type\":\"text/javascript\",\"source\":\"//test\\n\"},\"onValidate\":{\"globals\":{\"test\":null},\"source\":\"//groovy script test\",\"type\":\"groovy\"},\"order\":[\"testObject\",\"testString\"],\"properties\":{\"testObject\":{\"description\":null,\"isVirtual\":false,\"onRetrieve\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"text/javascript\"},\"onStore\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"groovy\"},\"order\":[],\"properties\":{},\"required\":[],\"searchable\":false,\"title\":\"test\",\"type\":\"object\",\"userEditable\":true,\"viewable\":true},\"testString\":{\"description\":null,\"format\":null,\"isVirtual\":false,\"onRetrieve\":{\"globals\":{\"test\":1},\"source\":\"//test\",\"type\":\"groovy\"},\"onStore\":{\"globals\":{\"test\":[\"test\",1,false]},\"source\":\"//test\",\"type\":\"text/javascript\"},\"searchable\":false,\"title\":\"test\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[],\"searchable\":false,\"title\":\"TestObj\",\"type\":\"object\",\"userEditable\":true,\"viewable\":true},\"testString\":{\"description\":null,\"format\":null,\"isVirtual\":false,\"onStore\":{\"globals\":{\"test\":null},\"source\":\"//test\",\"type\":\"groovy\"},\"searchable\":false,\"title\":\"test\",\"type\":\"string\",\"userEditable\":true,\"viewable\":true}},\"required\":[],\"title\":\"Test\",\"type\":\"object\"}}]}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 16:59:04 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 644, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T16:59:04.351Z", + "time": 45, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 45 + } + } + ], + "pages": [], + "version": "1.2" + } +} From 4d0082b37ae6167e81f74b398567cb973f1bffd3 Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Fri, 3 Apr 2026 08:38:18 -0600 Subject: [PATCH 06/69] Update snapshots --- test/e2e/__snapshots__/esv-secret-describe.e2e.test.js.snap | 2 +- test/e2e/__snapshots__/esv-secret-list.e2e.test.js.snap | 4 ++-- test/e2e/__snapshots__/esv-variable-describe.e2e.test.js.snap | 2 +- test/e2e/__snapshots__/esv-variable-list.e2e.test.js.snap | 4 ++-- test/e2e/__snapshots__/script-describe.e2e.test.js.snap | 2 +- test/e2e/__snapshots__/script-list.e2e.test.js.snap | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/test/e2e/__snapshots__/esv-secret-describe.e2e.test.js.snap b/test/e2e/__snapshots__/esv-secret-describe.e2e.test.js.snap index 902914b87..92cd11c13 100644 --- a/test/e2e/__snapshots__/esv-secret-describe.e2e.test.js.snap +++ b/test/e2e/__snapshots__/esv-secret-describe.e2e.test.js.snap @@ -127,7 +127,7 @@ Error exporting idm config entity fidc/federation-EntraID Code: ERR_BAD_REQUEST Reason: Forbidden Message: Access denied -✔ Exported 69 config entities. +• Exported 69 config entities. • Exported 7 internal roles • Exported 7 custom nodes. • Exported 2 realms. diff --git a/test/e2e/__snapshots__/esv-secret-list.e2e.test.js.snap b/test/e2e/__snapshots__/esv-secret-list.e2e.test.js.snap index a43ec2270..1b72e0a98 100644 --- a/test/e2e/__snapshots__/esv-secret-list.e2e.test.js.snap +++ b/test/e2e/__snapshots__/esv-secret-list.e2e.test.js.snap @@ -84,7 +84,7 @@ Error exporting idm config entity fidc/federation-EntraID Code: ERR_BAD_REQUEST Reason: Forbidden Message: Access denied -✔ Exported 69 config entities. +• Exported 69 config entities. • Exported 7 internal roles • Exported 7 custom nodes. • Exported 2 realms. @@ -163,7 +163,7 @@ Error exporting idm config entity fidc/federation-EntraID Code: ERR_BAD_REQUEST Reason: Forbidden Message: Access denied -✔ Exported 69 config entities. +• Exported 69 config entities. • Exported 7 internal roles • Exported 7 custom nodes. • Exported 2 realms. diff --git a/test/e2e/__snapshots__/esv-variable-describe.e2e.test.js.snap b/test/e2e/__snapshots__/esv-variable-describe.e2e.test.js.snap index 64a817cc6..e87eedf66 100644 --- a/test/e2e/__snapshots__/esv-variable-describe.e2e.test.js.snap +++ b/test/e2e/__snapshots__/esv-variable-describe.e2e.test.js.snap @@ -81,7 +81,7 @@ Error exporting idm config entity fidc/federation-EntraID Code: ERR_BAD_REQUEST Reason: Forbidden Message: Access denied -✔ Exported 69 config entities. +• Exported 69 config entities. • Exported 7 internal roles • Exported 7 custom nodes. • Exported 2 realms. diff --git a/test/e2e/__snapshots__/esv-variable-list.e2e.test.js.snap b/test/e2e/__snapshots__/esv-variable-list.e2e.test.js.snap index 05bee64a5..ef9d8f6f9 100644 --- a/test/e2e/__snapshots__/esv-variable-list.e2e.test.js.snap +++ b/test/e2e/__snapshots__/esv-variable-list.e2e.test.js.snap @@ -71,7 +71,7 @@ Error exporting idm config entity fidc/federation-EntraID Code: ERR_BAD_REQUEST Reason: Forbidden Message: Access denied -✔ Exported 69 config entities. +• Exported 69 config entities. • Exported 7 internal roles • Exported 7 custom nodes. • Exported 2 realms. @@ -148,7 +148,7 @@ Error exporting idm config entity fidc/federation-EntraID Code: ERR_BAD_REQUEST Reason: Forbidden Message: Access denied -✔ Exported 69 config entities. +• Exported 69 config entities. • Exported 7 internal roles • Exported 7 custom nodes. • Exported 2 realms. diff --git a/test/e2e/__snapshots__/script-describe.e2e.test.js.snap b/test/e2e/__snapshots__/script-describe.e2e.test.js.snap index 943b088cb..a77b625af 100644 --- a/test/e2e/__snapshots__/script-describe.e2e.test.js.snap +++ b/test/e2e/__snapshots__/script-describe.e2e.test.js.snap @@ -188,7 +188,7 @@ Error exporting idm config entity fidc/federation-EntraID Code: ERR_BAD_REQUEST Reason: Forbidden Message: Access denied -✔ Exported 69 config entities. +• Exported 69 config entities. • Exported 7 internal roles • Exported 7 custom nodes. • Exported 2 realms. diff --git a/test/e2e/__snapshots__/script-list.e2e.test.js.snap b/test/e2e/__snapshots__/script-list.e2e.test.js.snap index 2755690ad..1c3a9c79f 100644 --- a/test/e2e/__snapshots__/script-list.e2e.test.js.snap +++ b/test/e2e/__snapshots__/script-list.e2e.test.js.snap @@ -899,7 +899,7 @@ Error exporting idm config entity fidc/federation-EntraID Code: ERR_BAD_REQUEST Reason: Forbidden Message: Access denied -✔ Exported 69 config entities. +• Exported 69 config entities. • Exported 7 internal roles • Exported 7 custom nodes. • Exported 2 realms. @@ -1103,7 +1103,7 @@ Error exporting idm config entity fidc/federation-EntraID Code: ERR_BAD_REQUEST Reason: Forbidden Message: Access denied -✔ Exported 69 config entities. +• Exported 69 config entities. • Exported 7 internal roles • Exported 7 custom nodes. • Exported 2 realms. From 85febbdd98617f0779f12c0bd96b05587d3660fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:05:33 +0000 Subject: [PATCH 07/69] Updated changelog and version for release v4.0.0-38 --- CHANGELOG.md | 5 ++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e348b98c..8c5687c09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.0.0-38] - 2026-04-03 + ## [4.0.0-37] - 2026-03-30 ## [4.0.0-36] - 2026-03-30 @@ -2237,7 +2239,8 @@ Frodo CLI 2.x automatically refreshes session and access tokens before they expi - Fixed problem with adding connection profiles - Miscellaneous bug fixes -[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-37...HEAD +[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-38...HEAD +[4.0.0-38]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-37...v4.0.0-38 [4.0.0-37]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-36...v4.0.0-37 [4.0.0-36]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-35...v4.0.0-36 [4.0.0-35]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-34...v4.0.0-35 diff --git a/package-lock.json b/package-lock.json index eb4d92562..63ff24be4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-37", + "version": "4.0.0-38", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-37", + "version": "4.0.0-38", "license": "MIT", "bin": { "frodo": "dist/launch.cjs" diff --git a/package.json b/package.json index 7a74efe4f..18a2dd848 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-37", + "version": "4.0.0-38", "type": "module", "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.", "keywords": [ From 2c1dd2340e96135cbfc0edc8324663bf834b8d52 Mon Sep 17 00:00:00 2001 From: devintrivir Date: Fri, 3 Apr 2026 09:18:05 -0600 Subject: [PATCH 08/69] deployment type adjustments and switched to constant usage over string declaration (#580) --- src/cli/admin/admin-add-autoid-static-user-mapping.ts | 6 +++++- ...admin-create-oauth2-client-with-admin-privileges.ts | 10 ++++++++-- src/cli/admin/admin-federation-export.ts | 5 ++++- src/cli/admin/admin-federation-import.ts | 5 ++++- src/cli/admin/admin-federation-list.ts | 6 +++++- .../admin-grant-oauth2-client-admin-privileges.ts | 10 ++++++++-- .../admin/admin-hide-generic-extension-attributes.ts | 6 ++++-- .../admin-list-oauth2-clients-with-admin-privileges.ts | 10 ++++++++-- ...admin-list-oauth2-clients-with-custom-privileges.ts | 10 ++++++++-- src/cli/admin/admin-list-static-user-mappings.ts | 9 ++++++++- src/cli/admin/admin-remove-static-user-mapping.ts | 9 ++++++++- src/cli/admin/admin-repair-org-model.ts | 10 ++++++++-- .../admin-revoke-oauth2-client-admin-privileges.ts | 10 ++++++++-- .../admin/admin-show-generic-extension-attributes.ts | 6 ++++-- src/cli/admin/admin-train-auto-access-model.ts | 4 +++- src/cli/app/app-delete.ts | 9 ++++++++- src/cli/app/app-describe.ts | 9 ++++++++- src/cli/app/app-export.ts | 9 ++++++++- src/cli/app/app-import.ts | 9 ++++++++- src/cli/app/app-list.ts | 9 ++++++++- .../config-manager-pull-access-config.ts | 10 +++++++++- .../config-manager-pull-all-static.ts | 10 +++++++++- .../config-manager-pull/config-manager-pull-all.ts | 9 ++++++++- .../config-manager-pull/config-manager-pull-audit.ts | 10 +++++++++- .../config-manager-pull-authentication.ts | 9 ++++++++- .../config-manager-pull-authz-policies.ts | 8 +++++++- .../config-manager-pull-connector-definitions.ts | 9 ++++++++- .../config-manager-pull-connector-mappings.ts | 10 +++++++++- .../config-manager-pull-cookie-domains.ts | 10 +++++++++- .../config-manager-pull/config-manager-pull-cors.ts | 10 +++++++++- .../config-manager-pull/config-manager-pull-csp.ts | 9 ++++++++- .../config-manager-pull-email-templates.ts | 9 ++++++++- .../config-manager-pull-endpoints.ts | 9 ++++++++- .../config-manager-pull-internal-roles.ts | 9 ++++++++- .../config-manager-pull-journeys.ts | 9 ++++++++- .../config-manager-pull/config-manager-pull-kba.ts | 10 +++++++++- .../config-manager-pull/config-manager-pull-locales.ts | 9 ++++++++- .../config-manager-pull-managed-objects.ts | 9 ++++++++- .../config-manager-pull-oauth2-agents.ts | 8 +++++++- .../config-manager-pull-org-privileges.ts | 1 - .../config-manager-pull-password-policy.ts | 9 ++++++++- .../config-manager-pull/config-manager-pull-raw.ts | 9 ++++++++- .../config-manager-pull-remote-servers.ts | 10 +++++++++- .../config-manager-pull/config-manager-pull-saml.ts | 9 ++++++++- .../config-manager-pull-schedules.ts | 9 ++++++++- .../config-manager-pull/config-manager-pull-scripts.ts | 8 +++++++- .../config-manager-pull-secret-mappings.ts | 9 ++++++++- .../config-manager-pull/config-manager-pull-secrets.ts | 10 +++++++++- .../config-manager-pull-service-objects.ts | 9 ++++++++- .../config-manager-pull-services.ts | 9 ++++++++- .../config-manager-pull-terms-and-conditions.ts | 10 +++++++++- .../config-manager-pull/config-manager-pull-test.ts | 10 +++++++++- .../config-manager-pull/config-manager-pull-themes.ts | 10 +++++++++- .../config-manager-pull-uiConfig.ts | 10 +++++++++- .../config-manager-pull-variables.ts | 6 +++++- src/cli/email/email-template-export.ts | 10 ++++++++-- src/cli/email/email-template-import.ts | 9 ++++++++- src/cli/email/email-template-list.ts | 9 ++++++++- src/cli/esv/esv-apply.ts | 4 +++- src/cli/esv/esv-secret-create.ts | 5 ++++- src/cli/esv/esv-secret-delete.ts | 5 ++++- src/cli/esv/esv-secret-describe.ts | 5 ++++- src/cli/esv/esv-secret-export.ts | 6 ++++-- src/cli/esv/esv-secret-import.ts | 5 ++++- src/cli/esv/esv-secret-list.ts | 5 ++++- src/cli/esv/esv-secret-set.ts | 5 ++++- src/cli/esv/esv-secret-version-activate.ts | 5 ++++- src/cli/esv/esv-secret-version-create.ts | 5 ++++- src/cli/esv/esv-secret-version-deactivate.ts | 5 ++++- src/cli/esv/esv-secret-version-delete.ts | 5 ++++- src/cli/esv/esv-secret-version-list.ts | 5 ++++- src/cli/esv/esv-variable-create.ts | 6 +++++- src/cli/esv/esv-variable-delete.ts | 5 ++++- src/cli/esv/esv-variable-describe.ts | 5 ++++- src/cli/esv/esv-variable-export.ts | 6 ++++-- src/cli/esv/esv-variable-import.ts | 5 ++++- src/cli/esv/esv-variable-list.ts | 5 ++++- src/cli/esv/esv-variable-set.ts | 6 +++++- src/cli/idm/idm-count.ts | 9 ++++++++- src/cli/idm/idm-export.ts | 10 ++++++++-- src/cli/idm/idm-import.ts | 10 ++++++++-- src/cli/idm/idm-list.ts | 10 +++++++++- src/cli/idm/idm-schema-object-export.ts | 10 ++++++++-- src/cli/idm/idm-schema-object-import.ts | 10 ++++++++-- src/cli/log/log-fetch.ts | 4 +++- src/cli/log/log-key-delete.ts | 5 ++++- src/cli/log/log-key-describe.ts | 5 ++++- src/cli/log/log-key-list.ts | 5 ++++- src/cli/log/log-list.ts | 4 +++- src/cli/log/log-tail.ts | 4 +++- src/cli/mapping/mapping-delete.ts | 9 ++++++++- src/cli/mapping/mapping-export.ts | 9 ++++++++- src/cli/mapping/mapping-import.ts | 9 ++++++++- src/cli/mapping/mapping-list.ts | 9 ++++++++- src/cli/mapping/mapping-rename.ts | 9 ++++++++- src/cli/promote/promote.ts | 10 ++++++++-- src/cli/theme/theme-delete.ts | 10 ++++++++-- src/cli/theme/theme-export.ts | 10 ++++++++-- src/cli/theme/theme-import.ts | 10 ++++++++-- src/cli/theme/theme-list.ts | 10 ++++++++-- ...g-manager-export-connector-definitions.test.js.snap | 2 -- ...nfig-manager-export-connector-mappings.test.js.snap | 2 -- .../config-manager-export-cors.test.js.snap | 2 -- .../config-manager-export-csp.test.js.snap | 2 -- .../config-manager-export-raw.test.js.snap | 2 -- test/client_cli/en/__snapshots__/promote.test.js.snap | 2 -- test/client_cli/en/__snapshots__/root.test.js.snap | 2 +- 107 files changed, 668 insertions(+), 133 deletions(-) diff --git a/src/cli/admin/admin-add-autoid-static-user-mapping.ts b/src/cli/admin/admin-add-autoid-static-user-mapping.ts index ac3d327d1..ab6160b29 100644 --- a/src/cli/admin/admin-add-autoid-static-user-mapping.ts +++ b/src/cli/admin/admin-add-autoid-static-user-mapping.ts @@ -1,9 +1,13 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { addAutoIdStaticUserMapping } from '../../ops/AdminOps'; import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts b/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts index cbc07b5b9..680122c69 100644 --- a/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts +++ b/src/cli/admin/admin-create-oauth2-client-with-admin-privileges.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import Table from 'cli-table3'; import { Option } from 'commander'; import { v4 as uuidv4 } from 'uuid'; @@ -11,7 +11,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { printError, printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-federation-export.ts b/src/cli/admin/admin-federation-export.ts index e0fdfec8b..085770f21 100644 --- a/src/cli/admin/admin-federation-export.ts +++ b/src/cli/admin/admin-federation-export.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -9,7 +10,9 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-federation-import.ts b/src/cli/admin/admin-federation-import.ts index 2c92677ac..487e2ad1a 100644 --- a/src/cli/admin/admin-federation-import.ts +++ b/src/cli/admin/admin-federation-import.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -10,7 +11,9 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-federation-list.ts b/src/cli/admin/admin-federation-list.ts index 1b7e7f821..7410c2e1d 100644 --- a/src/cli/admin/admin-federation-list.ts +++ b/src/cli/admin/admin-federation-list.ts @@ -1,9 +1,13 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { getTokens } from '../../ops/AuthenticateOps'; import { listAdminFederationProviders } from '../../ops/cloud/AdminFederationOps'; import { verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-grant-oauth2-client-admin-privileges.ts b/src/cli/admin/admin-grant-oauth2-client-admin-privileges.ts index 31c9bc65a..097586ba5 100644 --- a/src/cli/admin/admin-grant-oauth2-client-admin-privileges.ts +++ b/src/cli/admin/admin-grant-oauth2-client-admin-privileges.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { grantOAuth2ClientAdminPrivileges } from '../../ops/AdminOps'; @@ -6,7 +6,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-hide-generic-extension-attributes.ts b/src/cli/admin/admin-hide-generic-extension-attributes.ts index e98f25b85..cc1b2fcf4 100644 --- a/src/cli/admin/admin-hide-generic-extension-attributes.ts +++ b/src/cli/admin/admin-hide-generic-extension-attributes.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { hideGenericExtensionAttributes } from '../../ops/AdminOps'; @@ -6,7 +6,9 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-list-oauth2-clients-with-admin-privileges.ts b/src/cli/admin/admin-list-oauth2-clients-with-admin-privileges.ts index 9d259cc86..5c6d23e0f 100644 --- a/src/cli/admin/admin-list-oauth2-clients-with-admin-privileges.ts +++ b/src/cli/admin/admin-list-oauth2-clients-with-admin-privileges.ts @@ -1,11 +1,17 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { listOAuth2AdminClients } from '../../ops/AdminOps'; import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-list-oauth2-clients-with-custom-privileges.ts b/src/cli/admin/admin-list-oauth2-clients-with-custom-privileges.ts index a0fdb92bb..cf480ab91 100644 --- a/src/cli/admin/admin-list-oauth2-clients-with-custom-privileges.ts +++ b/src/cli/admin/admin-list-oauth2-clients-with-custom-privileges.ts @@ -1,11 +1,17 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { listOAuth2CustomClients } from '../../ops/AdminOps'; import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-list-static-user-mappings.ts b/src/cli/admin/admin-list-static-user-mappings.ts index a061346f9..147a35fb5 100644 --- a/src/cli/admin/admin-list-static-user-mappings.ts +++ b/src/cli/admin/admin-list-static-user-mappings.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { listNonOAuth2AdminStaticUserMappings } from '../../ops/AdminOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-remove-static-user-mapping.ts b/src/cli/admin/admin-remove-static-user-mapping.ts index b67da98a4..4b3b11367 100644 --- a/src/cli/admin/admin-remove-static-user-mapping.ts +++ b/src/cli/admin/admin-remove-static-user-mapping.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { removeStaticUserMapping } from '../../ops/AdminOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-repair-org-model.ts b/src/cli/admin/admin-repair-org-model.ts index b336823b1..e0aafa619 100644 --- a/src/cli/admin/admin-repair-org-model.ts +++ b/src/cli/admin/admin-repair-org-model.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { repairOrgModel } from '../../ops/AdminOps'; @@ -6,7 +6,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-revoke-oauth2-client-admin-privileges.ts b/src/cli/admin/admin-revoke-oauth2-client-admin-privileges.ts index d9ee95946..88cd95995 100644 --- a/src/cli/admin/admin-revoke-oauth2-client-admin-privileges.ts +++ b/src/cli/admin/admin-revoke-oauth2-client-admin-privileges.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { revokeOAuth2ClientAdminPrivileges } from '../../ops/AdminOps'; @@ -6,7 +6,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-show-generic-extension-attributes.ts b/src/cli/admin/admin-show-generic-extension-attributes.ts index ccaa03321..e4fdc3e57 100644 --- a/src/cli/admin/admin-show-generic-extension-attributes.ts +++ b/src/cli/admin/admin-show-generic-extension-attributes.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { showGenericExtensionAttributes } from '../../ops/AdminOps'; @@ -6,7 +6,9 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/admin/admin-train-auto-access-model.ts b/src/cli/admin/admin-train-auto-access-model.ts index 07b538230..fbf8fddce 100644 --- a/src/cli/admin/admin-train-auto-access-model.ts +++ b/src/cli/admin/admin-train-auto-access-model.ts @@ -7,7 +7,9 @@ import { FrodoCommand } from '../FrodoCommand.js'; const { trainAA } = frodo.admin; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/app/app-delete.ts b/src/cli/app/app-delete.ts index 4cd40a7d6..0e202d361 100644 --- a/src/cli/app/app-delete.ts +++ b/src/cli/app/app-delete.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import * as s from '../../help/SampleData'; @@ -9,7 +10,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo app delete', [], deploymentTypes); diff --git a/src/cli/app/app-describe.ts b/src/cli/app/app-describe.ts index b65782a61..05c0852f7 100644 --- a/src/cli/app/app-describe.ts +++ b/src/cli/app/app-describe.ts @@ -1,10 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo app describe', [], deploymentTypes); diff --git a/src/cli/app/app-export.ts b/src/cli/app/app-export.ts index c8e900dec..1b93d3505 100644 --- a/src/cli/app/app-export.ts +++ b/src/cli/app/app-export.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import * as s from '../../help/SampleData'; @@ -10,7 +11,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo app export', [], deploymentTypes); diff --git a/src/cli/app/app-import.ts b/src/cli/app/app-import.ts index 25448b128..aac23edc7 100644 --- a/src/cli/app/app-import.ts +++ b/src/cli/app/app-import.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import * as s from '../../help/SampleData'; @@ -11,7 +12,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo app import', [], deploymentTypes); diff --git a/src/cli/app/app-list.ts b/src/cli/app/app-list.ts index dbca49c9a..6b4d75d3f 100644 --- a/src/cli/app/app-list.ts +++ b/src/cli/app/app-list.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import * as s from '../../help/SampleData'; @@ -6,7 +7,13 @@ import { getTokens } from '../../ops/AuthenticateOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo app list', [], deploymentTypes); diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts index f19be8a66..e02521a55 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-access-config.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportAccessConfig } from '../../../configManagerOps/FrConfigAccessConfigOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-all-static.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-all-static.ts index c751f96b6..e97d16099 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-all-static.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-all-static.ts @@ -1,8 +1,16 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportAllStatic } from '../../../configManagerOps/FrConfigAllOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-all.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-all.ts index 25a4ffc8b..ab591170c 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-all.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-all.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportAllWithConfigFolder } from '../../../configManagerOps/FrConfigAllOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts index c60bc27c6..cef4b6e9f 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-audit.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportAudit } from '../../../configManagerOps/FrConfigAuditOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-authentication.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-authentication.ts index 1861d96d1..ad0987b3e 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-authentication.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-authentication.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportAuthentication } from '../../../configManagerOps/FrConfigAuthenticationOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-authz-policies.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-authz-policies.ts index 5469d921a..639c70cf8 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-authz-policies.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-authz-policies.ts @@ -11,7 +11,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; const { constants } = frodo.utils; const { readRealms } = frodo.realm; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-definitions.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-definitions.ts index 693185e39..9ed88cde2 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-definitions.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-definitions.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { @@ -8,7 +9,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-mappings.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-mappings.ts index 1bfae8a1b..2c9013145 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-mappings.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-connector-mappings.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportMappings } from '../../../configManagerOps/FrConfigConnectorMappingOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-cookie-domains.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-cookie-domains.ts index 4ed319d7f..bf278771e 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-cookie-domains.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-cookie-domains.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportCookieDomains } from '../../../configManagerOps/FrConfigCookieDomainsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-cors.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-cors.ts index 02e11ecf8..d3cd94e37 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-cors.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-cors.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportCors } from '../../../configManagerOps/FrConfigCorsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-csp.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-csp.ts index 9832d0ad0..857ecc3a8 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-csp.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-csp.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportCsp } from '../../../configManagerOps/FrConfigCspOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-email-templates.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-email-templates.ts index ef5b865ea..5f8b993fb 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-email-templates.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-email-templates.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportEmailTemplates } from '../../../configManagerOps/FrConfigEmailTemplatesOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-endpoints.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-endpoints.ts index 8ad8fbc08..d9b51d617 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-endpoints.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-endpoints.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportEndpoints } from '../../../configManagerOps/FrConfigEndpointsOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-internal-roles.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-internal-roles.ts index 297eac595..f0d1a2b95 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-internal-roles.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-internal-roles.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportInternalRoles } from '../../../configManagerOps/FrConfigInternalRolesOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-journeys.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-journeys.ts index 37c2ef629..bc947bec2 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-journeys.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-journeys.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportJourneys } from '../../../configManagerOps/FrConfigJourneysOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts index 9442b106e..a13aa9152 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-kba.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportKbaConfig } from '../../../configManagerOps/FrConfigKbaOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-locales.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-locales.ts index ef9007345..447dc6cc3 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-locales.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-locales.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportLocales } from '../../../configManagerOps/FrConfigLocalesOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-managed-objects.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-managed-objects.ts index 5d5b5f38d..ca49c2d6c 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-managed-objects.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-managed-objects.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportManagedObjects } from '../../../configManagerOps/FrConfigManagedObjectsOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-oauth2-agents.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-oauth2-agents.ts index f41ee506b..b31c79663 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-oauth2-agents.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-oauth2-agents.ts @@ -11,7 +11,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; const { constants } = frodo.utils; const { readRealms } = frodo.realm; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-org-privileges.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-org-privileges.ts index 48223b7de..9f9910c3f 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-org-privileges.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-org-privileges.ts @@ -17,7 +17,6 @@ const deploymentTypes = [ CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY, ]; - const { constants } = frodo.utils; export default function setup() { diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-password-policy.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-password-policy.ts index e1ffeb979..97a3c629e 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-password-policy.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-password-policy.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportPasswordPolicy } from '../../../configManagerOps/FrConfigPasswordPolicyOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-raw.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-raw.ts index c0bfe75af..3003b3e14 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-raw.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-raw.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportRaw } from '../../../configManagerOps/FrConfigRawOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts index 13b743776..02caebd42 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-remote-servers.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportRemoteServers } from '../../../configManagerOps/FrConfigRemoteServersOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-saml.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-saml.ts index d8c58b57d..6c25c05cb 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-saml.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-saml.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportSaml } from '../../../configManagerOps/FrConfigSamlOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-schedules.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-schedules.ts index 492715e4c..7981a4bac 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-schedules.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-schedules.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportSchedules } from '../../../configManagerOps/FrConfigSchedulesOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-scripts.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-scripts.ts index 5923e1d43..3beb7f298 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-scripts.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-scripts.ts @@ -10,7 +10,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; const { constants } = frodo.utils; const { readRealms } = frodo.realm; diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-secret-mappings.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-secret-mappings.ts index aa48c5ef8..18871508a 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-secret-mappings.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-secret-mappings.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportSecretMappings } from '../../../configManagerOps/FrConfigSecretMappingsOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-secrets.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-secrets.ts index 5aa2087e2..ec4a69658 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-secrets.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-secrets.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportSecrets } from '../../../configManagerOps/FrConfigSecretOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-service-objects.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-service-objects.ts index 277641f1b..bea9ae6dc 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-service-objects.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-service-objects.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportServiceObjectsFromFile } from '../../../configManagerOps/FrConfigServiceObjectsOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-services.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-services.ts index 67a930070..fbc618007 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-services.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-services.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { configManagerExportServices } from '../../../configManagerOps/FrConfigServiceOps'; @@ -5,7 +6,13 @@ import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-terms-and-conditions.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-terms-and-conditions.ts index 7af8c3e56..adcb38163 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-terms-and-conditions.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-terms-and-conditions.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportTermsAndConditions } from '../../../configManagerOps/FrConfigTermsAndConditionsOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-test.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-test.ts index 9f95b55d4..1b468deb3 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-test.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-test.ts @@ -1,8 +1,16 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-themes.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-themes.ts index ce0a9f36e..814691787 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-themes.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-themes.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportThemes } from '../../../configManagerOps/FrConfigThemeOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts index 5bcce171c..40dafdf17 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-uiConfig.ts @@ -1,9 +1,17 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportUiConfig } from '../../../configManagerOps/FrConfigUiConfigOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/config-manager/config-manager-pull/config-manager-pull-variables.ts b/src/cli/config-manager/config-manager-pull/config-manager-pull-variables.ts index 0f443f2ed..febceff1b 100644 --- a/src/cli/config-manager/config-manager-pull/config-manager-pull-variables.ts +++ b/src/cli/config-manager/config-manager-pull/config-manager-pull-variables.ts @@ -1,9 +1,13 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { configManagerExportVariables } from '../../../configManagerOps/FrConfigVariableOps'; import { getTokens } from '../../../ops/AuthenticateOps'; import { printMessage, verboseMessage } from '../../../utils/Console'; import { FrodoCommand } from '../../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/email/email-template-export.ts b/src/cli/email/email-template-export.ts index 06cc375dc..d3bfb6ce0 100644 --- a/src/cli/email/email-template-export.ts +++ b/src/cli/email/email-template-export.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -10,7 +10,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/email/email-template-import.ts b/src/cli/email/email-template-import.ts index 5c5eebcff..ddab7e241 100644 --- a/src/cli/email/email-template-import.ts +++ b/src/cli/email/email-template-import.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -10,7 +11,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/email/email-template-list.ts b/src/cli/email/email-template-list.ts index fa60fbba7..086ba8a18 100644 --- a/src/cli/email/email-template-list.ts +++ b/src/cli/email/email-template-list.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,13 @@ import { listEmailTemplates } from '../../ops/EmailTemplateOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-apply.ts b/src/cli/esv/esv-apply.ts index 074c41edb..263f5b8bb 100644 --- a/src/cli/esv/esv-apply.ts +++ b/src/cli/esv/esv-apply.ts @@ -9,7 +9,9 @@ import { FrodoCommand } from '../FrodoCommand'; const { checkForUpdates, applyUpdates } = frodo.cloud.startup; const { resolveUserName } = frodo.idm.managed; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-create.ts b/src/cli/esv/esv-secret-create.ts index 9fd80bc7b..9bdc819ed 100644 --- a/src/cli/esv/esv-secret-create.ts +++ b/src/cli/esv/esv-secret-create.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { createSecret, createSecretFromFile } from '../../ops/cloud/SecretsOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-delete.ts b/src/cli/esv/esv-secret-delete.ts index ff91853c1..fe761365f 100644 --- a/src/cli/esv/esv-secret-delete.ts +++ b/src/cli/esv/esv-secret-delete.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { deleteSecret, deleteSecrets } from '../../ops/cloud/SecretsOps'; import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-describe.ts b/src/cli/esv/esv-secret-describe.ts index 70c948ed0..9b409008d 100644 --- a/src/cli/esv/esv-secret-describe.ts +++ b/src/cli/esv/esv-secret-describe.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { describeSecret } from '../../ops/cloud/SecretsOps'; import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-export.ts b/src/cli/esv/esv-secret-export.ts index 67cad6249..71ddb0f5b 100644 --- a/src/cli/esv/esv-secret-export.ts +++ b/src/cli/esv/esv-secret-export.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import * as s from '../../help/SampleData'; @@ -11,7 +11,9 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-import.ts b/src/cli/esv/esv-secret-import.ts index c5073bf86..48e2523a2 100644 --- a/src/cli/esv/esv-secret-import.ts +++ b/src/cli/esv/esv-secret-import.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import * as s from '../../help/SampleData'; @@ -10,7 +11,9 @@ import { import { printMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-list.ts b/src/cli/esv/esv-secret-list.ts index dca5dbd5f..9ae408cd4 100644 --- a/src/cli/esv/esv-secret-list.ts +++ b/src/cli/esv/esv-secret-list.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { listSecrets } from '../../ops/cloud/SecretsOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-set.ts b/src/cli/esv/esv-secret-set.ts index 612fb88f9..a62ab88a1 100644 --- a/src/cli/esv/esv-secret-set.ts +++ b/src/cli/esv/esv-secret-set.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { setSecretDescription } from '../../ops/cloud/SecretsOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-version-activate.ts b/src/cli/esv/esv-secret-version-activate.ts index e11a8e989..07bdb7617 100644 --- a/src/cli/esv/esv-secret-version-activate.ts +++ b/src/cli/esv/esv-secret-version-activate.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { activateVersionOfSecret } from '../../ops/cloud/SecretsOps'; import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-version-create.ts b/src/cli/esv/esv-secret-version-create.ts index 98fe199ba..87da609c8 100644 --- a/src/cli/esv/esv-secret-version-create.ts +++ b/src/cli/esv/esv-secret-version-create.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -8,7 +9,9 @@ import { import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-version-deactivate.ts b/src/cli/esv/esv-secret-version-deactivate.ts index 743ddec0a..7393805a7 100644 --- a/src/cli/esv/esv-secret-version-deactivate.ts +++ b/src/cli/esv/esv-secret-version-deactivate.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { deactivateVersionOfSecret } from '../../ops/cloud/SecretsOps'; import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-version-delete.ts b/src/cli/esv/esv-secret-version-delete.ts index bcc6ad943..b436c3052 100644 --- a/src/cli/esv/esv-secret-version-delete.ts +++ b/src/cli/esv/esv-secret-version-delete.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { deleteVersionOfSecret } from '../../ops/cloud/SecretsOps'; import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-secret-version-list.ts b/src/cli/esv/esv-secret-version-list.ts index cde3659a2..eec8e5c2e 100644 --- a/src/cli/esv/esv-secret-version-list.ts +++ b/src/cli/esv/esv-secret-version-list.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { listSecretVersions } from '../../ops/cloud/SecretsOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-variable-create.ts b/src/cli/esv/esv-variable-create.ts index f3b1fe838..a1bb7f958 100644 --- a/src/cli/esv/esv-variable-create.ts +++ b/src/cli/esv/esv-variable-create.ts @@ -1,10 +1,14 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import * as s from '../../help/SampleData'; import { getTokens } from '../../ops/AuthenticateOps'; import { createVariable } from '../../ops/cloud/VariablesOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-variable-delete.ts b/src/cli/esv/esv-variable-delete.ts index c586f7487..312980b52 100644 --- a/src/cli/esv/esv-variable-delete.ts +++ b/src/cli/esv/esv-variable-delete.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -8,7 +9,9 @@ import { import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-variable-describe.ts b/src/cli/esv/esv-variable-describe.ts index b05da3477..6fb665d7a 100644 --- a/src/cli/esv/esv-variable-describe.ts +++ b/src/cli/esv/esv-variable-describe.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { describeVariable } from '../../ops/cloud/VariablesOps'; import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-variable-export.ts b/src/cli/esv/esv-variable-export.ts index 4447d61af..19f00b306 100644 --- a/src/cli/esv/esv-variable-export.ts +++ b/src/cli/esv/esv-variable-export.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -10,7 +10,9 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-variable-import.ts b/src/cli/esv/esv-variable-import.ts index e2f27af0f..b024dc75f 100644 --- a/src/cli/esv/esv-variable-import.ts +++ b/src/cli/esv/esv-variable-import.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -9,7 +10,9 @@ import { import { printMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-variable-list.ts b/src/cli/esv/esv-variable-list.ts index 78756fad0..cd727e788 100644 --- a/src/cli/esv/esv-variable-list.ts +++ b/src/cli/esv/esv-variable-list.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { listVariables } from '../../ops/cloud/VariablesOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/esv/esv-variable-set.ts b/src/cli/esv/esv-variable-set.ts index 4372a9a6a..e5b909b57 100644 --- a/src/cli/esv/esv-variable-set.ts +++ b/src/cli/esv/esv-variable-set.ts @@ -1,3 +1,5 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { getTokens } from '../../ops/AuthenticateOps'; import { setVariableDescription, @@ -6,7 +8,9 @@ import { import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/idm/idm-count.ts b/src/cli/idm/idm-count.ts index e541c44a9..b69d4a76c 100644 --- a/src/cli/idm/idm-count.ts +++ b/src/cli/idm/idm-count.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,13 @@ import { countManagedObjects } from '../../ops/IdmOps'; import { verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo idm count', [], deploymentTypes); diff --git a/src/cli/idm/idm-export.ts b/src/cli/idm/idm-export.ts index 1ed3ced81..045b5b63c 100644 --- a/src/cli/idm/idm-export.ts +++ b/src/cli/idm/idm-export.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -11,7 +11,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo idm export', [], deploymentTypes); diff --git a/src/cli/idm/idm-import.ts b/src/cli/idm/idm-import.ts index a191828aa..967e66d0c 100644 --- a/src/cli/idm/idm-import.ts +++ b/src/cli/idm/idm-import.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -11,7 +11,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo idm import', [], deploymentTypes); diff --git a/src/cli/idm/idm-list.ts b/src/cli/idm/idm-list.ts index acad9e4bf..58cc2c315 100644 --- a/src/cli/idm/idm-list.ts +++ b/src/cli/idm/idm-list.ts @@ -1,3 +1,5 @@ +import { frodo } from '@rockcarver/frodo-lib'; + import { getTokens } from '../../ops/AuthenticateOps'; import { listAllConfigEntities, @@ -6,7 +8,13 @@ import { import { verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo idm list', [], deploymentTypes); diff --git a/src/cli/idm/idm-schema-object-export.ts b/src/cli/idm/idm-schema-object-export.ts index e766b1156..f9e73a52e 100644 --- a/src/cli/idm/idm-schema-object-export.ts +++ b/src/cli/idm/idm-schema-object-export.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -10,7 +10,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/idm/idm-schema-object-import.ts b/src/cli/idm/idm-schema-object-import.ts index d8f66ea4c..251c87157 100644 --- a/src/cli/idm/idm-schema-object-import.ts +++ b/src/cli/idm/idm-schema-object-import.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -10,7 +10,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/log/log-fetch.ts b/src/cli/log/log-fetch.ts index 2b32c5612..528fc61c5 100644 --- a/src/cli/log/log-fetch.ts +++ b/src/cli/log/log-fetch.ts @@ -15,7 +15,9 @@ const SECONDS_IN_30_DAYS = 2592000; const SECONDS_IN_1_HOUR = 3600; const LOG_TIME_WINDOW_MAX = SECONDS_IN_30_DAYS; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/log/log-key-delete.ts b/src/cli/log/log-key-delete.ts index a6d7a0d9f..096a990c0 100644 --- a/src/cli/log/log-key-delete.ts +++ b/src/cli/log/log-key-delete.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { deleteLogApiKey, deleteLogApiKeys } from '../../ops/LogOps'; import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/log/log-key-describe.ts b/src/cli/log/log-key-describe.ts index e4ac9c76e..36c704420 100644 --- a/src/cli/log/log-key-describe.ts +++ b/src/cli/log/log-key-describe.ts @@ -1,9 +1,12 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/log/log-key-list.ts b/src/cli/log/log-key-list.ts index d0db3c9ab..0911888d8 100644 --- a/src/cli/log/log-key-list.ts +++ b/src/cli/log/log-key-list.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,9 @@ import { listLogApiKeys } from '../../ops/LogOps'; import { verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/log/log-list.ts b/src/cli/log/log-list.ts index 73f59e942..f81eea004 100644 --- a/src/cli/log/log-list.ts +++ b/src/cli/log/log-list.ts @@ -9,7 +9,9 @@ import { FrodoCommand } from '../FrodoCommand'; const { getConnectionProfile, saveConnectionProfile } = frodo.conn; const { getLogSources } = frodo.cloud.log; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/log/log-tail.ts b/src/cli/log/log-tail.ts index 490d32de7..e5159e35f 100644 --- a/src/cli/log/log-tail.ts +++ b/src/cli/log/log-tail.ts @@ -11,7 +11,9 @@ import { sourcesOptionM } from './log'; const { resolveLevel } = frodo.cloud.log; const { getConnectionProfile, saveConnectionProfile } = frodo.conn; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY } = frodo.utils.constants; + +const deploymentTypes = [CLOUD_DEPLOYMENT_TYPE_KEY]; export default function setup() { const program = new FrodoCommand( diff --git a/src/cli/mapping/mapping-delete.ts b/src/cli/mapping/mapping-delete.ts index df53cca76..a4940a516 100644 --- a/src/cli/mapping/mapping-delete.ts +++ b/src/cli/mapping/mapping-delete.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,13 @@ import { deleteMapping, deleteMappings } from '../../ops/MappingOps'; import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo mapping delete', [], deploymentTypes); diff --git a/src/cli/mapping/mapping-export.ts b/src/cli/mapping/mapping-export.ts index 72f4fca51..d1c163e1f 100644 --- a/src/cli/mapping/mapping-export.ts +++ b/src/cli/mapping/mapping-export.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -9,7 +10,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo mapping export', [], deploymentTypes); diff --git a/src/cli/mapping/mapping-import.ts b/src/cli/mapping/mapping-import.ts index 752069460..a18c6bf08 100644 --- a/src/cli/mapping/mapping-import.ts +++ b/src/cli/mapping/mapping-import.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -10,7 +11,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo mapping import', [], deploymentTypes); diff --git a/src/cli/mapping/mapping-list.ts b/src/cli/mapping/mapping-list.ts index b12b56a12..0cb6c486d 100644 --- a/src/cli/mapping/mapping-list.ts +++ b/src/cli/mapping/mapping-list.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,13 @@ import { listMappings } from '../../ops/MappingOps'; import { verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo mapping list', [], deploymentTypes); diff --git a/src/cli/mapping/mapping-rename.ts b/src/cli/mapping/mapping-rename.ts index 95d293fc9..43ef95737 100644 --- a/src/cli/mapping/mapping-rename.ts +++ b/src/cli/mapping/mapping-rename.ts @@ -1,3 +1,4 @@ +import { frodo } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -5,7 +6,13 @@ import { renameMapping, renameMappings } from '../../ops/MappingOps'; import { printMessage, verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo mapping rename', [], deploymentTypes); diff --git a/src/cli/promote/promote.ts b/src/cli/promote/promote.ts index 61c2cdb7e..1c7dd09e2 100644 --- a/src/cli/promote/promote.ts +++ b/src/cli/promote/promote.ts @@ -1,4 +1,4 @@ -import { FrodoError } from '@rockcarver/frodo-lib'; +import { frodo, FrodoError } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -6,7 +6,13 @@ import { compareExportToDirectory } from '../../ops/PromoteOps'; import { verboseMessage } from '../../utils/Console.js'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('promote', [], deploymentTypes); diff --git a/src/cli/theme/theme-delete.ts b/src/cli/theme/theme-delete.ts index 5608ceadc..3558a4b62 100644 --- a/src/cli/theme/theme-delete.ts +++ b/src/cli/theme/theme-delete.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -10,7 +10,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo theme delete', [], deploymentTypes); diff --git a/src/cli/theme/theme-export.ts b/src/cli/theme/theme-export.ts index bf7e430a4..b8077b171 100644 --- a/src/cli/theme/theme-export.ts +++ b/src/cli/theme/theme-export.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -11,7 +11,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo theme export', [], deploymentTypes); diff --git a/src/cli/theme/theme-import.ts b/src/cli/theme/theme-import.ts index ef3805417..5678007fc 100644 --- a/src/cli/theme/theme-import.ts +++ b/src/cli/theme/theme-import.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -12,7 +12,13 @@ import { import { printMessage, verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo theme import', [], deploymentTypes); diff --git a/src/cli/theme/theme-list.ts b/src/cli/theme/theme-list.ts index b4681074a..978fc2124 100644 --- a/src/cli/theme/theme-list.ts +++ b/src/cli/theme/theme-list.ts @@ -1,4 +1,4 @@ -import { state } from '@rockcarver/frodo-lib'; +import { frodo, state } from '@rockcarver/frodo-lib'; import { Option } from 'commander'; import { getTokens } from '../../ops/AuthenticateOps'; @@ -6,7 +6,13 @@ import { listThemes } from '../../ops/ThemeOps'; import { verboseMessage } from '../../utils/Console'; import { FrodoCommand } from '../FrodoCommand'; -const deploymentTypes = ['cloud', 'forgeops']; +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; export default function setup() { const program = new FrodoCommand('frodo theme list', [], deploymentTypes); diff --git a/test/client_cli/en/__snapshots__/config-manager-export-connector-definitions.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-export-connector-definitions.test.js.snap index 1141fb127..450978957 100644 --- a/test/client_cli/en/__snapshots__/config-manager-export-connector-definitions.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-export-connector-definitions.test.js.snap @@ -19,8 +19,6 @@ Arguments: journeys/trees. password Password. -Deployment: Cloud-only - Options: -n, --name Get connector-definition from specified name/id, without the type prefix. diff --git a/test/client_cli/en/__snapshots__/config-manager-export-connector-mappings.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-export-connector-mappings.test.js.snap index 20fe9dbb4..52e660242 100644 --- a/test/client_cli/en/__snapshots__/config-manager-export-connector-mappings.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-export-connector-mappings.test.js.snap @@ -16,8 +16,6 @@ Arguments: appropriate rights to manage authentication journeys/trees. password Password. -Deployment: Cloud-only - Options: -h, --help Help -hh, --help-more Help with all options. diff --git a/test/client_cli/en/__snapshots__/config-manager-export-cors.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-export-cors.test.js.snap index 5edccf30d..6cd07952e 100644 --- a/test/client_cli/en/__snapshots__/config-manager-export-cors.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-export-cors.test.js.snap @@ -16,8 +16,6 @@ Arguments: appropriate rights to manage authentication journeys/trees. password Password. -Deployment: Cloud-only - Options: -h, --help Help -hh, --help-more Help with all options. diff --git a/test/client_cli/en/__snapshots__/config-manager-export-csp.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-export-csp.test.js.snap index 6c6ffdef0..a8c2b9716 100644 --- a/test/client_cli/en/__snapshots__/config-manager-export-csp.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-export-csp.test.js.snap @@ -16,8 +16,6 @@ Arguments: appropriate rights to manage authentication journeys/trees. password Password. -Deployment: Cloud-only - Options: -f, --file The CSP_OVERRIDES json file. ex: "/home/trivir/Documents/csp-overrides.json", or diff --git a/test/client_cli/en/__snapshots__/config-manager-export-raw.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-export-raw.test.js.snap index 5b760f3f6..ad6ed5308 100644 --- a/test/client_cli/en/__snapshots__/config-manager-export-raw.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-export-raw.test.js.snap @@ -17,8 +17,6 @@ Arguments: journeys/trees. password Password. -Deployment: Cloud-only - Options: -f, --config-file The file path of the service object config file. -h, --help Help diff --git a/test/client_cli/en/__snapshots__/promote.test.js.snap b/test/client_cli/en/__snapshots__/promote.test.js.snap index afc138d65..5b7edfcac 100644 --- a/test/client_cli/en/__snapshots__/promote.test.js.snap +++ b/test/client_cli/en/__snapshots__/promote.test.js.snap @@ -19,8 +19,6 @@ Arguments: authentication journeys/trees. password Password. -Deployment: Cloud-only - Options: -E, --frodo-export-dir The directory where the frodo export is located. diff --git a/test/client_cli/en/__snapshots__/root.test.js.snap b/test/client_cli/en/__snapshots__/root.test.js.snap index 613f76e54..2409ff569 100644 --- a/test/client_cli/en/__snapshots__/root.test.js.snap +++ b/test/client_cli/en/__snapshots__/root.test.js.snap @@ -30,6 +30,7 @@ Commands: mapping Manage IDM mappings. node Manage custom nodes. oauth Manage OAuth2 clients and providers. + promote Prepares a tenant to be promoted realm Manage realms. role Manage internal (authorization) roles. saml Manage SAML entity providers and circles of @@ -48,7 +49,6 @@ Commands: esv Manage environment secrets and variables (ESVs). log|logs List/View Identity Cloud logs - promote Prepares a tenant to be promoted Utilities: conn|connection Manage connection profiles. From df164aeba827682a1b7f36ba26e20972be493069 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 15:44:59 +0000 Subject: [PATCH 09/69] Updated changelog and version for release v4.0.0-39 --- CHANGELOG.md | 5 ++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c5687c09..a80f7ce36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.0.0-39] - 2026-04-03 + ## [4.0.0-38] - 2026-04-03 ## [4.0.0-37] - 2026-03-30 @@ -2239,7 +2241,8 @@ Frodo CLI 2.x automatically refreshes session and access tokens before they expi - Fixed problem with adding connection profiles - Miscellaneous bug fixes -[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-38...HEAD +[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-39...HEAD +[4.0.0-39]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-38...v4.0.0-39 [4.0.0-38]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-37...v4.0.0-38 [4.0.0-37]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-36...v4.0.0-37 [4.0.0-36]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-35...v4.0.0-36 diff --git a/package-lock.json b/package-lock.json index 63ff24be4..8f5378218 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-38", + "version": "4.0.0-39", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-38", + "version": "4.0.0-39", "license": "MIT", "bin": { "frodo": "dist/launch.cjs" diff --git a/package.json b/package.json index 18a2dd848..15544aa52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-38", + "version": "4.0.0-39", "type": "module", "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.", "keywords": [ From 4b5fc45641530594235a6d7e8ea9627aa0865de3 Mon Sep 17 00:00:00 2001 From: dallinjsevy Date: Fri, 3 Apr 2026 09:58:14 -0600 Subject: [PATCH 10/69] feat: Add config-manager push access-config command (#581) * feat: Add config-manager push access-config command * feat: Add config-manager push managed-objects (#579) * feat: Add config-manager push managed-objects * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * Updated changelog and version for release v4.0.0-35 * feat: Add config-manager push org-privileges command. (#574) * feat: Add config-manager push org-privileges command. * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * feat: Add config-manager push org-privileges command. * Rebase and update to frodo-lib 4.0.0-34 * Update snapshots * Updated snapshots * Updated snapshots * Updated snapshots --------- Co-authored-by: Volker Scheuber * Updated changelog and version for release v4.0.0-36 * adjusted path string to pull csp not cps (#578) * Updated changelog and version for release v4.0.0-37 * feat: Add config-manager push managed-objects * Update snapshots * chore: update @rockcarver/frodo-lib to version 4.0.0-35 --------- Co-authored-by: Huston Franklin Co-authored-by: Volker Scheuber Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: devintrivir * Update snapshots * Updated changelog and version for release v4.0.0-38 * deployment type adjustments and switched to constant usage over string declaration (#580) * Updated changelog and version for release v4.0.0-39 * feat: Add config-manager push access-config command --------- Co-authored-by: Huston Franklin Co-authored-by: Volker Scheuber Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: devintrivir --- .../config-manager-push-access-config.ts | 52 ++ .../config-manager-push.ts | 2 + .../FrConfigAccessConfigOps.ts | 22 +- ...ig-manager-push-access-config.test.js.snap | 25 + .../config-manager-push.test.js.snap | 1 + .../config-manager-push-access-config.test.js | 10 + ...anager-push-access-config.e2e.test.js.snap | 8 + ...fig-manager-push-access-config.e2e.test.js | 73 ++ .../forgeops/access-config/access.json | 334 +++++++++ .../am_1076162899/recording.har | 631 ++++++++++++++++++ .../oauth2_393036114/recording.har | 289 ++++++++ .../openidm_3290118515/recording.har | 167 +++++ 12 files changed, 1613 insertions(+), 1 deletion(-) create mode 100644 src/cli/config-manager/config-manager-push/config-manager-push-access-config.ts create mode 100644 test/client_cli/en/__snapshots__/config-manager-push-access-config.test.js.snap create mode 100644 test/client_cli/en/config-manager-push-access-config.test.js create mode 100644 test/e2e/__snapshots__/config-manager-push-access-config.e2e.test.js.snap create mode 100644 test/e2e/config-manager-push-access-config.e2e.test.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/access-config/access.json create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/openidm_3290118515/recording.har diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-access-config.ts b/src/cli/config-manager/config-manager-push/config-manager-push-access-config.ts new file mode 100644 index 000000000..348444583 --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-access-config.ts @@ -0,0 +1,52 @@ +import { frodo } from '@rockcarver/frodo-lib'; + +import { configManagerImportAccessConfig } from '../../../configManagerOps/FrConfigAccessConfigOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { printMessage, verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push access-config', + [], + deploymentTypes + ); + + program + .description('Import access configuration.') + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + + if (await getTokens(false, true, deploymentTypes)) { + verboseMessage('Importing access configuration...'); + const outcome = await configManagerImportAccessConfig(); + if (!outcome) process.exitCode = 1; + } + // unrecognized combination of options or no options + else { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + program.help(); + process.exitCode = 1; + } + }); + + return program; +} diff --git a/src/cli/config-manager/config-manager-push/config-manager-push.ts b/src/cli/config-manager/config-manager-push/config-manager-push.ts index e35727fe4..20c0ba659 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push.ts @@ -1,4 +1,5 @@ import { FrodoStubCommand } from '../../FrodoCommand'; +import AccessConfig from './config-manager-push-access-config'; import EmailProvider from './config-manager-push-email-provider'; import EmailTemplates from './config-manager-push-email-templates'; import Endpoints from './config-manager-push-endpoints'; @@ -29,6 +30,7 @@ export default function setup() { program.addCommand(Schedules().name('schedules')); program.addCommand(OrgPrivileges().name('org-privileges')); program.addCommand(ManagedObjects().name('managed-objects')); + program.addCommand(AccessConfig().name('access-config')); return program; } diff --git a/src/configManagerOps/FrConfigAccessConfigOps.ts b/src/configManagerOps/FrConfigAccessConfigOps.ts index 2800cb277..5dbcb81ed 100644 --- a/src/configManagerOps/FrConfigAccessConfigOps.ts +++ b/src/configManagerOps/FrConfigAccessConfigOps.ts @@ -1,9 +1,10 @@ import { frodo } from '@rockcarver/frodo-lib'; +import fs from 'fs'; import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity } = frodo.idm.config; +const { exportConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** @@ -34,3 +35,22 @@ export async function configManagerExportAccessConfig( } return false; } + +/** + * Import access configuration from fr-config-manager format. + * @return {Promise} a promise that resolves to true if successful, false otherwise + */ +export async function configManagerImportAccessConfig(): Promise { + try { + const accessConfigFile = getFilePath('access-config/access.json'); + const readAccessConfig = fs.readFileSync(accessConfigFile, 'utf-8'); + let accessConfigImportData = JSON.parse(readAccessConfig); + const id = accessConfigImportData._id; + accessConfigImportData = { idm: { [id]: accessConfigImportData } }; + await importConfigEntities(accessConfigImportData); + return true; + } catch (error) { + printError(error, `Error importing config entity access`); + } + return false; +} diff --git a/test/client_cli/en/__snapshots__/config-manager-push-access-config.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-access-config.test.js.snap new file mode 100644 index 000000000..164f0edb9 --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-access-config.test.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push access-config' should be expected english 1`] = ` +"Usage: frodo config-manager push access-config [options] [host] [realm] [username] [password] + +[Experimental] Import access configuration. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. To use a + connection profile, just specify a unique substring or + alias. + realm Realm. Specify realm as '/' for the root realm or 'realm' or + '/parent/child' otherwise. (default: "alpha" for Identity + Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication journeys/trees. + password Password. + +Options: + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and usage + examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap index 4bf39cf85..4a8dbe9b8 100644 --- a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap @@ -13,6 +13,7 @@ Options: examples. Commands: + access-config [Experimental] Import access configuration. email-provider [Experimental] Import email provider configuration. email-templates [Experimental] Import email template objects. endpoints [Experimental] Import custom endpoints objects. diff --git a/test/client_cli/en/config-manager-push-access-config.test.js b/test/client_cli/en/config-manager-push-access-config.test.js new file mode 100644 index 000000000..0906307ec --- /dev/null +++ b/test/client_cli/en/config-manager-push-access-config.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager push access-config --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push access-config' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); diff --git a/test/e2e/__snapshots__/config-manager-push-access-config.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-access-config.e2e.test.js.snap new file mode 100644 index 000000000..4fd7395cd --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-access-config.e2e.test.js.snap @@ -0,0 +1,8 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager push access-config "frodo config-manager push access-config -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import the access config into forgeops" 1`] = `""`; + +exports[`frodo config-manager push access-config "frodo config-manager push access-config -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import the access config into forgeops" 2`] = ` +"Experimental feature in use: 'frodo config-manager push access-config'. This feature may change without notice. +" +`; diff --git a/test/e2e/config-manager-push-access-config.e2e.test.js b/test/e2e/config-manager-push-access-config.e2e.test.js new file mode 100644 index 000000000..70758578f --- /dev/null +++ b/test/e2e/config-manager-push-access-config.e2e.test.js @@ -0,0 +1,73 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +// ForgeOps +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/am frodo config-manager push access-config -D test/e2e/exports/fr-config-manager/forgeops -m forgeops +*/ + +import cp from 'child_process'; +import { promisify } from 'util'; +import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { forgeops_connection as fc } from './utils/TestConfig'; + +const exec = promisify(cp.exec); + +process.env['FRODO_MOCK'] = '1'; +const forgeopsEnv = getEnv(fc); + +const allDirectory = "test/e2e/exports/fr-config-manager/forgeops"; + +describe('frodo config-manager push access-config', () => { + test(`"frodo config-manager push access-config -D ${allDirectory} -m forgeops": should import the access config into forgeops"`, async () => { + const CMD = `frodo config-manager push access-config -D ${allDirectory} -m forgeops`; + const { stdout, stderr } = await exec(CMD, forgeopsEnv); + expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + }); +}); diff --git a/test/e2e/exports/fr-config-manager/forgeops/access-config/access.json b/test/e2e/exports/fr-config-manager/forgeops/access-config/access.json new file mode 100644 index 000000000..6816b27b1 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/access-config/access.json @@ -0,0 +1,334 @@ +{ + "_id": "access", + "configs": [ + { + "actions": "", + "methods": "read", + "pattern": "health", + "roles": "*" + }, + { + "actions": "*", + "methods": "read", + "pattern": "info/*", + "roles": "*" + }, + { + "actions": "login,logout", + "methods": "read,action", + "pattern": "authentication", + "roles": "*" + }, + { + "actions": "*", + "methods": "read", + "pattern": "config/ui/themeconfig", + "roles": "*" + }, + { + "actions": "*", + "methods": "read", + "pattern": "config/ui/themerealm", + "roles": "*" + }, + { + "actions": "*", + "methods": "read", + "pattern": "config/ui/theme-*", + "roles": "*" + }, + { + "actions": "*", + "methods": "read", + "pattern": "config/uilocale/*", + "roles": "*" + }, + { + "actions": "*", + "methods": "read", + "pattern": "config/fieldPolicy/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "methods": "read", + "pattern": "info/uiconfig", + "roles": "*" + }, + { + "actions": "*", + "methods": "read", + "pattern": "config/ui/dashboard", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "methods": "query", + "pattern": "info/features", + "roles": "*" + }, + { + "actions": "listPrivileges", + "methods": "action", + "pattern": "privilege", + "roles": "*" + }, + { + "actions": "*", + "methods": "read", + "pattern": "privilege/*", + "roles": "*" + }, + { + "actions": "validate", + "methods": "action", + "pattern": "util/validateQueryFilter", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "customAuthz": "checkIfAnyFeatureEnabled('kba')", + "methods": "read", + "pattern": "selfservice/kba", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "", + "customAuthz": "isMyProfile()", + "methods": "read,query", + "pattern": "profile/*", + "roles": "*" + }, + { + "actions": "*", + "methods": "read", + "pattern": "schema/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "methods": "action,query", + "pattern": "consent", + "roles": "internal/role/openidm-authorized" + }, + { + "customAuthz": "checkIfApiRequest()", + "methods": "read", + "pattern": "*", + "roles": "internal/role/openidm-admin" + }, + { + "methods": "read", + "pattern": "*", + "roles": "~rcsclient-authorized", + "servlet": "openicf" + }, + { + "actions": "*", + "excludePatterns": "repo,repo/*,file/iwa/*", + "methods": "*", + "pattern": "*", + "roles": "internal/role/openidm-admin" + }, + { + "actions": "", + "methods": "create,read,update,delete,patch,query", + "pattern": "system/*", + "roles": "internal/role/openidm-admin" + }, + { + "actions": "*", + "methods": "script", + "pattern": "system/*", + "roles": "internal/role/openidm-admin" + }, + { + "actions": "test,testConfig,createconfiguration,liveSync,authenticate", + "methods": "action", + "pattern": "system/*", + "roles": "internal/role/openidm-admin" + }, + { + "actions": "*", + "customAuthz": "disallowCommandAction()", + "methods": "*", + "pattern": "repo", + "roles": "internal/role/openidm-admin" + }, + { + "actions": "*", + "customAuthz": "disallowCommandAction()", + "methods": "*", + "pattern": "repo/*", + "roles": "internal/role/openidm-admin" + }, + { + "actions": "command", + "customAuthz": "request.additionalParameters.commandId === 'delete-mapping-links'", + "methods": "action", + "pattern": "repo/link", + "roles": "internal/role/openidm-admin" + }, + { + "methods": "create,read,query,patch", + "pattern": "managed/*", + "roles": "internal/role/platform-provisioning" + }, + { + "methods": "read,query", + "pattern": "internal/role/*", + "roles": "internal/role/platform-provisioning" + }, + { + "actions": "*", + "methods": "create,read,action,update", + "pattern": "profile/*", + "roles": "internal/role/platform-provisioning" + }, + { + "actions": "*", + "methods": "read,action", + "pattern": "policy/*", + "roles": "internal/role/platform-provisioning" + }, + { + "methods": "read", + "pattern": "schema/*", + "roles": "internal/role/platform-provisioning" + }, + { + "actions": "*", + "methods": "action,query", + "pattern": "consent", + "roles": "internal/role/platform-provisioning" + }, + { + "methods": "read", + "pattern": "selfservice/kba", + "roles": "internal/role/platform-provisioning" + }, + { + "methods": "read", + "pattern": "selfservice/terms", + "roles": "internal/role/platform-provisioning" + }, + { + "methods": "read", + "pattern": "identityProviders", + "roles": "internal/role/platform-provisioning" + }, + { + "actions": "sendTemplate", + "methods": "action", + "pattern": "external/email", + "roles": "internal/role/platform-provisioning" + }, + { + "actions": "authenticate", + "methods": "action", + "pattern": "system/*", + "roles": "internal/role/platform-provisioning" + }, + { + "actions": "*", + "methods": "read,action", + "pattern": "policy/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "methods": "read", + "pattern": "config/ui/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "bind,unbind", + "customAuthz": "ownDataOnly()", + "methods": "read,action,delete", + "pattern": "*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "patch", + "customAuthz": "ownDataOnly() && onlyEditableManagedObjectProperties('user', [])", + "methods": "update,patch,action", + "pattern": "*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "methods": "read", + "pattern": "endpoint/getprocessesforuser", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "methods": "query", + "pattern": "endpoint/gettasksview", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "complete", + "customAuthz": "isMyTask()", + "methods": "action", + "pattern": "workflow/taskinstance/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "customAuthz": "canUpdateTask()", + "methods": "read,update", + "pattern": "workflow/taskinstance/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "customAuthz": "isAllowedToStartProcess()", + "methods": "create", + "pattern": "workflow/processinstance", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "read", + "customAuthz": "isOneOfMyWorkflows()", + "methods": "*", + "pattern": "workflow/processdefinition/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "patch", + "customAuthz": "isQueryOneOf({'managed/user': ['for-userName']}) && restrictPatchToFields(['password'])", + "methods": "patch,action", + "pattern": "managed/user", + "roles": "internal/role/openidm-cert" + }, + { + "actions": "*", + "customAuthz": "ownRelationshipProperty('_meta', false)", + "methods": "read", + "pattern": "internal/usermeta/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "customAuthz": "ownRelationshipProperty('_notifications', true)", + "methods": "read,delete", + "pattern": "internal/notification/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "*", + "customAuthz": "ownRelationshipCollection(['_meta','_notifications'])", + "methods": "read,query", + "pattern": "managed/user/*", + "roles": "internal/role/openidm-authorized" + }, + { + "actions": "deleteNotificationsForTarget", + "customAuthz": "request.additionalParameters.target === (context.security.authorization.component + '/' + context.security.authorization.id)", + "methods": "action", + "pattern": "notification", + "roles": "internal/role/openidm-authorized" + } + ] +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/am_1076162899/recording.har new file mode 100644 index 000000000..6433f86be --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/am_1076162899/recording.har @@ -0,0 +1,631 @@ +{ + "log": { + "_recordingName": "config-manager/push/access-config/0_D_m/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-873c50db-20d1-4822-aae8-737e3d3e29a9" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 370, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 587, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 587, + "text": "{\"_id\":\"*\",\"_rev\":\"2075994313\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"nodeDesignerXuiEnabled\":true}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 16 Mar 2026 20:43:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "587" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2075994313\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-16T20:43:13.910Z", + "time": 27, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 27 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-873c50db-20d1-4822-aae8-737e3d3e29a9" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "41ghjnKpNFAFU/HXw82HbFbitYNOOJ0g" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 497, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 167, + "content": { + "mimeType": "application/json", + "size": 167, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 16 Mar 2026 20:43:16 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "167" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 693, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-16T20:43:13.943Z", + "time": 23, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 23 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 128, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-873c50db-20d1-4822-aae8-737e3d3e29a9" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "128" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "https://platform.dev.trivir.com/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 290, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 290, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,ou=am-config\",\"realm\":\"/\",\"latestAccessTime\":\"2026-03-16T20:43:16Z\",\"maxIdleExpirationTime\":\"2026-03-16T21:13:16Z\",\"maxSessionExpirationTime\":\"2026-03-16T22:43:15Z\",\"properties\":{\"AMCtxId\":\"43ba9500-5021-4093-850b-dc18b8548553-9368\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 16 Mar 2026 20:43:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "290" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 610, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-16T20:43:13.972Z", + "time": 6, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 6 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-873c50db-20d1-4822-aae8-737e3d3e29a9" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 520, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 257, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 257, + "text": "{\"_id\":\"version\",\"_rev\":\"-466575464\",\"version\":\"8.0.1\",\"fullVersion\":\"ForgeRock Access Management 8.0.1 Build b59bc0908346197b0c33afcb9e733d0400feeea1 (2025-April-15 11:37)\",\"revision\":\"b59bc0908346197b0c33afcb9e733d0400feeea1\",\"date\":\"2025-April-15 11:37\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 16 Mar 2026 20:43:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "257" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-466575464\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-16T20:43:13.985Z", + "time": 6, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 6 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/oauth2_393036114/recording.har new file mode 100644 index 000000000..e7ba05cda --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/access-config/0_D_m/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "a684e2f67fd67a4263878c3124af167a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 365, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-873c50db-20d1-4822-aae8-737e3d3e29a9" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "content-length", + "value": "365" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 565, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&scope=fr:idm:* openid&response_type=code&client_id=idm-admin-ui&csrf=0usX1WASVp6p5r_p3urdcAhSKTc.*AAJTSQACMDIAAlNLABx0Q1AzbXJWc0cxelhNYmlGU0F0RExyRUthMFE9AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=mm8cCDw4a6S30pP8UUwqibff4VY_xIRZWUbaJoUxweA&code_challenge_method=S256" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/authorize" + }, + "response": { + "bodySize": 0, + "content": { + "mimeType": "text/plain", + "size": 0 + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "expires": "1970-01-01T00:00:00.000Z", + "httpOnly": true, + "name": "OAUTH_REQUEST_ATTRIBUTES", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 16 Mar 2026 20:43:16 GMT" + }, + { + "name": "content-length", + "value": "0" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "OAUTH_REQUEST_ATTRIBUTES=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "location", + "value": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=RxS1iJXJcDU5M-dN0_UNlo6RJ-Q&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 673, + "httpVersion": "HTTP/1.1", + "redirectURL": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=RxS1iJXJcDU5M-dN0_UNlo6RJ-Q&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-03-16T20:43:13.999Z", + "time": 18, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 18 + } + }, + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 224, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-873c50db-20d1-4822-aae8-737e3d3e29a9" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "224" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "client_id=idm-admin-ui&redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&grant_type=authorization_code&code=RxS1iJXJcDU5M-dN0_UNlo6RJ-Q&code_verifier=cq0xK_e--4_0A1WFHS7qb4AwZZ4Hl_u-IJmDaAlsz0E" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1247, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1247, + "text": "{\"access_token\":\"\",\"scope\":\"openid fr:idm:*\",\"id_token\":\"\",\"token_type\":\"Bearer\",\"expires_in\":239}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 16 Mar 2026 20:43:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1247" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 404, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-16T20:43:14.024Z", + "time": 52, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 52 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/openidm_3290118515/recording.har new file mode 100644 index 000000000..2899bb885 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/access-config_155956572/0_D_m_314327836/openidm_3290118515/recording.har @@ -0,0 +1,167 @@ +{ + "log": { + "_recordingName": "config-manager/push/access-config/0_D_m/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "3a340534477e0620f6434cc44f8d5352", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 6286, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-873c50db-20d1-4822-aae8-737e3d3e29a9" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "6286" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 410, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"access\",\"configs\":[{\"actions\":\"\",\"methods\":\"read\",\"pattern\":\"health\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"info/*\",\"roles\":\"*\"},{\"actions\":\"login,logout\",\"methods\":\"read,action\",\"pattern\":\"authentication\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/themeconfig\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/themerealm\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/theme-*\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/uilocale/*\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/fieldPolicy/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"info/uiconfig\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/dashboard\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"query\",\"pattern\":\"info/features\",\"roles\":\"*\"},{\"actions\":\"listPrivileges\",\"methods\":\"action\",\"pattern\":\"privilege\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"privilege/*\",\"roles\":\"*\"},{\"actions\":\"validate\",\"methods\":\"action\",\"pattern\":\"util/validateQueryFilter\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"checkIfAnyFeatureEnabled('kba')\",\"methods\":\"read\",\"pattern\":\"selfservice/kba\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"\",\"customAuthz\":\"isMyProfile()\",\"methods\":\"read,query\",\"pattern\":\"profile/*\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"schema/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"action,query\",\"pattern\":\"consent\",\"roles\":\"internal/role/openidm-authorized\"},{\"customAuthz\":\"checkIfApiRequest()\",\"methods\":\"read\",\"pattern\":\"*\",\"roles\":\"internal/role/openidm-admin\"},{\"methods\":\"read\",\"pattern\":\"*\",\"roles\":\"~rcsclient-authorized\",\"servlet\":\"openicf\"},{\"actions\":\"*\",\"excludePatterns\":\"repo,repo/*,file/iwa/*\",\"methods\":\"*\",\"pattern\":\"*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"\",\"methods\":\"create,read,update,delete,patch,query\",\"pattern\":\"system/*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"*\",\"methods\":\"script\",\"pattern\":\"system/*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"test,testConfig,createconfiguration,liveSync,authenticate\",\"methods\":\"action\",\"pattern\":\"system/*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"*\",\"customAuthz\":\"disallowCommandAction()\",\"methods\":\"*\",\"pattern\":\"repo\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"*\",\"customAuthz\":\"disallowCommandAction()\",\"methods\":\"*\",\"pattern\":\"repo/*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"command\",\"customAuthz\":\"request.additionalParameters.commandId === 'delete-mapping-links'\",\"methods\":\"action\",\"pattern\":\"repo/link\",\"roles\":\"internal/role/openidm-admin\"},{\"methods\":\"create,read,query,patch\",\"pattern\":\"managed/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read,query\",\"pattern\":\"internal/role/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"*\",\"methods\":\"create,read,action,update\",\"pattern\":\"profile/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"*\",\"methods\":\"read,action\",\"pattern\":\"policy/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read\",\"pattern\":\"schema/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"*\",\"methods\":\"action,query\",\"pattern\":\"consent\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read\",\"pattern\":\"selfservice/kba\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read\",\"pattern\":\"selfservice/terms\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read\",\"pattern\":\"identityProviders\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"sendTemplate\",\"methods\":\"action\",\"pattern\":\"external/email\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"authenticate\",\"methods\":\"action\",\"pattern\":\"system/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"*\",\"methods\":\"read,action\",\"pattern\":\"policy/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"bind,unbind\",\"customAuthz\":\"ownDataOnly()\",\"methods\":\"read,action,delete\",\"pattern\":\"*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"patch\",\"customAuthz\":\"ownDataOnly() && onlyEditableManagedObjectProperties('user', [])\",\"methods\":\"update,patch,action\",\"pattern\":\"*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"endpoint/getprocessesforuser\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"query\",\"pattern\":\"endpoint/gettasksview\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"complete\",\"customAuthz\":\"isMyTask()\",\"methods\":\"action\",\"pattern\":\"workflow/taskinstance/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"canUpdateTask()\",\"methods\":\"read,update\",\"pattern\":\"workflow/taskinstance/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"isAllowedToStartProcess()\",\"methods\":\"create\",\"pattern\":\"workflow/processinstance\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"read\",\"customAuthz\":\"isOneOfMyWorkflows()\",\"methods\":\"*\",\"pattern\":\"workflow/processdefinition/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"patch\",\"customAuthz\":\"isQueryOneOf({'managed/user': ['for-userName']}) && restrictPatchToFields(['password'])\",\"methods\":\"patch,action\",\"pattern\":\"managed/user\",\"roles\":\"internal/role/openidm-cert\"},{\"actions\":\"*\",\"customAuthz\":\"ownRelationshipProperty('_meta', false)\",\"methods\":\"read\",\"pattern\":\"internal/usermeta/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"ownRelationshipProperty('_notifications', true)\",\"methods\":\"read,delete\",\"pattern\":\"internal/notification/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"ownRelationshipCollection(['_meta','_notifications'])\",\"methods\":\"read,query\",\"pattern\":\"managed/user/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"deleteNotificationsForTarget\",\"customAuthz\":\"request.additionalParameters.target === (context.security.authorization.component + '/' + context.security.authorization.id)\",\"methods\":\"action\",\"pattern\":\"notification\",\"roles\":\"internal/role/openidm-authorized\"}]}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/config/access" + }, + "response": { + "bodySize": 6286, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 6286, + "text": "{\"_id\":\"access\",\"configs\":[{\"actions\":\"\",\"methods\":\"read\",\"pattern\":\"health\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"info/*\",\"roles\":\"*\"},{\"actions\":\"login,logout\",\"methods\":\"read,action\",\"pattern\":\"authentication\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/themeconfig\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/themerealm\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/theme-*\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/uilocale/*\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/fieldPolicy/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"info/uiconfig\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/dashboard\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"query\",\"pattern\":\"info/features\",\"roles\":\"*\"},{\"actions\":\"listPrivileges\",\"methods\":\"action\",\"pattern\":\"privilege\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"privilege/*\",\"roles\":\"*\"},{\"actions\":\"validate\",\"methods\":\"action\",\"pattern\":\"util/validateQueryFilter\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"checkIfAnyFeatureEnabled('kba')\",\"methods\":\"read\",\"pattern\":\"selfservice/kba\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"\",\"customAuthz\":\"isMyProfile()\",\"methods\":\"read,query\",\"pattern\":\"profile/*\",\"roles\":\"*\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"schema/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"action,query\",\"pattern\":\"consent\",\"roles\":\"internal/role/openidm-authorized\"},{\"customAuthz\":\"checkIfApiRequest()\",\"methods\":\"read\",\"pattern\":\"*\",\"roles\":\"internal/role/openidm-admin\"},{\"methods\":\"read\",\"pattern\":\"*\",\"roles\":\"~rcsclient-authorized\",\"servlet\":\"openicf\"},{\"actions\":\"*\",\"excludePatterns\":\"repo,repo/*,file/iwa/*\",\"methods\":\"*\",\"pattern\":\"*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"\",\"methods\":\"create,read,update,delete,patch,query\",\"pattern\":\"system/*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"*\",\"methods\":\"script\",\"pattern\":\"system/*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"test,testConfig,createconfiguration,liveSync,authenticate\",\"methods\":\"action\",\"pattern\":\"system/*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"*\",\"customAuthz\":\"disallowCommandAction()\",\"methods\":\"*\",\"pattern\":\"repo\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"*\",\"customAuthz\":\"disallowCommandAction()\",\"methods\":\"*\",\"pattern\":\"repo/*\",\"roles\":\"internal/role/openidm-admin\"},{\"actions\":\"command\",\"customAuthz\":\"request.additionalParameters.commandId === 'delete-mapping-links'\",\"methods\":\"action\",\"pattern\":\"repo/link\",\"roles\":\"internal/role/openidm-admin\"},{\"methods\":\"create,read,query,patch\",\"pattern\":\"managed/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read,query\",\"pattern\":\"internal/role/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"*\",\"methods\":\"create,read,action,update\",\"pattern\":\"profile/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"*\",\"methods\":\"read,action\",\"pattern\":\"policy/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read\",\"pattern\":\"schema/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"*\",\"methods\":\"action,query\",\"pattern\":\"consent\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read\",\"pattern\":\"selfservice/kba\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read\",\"pattern\":\"selfservice/terms\",\"roles\":\"internal/role/platform-provisioning\"},{\"methods\":\"read\",\"pattern\":\"identityProviders\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"sendTemplate\",\"methods\":\"action\",\"pattern\":\"external/email\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"authenticate\",\"methods\":\"action\",\"pattern\":\"system/*\",\"roles\":\"internal/role/platform-provisioning\"},{\"actions\":\"*\",\"methods\":\"read,action\",\"pattern\":\"policy/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"config/ui/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"bind,unbind\",\"customAuthz\":\"ownDataOnly()\",\"methods\":\"read,action,delete\",\"pattern\":\"*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"patch\",\"customAuthz\":\"ownDataOnly() && onlyEditableManagedObjectProperties('user', [])\",\"methods\":\"update,patch,action\",\"pattern\":\"*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"read\",\"pattern\":\"endpoint/getprocessesforuser\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"methods\":\"query\",\"pattern\":\"endpoint/gettasksview\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"complete\",\"customAuthz\":\"isMyTask()\",\"methods\":\"action\",\"pattern\":\"workflow/taskinstance/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"canUpdateTask()\",\"methods\":\"read,update\",\"pattern\":\"workflow/taskinstance/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"isAllowedToStartProcess()\",\"methods\":\"create\",\"pattern\":\"workflow/processinstance\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"read\",\"customAuthz\":\"isOneOfMyWorkflows()\",\"methods\":\"*\",\"pattern\":\"workflow/processdefinition/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"patch\",\"customAuthz\":\"isQueryOneOf({'managed/user': ['for-userName']}) && restrictPatchToFields(['password'])\",\"methods\":\"patch,action\",\"pattern\":\"managed/user\",\"roles\":\"internal/role/openidm-cert\"},{\"actions\":\"*\",\"customAuthz\":\"ownRelationshipProperty('_meta', false)\",\"methods\":\"read\",\"pattern\":\"internal/usermeta/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"ownRelationshipProperty('_notifications', true)\",\"methods\":\"read,delete\",\"pattern\":\"internal/notification/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"*\",\"customAuthz\":\"ownRelationshipCollection(['_meta','_notifications'])\",\"methods\":\"read,query\",\"pattern\":\"managed/user/*\",\"roles\":\"internal/role/openidm-authorized\"},{\"actions\":\"deleteNotificationsForTarget\",\"customAuthz\":\"request.additionalParameters.target === (context.security.authorization.component + '/' + context.security.authorization.id)\",\"methods\":\"action\",\"pattern\":\"notification\",\"roles\":\"internal/role/openidm-authorized\"}]}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 16 Mar 2026 20:43:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 644, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-16T20:43:14.081Z", + "time": 25, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 25 + } + } + ], + "pages": [], + "version": "1.2" + } +} From 935ffac52534e5caad6f6e96e271b3817e880ee4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 16:24:03 +0000 Subject: [PATCH 11/69] Updated changelog and version for release v4.0.0-40 --- CHANGELOG.md | 5 ++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a80f7ce36..f05139e43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.0.0-40] - 2026-04-03 + ## [4.0.0-39] - 2026-04-03 ## [4.0.0-38] - 2026-04-03 @@ -2241,7 +2243,8 @@ Frodo CLI 2.x automatically refreshes session and access tokens before they expi - Fixed problem with adding connection profiles - Miscellaneous bug fixes -[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-39...HEAD +[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-40...HEAD +[4.0.0-40]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-39...v4.0.0-40 [4.0.0-39]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-38...v4.0.0-39 [4.0.0-38]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-37...v4.0.0-38 [4.0.0-37]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-36...v4.0.0-37 diff --git a/package-lock.json b/package-lock.json index 8f5378218..9562719e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-39", + "version": "4.0.0-40", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-39", + "version": "4.0.0-40", "license": "MIT", "bin": { "frodo": "dist/launch.cjs" diff --git a/package.json b/package.json index 15544aa52..57050e3eb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-39", + "version": "4.0.0-40", "type": "module", "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.", "keywords": [ From c491f4a2d6bad89ab3c83aa7bb0718c6af0754fd Mon Sep 17 00:00:00 2001 From: dallinjsevy Date: Fri, 3 Apr 2026 10:37:33 -0600 Subject: [PATCH 12/69] feat: Add config-manager push audit command (#582) * feat: Add config-manager push audit command * feat: Add config-manager push managed-objects (#579) * feat: Add config-manager push managed-objects * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * Updated changelog and version for release v4.0.0-35 * feat: Add config-manager push org-privileges command. (#574) * feat: Add config-manager push org-privileges command. * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * feat: Add config-manager push org-privileges command. * Rebase and update to frodo-lib 4.0.0-34 * Update snapshots * Updated snapshots * Updated snapshots * Updated snapshots --------- Co-authored-by: Volker Scheuber * Updated changelog and version for release v4.0.0-36 * adjusted path string to pull csp not cps (#578) * Updated changelog and version for release v4.0.0-37 * feat: Add config-manager push managed-objects * Update snapshots * chore: update @rockcarver/frodo-lib to version 4.0.0-35 --------- Co-authored-by: Huston Franklin Co-authored-by: Volker Scheuber Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: devintrivir * Update snapshots * Updated changelog and version for release v4.0.0-38 * deployment type adjustments and switched to constant usage over string declaration (#580) * Updated changelog and version for release v4.0.0-39 * feat: Add config-manager push access-config command (#581) * feat: Add config-manager push access-config command * feat: Add config-manager push managed-objects (#579) * feat: Add config-manager push managed-objects * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * Updated changelog and version for release v4.0.0-35 * feat: Add config-manager push org-privileges command. (#574) * feat: Add config-manager push org-privileges command. * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * feat: Add config-manager push org-privileges command. * Rebase and update to frodo-lib 4.0.0-34 * Update snapshots * Updated snapshots * Updated snapshots * Updated snapshots --------- Co-authored-by: Volker Scheuber * Updated changelog and version for release v4.0.0-36 * adjusted path string to pull csp not cps (#578) * Updated changelog and version for release v4.0.0-37 * feat: Add config-manager push managed-objects * Update snapshots * chore: update @rockcarver/frodo-lib to version 4.0.0-35 --------- Co-authored-by: Huston Franklin Co-authored-by: Volker Scheuber Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: devintrivir * Update snapshots * Updated changelog and version for release v4.0.0-38 * deployment type adjustments and switched to constant usage over string declaration (#580) * Updated changelog and version for release v4.0.0-39 * feat: Add config-manager push access-config command --------- Co-authored-by: Huston Franklin Co-authored-by: Volker Scheuber Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: devintrivir * Updated changelog and version for release v4.0.0-40 * feat: Add config-manager push audit command --------- Co-authored-by: Huston Franklin Co-authored-by: Volker Scheuber Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: devintrivir --- .../config-manager-push-audit.ts | 52 ++ .../config-manager-push.ts | 2 + src/configManagerOps/FrConfigAuditOps.ts | 21 +- .../config-manager-push-audit.test.js.snap | 25 + .../config-manager-push.test.js.snap | 1 + .../en/config-manager-push-audit.test.js | 10 + ...config-manager-push-audit.e2e.test.js.snap | 3 + .../e2e/config-manager-push-audit.e2e.test.js | 72 ++ .../forgeops/audit/audit.json | 139 ++++ .../am_1076162899/recording.har | 631 ++++++++++++++++++ .../oauth2_393036114/recording.har | 289 ++++++++ .../openidm_3290118515/recording.har | 167 +++++ 12 files changed, 1411 insertions(+), 1 deletion(-) create mode 100644 src/cli/config-manager/config-manager-push/config-manager-push-audit.ts create mode 100644 test/client_cli/en/__snapshots__/config-manager-push-audit.test.js.snap create mode 100644 test/client_cli/en/config-manager-push-audit.test.js create mode 100644 test/e2e/__snapshots__/config-manager-push-audit.e2e.test.js.snap create mode 100644 test/e2e/config-manager-push-audit.e2e.test.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/audit/audit.json create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/openidm_3290118515/recording.har diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-audit.ts b/src/cli/config-manager/config-manager-push/config-manager-push-audit.ts new file mode 100644 index 000000000..38b37264d --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-audit.ts @@ -0,0 +1,52 @@ +import { frodo } from '@rockcarver/frodo-lib'; + +import { configManagerImportAudit } from '../../../configManagerOps/FrConfigAuditOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { printMessage, verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push audit', + [], + deploymentTypes + ); + + program + .description('Import audit configuration.') + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + + if (await getTokens(false, true, deploymentTypes)) { + verboseMessage('Importing audit configuration...'); + const outcome = await configManagerImportAudit(); + if (!outcome) process.exitCode = 1; + } + // unrecognized combination of options or no options + else { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + program.help(); + process.exitCode = 1; + } + }); + + return program; +} diff --git a/src/cli/config-manager/config-manager-push/config-manager-push.ts b/src/cli/config-manager/config-manager-push/config-manager-push.ts index 20c0ba659..dd3236361 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push.ts @@ -1,5 +1,6 @@ import { FrodoStubCommand } from '../../FrodoCommand'; import AccessConfig from './config-manager-push-access-config'; +import Audit from './config-manager-push-audit'; import EmailProvider from './config-manager-push-email-provider'; import EmailTemplates from './config-manager-push-email-templates'; import Endpoints from './config-manager-push-endpoints'; @@ -31,6 +32,7 @@ export default function setup() { program.addCommand(OrgPrivileges().name('org-privileges')); program.addCommand(ManagedObjects().name('managed-objects')); program.addCommand(AccessConfig().name('access-config')); + program.addCommand(Audit().name('audit')); return program; } diff --git a/src/configManagerOps/FrConfigAuditOps.ts b/src/configManagerOps/FrConfigAuditOps.ts index a5e6ce510..3d794f007 100644 --- a/src/configManagerOps/FrConfigAuditOps.ts +++ b/src/configManagerOps/FrConfigAuditOps.ts @@ -1,9 +1,10 @@ import { frodo } from '@rockcarver/frodo-lib'; +import fs from 'fs'; import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity } = frodo.idm.config; +const { exportConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** @@ -30,3 +31,21 @@ export async function configManagerExportAudit( } return false; } + +/** + * Import audit configuration from fr-config-manager format. + * @return {Promise} a promise that resolves to true if successful, false otherwise + */ +export async function configManagerImportAudit(): Promise { + try { + const auditPath = getFilePath('audit/'); + const auditData = fs.readFileSync(`${auditPath}/audit.json`, 'utf-8'); + let importData = JSON.parse(auditData); + importData = { idm: { [importData._id]: importData } }; + await importConfigEntities(importData); + return true; + } catch (error) { + printError(error, `Error importing audit configuration`); + } + return false; +} diff --git a/test/client_cli/en/__snapshots__/config-manager-push-audit.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-audit.test.js.snap new file mode 100644 index 000000000..6b509f936 --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-audit.test.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push audit' should be expected english 1`] = ` +"Usage: frodo config-manager push audit [options] [host] [realm] [username] [password] + +[Experimental] Import audit configuration. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. To use a + connection profile, just specify a unique substring or + alias. + realm Realm. Specify realm as '/' for the root realm or 'realm' or + '/parent/child' otherwise. (default: "alpha" for Identity + Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication journeys/trees. + password Password. + +Options: + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and usage + examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap index 4a8dbe9b8..2e5fc5759 100644 --- a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap @@ -14,6 +14,7 @@ Options: Commands: access-config [Experimental] Import access configuration. + audit [Experimental] Import audit configuration. email-provider [Experimental] Import email provider configuration. email-templates [Experimental] Import email template objects. endpoints [Experimental] Import custom endpoints objects. diff --git a/test/client_cli/en/config-manager-push-audit.test.js b/test/client_cli/en/config-manager-push-audit.test.js new file mode 100644 index 000000000..91f5e6500 --- /dev/null +++ b/test/client_cli/en/config-manager-push-audit.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager push audit --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push audit' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); diff --git a/test/e2e/__snapshots__/config-manager-push-audit.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-audit.e2e.test.js.snap new file mode 100644 index 000000000..b7ea220d4 --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-audit.e2e.test.js.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager push audit "frodo config-manager push audit -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import the audit into forgeops" 1`] = `""`; diff --git a/test/e2e/config-manager-push-audit.e2e.test.js b/test/e2e/config-manager-push-audit.e2e.test.js new file mode 100644 index 000000000..7f93541e9 --- /dev/null +++ b/test/e2e/config-manager-push-audit.e2e.test.js @@ -0,0 +1,72 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +// ForgeOps +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/am frodo config-manager push audit -D test/e2e/exports/fr-config-manager/forgeops -m forgeops +*/ + +import cp from 'child_process'; +import { promisify } from 'util'; +import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { forgeops_connection as fc } from './utils/TestConfig'; + +const exec = promisify(cp.exec); + +process.env['FRODO_MOCK'] = '1'; +const forgeopsEnv = getEnv(fc); + +const allDirectory = "test/e2e/exports/fr-config-manager/forgeops"; + +describe('frodo config-manager push audit', () => { + test(`"frodo config-manager push audit -D ${allDirectory} -m forgeops": should import the audit into forgeops"`, async () => { + const CMD = `frodo config-manager push audit -D ${allDirectory} -m forgeops`; + const { stdout } = await exec(CMD, forgeopsEnv); + expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + }); +}); \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/audit/audit.json b/test/e2e/exports/fr-config-manager/forgeops/audit/audit.json new file mode 100644 index 000000000..98cb44d9c --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/audit/audit.json @@ -0,0 +1,139 @@ +{ + "_id": "audit", + "auditServiceConfig": { + "availableAuditEventHandlers": [ + "org.forgerock.audit.handlers.csv.CsvAuditEventHandler", + "org.forgerock.audit.handlers.jms.JmsAuditEventHandler", + "org.forgerock.audit.handlers.json.JsonAuditEventHandler", + "org.forgerock.audit.handlers.json.stdout.JsonStdoutAuditEventHandler", + "org.forgerock.openidm.audit.impl.RepositoryAuditEventHandler", + "org.forgerock.openidm.audit.impl.RouterAuditEventHandler", + "org.forgerock.audit.handlers.syslog.SyslogAuditEventHandler" + ], + "caseInsensitiveFields": [ + "/access/http/request/headers", + "/access/http/response/headers" + ], + "filterPolicies": { + "value": { + "excludeIf": [ + "/access/http/request/cookies/&{com.iplanet.am.cookie.name}", + "/access/http/request/cookies/session-jwt", + "/access/http/request/headers/&{com.sun.identity.auth.cookieName}", + "/access/http/request/headers/&{com.iplanet.am.cookie.name}", + "/access/http/request/headers/accept-encoding", + "/access/http/request/headers/accept-language", + "/access/http/request/headers/Authorization", + "/access/http/request/headers/cache-control", + "/access/http/request/headers/connection", + "/access/http/request/headers/content-length", + "/access/http/request/headers/content-type", + "/access/http/request/headers/proxy-authorization", + "/access/http/request/headers/X-OpenAM-Password", + "/access/http/request/headers/X-OpenIDM-Password", + "/access/http/request/queryParameters/access_token", + "/access/http/request/queryParameters/IDToken1", + "/access/http/request/queryParameters/id_token_hint", + "/access/http/request/queryParameters/Login.Token1", + "/access/http/request/queryParameters/redirect_uri", + "/access/http/request/queryParameters/requester", + "/access/http/request/queryParameters/sessionUpgradeSSOTokenId", + "/access/http/request/queryParameters/tokenId", + "/access/http/response/headers/Authorization", + "/access/http/response/headers/Set-Cookie", + "/access/http/response/headers/X-OpenIDM-Password" + ], + "includeIf": [] + } + }, + "handlerForQueries": "json" + }, + "eventHandlers": [ + { + "class": "org.forgerock.audit.handlers.json.JsonAuditEventHandler", + "config": { + "buffering": { + "maxSize": 100000, + "writeInterval": "100 millis" + }, + "enabled": { + "$bool": "&{openidm.audit.handler.json.enabled|true}" + }, + "logDirectory": "&{idm.data.dir}/audit", + "name": "json", + "topics": [ + "access", + "activity", + "sync", + "authentication", + "config" + ] + } + }, + { + "class": "org.forgerock.openidm.audit.impl.RepositoryAuditEventHandler", + "config": { + "enabled": { + "$bool": "&{openidm.audit.handler.repo.enabled|false}" + }, + "name": "repo", + "topics": [ + "access", + "activity", + "sync", + "authentication", + "config" + ] + } + }, + { + "class": "org.forgerock.audit.handlers.json.stdout.JsonStdoutAuditEventHandler", + "config": { + "elasticsearchCompatible": false, + "enabled": { + "$bool": "&{openidm.audit.handler.stdout.enabled|false}" + }, + "name": "json-stdout", + "topics": [ + "config", + "activity", + "authentication", + "access", + "sync" + ] + } + } + ], + "eventTopics": { + "activity": { + "filter": { + "actions": [ + "create", + "update", + "delete", + "patch", + "action" + ] + }, + "passwordFields": [ + "password" + ], + "watchedFields": [] + }, + "config": { + "filter": { + "actions": [ + "create", + "update", + "delete", + "patch", + "action" + ] + } + } + }, + "exceptionFormatter": { + "file": "bin/defaults/script/audit/stacktraceFormatter.js", + "type": "text/javascript" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/am_1076162899/recording.har new file mode 100644 index 000000000..a3130f7ce --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/am_1076162899/recording.har @@ -0,0 +1,631 @@ +{ + "log": { + "_recordingName": "config-manager/push/audit/0_D_m/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-ca32ebe9-7704-4944-9200-b262cd31adb5" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 370, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 587, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 587, + "text": "{\"_id\":\"*\",\"_rev\":\"2075994313\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"nodeDesignerXuiEnabled\":true}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 17 Mar 2026 20:16:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "587" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2075994313\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-17T20:16:16.507Z", + "time": 30, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 30 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-ca32ebe9-7704-4944-9200-b262cd31adb5" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "41ghjnKpNFAFU/HXw82HbFbitYNOOJ0g" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 497, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 167, + "content": { + "mimeType": "application/json", + "size": 167, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 17 Mar 2026 20:16:16 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "167" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 693, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-17T20:16:16.546Z", + "time": 33, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 33 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 128, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-ca32ebe9-7704-4944-9200-b262cd31adb5" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "128" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "https://platform.dev.trivir.com/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 291, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 291, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,ou=am-config\",\"realm\":\"/\",\"latestAccessTime\":\"2026-03-17T20:16:16Z\",\"maxIdleExpirationTime\":\"2026-03-17T20:46:16Z\",\"maxSessionExpirationTime\":\"2026-03-17T22:16:15Z\",\"properties\":{\"AMCtxId\":\"43ba9500-5021-4093-850b-dc18b8548553-26402\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 17 Mar 2026 20:16:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "291" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 610, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-17T20:16:16.586Z", + "time": 7, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 7 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-ca32ebe9-7704-4944-9200-b262cd31adb5" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 520, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 257, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 257, + "text": "{\"_id\":\"version\",\"_rev\":\"-466575464\",\"version\":\"8.0.1\",\"fullVersion\":\"ForgeRock Access Management 8.0.1 Build b59bc0908346197b0c33afcb9e733d0400feeea1 (2025-April-15 11:37)\",\"revision\":\"b59bc0908346197b0c33afcb9e733d0400feeea1\",\"date\":\"2025-April-15 11:37\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 17 Mar 2026 20:16:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "257" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-466575464\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-17T20:16:16.599Z", + "time": 8, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 8 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/oauth2_393036114/recording.har new file mode 100644 index 000000000..b353f6c75 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/audit/0_D_m/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "a684e2f67fd67a4263878c3124af167a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 365, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-ca32ebe9-7704-4944-9200-b262cd31adb5" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "content-length", + "value": "365" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 565, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&scope=fr:idm:* openid&response_type=code&client_id=idm-admin-ui&csrf=4qobMEov7SLHPqBDe_6if2I6lxI.*AAJTSQACMDIAAlNLABw3SjcyeisvQWthdE9MYkpGbUxTSFdSK09vWlU9AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=dn-n0NTgXeKh2Xl3oW9dCujVtkM0Yh2NfOasQwHPZrk&code_challenge_method=S256" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/authorize" + }, + "response": { + "bodySize": 0, + "content": { + "mimeType": "text/plain", + "size": 0 + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "expires": "1970-01-01T00:00:00.000Z", + "httpOnly": true, + "name": "OAUTH_REQUEST_ATTRIBUTES", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 17 Mar 2026 20:16:16 GMT" + }, + { + "name": "content-length", + "value": "0" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "OAUTH_REQUEST_ATTRIBUTES=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "location", + "value": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=tCMxk32bVDREu0iWLVH2zqrkIH8&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 673, + "httpVersion": "HTTP/1.1", + "redirectURL": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=tCMxk32bVDREu0iWLVH2zqrkIH8&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-03-17T20:16:16.615Z", + "time": 15, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 15 + } + }, + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 224, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-ca32ebe9-7704-4944-9200-b262cd31adb5" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "224" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "client_id=idm-admin-ui&redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&grant_type=authorization_code&code=tCMxk32bVDREu0iWLVH2zqrkIH8&code_verifier=jVVrtyvzyQTQxiLcI0ub13CCe48NzWiF4wNrhzsPUlQ" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1249, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1249, + "text": "{\"access_token\":\"\",\"scope\":\"openid fr:idm:*\",\"id_token\":\"\",\"token_type\":\"Bearer\",\"expires_in\":239}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 17 Mar 2026 20:16:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1249" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 405, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-17T20:16:16.637Z", + "time": 42, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 42 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/openidm_3290118515/recording.har new file mode 100644 index 000000000..f842ee7cf --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/audit_4116798120/0_D_m_314327836/openidm_3290118515/recording.har @@ -0,0 +1,167 @@ +{ + "log": { + "_recordingName": "config-manager/push/audit/0_D_m/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "41e0491e9377fe44c8dd660632745e04", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 3097, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-22" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-ca32ebe9-7704-4944-9200-b262cd31adb5" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "3097" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 409, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"audit\",\"auditServiceConfig\":{\"availableAuditEventHandlers\":[\"org.forgerock.audit.handlers.csv.CsvAuditEventHandler\",\"org.forgerock.audit.handlers.jms.JmsAuditEventHandler\",\"org.forgerock.audit.handlers.json.JsonAuditEventHandler\",\"org.forgerock.audit.handlers.json.stdout.JsonStdoutAuditEventHandler\",\"org.forgerock.openidm.audit.impl.RepositoryAuditEventHandler\",\"org.forgerock.openidm.audit.impl.RouterAuditEventHandler\",\"org.forgerock.audit.handlers.syslog.SyslogAuditEventHandler\"],\"caseInsensitiveFields\":[\"/access/http/request/headers\",\"/access/http/response/headers\"],\"filterPolicies\":{\"value\":{\"excludeIf\":[\"/access/http/request/cookies/&{com.iplanet.am.cookie.name}\",\"/access/http/request/cookies/session-jwt\",\"/access/http/request/headers/&{com.sun.identity.auth.cookieName}\",\"/access/http/request/headers/&{com.iplanet.am.cookie.name}\",\"/access/http/request/headers/accept-encoding\",\"/access/http/request/headers/accept-language\",\"/access/http/request/headers/Authorization\",\"/access/http/request/headers/cache-control\",\"/access/http/request/headers/connection\",\"/access/http/request/headers/content-length\",\"/access/http/request/headers/content-type\",\"/access/http/request/headers/proxy-authorization\",\"/access/http/request/headers/X-OpenAM-Password\",\"/access/http/request/headers/X-OpenIDM-Password\",\"/access/http/request/queryParameters/access_token\",\"/access/http/request/queryParameters/IDToken1\",\"/access/http/request/queryParameters/id_token_hint\",\"/access/http/request/queryParameters/Login.Token1\",\"/access/http/request/queryParameters/redirect_uri\",\"/access/http/request/queryParameters/requester\",\"/access/http/request/queryParameters/sessionUpgradeSSOTokenId\",\"/access/http/request/queryParameters/tokenId\",\"/access/http/response/headers/Authorization\",\"/access/http/response/headers/Set-Cookie\",\"/access/http/response/headers/X-OpenIDM-Password\"],\"includeIf\":[]}},\"handlerForQueries\":\"json\"},\"eventHandlers\":[{\"class\":\"org.forgerock.audit.handlers.json.JsonAuditEventHandler\",\"config\":{\"buffering\":{\"maxSize\":100000,\"writeInterval\":\"100 millis\"},\"enabled\":{\"$bool\":\"&{openidm.audit.handler.json.enabled|true}\"},\"logDirectory\":\"&{idm.data.dir}/audit\",\"name\":\"json\",\"topics\":[\"access\",\"activity\",\"sync\",\"authentication\",\"config\"]}},{\"class\":\"org.forgerock.openidm.audit.impl.RepositoryAuditEventHandler\",\"config\":{\"enabled\":{\"$bool\":\"&{openidm.audit.handler.repo.enabled|false}\"},\"name\":\"repo\",\"topics\":[\"access\",\"activity\",\"sync\",\"authentication\",\"config\"]}},{\"class\":\"org.forgerock.audit.handlers.json.stdout.JsonStdoutAuditEventHandler\",\"config\":{\"elasticsearchCompatible\":false,\"enabled\":{\"$bool\":\"&{openidm.audit.handler.stdout.enabled|false}\"},\"name\":\"json-stdout\",\"topics\":[\"config\",\"activity\",\"authentication\",\"access\",\"sync\"]}}],\"eventTopics\":{\"activity\":{\"filter\":{\"actions\":[\"create\",\"update\",\"delete\",\"patch\",\"action\"]},\"passwordFields\":[\"password\"],\"watchedFields\":[]},\"config\":{\"filter\":{\"actions\":[\"create\",\"update\",\"delete\",\"patch\",\"action\"]}}},\"exceptionFormatter\":{\"file\":\"bin/defaults/script/audit/stacktraceFormatter.js\",\"type\":\"text/javascript\"}}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/config/audit" + }, + "response": { + "bodySize": 3097, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 3097, + "text": "{\"_id\":\"audit\",\"auditServiceConfig\":{\"availableAuditEventHandlers\":[\"org.forgerock.audit.handlers.csv.CsvAuditEventHandler\",\"org.forgerock.audit.handlers.jms.JmsAuditEventHandler\",\"org.forgerock.audit.handlers.json.JsonAuditEventHandler\",\"org.forgerock.audit.handlers.json.stdout.JsonStdoutAuditEventHandler\",\"org.forgerock.openidm.audit.impl.RepositoryAuditEventHandler\",\"org.forgerock.openidm.audit.impl.RouterAuditEventHandler\",\"org.forgerock.audit.handlers.syslog.SyslogAuditEventHandler\"],\"caseInsensitiveFields\":[\"/access/http/request/headers\",\"/access/http/response/headers\"],\"filterPolicies\":{\"value\":{\"excludeIf\":[\"/access/http/request/cookies/&{com.iplanet.am.cookie.name}\",\"/access/http/request/cookies/session-jwt\",\"/access/http/request/headers/&{com.sun.identity.auth.cookieName}\",\"/access/http/request/headers/&{com.iplanet.am.cookie.name}\",\"/access/http/request/headers/accept-encoding\",\"/access/http/request/headers/accept-language\",\"/access/http/request/headers/Authorization\",\"/access/http/request/headers/cache-control\",\"/access/http/request/headers/connection\",\"/access/http/request/headers/content-length\",\"/access/http/request/headers/content-type\",\"/access/http/request/headers/proxy-authorization\",\"/access/http/request/headers/X-OpenAM-Password\",\"/access/http/request/headers/X-OpenIDM-Password\",\"/access/http/request/queryParameters/access_token\",\"/access/http/request/queryParameters/IDToken1\",\"/access/http/request/queryParameters/id_token_hint\",\"/access/http/request/queryParameters/Login.Token1\",\"/access/http/request/queryParameters/redirect_uri\",\"/access/http/request/queryParameters/requester\",\"/access/http/request/queryParameters/sessionUpgradeSSOTokenId\",\"/access/http/request/queryParameters/tokenId\",\"/access/http/response/headers/Authorization\",\"/access/http/response/headers/Set-Cookie\",\"/access/http/response/headers/X-OpenIDM-Password\"],\"includeIf\":[]}},\"handlerForQueries\":\"json\"},\"eventHandlers\":[{\"class\":\"org.forgerock.audit.handlers.json.JsonAuditEventHandler\",\"config\":{\"buffering\":{\"maxSize\":100000,\"writeInterval\":\"100 millis\"},\"enabled\":{\"$bool\":\"&{openidm.audit.handler.json.enabled|true}\"},\"logDirectory\":\"&{idm.data.dir}/audit\",\"name\":\"json\",\"topics\":[\"access\",\"activity\",\"sync\",\"authentication\",\"config\"]}},{\"class\":\"org.forgerock.openidm.audit.impl.RepositoryAuditEventHandler\",\"config\":{\"enabled\":{\"$bool\":\"&{openidm.audit.handler.repo.enabled|false}\"},\"name\":\"repo\",\"topics\":[\"access\",\"activity\",\"sync\",\"authentication\",\"config\"]}},{\"class\":\"org.forgerock.audit.handlers.json.stdout.JsonStdoutAuditEventHandler\",\"config\":{\"elasticsearchCompatible\":false,\"enabled\":{\"$bool\":\"&{openidm.audit.handler.stdout.enabled|false}\"},\"name\":\"json-stdout\",\"topics\":[\"config\",\"activity\",\"authentication\",\"access\",\"sync\"]}}],\"eventTopics\":{\"activity\":{\"filter\":{\"actions\":[\"create\",\"update\",\"delete\",\"patch\",\"action\"]},\"passwordFields\":[\"password\"],\"watchedFields\":[]},\"config\":{\"filter\":{\"actions\":[\"create\",\"update\",\"delete\",\"patch\",\"action\"]}}},\"exceptionFormatter\":{\"file\":\"bin/defaults/script/audit/stacktraceFormatter.js\",\"type\":\"text/javascript\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Tue, 17 Mar 2026 20:16:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 644, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-17T20:16:16.689Z", + "time": 33, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 33 + } + } + ], + "pages": [], + "version": "1.2" + } +} From 409625997506569dd43077bf91619b9c2417ba79 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 17:03:47 +0000 Subject: [PATCH 13/69] Updated changelog and version for release v4.0.0-41 --- CHANGELOG.md | 5 ++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f05139e43..78f6a6dc3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.0.0-41] - 2026-04-03 + ## [4.0.0-40] - 2026-04-03 ## [4.0.0-39] - 2026-04-03 @@ -2243,7 +2245,8 @@ Frodo CLI 2.x automatically refreshes session and access tokens before they expi - Fixed problem with adding connection profiles - Miscellaneous bug fixes -[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-40...HEAD +[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-41...HEAD +[4.0.0-41]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-40...v4.0.0-41 [4.0.0-40]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-39...v4.0.0-40 [4.0.0-39]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-38...v4.0.0-39 [4.0.0-38]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-37...v4.0.0-38 diff --git a/package-lock.json b/package-lock.json index 9562719e2..fdf261610 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-40", + "version": "4.0.0-41", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-40", + "version": "4.0.0-41", "license": "MIT", "bin": { "frodo": "dist/launch.cjs" diff --git a/package.json b/package.json index 57050e3eb..75ee61d5e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-40", + "version": "4.0.0-41", "type": "module", "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.", "keywords": [ From c23210d54407e96a6e218ccc85ee41c8d3898817 Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Tue, 7 Apr 2026 21:10:13 -0600 Subject: [PATCH 14/69] fix: update @rockcarver/frodo-lib to version 4.0.0-36 and normalize agent import data handling --- package-lock.json | 8 +++--- package.json | 2 +- src/ops/AgentOps.ts | 66 ++++++++++++++++++++++++++++++++++++--------- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index fdf261610..6851ce456 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ }, "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", - "@rockcarver/frodo-lib": "4.0.0-35", + "@rockcarver/frodo-lib": "4.0.0-36", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", @@ -1833,9 +1833,9 @@ } }, "node_modules/@rockcarver/frodo-lib": { - "version": "4.0.0-35", - "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.0.0-35.tgz", - "integrity": "sha512-N3Cluq5cuj4K0INGNo/dw5UQc4DEm5eBHKdpA8C8+fel23InEAk3RZ5KSl5dvVMUEoi5A45CVDJrPusTQxFSwg==", + "version": "4.0.0-36", + "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.0.0-36.tgz", + "integrity": "sha512-4AReHTZGd54Ke5MCQDQtwsTBDHRlkgdxGa3K7DtXOwzicxBVFwii4YRAvU/E2p2epjas8np8fCklNPUZHJGKoQ==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 75ee61d5e..27cd3a731 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ }, "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", - "@rockcarver/frodo-lib": "4.0.0-35", + "@rockcarver/frodo-lib": "4.0.0-36", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", diff --git a/src/ops/AgentOps.ts b/src/ops/AgentOps.ts index 76db63aed..3813034a8 100644 --- a/src/ops/AgentOps.ts +++ b/src/ops/AgentOps.ts @@ -55,6 +55,22 @@ const agentTypeToFileIdMap = { WebAgent: 'web.agent', }; +type AgentImportData = Partial & { + agents?: AgentExportInterface['agent']; +}; + +function normalizeAgentImportData( + importData: AgentImportData +): AgentExportInterface { + if (!importData.agent && importData.agents) { + importData.agent = importData.agents; + } + if (!importData.agent) { + importData.agent = {}; + } + return importData as AgentExportInterface; +} + /** * List agents * @param {boolean} [long=false] detailed list @@ -549,7 +565,9 @@ export async function importAgentFromFile( try { const verbose = state.getVerbose(); const data = fs.readFileSync(getFilePath(file), 'utf8'); - const importData = JSON.parse(data); + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); // check if this is a file with multiple agents and get agent by id if (importData.agent && importData.agent[agentId]) { const agent = importData.agent[agentId]; @@ -619,7 +637,9 @@ export async function importIdentityGatewayAgentFromFile( debugMessage(`cli.AgentOps.importIdentityGatewayAgentFromFile: start`); const verbose = state.getVerbose(); const data = fs.readFileSync(getFilePath(file), 'utf8'); - const importData = JSON.parse(data); + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); // check if this is a file with multiple agents and get agent by id if (importData.agent && importData.agent[agentId]) { const agent = importData.agent[agentId]; @@ -687,7 +707,9 @@ export async function importJavaAgentFromFile( debugMessage(`cli.AgentOps.importJavaAgentFromFile: start`); const verbose = state.getVerbose(); const data = fs.readFileSync(getFilePath(file), 'utf8'); - const importData = JSON.parse(data); + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); // check if this is a file with multiple agents and get agent by id if (importData.agent && importData.agent[agentId]) { const agent = importData.agent[agentId]; @@ -752,7 +774,9 @@ export async function importWebAgentFromFile( debugMessage(`cli.AgentOps.importWebAgentFromFile: start`); const verbose = state.getVerbose(); const data = fs.readFileSync(getFilePath(file), 'utf8'); - const importData = JSON.parse(data); + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); // check if this is a file with multiple agents and get agent by id if (importData.agent && importData.agent[agentId]) { const agent = importData.agent[agentId]; @@ -814,9 +838,12 @@ export async function importFirstAgentFromFile( global: boolean = false ): Promise { try { + debugMessage(`cli.AgentOps.importFirstAgentFromFile: start`); const verbose = state.getVerbose(); const data = fs.readFileSync(getFilePath(file), 'utf8'); - const importData = JSON.parse(data); + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); let spinnerId: string; if (Object.keys(importData.agent).length > 0) { for (const agent of Object.values(importData.agent)) { @@ -839,6 +866,7 @@ export async function importFirstAgentFromFile( `Imported ${agent['_id']}.`, 'success' ); + debugMessage(`cli.AgentOps.importFirstAgentFromFile: end`); return true; } catch (error) { if (verbose) @@ -874,7 +902,9 @@ export async function importFirstIdentityGatewayAgentFromFile( debugMessage(`cli.AgentOps.importFirstIdentityGatewayAgentFromFile: start`); const verbose = state.getVerbose(); const data = fs.readFileSync(getFilePath(file), 'utf8'); - const importData = JSON.parse(data); + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); let spinnerId: string; if (Object.keys(importData.agent).length > 0) { for (const agent of Object.values(importData.agent)) { @@ -929,7 +959,9 @@ export async function importFirstJavaAgentFromFile( debugMessage(`cli.AgentOps.importFirstJavaAgentFromFile: start`); const verbose = state.getVerbose(); const data = fs.readFileSync(getFilePath(file), 'utf8'); - const importData = JSON.parse(data); + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); let spinnerId: string; if (Object.keys(importData.agent).length > 0) { for (const agent of Object.values(importData.agent)) { @@ -981,7 +1013,9 @@ export async function importFirstWebAgentFromFile( debugMessage(`cli.AgentOps.importFirstWebAgentFromFile: start`); const verbose = state.getVerbose(); const data = fs.readFileSync(getFilePath(file), 'utf8'); - const importData = JSON.parse(data); + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); let spinnerId: string; if (Object.keys(importData.agent).length > 0) { for (const agent of Object.values(importData.agent)) { @@ -1040,7 +1074,9 @@ export async function importAgentsFromFile( const filePath = getFilePath(file); const data = fs.readFileSync(filePath, 'utf8'); debugMessage(`importAgentsFromFile: importing ${filePath}`); - const importData = JSON.parse(data) as AgentExportInterface; + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); await importAgents(importData, global); debugMessage(`importAgentsFromFile: end`); return true; @@ -1065,7 +1101,9 @@ export async function importIdentityGatewayAgentsFromFile( debugMessage( `cli.AgentOps.importIdentityGatewayAgentsFromFile: importing ${filePath}` ); - const importData = JSON.parse(data) as AgentExportInterface; + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); await importIdentityGatewayAgents(importData); debugMessage(`cli.AgentOps.importIdentityGatewayAgentsFromFile: end`); return true; @@ -1088,7 +1126,9 @@ export async function importJavaAgentsFromFile(file: string): Promise { debugMessage( `cli.AgentOps.importJavaAgentsFromFile: importing ${filePath}` ); - const importData = JSON.parse(data) as AgentExportInterface; + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); await importJavaAgents(importData); debugMessage(`cli.AgentOps.importJavaAgentsFromFile: end`); return true; @@ -1109,7 +1149,9 @@ export async function importWebAgentsFromFile(file: string): Promise { const filePath = getFilePath(file); const data = fs.readFileSync(filePath, 'utf8'); debugMessage(`cli.AgentOps.importWebAgentsFromFile: importing ${filePath}`); - const importData = JSON.parse(data) as AgentExportInterface; + const importData = normalizeAgentImportData( + JSON.parse(data) as AgentImportData + ); await importWebAgents(importData); debugMessage(`cli.AgentOps.importWebAgentsFromFile: end`); return true; From 573ef7d0dd816f2d33bd623ec6d2449a84e0549b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 03:36:28 +0000 Subject: [PATCH 15/69] Updated changelog and version for release v4.0.0-42 --- CHANGELOG.md | 5 ++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78f6a6dc3..4450249f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.0.0-42] - 2026-04-08 + ## [4.0.0-41] - 2026-04-03 ## [4.0.0-40] - 2026-04-03 @@ -2245,7 +2247,8 @@ Frodo CLI 2.x automatically refreshes session and access tokens before they expi - Fixed problem with adding connection profiles - Miscellaneous bug fixes -[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-41...HEAD +[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-42...HEAD +[4.0.0-42]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-41...v4.0.0-42 [4.0.0-41]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-40...v4.0.0-41 [4.0.0-40]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-39...v4.0.0-40 [4.0.0-39]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-38...v4.0.0-39 diff --git a/package-lock.json b/package-lock.json index 6851ce456..544086896 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-41", + "version": "4.0.0-42", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-41", + "version": "4.0.0-42", "license": "MIT", "bin": { "frodo": "dist/launch.cjs" diff --git a/package.json b/package.json index 27cd3a731..28d48fa52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-41", + "version": "4.0.0-42", "type": "module", "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.", "keywords": [ From 318de4744020ddbf16eda231623bbf79f914a876 Mon Sep 17 00:00:00 2001 From: dallinjsevy Date: Wed, 8 Apr 2026 08:43:08 -0600 Subject: [PATCH 16/69] feat: Add config-manager push cookie-domains command (#583) Co-authored-by: Huston Franklin --- .../config-manager-push-cookie-domain.ts | 52 +++ .../config-manager-push.ts | 2 + .../FrConfigCookieDomainsOps.ts | 26 +- ...g-manager-push-cookie-domains.test.js.snap | 25 ++ .../config-manager-push.test.js.snap | 1 + ...config-manager-push-cookie-domains.test.js | 10 + ...nager-push-cookie-domains.e2e.test.js.snap | 8 + ...ig-manager-push-cookie-domains.e2e.test.js | 73 ++++ .../cloud/cookie-domains/cookie-domains.json | 6 + .../am_1076162899/recording.har | 312 ++++++++++++++++++ .../environment_1072573434/recording.har | 241 ++++++++++++++ .../oauth2_393036114/recording.har | 146 ++++++++ .../openidm_3290118515/recording.har | 310 +++++++++++++++++ 13 files changed, 1208 insertions(+), 4 deletions(-) create mode 100644 src/cli/config-manager/config-manager-push/config-manager-push-cookie-domain.ts create mode 100644 test/client_cli/en/__snapshots__/config-manager-push-cookie-domains.test.js.snap create mode 100644 test/client_cli/en/config-manager-push-cookie-domains.test.js create mode 100644 test/e2e/__snapshots__/config-manager-push-cookie-domains.e2e.test.js.snap create mode 100644 test/e2e/config-manager-push-cookie-domains.e2e.test.js create mode 100644 test/e2e/exports/fr-config-manager/cloud/cookie-domains/cookie-domains.json create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/environment_1072573434/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/openidm_3290118515/recording.har diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-cookie-domain.ts b/src/cli/config-manager/config-manager-push/config-manager-push-cookie-domain.ts new file mode 100644 index 000000000..ce845a969 --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-cookie-domain.ts @@ -0,0 +1,52 @@ +import { frodo } from '@rockcarver/frodo-lib'; + +import { configManagerImportCookieDomains } from '../../../configManagerOps/FrConfigCookieDomainsOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { printMessage, verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push cookie-domains', + [], + deploymentTypes + ); + + program + .description('Import cookie domains.') + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + + if (await getTokens(false, true, deploymentTypes)) { + verboseMessage('Importing cookie domains...'); + const outcome = await configManagerImportCookieDomains(); + if (!outcome) process.exitCode = 1; + } + // unrecognized combination of options or no options + else { + printMessage( + 'Unrecognized combination of options or no options...', + 'error' + ); + program.help(); + process.exitCode = 1; + } + }); + + return program; +} diff --git a/src/cli/config-manager/config-manager-push/config-manager-push.ts b/src/cli/config-manager/config-manager-push/config-manager-push.ts index dd3236361..153bb0eda 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push.ts @@ -1,6 +1,7 @@ import { FrodoStubCommand } from '../../FrodoCommand'; import AccessConfig from './config-manager-push-access-config'; import Audit from './config-manager-push-audit'; +import CookieDomains from './config-manager-push-cookie-domain'; import EmailProvider from './config-manager-push-email-provider'; import EmailTemplates from './config-manager-push-email-templates'; import Endpoints from './config-manager-push-endpoints'; @@ -33,6 +34,7 @@ export default function setup() { program.addCommand(ManagedObjects().name('managed-objects')); program.addCommand(AccessConfig().name('access-config')); program.addCommand(Audit().name('audit')); + program.addCommand(CookieDomains().name('cookie-domains')); return program; } diff --git a/src/configManagerOps/FrConfigCookieDomainsOps.ts b/src/configManagerOps/FrConfigCookieDomainsOps.ts index 504acb16e..d23582a39 100644 --- a/src/configManagerOps/FrConfigCookieDomainsOps.ts +++ b/src/configManagerOps/FrConfigCookieDomainsOps.ts @@ -1,12 +1,13 @@ import { frodo } from '@rockcarver/frodo-lib'; +import fs from 'fs'; import { printError } from '../utils/Console'; const { getFilePath, saveJsonToFile } = frodo.utils; -const { readCookieDomains } = frodo.cloud.env; +const { readCookieDomains, updateCookieDomains } = frodo.cloud.env; + /** - * Export an IDM configuration object in the fr-config-manager format. - * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import + * Export cookie domains in the fr-config-manager format. * @return {Promise} a promise that resolves to true if successful, false otherwise */ export async function configManagerExportCookieDomains(): Promise { @@ -19,7 +20,24 @@ export async function configManagerExportCookieDomains(): Promise { ); return true; } catch (error) { - printError(error, `Error exporting config entity access`); + printError(error, `Error exporting custom domains`); + } + return false; +} + +/** + * Import cookie domains from fr-config-manager format. + * @return {Promise} a promise that resolves to true if successful, false otherwise + */ +export async function configManagerImportCookieDomains(): Promise { + try { + const getFile = getFilePath('cookie-domains/cookie-domains.json'); + const readFile = fs.readFileSync(getFile, 'utf-8'); + const importData = JSON.parse(readFile); + await updateCookieDomains(importData); + return true; + } catch (error) { + printError(error, `Error importing custom domains`); } return false; } diff --git a/test/client_cli/en/__snapshots__/config-manager-push-cookie-domains.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-cookie-domains.test.js.snap new file mode 100644 index 000000000..06c936910 --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-cookie-domains.test.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push cookie-domains' should be expected english 1`] = ` +"Usage: frodo config-manager push cookie-domains [options] [host] [realm] [username] [password] + +[Experimental] Import cookie domains. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. To use a + connection profile, just specify a unique substring or + alias. + realm Realm. Specify realm as '/' for the root realm or 'realm' or + '/parent/child' otherwise. (default: "alpha" for Identity + Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication journeys/trees. + password Password. + +Options: + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and usage + examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap index 2e5fc5759..dd1073166 100644 --- a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap @@ -15,6 +15,7 @@ Options: Commands: access-config [Experimental] Import access configuration. audit [Experimental] Import audit configuration. + cookie-domains [Experimental] Import cookie domains. email-provider [Experimental] Import email provider configuration. email-templates [Experimental] Import email template objects. endpoints [Experimental] Import custom endpoints objects. diff --git a/test/client_cli/en/config-manager-push-cookie-domains.test.js b/test/client_cli/en/config-manager-push-cookie-domains.test.js new file mode 100644 index 000000000..8ab2f146d --- /dev/null +++ b/test/client_cli/en/config-manager-push-cookie-domains.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager push cookie-domains --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push cookie-domains' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); \ No newline at end of file diff --git a/test/e2e/__snapshots__/config-manager-push-cookie-domains.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-cookie-domains.e2e.test.js.snap new file mode 100644 index 000000000..38afd6adf --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-cookie-domains.e2e.test.js.snap @@ -0,0 +1,8 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager push cookie-domains "frodo config-manager push cookie-domains -D test/e2e/exports/fr-config-manager/cloud ": should import the cookie-domains into cloud" 1`] = `""`; + +exports[`frodo config-manager push cookie-domains "frodo config-manager push cookie-domains -D test/e2e/exports/fr-config-manager/cloud ": should import the cookie-domains into cloud" 2`] = ` +"Experimental feature in use: 'frodo config-manager push cookie-domains'. This feature may change without notice. +" +`; diff --git a/test/e2e/config-manager-push-cookie-domains.e2e.test.js b/test/e2e/config-manager-push-cookie-domains.e2e.test.js new file mode 100644 index 000000000..ae0eaef15 --- /dev/null +++ b/test/e2e/config-manager-push-cookie-domains.e2e.test.js @@ -0,0 +1,73 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +// Cloud +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://openam-frodo-dev.forgeblocks.com/am frodo config-manager push cookie-domains -D test/e2e/exports/fr-config-manager/cloud +*/ + +import cp from 'child_process'; +import { promisify } from 'util'; +import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { connection as c } from './utils/TestConfig'; + +const exec = promisify(cp.exec); + +process.env['FRODO_MOCK'] = '1'; +const cloudEnv = getEnv(c); + +const allDirectory = "test/e2e/exports/fr-config-manager/cloud"; + +describe('frodo config-manager push cookie-domains', () => { + test(`"frodo config-manager push cookie-domains -D ${allDirectory} ": should import the cookie-domains into cloud"`, async () => { + const CMD = `frodo config-manager push cookie-domains -D ${allDirectory}`; + const { stdout, stderr } = await exec(CMD, cloudEnv); + expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + }); +}); \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/cloud/cookie-domains/cookie-domains.json b/test/e2e/exports/fr-config-manager/cloud/cookie-domains/cookie-domains.json new file mode 100644 index 000000000..c4c2acc74 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/cloud/cookie-domains/cookie-domains.json @@ -0,0 +1,6 @@ +{ + "domains": [ + "frodo-dev.com", + "test-frodo.com" + ] +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/am_1076162899/recording.har new file mode 100644 index 000000000..621415299 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/am_1076162899/recording.har @@ -0,0 +1,312 @@ +{ + "log": { + "_recordingName": "config-manager/push/cookie-domains/0_D/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 615, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 615, + "text": "{\"_id\":\"*\",\"_rev\":\"1955877839\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"6ac6499e9da2071\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"allowedWithoutReferer\":true,\"refererWhitelist\":[]},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"cloudOnlyFeaturesEnabled\":true,\"oauth2AIAgentsEnabled\":false}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"1955877839\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "615" + }, + { + "name": "date", + "value": "Wed, 01 Apr 2026 15:49:45 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 762, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-01T15:49:45.161Z", + "time": 357, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 357 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1980, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 275, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 275, + "text": "{\"_id\":\"version\",\"_rev\":\"-824275682\",\"version\":\"9.0.0-SNAPSHOT\",\"fullVersion\":\"ForgeRock Access Management 9.0.0-SNAPSHOT Build 75a770de430656acd9cf271c54af448902e5589a (2026-March-25 18:41)\",\"revision\":\"75a770de430656acd9cf271c54af448902e5589a\",\"date\":\"2026-March-25 18:41\"}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-824275682\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "275" + }, + { + "name": "date", + "value": "Wed, 01 Apr 2026 15:49:45 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 762, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-01T15:49:45.718Z", + "time": 89, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 89 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/environment_1072573434/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/environment_1072573434/recording.har new file mode 100644 index 000000000..28b0f0851 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/environment_1072573434/recording.har @@ -0,0 +1,241 @@ +{ + "log": { + "_recordingName": "config-manager/push/cookie-domains/0_D/environment", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccc7ec61c2094114d7917814bb19b83b", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1931, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/scopes/service-accounts" + }, + "response": { + "bodySize": 1975, + "content": { + "mimeType": "application/json; charset=utf-8", + "size": 1975, + "text": "[{\"scope\":\"fr:am:*\",\"description\":\"All Access Management APIs\"},{\"scope\":\"fr:autoaccess:*\",\"description\":\"All Auto Access APIs\"},{\"scope\":\"fr:idc:analytics:*\",\"description\":\"All Analytics APIs\"},{\"scope\":\"fr:idc:certificate:*\",\"description\":\"All TLS certificate APIs\",\"childScopes\":[{\"scope\":\"fr:idc:certificate:read\",\"description\":\"Read TLS certificates\"}]},{\"scope\":\"fr:idc:content-security-policy:*\",\"description\":\"All content security policy APIs\",\"childScopes\":[{\"scope\":\"fr:idc:content-security-policy:read\",\"description\":\"Read content security policy\"}]},{\"scope\":\"fr:idc:cookie-domain:*\",\"description\":\"All cookie domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:cookie-domain:read\",\"description\":\"Read cookie domains\"}]},{\"scope\":\"fr:idc:custom-domain:*\",\"description\":\"All custom domain APIs\",\"childScopes\":[{\"scope\":\"fr:idc:custom-domain:read\",\"description\":\"Read custom domains\"}]},{\"scope\":\"fr:idc:dataset:*\",\"description\":\"All dataset deletion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:dataset:read\",\"description\":\"Read dataset deletions\"}]},{\"scope\":\"fr:idc:esv:*\",\"description\":\"All ESV APIs\",\"childScopes\":[{\"scope\":\"fr:idc:esv:read\",\"description\":\"Read ESVs, excluding values of secrets\"},{\"scope\":\"fr:idc:esv:update\",\"description\":\"Create, modify, and delete ESVs\"},{\"scope\":\"fr:idc:esv:restart\",\"description\":\"Restart workloads that consume ESVs\"}]},{\"scope\":\"fr:idc:promotion:*\",\"description\":\"All configuration promotion APIs\",\"childScopes\":[{\"scope\":\"fr:idc:promotion:read\",\"description\":\"Read configuration promotion\"}]},{\"scope\":\"fr:idc:release:*\",\"description\":\"All product release APIs\",\"childScopes\":[{\"scope\":\"fr:idc:release:read\",\"description\":\"Read product release\"}]},{\"scope\":\"fr:idc:sso-cookie:*\",\"description\":\"All SSO cookie APIs\",\"childScopes\":[{\"scope\":\"fr:idc:sso-cookie:read\",\"description\":\"Read SSO cookie\"}]},{\"scope\":\"fr:idc:ws:admin\",\"description\":\"All PingFederate APIs\"},{\"scope\":\"fr:idm:*\",\"description\":\"All Identity Management APIs\"}]" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-type", + "value": "application/json; charset=utf-8" + }, + { + "name": "content-length", + "value": "1975" + }, + { + "name": "etag", + "value": "W/\"7b7-9oeZSONSS8Sn+SSr15TXAygvvcE\"" + }, + { + "name": "date", + "value": "Wed, 01 Apr 2026 15:49:45 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "989d2406-58a4-4bf9-8f35-fcd49e13b5a8" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 388, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-01T15:49:45.815Z", + "time": 77, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 77 + } + }, + { + "_id": "11716bd4365c73313bb4a750331ea132", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 46, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "accept-api-version", + "value": "protocol=1.0,resource=1.0" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "46" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1942, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"domains\":[\"frodo-dev.com\",\"test-frodo.com\"]}" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/environment/cookie-domains" + }, + "response": { + "bodySize": 47, + "content": { + "mimeType": "application/json", + "size": 47, + "text": "{\"domains\":[\"frodo-dev.com\",\"test-frodo.com\"]}" + }, + "cookies": [], + "headers": [ + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "date", + "value": "Wed, 01 Apr 2026 15:49:46 GMT" + }, + { + "name": "content-length", + "value": "47" + }, + { + "name": "x-forgerock-transactionid", + "value": "e4b3a890-3d46-415f-a84c-55a54fafe7d2" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 334, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-01T15:49:45.976Z", + "time": 127, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 127 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/oauth2_393036114/recording.har new file mode 100644 index 000000000..81397d587 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/oauth2_393036114/recording.har @@ -0,0 +1,146 @@ +{ + "log": { + "_recordingName": "config-manager/push/cookie-domains/0_D/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 1362, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "1362" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 443, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "assertion=&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=fr:idc:ws:admin fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:analytics:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*" + }, + "queryString": [], + "url": "https://openam-frodo-dev.forgeblocks.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1884, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1884, + "text": "{\"access_token\":\"\",\"scope\":\"fr:idc:ws:admin fr:am:* fr:autoaccess:* fr:idc:esv:* fr:idc:analytics:* fr:idc:custom-domain:* fr:idc:release:* fr:idc:sso-cookie:* fr:idc:content-security-policy:* fr:idc:certificate:* fr:idm:* fr:idc:dataset:* fr:idc:cookie-domain:* fr:idc:promotion:*\",\"token_type\":\"Bearer\",\"expires_in\":899}" + }, + "cookies": [], + "headers": [ + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "content-security-policy-report-only", + "value": "frame-ancestors 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1884" + }, + { + "name": "date", + "value": "Wed, 01 Apr 2026 15:49:45 GMT" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 536, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-01T15:49:45.548Z", + "time": 161, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 161 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/openidm_3290118515/recording.har new file mode 100644 index 000000000..78c8da291 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/cookie-domains_2381120331/0_D_2157136892/openidm_3290118515/recording.har @@ -0,0 +1,310 @@ +{ + "log": { + "_recordingName": "config-manager/push/cookie-domains/0_D/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1992, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/810dd2f4-874b-4aad-9e0a-f8a57789f182?_fields=%2A" + }, + "response": { + "bodySize": 1408, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1408, + "text": "{\"_id\":\"810dd2f4-874b-4aad-9e0a-f8a57789f182\",\"_rev\":\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1773261131370\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:ws:admin\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"GIyq6foAjk7VGtM7NyJQZMEUxtAgSe02sjjgp4ey4go\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"rBa78YjWw5-Hkd2rP8uuY2fikjMf9FVeP2AUabFL2qqgVCJxs035yKQDlMAYAFnKaSUXME0vXhZKNkP5ZsWdYAl_sS-0o8HBO4AQk8dXSB--NnkPd0S-6c-sb01oy5tet1WFiKI8dfhzH9KZ65oy3ouzaSsnTjIpFQNMVaq1qQE3m2gPnmwMoRQZdP_hClkXMTtkdRapTL_cdxw7tYGGwpjFz2IJRX-fjFpE79NZdQ_dUaeWOm3tnoHAHjh01IrFu7qlT0o5Bf7-gDvoXU3eYAy5D9LcZAeXr8DiEqK-2aBltV43JSk-Z119DQhRUOFOVMlfbZzHYcWlMgPHBnneleAzChhaDnTxd3NGfqF329wfxQHUaGdj7-eVlXEEYIxmzVwFOiEK0ogEtyvkrlYqQiarxSGt1teNShBpb2QtKL4UPLh7ufxe6K961QuL-FmCkKbjGFxYY0PTegeIsf3rYTNKJRpADC9rGPDF67c5yuMbbBZU9G_GRq5Lj8yS5vG94oCM7PGmKzxxavS7neBu0BH6cqn_u6kuvbfcLtmszo7JqMnY6SqPIp0PU1wfizkjeXKG0s_6rtqQ57pH5IpZTUYwCrtkqcOLEColrUwort43MY12P-ELDuq-IaZFRxJWn8A9dqplVJzOQViUfHHtTVu5W2KiumLSXsxWUsQTb8E\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 01 Apr 2026 15:49:45 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1408" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 657, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-01T15:49:45.761Z", + "time": 159, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 159 + } + }, + { + "_id": "9cb8561357870863838a9948da32d1e8", + "_order": 1, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 1992, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [ + { + "name": "_fields", + "value": "*" + } + ], + "url": "https://openam-frodo-dev.forgeblocks.com/openidm/managed/svcacct/810dd2f4-874b-4aad-9e0a-f8a57789f182?_fields=%2A" + }, + "response": { + "bodySize": 1408, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 1408, + "text": "{\"_id\":\"810dd2f4-874b-4aad-9e0a-f8a57789f182\",\"_rev\":\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\",\"accountStatus\":\"active\",\"name\":\"Frodo-SA-1773261131370\",\"description\":\"phales@trivir.com's Frodo Service Account\",\"scopes\":[\"fr:am:*\",\"fr:idc:analytics:*\",\"fr:autoaccess:*\",\"fr:idc:certificate:*\",\"fr:idc:content-security-policy:*\",\"fr:idc:cookie-domain:*\",\"fr:idc:custom-domain:*\",\"fr:idc:dataset:*\",\"fr:idc:esv:*\",\"fr:idm:*\",\"fr:idc:promotion:*\",\"fr:idc:release:*\",\"fr:idc:sso-cookie:*\",\"fr:idc:ws:admin\"],\"jwks\":\"{\\\"keys\\\":[{\\\"kty\\\":\\\"RSA\\\",\\\"kid\\\":\\\"GIyq6foAjk7VGtM7NyJQZMEUxtAgSe02sjjgp4ey4go\\\",\\\"alg\\\":\\\"RS256\\\",\\\"e\\\":\\\"AQAB\\\",\\\"n\\\":\\\"rBa78YjWw5-Hkd2rP8uuY2fikjMf9FVeP2AUabFL2qqgVCJxs035yKQDlMAYAFnKaSUXME0vXhZKNkP5ZsWdYAl_sS-0o8HBO4AQk8dXSB--NnkPd0S-6c-sb01oy5tet1WFiKI8dfhzH9KZ65oy3ouzaSsnTjIpFQNMVaq1qQE3m2gPnmwMoRQZdP_hClkXMTtkdRapTL_cdxw7tYGGwpjFz2IJRX-fjFpE79NZdQ_dUaeWOm3tnoHAHjh01IrFu7qlT0o5Bf7-gDvoXU3eYAy5D9LcZAeXr8DiEqK-2aBltV43JSk-Z119DQhRUOFOVMlfbZzHYcWlMgPHBnneleAzChhaDnTxd3NGfqF329wfxQHUaGdj7-eVlXEEYIxmzVwFOiEK0ogEtyvkrlYqQiarxSGt1teNShBpb2QtKL4UPLh7ufxe6K961QuL-FmCkKbjGFxYY0PTegeIsf3rYTNKJRpADC9rGPDF67c5yuMbbBZU9G_GRq5Lj8yS5vG94oCM7PGmKzxxavS7neBu0BH6cqn_u6kuvbfcLtmszo7JqMnY6SqPIp0PU1wfizkjeXKG0s_6rtqQ57pH5IpZTUYwCrtkqcOLEColrUwort43MY12P-ELDuq-IaZFRxJWn8A9dqplVJzOQViUfHHtTVu5W2KiumLSXsxWUsQTb8E\\\"}]}\",\"maxCachingTime\":\"15\",\"maxIdleTime\":\"15\",\"maxSessionTime\":\"15\",\"quotaLimit\":\"5\"}" + }, + "cookies": [], + "headers": [ + { + "name": "date", + "value": "Wed, 01 Apr 2026 15:49:45 GMT" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"4773460a-f4b4-4472-a12b-8c7b7ad4fd76-9686\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "content-length", + "value": "1408" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-698d5d95-01ad-4d80-bc3a-f734c3b6b905" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains; preload;" + }, + { + "name": "x-robots-tag", + "value": "none" + }, + { + "name": "via", + "value": "1.1 google" + }, + { + "name": "alt-svc", + "value": "h3=\":443\"; ma=2592000" + } + ], + "headersSize": 657, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-01T15:49:45.903Z", + "time": 67, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 67 + } + } + ], + "pages": [], + "version": "1.2" + } +} From 52db6ff64d8625aa5801aa9a5b968d41309ffa51 Mon Sep 17 00:00:00 2001 From: dallinjsevy Date: Wed, 8 Apr 2026 10:21:35 -0600 Subject: [PATCH 17/69] feat: Add config-manager-push service-object command (#584) --- .../config-manager-push-service-objects.ts | 45 ++ .../config-manager-push.ts | 2 + .../FrConfigServiceObjectsOps.ts | 33 +- ...-manager-push-service-objects.test.js.snap | 25 + .../config-manager-push.test.js.snap | 1 + ...onfig-manager-push-service-objects.test.js | 10 + ...ager-push-service-objects.e2e.test.js.snap | 3 + ...g-manager-push-service-objects.e2e.test.js | 72 ++ .../service-objects/role/Test B Role.json | 5 + .../service-objects/role/test Role.json | 5 + .../forgeops/service-objects/user/aTest.json | 8 + .../forgeops/service-objects/user/test.json | 8 + .../am_1076162899/recording.har | 631 +++++++++++++++++ .../oauth2_393036114/recording.har | 289 ++++++++ .../openidm_3290118515/recording.har | 634 ++++++++++++++++++ 15 files changed, 1770 insertions(+), 1 deletion(-) create mode 100644 src/cli/config-manager/config-manager-push/config-manager-push-service-objects.ts create mode 100644 test/client_cli/en/__snapshots__/config-manager-push-service-objects.test.js.snap create mode 100644 test/client_cli/en/config-manager-push-service-objects.test.js create mode 100644 test/e2e/__snapshots__/config-manager-push-service-objects.e2e.test.js.snap create mode 100644 test/e2e/config-manager-push-service-objects.e2e.test.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/service-objects/role/Test B Role.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/service-objects/role/test Role.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/service-objects/user/aTest.json create mode 100644 test/e2e/exports/fr-config-manager/forgeops/service-objects/user/test.json create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/openidm_3290118515/recording.har diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-service-objects.ts b/src/cli/config-manager/config-manager-push/config-manager-push-service-objects.ts new file mode 100644 index 000000000..04e64bba8 --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-service-objects.ts @@ -0,0 +1,45 @@ +import { frodo } from '@rockcarver/frodo-lib'; + +import { configManagerImportServiceObjects } from '../../../configManagerOps/FrConfigServiceObjectsOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push service-objects', + [], + deploymentTypes + ); + + program + .description('Import service objects.') + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + + if (await getTokens(false, true, deploymentTypes)) { + verboseMessage('Importing service objects...'); + const outcome = await configManagerImportServiceObjects(); + if (!outcome) process.exitCode = 1; + } else { + process.exitCode = 1; + } + }); + + return program; +} diff --git a/src/cli/config-manager/config-manager-push/config-manager-push.ts b/src/cli/config-manager/config-manager-push/config-manager-push.ts index 153bb0eda..5fa7c2fe0 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push.ts @@ -12,6 +12,7 @@ import ManagedObjects from './config-manager-push-managed-objects'; import OrgPrivileges from './config-manager-push-org-privileges'; import PasswordPolicy from './config-manager-push-password-policy'; import Schedules from './config-manager-push-schedules'; +import ServiceObjects from './config-manager-push-service-objects'; import TermsAndConditions from './config-manager-push-terms-and-conditions'; import Themes from './config-manager-push-themes'; @@ -35,6 +36,7 @@ export default function setup() { program.addCommand(AccessConfig().name('access-config')); program.addCommand(Audit().name('audit')); program.addCommand(CookieDomains().name('cookie-domains')); + program.addCommand(ServiceObjects().name('service-objects')); return program; } diff --git a/src/configManagerOps/FrConfigServiceObjectsOps.ts b/src/configManagerOps/FrConfigServiceObjectsOps.ts index b5e5d283d..440583444 100644 --- a/src/configManagerOps/FrConfigServiceObjectsOps.ts +++ b/src/configManagerOps/FrConfigServiceObjectsOps.ts @@ -4,7 +4,7 @@ import fs from 'fs'; import { printError } from '../utils/Console'; const { getFilePath, saveJsonToFile } = frodo.utils; -const { queryManagedObjects } = frodo.idm.managed; +const { queryManagedObjects, updateManagedObject } = frodo.idm.managed; /** * Export an IDM configuration object in the fr-config-manager format. * @param {string} envFile File that defines environment specific variables for replacement during configuration export/import @@ -117,3 +117,34 @@ export async function configManagerExportServiceObject( printError(err, `Error exporting object`); } } + +/** + * Import service objects exported in fr-config-manager format. + * @returns {Promise} true if succesful, false otherwise + */ +export async function configManagerImportServiceObjects(): Promise { + try { + const objectsDir = getFilePath('service-objects/'); + const objectTypes = fs.readdirSync(objectsDir); + + for (const objectType of objectTypes) { + const objectPath = `${objectsDir}/${objectType}`; + const objectFiles = fs.readdirSync(objectPath); + + for (const objectFile of objectFiles) { + const fullPath = `${objectPath}/${objectFile}`; + const readFiles = fs.readFileSync(fullPath, 'utf8'); + const importData = JSON.parse(readFiles); + delete importData._rev; + delete importData._refProperties; + + await updateManagedObject(objectType, importData._id, importData); + } + } + + return true; + } catch (err) { + printError(err, `Error importing service-objects`); + } + return false; +} diff --git a/test/client_cli/en/__snapshots__/config-manager-push-service-objects.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-service-objects.test.js.snap new file mode 100644 index 000000000..ea5ed1c13 --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-service-objects.test.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push service-objects' should be expected english 1`] = ` +"Usage: frodo config-manager push service-objects [options] [host] [realm] [username] [password] + +[Experimental] Import service objects. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. To use a + connection profile, just specify a unique substring or + alias. + realm Realm. Specify realm as '/' for the root realm or 'realm' or + '/parent/child' otherwise. (default: "alpha" for Identity + Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication journeys/trees. + password Password. + +Options: + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and usage + examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap index dd1073166..f861e2c0d 100644 --- a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap @@ -27,6 +27,7 @@ Commands: org-privileges [Experimental] Import organization privileges config. password-policy [Experimental] Import password-policy objects. schedules [Experimental] Import schedules. + service-objects [Experimental] Import service objects. terms-and-conditions [Experimental] Import terms and conditions. themes [Experimental] Import themes. " diff --git a/test/client_cli/en/config-manager-push-service-objects.test.js b/test/client_cli/en/config-manager-push-service-objects.test.js new file mode 100644 index 000000000..f8da6c16a --- /dev/null +++ b/test/client_cli/en/config-manager-push-service-objects.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager push service-objects --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push service-objects' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); diff --git a/test/e2e/__snapshots__/config-manager-push-service-objects.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-service-objects.e2e.test.js.snap new file mode 100644 index 000000000..e1242ac4c --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-service-objects.e2e.test.js.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager push service-objects "frodo config-manager push service-objects -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import the service objects into forgeops" 1`] = `""`; diff --git a/test/e2e/config-manager-push-service-objects.e2e.test.js b/test/e2e/config-manager-push-service-objects.e2e.test.js new file mode 100644 index 000000000..d934b21ce --- /dev/null +++ b/test/e2e/config-manager-push-service-objects.e2e.test.js @@ -0,0 +1,72 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +// ForgeOps +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/am frodo config-manager push service-objects -D test/e2e/exports/fr-config-manager/forgeops -m forgeops +*/ + +import cp from 'child_process'; +import { promisify } from 'util'; +import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { forgeops_connection as fc } from './utils/TestConfig'; + +const exec = promisify(cp.exec); + +process.env['FRODO_MOCK'] = '1'; +const forgeopsEnv = getEnv(fc); + +const allDirectory = "test/e2e/exports/fr-config-manager/forgeops"; + +describe('frodo config-manager push service-objects', () => { + test(`"frodo config-manager push service-objects -D ${allDirectory} -m forgeops": should import the service objects into forgeops"`, async () => { + const CMD = `frodo config-manager push service-objects -D ${allDirectory} -m forgeops`; + const { stdout } = await exec(CMD, forgeopsEnv); + expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + }); +}); \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/service-objects/role/Test B Role.json b/test/e2e/exports/fr-config-manager/forgeops/service-objects/role/Test B Role.json new file mode 100644 index 000000000..71d285960 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/service-objects/role/Test B Role.json @@ -0,0 +1,5 @@ +{ + "_id": "2d1d7733-bbe2-4a22-a24e-b8f28f377bab", + "_rev": "3bd23670-309b-4186-a573-cf8bda235ea1-278", + "name": "Test B Role" +} diff --git a/test/e2e/exports/fr-config-manager/forgeops/service-objects/role/test Role.json b/test/e2e/exports/fr-config-manager/forgeops/service-objects/role/test Role.json new file mode 100644 index 000000000..b4552f731 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/service-objects/role/test Role.json @@ -0,0 +1,5 @@ +{ + "_id": "74a2bb8d-2783-4885-941e-7398b1104fe1", + "_rev": "3bd23670-309b-4186-a573-cf8bda235ea1-274", + "name": "test Role" +} diff --git a/test/e2e/exports/fr-config-manager/forgeops/service-objects/user/aTest.json b/test/e2e/exports/fr-config-manager/forgeops/service-objects/user/aTest.json new file mode 100644 index 000000000..524a0f551 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/service-objects/user/aTest.json @@ -0,0 +1,8 @@ +{ + "_id": "2a289273-5240-49d1-b6dc-0fa41eb4c45f", + "_rev": "3bd23670-309b-4186-a573-cf8bda235ea1-165", + "givenName": "anotehr", + "mail": "test@email.com", + "sn": "test", + "userName": "aTest" +} diff --git a/test/e2e/exports/fr-config-manager/forgeops/service-objects/user/test.json b/test/e2e/exports/fr-config-manager/forgeops/service-objects/user/test.json new file mode 100644 index 000000000..14a8f1de8 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/service-objects/user/test.json @@ -0,0 +1,8 @@ +{ + "_id": "8ce6f2da-c02c-43e3-9689-7d9b10254f49", + "_rev": "969db80c-7f5b-45b6-b594-0c3ba684d6e6-8067", + "givenName": "test", + "mail": "test@email.com", + "sn": "user", + "userName": "test" +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/am_1076162899/recording.har new file mode 100644 index 000000000..5f87c8e0b --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/am_1076162899/recording.har @@ -0,0 +1,631 @@ +{ + "log": { + "_recordingName": "config-manager/push/service-objects/0_D_m/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 370, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 587, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 587, + "text": "{\"_id\":\"*\",\"_rev\":\"2075994313\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"nodeDesignerXuiEnabled\":true}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:13 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "587" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2075994313\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T13:51:11.951Z", + "time": 10, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 10 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "41ghjnKpNFAFU/HXw82HbFbitYNOOJ0g" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 497, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 167, + "content": { + "mimeType": "application/json", + "size": 167, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:13 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "167" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 693, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T13:51:11.968Z", + "time": 25, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 25 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 128, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "128" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "https://platform.dev.trivir.com/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 290, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 290, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,ou=am-config\",\"realm\":\"/\",\"latestAccessTime\":\"2026-03-30T13:51:14Z\",\"maxIdleExpirationTime\":\"2026-03-30T14:21:14Z\",\"maxSessionExpirationTime\":\"2026-03-30T15:51:13Z\",\"properties\":{\"AMCtxId\":\"87bd5796-6c1a-4d13-8c2b-a1619ca81517-4105\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:14 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "290" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 605, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T13:51:11.999Z", + "time": 6, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 6 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 520, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 257, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 257, + "text": "{\"_id\":\"version\",\"_rev\":\"-466575464\",\"version\":\"8.0.1\",\"fullVersion\":\"ForgeRock Access Management 8.0.1 Build b59bc0908346197b0c33afcb9e733d0400feeea1 (2025-April-15 11:37)\",\"revision\":\"b59bc0908346197b0c33afcb9e733d0400feeea1\",\"date\":\"2025-April-15 11:37\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:14 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "257" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-466575464\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T13:51:12.016Z", + "time": 7, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 7 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/oauth2_393036114/recording.har new file mode 100644 index 000000000..e04ce8ebd --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/service-objects/0_D_m/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "a684e2f67fd67a4263878c3124af167a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 365, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "content-length", + "value": "365" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 565, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&scope=fr:idm:* openid&response_type=code&client_id=idm-admin-ui&csrf=LMy9gG3U2MnB7ARm7hLQ_87F53o.*AAJTSQACMDIAAlNLABxJNXhNTUFyajdvUkRtdndRc3Y0WEhyeGc2aGc9AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=5ZW3HI3hDVE6uUvEOHk-WWiSGY-lu-AGrdv6GMwM54o&code_challenge_method=S256" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/authorize" + }, + "response": { + "bodySize": 0, + "content": { + "mimeType": "text/plain", + "size": 0 + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "expires": "1970-01-01T00:00:00.000Z", + "httpOnly": true, + "name": "OAUTH_REQUEST_ATTRIBUTES", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:14 GMT" + }, + { + "name": "content-length", + "value": "0" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "OAUTH_REQUEST_ATTRIBUTES=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "location", + "value": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=ubRGTLtxWch_W-c1WJ19qk739GU&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 673, + "httpVersion": "HTTP/1.1", + "redirectURL": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=ubRGTLtxWch_W-c1WJ19qk739GU&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-03-30T13:51:12.031Z", + "time": 16, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 16 + } + }, + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 224, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "224" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "client_id=idm-admin-ui&redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&grant_type=authorization_code&code=ubRGTLtxWch_W-c1WJ19qk739GU&code_verifier=9eczIuVp-MlFIqaTNfyqFt3-IWimD5MJZ9i05z4MtmQ" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1247, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1247, + "text": "{\"access_token\":\"\",\"scope\":\"openid fr:idm:*\",\"id_token\":\"\",\"token_type\":\"Bearer\",\"expires_in\":239}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:14 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1247" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 405, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T13:51:12.054Z", + "time": 48, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 48 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/openidm_3290118515/recording.har new file mode 100644 index 000000000..85e57246f --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/service-objects_3981230761/0_D_m_314327836/openidm_3290118515/recording.har @@ -0,0 +1,634 @@ +{ + "log": { + "_recordingName": "config-manager/push/service-objects/0_D_m/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "1e659179738c0807e765f53ccda419f7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 67, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "67" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 444, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"2d1d7733-bbe2-4a22-a24e-b8f28f377bab\",\"name\":\"Test B Role\"}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/managed/role/2d1d7733-bbe2-4a22-a24e-b8f28f377bab" + }, + "response": { + "bodySize": 117, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 117, + "text": "{\"_id\":\"2d1d7733-bbe2-4a22-a24e-b8f28f377bab\",\"_rev\":\"3bd23670-309b-4186-a573-cf8bda235ea1-278\",\"name\":\"Test B Role\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:14 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "content-length", + "value": "117" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"3bd23670-309b-4186-a573-cf8bda235ea1-278\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "x-not-modified", + "value": "true" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 661, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T13:51:12.112Z", + "time": 47, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 47 + } + }, + { + "_id": "351587289cad1b72f3de76dc377b3bf6", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 65, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "65" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 444, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"74a2bb8d-2783-4885-941e-7398b1104fe1\",\"name\":\"test Role\"}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/managed/role/74a2bb8d-2783-4885-941e-7398b1104fe1" + }, + "response": { + "bodySize": 115, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 115, + "text": "{\"_id\":\"74a2bb8d-2783-4885-941e-7398b1104fe1\",\"_rev\":\"3bd23670-309b-4186-a573-cf8bda235ea1-274\",\"name\":\"test Role\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:14 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "content-length", + "value": "115" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"3bd23670-309b-4186-a573-cf8bda235ea1-274\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "x-not-modified", + "value": "true" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 661, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T13:51:12.167Z", + "time": 32, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 32 + } + }, + { + "_id": "45857ecdeb0b02bf16551ac1da3060e4", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 123, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "123" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 445, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"2a289273-5240-49d1-b6dc-0fa41eb4c45f\",\"givenName\":\"anotehr\",\"mail\":\"test@email.com\",\"sn\":\"test\",\"userName\":\"aTest\"}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/managed/user/2a289273-5240-49d1-b6dc-0fa41eb4c45f" + }, + "response": { + "bodySize": 857, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 857, + "text": "{\"_id\":\"2a289273-5240-49d1-b6dc-0fa41eb4c45f\",\"_rev\":\"3bd23670-309b-4186-a573-cf8bda235ea1-1738\",\"country\":null,\"mail\":\"test@email.com\",\"memberOfOrgIDs\":[],\"postalCode\":null,\"profileImage\":null,\"expireAccount\":null,\"activeDate\":null,\"consentedMappings\":[],\"effectiveGroups\":[],\"devicePrintProfiles\":[],\"organizationName\":null,\"givenName\":\"anotehr\",\"stateProvince\":null,\"postalAddress\":null,\"telephoneNumber\":null,\"city\":null,\"displayName\":null,\"effectiveAssignments\":[],\"description\":null,\"effectiveApplications\":[],\"accountStatus\":null,\"passwordExpirationTime\":null,\"aliasList\":[],\"kbaInfo\":[],\"inactiveDate\":null,\"sn\":\"test\",\"preferences\":null,\"deviceProfiles\":[],\"userName\":\"aTest\",\"oathDeviceProfiles\":[],\"webauthnDeviceProfiles\":[],\"pushDeviceProfiles\":[],\"passwordLastChangedTime\":\"2026-03-28T00:07:50.416Z\",\"effectiveRoles\":[],\"activateAccount\":null}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:14 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "content-length", + "value": "857" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"3bd23670-309b-4186-a573-cf8bda235ea1-1738\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 640, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T13:51:12.211Z", + "time": 111, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 111 + } + }, + { + "_id": "f5b37cabd72220d889ffbad7ff60edfc", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 119, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-30" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-5c5a2bcc-bf74-4e4c-9818-4db228e51a3a" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "119" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 445, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"8ce6f2da-c02c-43e3-9689-7d9b10254f49\",\"givenName\":\"test\",\"mail\":\"test@email.com\",\"sn\":\"user\",\"userName\":\"test\"}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/managed/user/8ce6f2da-c02c-43e3-9689-7d9b10254f49" + }, + "response": { + "bodySize": 853, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 853, + "text": "{\"_id\":\"8ce6f2da-c02c-43e3-9689-7d9b10254f49\",\"_rev\":\"3bd23670-309b-4186-a573-cf8bda235ea1-1740\",\"country\":null,\"mail\":\"test@email.com\",\"memberOfOrgIDs\":[],\"postalCode\":null,\"profileImage\":null,\"expireAccount\":null,\"activeDate\":null,\"consentedMappings\":[],\"effectiveGroups\":[],\"devicePrintProfiles\":[],\"organizationName\":null,\"givenName\":\"test\",\"stateProvince\":null,\"postalAddress\":null,\"telephoneNumber\":null,\"city\":null,\"displayName\":null,\"effectiveAssignments\":[],\"description\":null,\"effectiveApplications\":[],\"accountStatus\":null,\"passwordExpirationTime\":null,\"aliasList\":[],\"kbaInfo\":[],\"inactiveDate\":null,\"sn\":\"user\",\"preferences\":null,\"deviceProfiles\":[],\"userName\":\"test\",\"oathDeviceProfiles\":[],\"webauthnDeviceProfiles\":[],\"pushDeviceProfiles\":[],\"passwordLastChangedTime\":\"2026-03-27T16:16:34.093Z\",\"effectiveRoles\":[],\"activateAccount\":null}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Mon, 30 Mar 2026 13:51:14 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "content-length", + "value": "853" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"3bd23670-309b-4186-a573-cf8bda235ea1-1740\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 640, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-03-30T13:51:12.336Z", + "time": 134, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 134 + } + } + ], + "pages": [], + "version": "1.2" + } +} From de4835c88345d80e74b5bca9ec85a28b1d4ec473 Mon Sep 17 00:00:00 2001 From: dallinjsevy Date: Wed, 8 Apr 2026 10:37:27 -0600 Subject: [PATCH 18/69] feat: Add config-manager push ui-config command (#585) --- .../config-manager-push-ui-config.ts | 47 ++ .../config-manager-push.ts | 2 + src/configManagerOps/FrConfigUiConfigOps.ts | 21 +- ...config-manager-push-ui-config.test.js.snap | 25 + .../config-manager-push.test.js.snap | 1 + .../en/config-manager-push-ui-config.test.js | 10 + ...ig-manager-push-ui-config.e2e.test.js.snap | 8 + .../config-manager-push-ui-config.e2e.test.js | 73 ++ .../forgeops/ui/ui-configuration.json | 35 + .../am_1076162899/recording.har | 631 ++++++++++++++++++ .../oauth2_393036114/recording.har | 289 ++++++++ .../openidm_3290118515/recording.har | 167 +++++ 12 files changed, 1308 insertions(+), 1 deletion(-) create mode 100644 src/cli/config-manager/config-manager-push/config-manager-push-ui-config.ts create mode 100644 test/client_cli/en/__snapshots__/config-manager-push-ui-config.test.js.snap create mode 100644 test/client_cli/en/config-manager-push-ui-config.test.js create mode 100644 test/e2e/__snapshots__/config-manager-push-ui-config.e2e.test.js.snap create mode 100644 test/e2e/config-manager-push-ui-config.e2e.test.js create mode 100644 test/e2e/exports/fr-config-manager/forgeops/ui/ui-configuration.json create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/am_1076162899/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/oauth2_393036114/recording.har create mode 100644 test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/openidm_3290118515/recording.har diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-ui-config.ts b/src/cli/config-manager/config-manager-push/config-manager-push-ui-config.ts new file mode 100644 index 000000000..62aa7d132 --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-ui-config.ts @@ -0,0 +1,47 @@ +import { frodo } from '@rockcarver/frodo-lib'; + +import { configManagerImportUiConfig } from '../../../configManagerOps/FrConfigUiConfigOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +const { CLOUD_DEPLOYMENT_TYPE_KEY, FORGEOPS_DEPLOYMENT_TYPE_KEY } = + frodo.utils.constants; + +const deploymentTypes = [ + CLOUD_DEPLOYMENT_TYPE_KEY, + FORGEOPS_DEPLOYMENT_TYPE_KEY, +]; + +export default function setup() { + const program = new FrodoCommand( + 'frodo config-manager push ui-config', + [], + deploymentTypes + ); + + program + .description('Import UI configuration.') + .action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + + if (await getTokens(false, true, deploymentTypes)) { + verboseMessage('Importing UI configuration...'); + const outcome = await configManagerImportUiConfig(); + if (!outcome) process.exitCode = 1; + } + // unrecognized combination of options or no options + else { + process.exitCode = 1; + } + }); + + return program; +} diff --git a/src/cli/config-manager/config-manager-push/config-manager-push.ts b/src/cli/config-manager/config-manager-push/config-manager-push.ts index 5fa7c2fe0..0e9c55345 100644 --- a/src/cli/config-manager/config-manager-push/config-manager-push.ts +++ b/src/cli/config-manager/config-manager-push/config-manager-push.ts @@ -15,6 +15,7 @@ import Schedules from './config-manager-push-schedules'; import ServiceObjects from './config-manager-push-service-objects'; import TermsAndConditions from './config-manager-push-terms-and-conditions'; import Themes from './config-manager-push-themes'; +import UiConfig from './config-manager-push-ui-config'; export default function setup() { const program = new FrodoStubCommand('push').description( @@ -37,6 +38,7 @@ export default function setup() { program.addCommand(Audit().name('audit')); program.addCommand(CookieDomains().name('cookie-domains')); program.addCommand(ServiceObjects().name('service-objects')); + program.addCommand(UiConfig().name('ui-config')); return program; } diff --git a/src/configManagerOps/FrConfigUiConfigOps.ts b/src/configManagerOps/FrConfigUiConfigOps.ts index 632268ee6..c2aecb87f 100644 --- a/src/configManagerOps/FrConfigUiConfigOps.ts +++ b/src/configManagerOps/FrConfigUiConfigOps.ts @@ -1,9 +1,10 @@ import { frodo } from '@rockcarver/frodo-lib'; +import fs from 'fs'; import { getIdmImportExportOptions } from '../ops/IdmOps'; import { printError } from '../utils/Console'; -const { exportConfigEntity } = frodo.idm.config; +const { exportConfigEntity, importConfigEntities } = frodo.idm.config; const { getFilePath, saveJsonToFile } = frodo.utils; /** @@ -34,3 +35,21 @@ export async function configManagerExportUiConfig( } return false; } + +/** + * Import UI configuration in the fr-config-manager format. + * @return {Promise} a promise that resolves to true if successful, false otherwise + */ +export async function configManagerImportUiConfig(): Promise { + try { + const fileData = getFilePath(`ui/ui-configuration.json`); + const readFile = fs.readFileSync(fileData, 'utf8'); + let importData = JSON.parse(readFile); + importData = { idm: { [importData._id]: importData } }; + await importConfigEntities(importData); + return true; + } catch (error) { + printError(error); + } + return false; +} diff --git a/test/client_cli/en/__snapshots__/config-manager-push-ui-config.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-ui-config.test.js.snap new file mode 100644 index 000000000..4cb8fa7fa --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-ui-config.test.js.snap @@ -0,0 +1,25 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push ui-config' should be expected english 1`] = ` +"Usage: frodo config-manager push ui-config [options] [host] [realm] [username] [password] + +[Experimental] Import UI configuration. + +Arguments: + host AM base URL, e.g.: https://cdk.iam.example.com/am. To use a + connection profile, just specify a unique substring or + alias. + realm Realm. Specify realm as '/' for the root realm or 'realm' or + '/parent/child' otherwise. (default: "alpha" for Identity + Cloud tenants, "/" otherwise.) + username Username to login with. Must be an admin user with + appropriate rights to manage authentication journeys/trees. + password Password. + +Options: + -h, --help Help + -hh, --help-more Help with all options. + -hhh, --help-all Help with all options, environment variables, and usage + examples. +" +`; diff --git a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap index f861e2c0d..0bba29ad7 100644 --- a/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-manager-push.test.js.snap @@ -30,5 +30,6 @@ Commands: service-objects [Experimental] Import service objects. terms-and-conditions [Experimental] Import terms and conditions. themes [Experimental] Import themes. + ui-config [Experimental] Import UI configuration. " `; diff --git a/test/client_cli/en/config-manager-push-ui-config.test.js b/test/client_cli/en/config-manager-push-ui-config.test.js new file mode 100644 index 000000000..85cf8ad68 --- /dev/null +++ b/test/client_cli/en/config-manager-push-ui-config.test.js @@ -0,0 +1,10 @@ +import cp from 'child_process'; +import { promisify } from 'util'; + +const exec = promisify(cp.exec); +const CMD = 'frodo config-manager push ui-config --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push ui-config' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); diff --git a/test/e2e/__snapshots__/config-manager-push-ui-config.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-ui-config.e2e.test.js.snap new file mode 100644 index 000000000..c470730d7 --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-ui-config.e2e.test.js.snap @@ -0,0 +1,8 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager push ui-config "frodo config-manager push ui-config -D test/e2e/exports/fr-config-manager/forgeops/-m forgeops": should import ui-config into forgeops" 1`] = `""`; + +exports[`frodo config-manager push ui-config "frodo config-manager push ui-config -D test/e2e/exports/fr-config-manager/forgeops/-m forgeops": should import ui-config into forgeops" 2`] = ` +"Experimental feature in use: 'frodo config-manager push ui-config'. This feature may change without notice. +" +`; diff --git a/test/e2e/config-manager-push-ui-config.e2e.test.js b/test/e2e/config-manager-push-ui-config.e2e.test.js new file mode 100644 index 000000000..cd72c208d --- /dev/null +++ b/test/e2e/config-manager-push-ui-config.e2e.test.js @@ -0,0 +1,73 @@ +/** + * Follow this process to write e2e tests for the CLI project: + * + * 1. Test if all the necessary mocks for your tests already exist. + * In mock mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=1 frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * If your command completes without errors and with the expected results, + * all the required mocks already exist and you are good to write your + * test and skip to step #4. + * + * If, however, your command fails and you see errors like the one below, + * you know you need to record the mock responses first: + * + * [Polly] [adapter:node-http] Recording for the following request is not found and `recordIfMissing` is `false`. + * + * 2. Record mock responses for your exact command. + * In mock record mode, run the command you want to test with the same arguments + * and parameters exactly as you want to test it, for example: + * + * $ FRODO_MOCK=record frodo conn save https://openam-frodo-dev.forgeblocks.com/am volker.scheuber@forgerock.com Sup3rS3cr3t! + * + * Wait until you see all the Polly instances (mock recording adapters) have + * shutdown before you try to run step #1 again. + * Messages like these indicate mock recording adapters shutting down: + * + * Polly instance 'conn/4' stopping in 3s... + * Polly instance 'conn/4' stopping in 2s... + * Polly instance 'conn/save/3' stopping in 3s... + * Polly instance 'conn/4' stopping in 1s... + * Polly instance 'conn/save/3' stopping in 2s... + * Polly instance 'conn/4' stopped. + * Polly instance 'conn/save/3' stopping in 1s... + * Polly instance 'conn/save/3' stopped. + * + * 3. Validate your freshly recorded mock responses are complete and working. + * Re-run the exact command you want to test in mock mode (see step #1). + * + * 4. Write your test. + * Make sure to use the exact command including number of arguments and params. + * + * 5. Commit both your test and your new recordings to the repository. + * Your tests are likely going to reside outside the frodo-lib project but + * the recordings must be committed to the frodo-lib project. + */ + +/* +// ForgeOps +FRODO_MOCK=record FRODO_NO_CACHE=1 FRODO_HOST=https://nightly.gcp.forgeops.com/am frodo config-manager push ui-config -D test/e2e/exports/fr-config-manager/forgeops -m forgeops +*/ + +import cp from 'child_process'; +import { promisify } from 'util'; +import { getEnv, removeAnsiEscapeCodes } from './utils/TestUtils'; +import { forgeops_connection as fc } from './utils/TestConfig'; + +const exec = promisify(cp.exec); + +process.env['FRODO_MOCK'] = '1'; +const forgeopsEnv = getEnv(fc); + +const allDirectory = "test/e2e/exports/fr-config-manager/forgeops/"; + +describe('frodo config-manager push ui-config', () => { + test(`"frodo config-manager push ui-config -D ${allDirectory}-m forgeops": should import ui-config into forgeops"`, async () => { + const CMD = `frodo config-manager push ui-config -D ${allDirectory} -m forgeops`; + const { stdout, stderr } = await exec(CMD, forgeopsEnv); + expect(removeAnsiEscapeCodes(stdout)).toMatchSnapshot(); + expect(removeAnsiEscapeCodes(stderr)).toMatchSnapshot(); + }); +}); diff --git a/test/e2e/exports/fr-config-manager/forgeops/ui/ui-configuration.json b/test/e2e/exports/fr-config-manager/forgeops/ui/ui-configuration.json new file mode 100644 index 000000000..cf398b05c --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/ui/ui-configuration.json @@ -0,0 +1,35 @@ +{ + "_id": "ui/configuration", + "configuration": { + "defaultNotificationType": "info", + "forgotUsername": false, + "lang": "en", + "notificationTypes": { + "error": { + "iconPath": "images/notifications/error.png", + "name": "common.notification.types.error" + }, + "info": { + "iconPath": "images/notifications/info.png", + "name": "common.notification.types.info" + }, + "warning": { + "iconPath": "images/notifications/warning.png", + "name": "common.notification.types.warning" + } + }, + "passwordReset": false, + "passwordResetLink": "", + "platformSettings": { + "adminOauthClient": "idm-admin-ui", + "adminOauthClientScopes": "fr:idm:*", + "amUrl": "/am", + "loginUrl": "" + }, + "roles": { + "internal/role/openidm-admin": "ui-admin", + "internal/role/openidm-authorized": "ui-user" + }, + "selfRegistration": false + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/am_1076162899/recording.har new file mode 100644 index 000000000..0b73ffe75 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/am_1076162899/recording.har @@ -0,0 +1,631 @@ +{ + "log": { + "_recordingName": "config-manager/push/ui-config/0_D_m/am", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "ccd7a5defd0fdeaa986a2b54642d911a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b2c01ea5-59f9-422a-b300-4fc36c75b6d7" + }, + { + "name": "accept-api-version", + "value": "resource=1.1" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 370, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 587, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 587, + "text": "{\"_id\":\"*\",\"_rev\":\"2075994313\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":true,\"forgotPassword\":\"false\",\"forgotUsername\":\"false\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"false\",\"lang\":\"en-US\",\"successfulUserRegistrationDestination\":\"default\",\"socialImplementations\":[],\"referralsEnabled\":\"false\",\"zeroPageLogin\":{\"enabled\":false,\"refererWhitelist\":[],\"allowedWithoutReferer\":true},\"realm\":\"/\",\"xuiUserSessionValidationEnabled\":true,\"fileBasedConfiguration\":true,\"userIdAttributes\":[],\"nodeDesignerXuiEnabled\":true}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 03 Apr 2026 14:49:15 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "587" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.1" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"2075994313\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-03T14:49:15.913Z", + "time": 11, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 11 + } + }, + { + "_id": "9f5671275c36a1c0090d0df26ce0e93f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 2, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b2c01ea5-59f9-422a-b300-4fc36c75b6d7" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "amadmin" + }, + { + "name": "x-openam-password", + "value": "41ghjnKpNFAFU/HXw82HbFbitYNOOJ0g" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 497, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/realms/root/authenticate" + }, + "response": { + "bodySize": 167, + "content": { + "mimeType": "application/json", + "size": 167, + "text": "{\"tokenId\":\"\",\"successUrl\":\"/am/console\",\"realm\":\"/\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "iPlanetDirectoryPro", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + }, + { + "httpOnly": true, + "name": "amlbcookie", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 03 Apr 2026 14:49:16 GMT" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "content-length", + "value": "167" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "iPlanetDirectoryPro=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "amlbcookie=; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=2.1" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 693, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-03T14:49:15.930Z", + "time": 16, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 16 + } + }, + { + "_id": "6a3744385d3fd7416ea7089e610fa7e7", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 128, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b2c01ea5-59f9-422a-b300-4fc36c75b6d7" + }, + { + "name": "accept-api-version", + "value": "resource=4.0" + }, + { + "name": "content-length", + "value": "128" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"tokenId\":\"\"}" + }, + "queryString": [ + { + "name": "_action", + "value": "getSessionInfo" + } + ], + "url": "https://platform.dev.trivir.com/am/json/realms/root/sessions/?_action=getSessionInfo" + }, + "response": { + "bodySize": 292, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 292, + "text": "{\"username\":\"amadmin\",\"universalId\":\"id=amadmin,ou=user,ou=am-config\",\"realm\":\"/\",\"latestAccessTime\":\"2026-04-03T14:49:16Z\",\"maxIdleExpirationTime\":\"2026-04-03T15:19:16Z\",\"maxSessionExpirationTime\":\"2026-04-03T16:49:15Z\",\"properties\":{\"AMCtxId\":\"87bd5796-6c1a-4d13-8c2b-a1619ca81517-100262\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 03 Apr 2026 14:49:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "292" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "private" + }, + { + "name": "content-api-version", + "value": "resource=4.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 610, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-03T14:49:15.953Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + }, + { + "_id": "6125d0328ad0dcaee55f73fd8b22ca14", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 0, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b2c01ea5-59f9-422a-b300-4fc36c75b6d7" + }, + { + "name": "accept-api-version", + "value": "resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 520, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/version" + }, + "response": { + "bodySize": 257, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 257, + "text": "{\"_id\":\"version\",\"_rev\":\"-466575464\",\"version\":\"8.0.1\",\"fullVersion\":\"ForgeRock Access Management 8.0.1 Build b59bc0908346197b0c33afcb9e733d0400feeea1 (2025-April-15 11:37)\",\"revision\":\"b59bc0908346197b0c33afcb9e733d0400feeea1\",\"date\":\"2025-April-15 11:37\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 03 Apr 2026 14:49:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "257" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "etag", + "value": "\"-466575464\"" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 631, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-03T14:49:15.964Z", + "time": 5, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 5 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/oauth2_393036114/recording.har new file mode 100644 index 000000000..662d05cd8 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/ui-config/0_D_m/oauth2", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "a684e2f67fd67a4263878c3124af167a", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 365, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b2c01ea5-59f9-422a-b300-4fc36c75b6d7" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "content-length", + "value": "365" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 565, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&scope=fr:idm:* openid&response_type=code&client_id=idm-admin-ui&csrf=Ns95H-jnkorQ50A3gH6gcbAQICk.*AAJTSQACMDIAAlNLABxoTGdkVXlUcUZuODg4cUs4ZGM1T3ZLeVlyUkE9AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=MVPqRC6L-FTk6LaFJTSrDESZtqYSFv39XMAV9qPm6Gw&code_challenge_method=S256" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/authorize" + }, + "response": { + "bodySize": 0, + "content": { + "mimeType": "text/plain", + "size": 0 + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + }, + { + "expires": "1970-01-01T00:00:00.000Z", + "httpOnly": true, + "name": "OAUTH_REQUEST_ATTRIBUTES", + "path": "/", + "sameSite": "none", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 03 Apr 2026 14:49:16 GMT" + }, + { + "name": "content-length", + "value": "0" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "OAUTH_REQUEST_ATTRIBUTES=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/; Secure; HttpOnly; SameSite=none" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "location", + "value": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=JqVx5lD9TXdlvlaiT9gp1ArYtOQ&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 672, + "httpVersion": "HTTP/1.1", + "redirectURL": "https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html?code=JqVx5lD9TXdlvlaiT9gp1ArYtOQ&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-04-03T14:49:15.976Z", + "time": 10, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 10 + } + }, + { + "_id": "ff75519a93ccab829f8ee8cf5e92b49f", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 224, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/x-www-form-urlencoded" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b2c01ea5-59f9-422a-b300-4fc36c75b6d7" + }, + { + "name": "accept-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-length", + "value": "224" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 424, + "httpVersion": "HTTP/1.1", + "method": "POST", + "postData": { + "mimeType": "application/x-www-form-urlencoded", + "params": [], + "text": "client_id=idm-admin-ui&redirect_uri=https://platform.dev.trivir.com/platform/appAuthHelperRedirect.html&grant_type=authorization_code&code=JqVx5lD9TXdlvlaiT9gp1ArYtOQ&code_verifier=18Cag1KA01zagK6qQSUaEGMScyAZxOSMOLs7v10aEK0" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/oauth2/access_token" + }, + "response": { + "bodySize": 1250, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 1250, + "text": "{\"access_token\":\"\",\"scope\":\"openid fr:idm:*\",\"id_token\":\"\",\"token_type\":\"Bearer\",\"expires_in\":239}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 03 Apr 2026 14:49:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "1250" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/am; Secure; HttpOnly" + }, + { + "name": "x-frame-options", + "value": "SAMEORIGIN" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 405, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-03T14:49:15.994Z", + "time": 33, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 33 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/openidm_3290118515/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/openidm_3290118515/recording.har new file mode 100644 index 000000000..bd83d6c36 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/ui-config_3375356940/0_D_m_314327836/openidm_3290118515/recording.har @@ -0,0 +1,167 @@ +{ + "log": { + "_recordingName": "config-manager/push/ui-config/0_D_m/openidm", + "creator": { + "comment": "persister:fs", + "name": "Polly.JS", + "version": "6.0.6" + }, + "entries": [ + { + "_id": "e6ef67a5fa0cdb69474865598fc725ed", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 707, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "@rockcarver/frodo-lib/4.0.0-34" + }, + { + "name": "x-forgerock-transactionid", + "value": "frodo-b2c01ea5-59f9-422a-b300-4fc36c75b6d7" + }, + { + "name": "authorization", + "value": "Bearer " + }, + { + "name": "content-length", + "value": "707" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 419, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"ui/configuration\",\"configuration\":{\"defaultNotificationType\":\"info\",\"forgotUsername\":false,\"lang\":\"en\",\"notificationTypes\":{\"error\":{\"iconPath\":\"images/notifications/error.png\",\"name\":\"common.notification.types.error\"},\"info\":{\"iconPath\":\"images/notifications/info.png\",\"name\":\"common.notification.types.info\"},\"warning\":{\"iconPath\":\"images/notifications/warning.png\",\"name\":\"common.notification.types.warning\"}},\"passwordReset\":false,\"passwordResetLink\":\"\",\"platformSettings\":{\"adminOauthClient\":\"idm-admin-ui\",\"adminOauthClientScopes\":\"fr:idm:*\",\"amUrl\":\"/am\",\"loginUrl\":\"\"},\"roles\":{\"internal/role/openidm-admin\":\"ui-admin\",\"internal/role/openidm-authorized\":\"ui-user\"},\"selfRegistration\":false}}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/openidm/config/ui/configuration" + }, + "response": { + "bodySize": 707, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 707, + "text": "{\"_id\":\"ui/configuration\",\"configuration\":{\"defaultNotificationType\":\"info\",\"forgotUsername\":false,\"lang\":\"en\",\"notificationTypes\":{\"error\":{\"iconPath\":\"images/notifications/error.png\",\"name\":\"common.notification.types.error\"},\"info\":{\"iconPath\":\"images/notifications/info.png\",\"name\":\"common.notification.types.info\"},\"warning\":{\"iconPath\":\"images/notifications/warning.png\",\"name\":\"common.notification.types.warning\"}},\"passwordReset\":false,\"passwordResetLink\":\"\",\"platformSettings\":{\"adminOauthClient\":\"idm-admin-ui\",\"adminOauthClientScopes\":\"fr:idm:*\",\"amUrl\":\"/am\",\"loginUrl\":\"\"},\"roles\":{\"internal/role/openidm-admin\":\"ui-admin\",\"internal/role/openidm-authorized\":\"ui-user\"},\"selfRegistration\":false}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/openidm", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "Fri, 03 Apr 2026 14:49:16 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "content-length", + "value": "707" + }, + { + "name": "connection", + "value": "keep-alive" + }, + { + "_fromType": "array", + "name": "set-cookie", + "value": "route=; Path=/openidm; Secure; HttpOnly" + }, + { + "name": "vary", + "value": "Origin" + }, + { + "name": "cache-control", + "value": "no-store" + }, + { + "name": "content-api-version", + "value": "protocol=2.1,resource=1.0" + }, + { + "name": "content-security-policy", + "value": "default-src 'none';frame-ancestors 'none';sandbox" + }, + { + "name": "cross-origin-opener-policy", + "value": "same-origin" + }, + { + "name": "cross-origin-resource-policy", + "value": "same-origin" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, + { + "name": "x-frame-options", + "value": "DENY" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 637, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-04-03T14:49:16.033Z", + "time": 30, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 30 + } + } + ], + "pages": [], + "version": "1.2" + } +} From 20622c1fb8f946f30484e0c962bbd28072e7c241 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 17:03:11 +0000 Subject: [PATCH 19/69] Updated changelog and version for release v4.0.0-43 --- CHANGELOG.md | 5 ++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4450249f3..66fc856e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.0.0-43] - 2026-04-08 + ## [4.0.0-42] - 2026-04-08 ## [4.0.0-41] - 2026-04-03 @@ -2247,7 +2249,8 @@ Frodo CLI 2.x automatically refreshes session and access tokens before they expi - Fixed problem with adding connection profiles - Miscellaneous bug fixes -[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-42...HEAD +[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-43...HEAD +[4.0.0-43]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-42...v4.0.0-43 [4.0.0-42]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-41...v4.0.0-42 [4.0.0-41]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-40...v4.0.0-41 [4.0.0-40]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-39...v4.0.0-40 diff --git a/package-lock.json b/package-lock.json index 544086896..87bea13a4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-42", + "version": "4.0.0-43", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-42", + "version": "4.0.0-43", "license": "MIT", "bin": { "frodo": "dist/launch.cjs" diff --git a/package.json b/package.json index 28d48fa52..dd52a659e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-42", + "version": "4.0.0-43", "type": "module", "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.", "keywords": [ From d96aa187eb61458e8282fc14fa595ed09a2d4d18 Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Tue, 31 Mar 2026 07:58:13 -0600 Subject: [PATCH 20/69] feat(mcp): introduce Model Context Protocol (MCP) command and server management - Added new MCP command group for managing Model Context Protocol integrations. - Implemented `frodo mcp server start` command to start an MCP server session. - Created `frodo mcp server tools` command to list current MCP tools. - Integrated HTTP and stdio transport options for MCP server. - Enhanced package dependencies with `@modelcontextprotocol/sdk` and updated `@rockcarver/frodo-lib`. - Added utility functions for handling MCP server operations and transport wiring. --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index dd52a659e..a6bccdf6f 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", "@rockcarver/frodo-lib": "4.0.0-36", + "@modelcontextprotocol/sdk": "^1.29.0", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", From 58360d7fc1be1b33cacb60af34a8a3f35d532e81 Mon Sep 17 00:00:00 2001 From: dallinjsevy Date: Fri, 3 Apr 2026 07:34:47 -0600 Subject: [PATCH 21/69] feat: Add config-manager push managed-objects (#579) * feat: Add config-manager push managed-objects * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * Updated changelog and version for release v4.0.0-35 * feat: Add config-manager push org-privileges command. (#574) * feat: Add config-manager push org-privileges command. * Refactor cli help and introduce stability indicators. (#577) * Upgrade to commander 14 and start structuring help * Further help structuring and output improvements. * Guarantee command help output occurs in this order: arguments, options, option groups in alphabetical order * Remove deprecated library methods and update journey lists with additional tree flags. * Add stability indicators. * remove deprecated library functions. * Updated output * Comments and cleanup * Update snapshots * Update recordings and snapshots for journey deprecation changes. * feat: Add config-manager push org-privileges command. * Rebase and update to frodo-lib 4.0.0-34 * Update snapshots * Updated snapshots * Updated snapshots * Updated snapshots --------- Co-authored-by: Volker Scheuber * Updated changelog and version for release v4.0.0-36 * adjusted path string to pull csp not cps (#578) * Updated changelog and version for release v4.0.0-37 * feat: Add config-manager push managed-objects * Update snapshots * chore: update @rockcarver/frodo-lib to version 4.0.0-35 --------- Co-authored-by: Huston Franklin Co-authored-by: Volker Scheuber Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: devintrivir --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index a6bccdf6f..dd52a659e 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,6 @@ "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", "@rockcarver/frodo-lib": "4.0.0-36", - "@modelcontextprotocol/sdk": "^1.29.0", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", From 7da099d6ac068d250597cf821758b501af39ac51 Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Tue, 31 Mar 2026 07:58:13 -0600 Subject: [PATCH 22/69] feat(mcp): introduce Model Context Protocol (MCP) command and server management - Added new MCP command group for managing Model Context Protocol integrations. - Implemented `frodo mcp server start` command to start an MCP server session. - Created `frodo mcp server tools` command to list current MCP tools. - Integrated HTTP and stdio transport options for MCP server. - Enhanced package dependencies with `@modelcontextprotocol/sdk` and updated `@rockcarver/frodo-lib`. - Added utility functions for handling MCP server operations and transport wiring. --- package.json | 1 + src/cli/mcp/server/server-start.ts | 17 +- src/ops/McpServerOps.ts | 263 +++++------------------------ 3 files changed, 49 insertions(+), 232 deletions(-) diff --git a/package.json b/package.json index dd52a659e..a6bccdf6f 100644 --- a/package.json +++ b/package.json @@ -97,6 +97,7 @@ "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", "@rockcarver/frodo-lib": "4.0.0-36", + "@modelcontextprotocol/sdk": "^1.29.0", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", diff --git a/src/cli/mcp/server/server-start.ts b/src/cli/mcp/server/server-start.ts index d8f6aea8c..3e30ff99d 100644 --- a/src/cli/mcp/server/server-start.ts +++ b/src/cli/mcp/server/server-start.ts @@ -96,16 +96,6 @@ export default function setup() { command ); - // Pre-authenticate the frodo singleton before starting the MCP server. - // This ensures subsequent tool calls can access APIs without hitting 401 errors. - try { - await frodo.login.getTokens(); - } catch (error) { - throw new Error( - `Failed to authenticate MCP server: ${error instanceof Error ? error.message : String(error)}` - ); - } - const opts = options as McpStartOptions; const service = createMcpService({ policyPreset: opts.policy, @@ -114,6 +104,11 @@ export default function setup() { excludeTopLevelDomains: opts.excludeDomains, includeUtils: !!opts.includeUtils, }, + // Reuse the preconfigured frodo singleton; the CLI has already + // applied connection credentials via handleDefaultArgsAndOpts. + runtimeOptions: { + resolveFrodoForRequest: async () => frodo, + }, }); const startupSummary = { @@ -147,7 +142,7 @@ export default function setup() { ); if (opts.transport === 'http') { printMessage( - ` HTTP endpoint: http://${startupSummary.http.bindHost}:${startupSummary.http.port}/mcp` + ` HTTP endpoint (planned): http://${startupSummary.http.bindHost}:${startupSummary.http.port}/mcp` ); } } diff --git a/src/ops/McpServerOps.ts b/src/ops/McpServerOps.ts index f2450959c..e8ea3503c 100644 --- a/src/ops/McpServerOps.ts +++ b/src/ops/McpServerOps.ts @@ -14,9 +14,10 @@ * The same McpServer instance is reused across sessions. * * @remarks - * Both transports derive request-scoped auth context from the active shared - * state configured by `handleDefaultArgsAndOpts` before startup. Generic tool - * calls may additionally override realm per request. + * Both transports recycle the frodo singleton that was configured by + * `handleDefaultArgsAndOpts` before the transport starts. A custom + * `resolveFrodoForRequest` passed to {@link createMcpService} bypasses the + * default per-request Frodo instantiation and returns the singleton directly. */ import { randomUUID } from 'node:crypto'; @@ -32,10 +33,8 @@ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/ import type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js'; import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js'; import { - type McpGenericExecutionArguments, type McpRuntimeRequestContext, type McpService, - state, } from '@rockcarver/frodo-lib'; import { z } from 'zod'; @@ -45,9 +44,17 @@ import { printMessage } from '../utils/Console.js'; // Internal constants // --------------------------------------------------------------------------- -// Zod v4 schema shapes reused for generic and special tools. -const MAX_INLINE_RESULT_BYTES = 256 * 1024; +/** + * Dummy request context used when the transport ignores per-request auth. + * The custom `resolveFrodoForRequest` registered by the `start` command + * returns the preconfigured frodo singleton instead, so the context fields + * are never read by the runtime. + */ +const CLI_REQUEST_CONTEXT: McpRuntimeRequestContext = { + auth: { mode: 'state-config', config: {} }, +}; +// Zod v4 schema shapes reused for generic and special tools. const GENERIC_SHAPE = { domain: z.string().describe('Top-level capability domain key (e.g. "authn")'), objectType: z @@ -55,38 +62,6 @@ const GENERIC_SHAPE = { .describe( 'Object type within the domain (e.g. "Journey"). Use frodo_discover to enumerate available types.' ), - scope: z - .string() - .optional() - .describe( - 'Optional scope selector for ambiguous generic operations (for example "single" or "bulk"). Use frodo_discover for supported values.' - ), - realm: z - .string() - .optional() - .describe( - 'Optional realm override for request-scoped execution context (e.g. "/alpha").' - ), - pageSize: z - .number() - .int() - .positive() - .optional() - .describe('Optional page size hint for paginated operations.'), - pageOffset: z - .number() - .int() - .nonnegative() - .optional() - .describe('Optional page offset hint for paginated operations.'), - pageToken: z - .string() - .optional() - .describe('Optional page token/cursor hint for paginated operations.'), - includeTotal: z - .boolean() - .optional() - .describe('Optional request for exact total counts when supported.'), positionalArgs: z .array(z.unknown()) .optional() @@ -146,9 +121,16 @@ function buildMcpServer(service: McpService): McpServer { try { const result = await service.executeTool({ toolName: tool.name, - context: buildRequestContext(), + context: CLI_REQUEST_CONTEXT, }); - return buildSuccessResult(result); + return { + content: [ + { + type: 'text' as const, + text: JSON.stringify(result.data, null, 2), + }, + ], + }; } catch (err) { return buildErrorResult(err); } @@ -164,13 +146,19 @@ function buildMcpServer(service: McpService): McpServer { }, async (args) => { try { - const genericArgs = args as McpGenericExecutionArguments; const result = await service.executeTool({ toolName: tool.name, arguments: args, - context: buildRequestContext(genericArgs.realm), + context: CLI_REQUEST_CONTEXT, }); - return buildSuccessResult(result); + return { + content: [ + { + type: 'text' as const, + text: JSON.stringify(result.data, null, 2), + }, + ], + }; } catch (err) { return buildErrorResult(err); } @@ -189,9 +177,16 @@ function buildMcpServer(service: McpService): McpServer { const result = await service.executeTool({ toolName: tool.name, arguments: args, - context: buildRequestContext(), + context: CLI_REQUEST_CONTEXT, }); - return buildSuccessResult(result); + return { + content: [ + { + type: 'text' as const, + text: JSON.stringify(result.data, null, 2), + }, + ], + }; } catch (err) { return buildErrorResult(err); } @@ -389,192 +384,18 @@ function readJsonBody(req: IncomingMessage): Promise { /** * Builds a standardized error result for tool execution failures. - * Extracts full error context from FrodoError chains and HTTP error details. - */ -function buildSuccessResult(result: unknown): { - content: { type: 'text'; text: string }[]; -} { - const serialized = safeJsonStringify(result); - const payloadSizeBytes = Buffer.byteLength(serialized, 'utf8'); - if (payloadSizeBytes <= MAX_INLINE_RESULT_BYTES) { - return { - content: [ - { - type: 'text' as const, - text: serialized, - }, - ], - }; - } - - const truncatedPayload = buildTruncatedSuccessPayload( - result, - payloadSizeBytes - ); - return { - content: [ - { - type: 'text' as const, - text: safeJsonStringify(truncatedPayload), - }, - ], - }; -} - -/** - * Replaces oversized inline payloads with a summary/truncation envelope. - */ -function buildTruncatedSuccessPayload( - result: unknown, - payloadSizeBytes: number -): unknown { - const warning = - 'Result exceeded the inline response limit. Narrow the request using scope, deps=false, paging, or a more specific read/export.'; - const resultObject = - result && typeof result === 'object' - ? (result as Record) - : { data: result }; - const metadataObject = - resultObject.metadata && typeof resultObject.metadata === 'object' - ? (resultObject.metadata as Record) - : {}; - const existingResultMetadata = - metadataObject.result && typeof metadataObject.result === 'object' - ? (metadataObject.result as Record) - : {}; - - return { - ...resultObject, - data: { - _truncated: true, - message: warning, - }, - metadata: { - ...metadataObject, - result: { - ...existingResultMetadata, - payloadSizeBytes, - payloadSizeHuman: formatByteSize(payloadSizeBytes), - isLarge: true, - isTruncated: true, - warning, - }, - }, - }; -} - -/** - * Safely stringifies a payload for MCP transport output. */ -function safeJsonStringify(payload: unknown): string { - try { - return JSON.stringify(payload, null, 2) ?? 'null'; - } catch { - return JSON.stringify(String(payload), null, 2); - } -} - -/** - * Formats byte counts for human-readable MCP payload metadata. - */ -function formatByteSize(bytes: number): string { - if (bytes < 1024) { - return `${bytes} B`; - } - if (bytes < 1024 * 1024) { - return `${(bytes / 1024).toFixed(1)} KiB`; - } - return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`; -} - function buildErrorResult(err: unknown): { content: { type: 'text'; text: string }[]; isError: true; } { - let errorText = 'Error: '; - - if (err instanceof Error) { - // If it's a FrodoError with nested originalErrors, get combined message - if (typeof (err as any).getCombinedMessage === 'function') { - errorText += (err as any).getCombinedMessage(); - } else if ( - (err as any).originalErrors && - Array.isArray((err as any).originalErrors) - ) { - // Fallback: manually build chain for non-getCombinedMessage errors - errorText += err.message; - const originalErrors = (err as any).originalErrors as Error[]; - for (const nested of originalErrors) { - errorText += `\n → ${nested.name || 'Error'}: ${nested.message}`; - } - } else { - errorText += err.message; - } - } else { - errorText += String(err); - } - return { content: [ { type: 'text' as const, - text: errorText, + text: `Error: ${err instanceof Error ? err.message : String(err)}`, }, ], isError: true as const, }; } - -/** - * Builds request-scoped runtime auth context from active frodo state. - */ -function buildRequestContext(realmOverride?: string): McpRuntimeRequestContext { - const host = state.getHost(); - const realm = realmOverride ?? state.getRealm(); - - const serviceAccountId = state.getServiceAccountId(); - const serviceAccountJwk = state.getServiceAccountJwk(); - if (host && serviceAccountId && serviceAccountJwk) { - return { - auth: { - mode: 'service-account', - host, - serviceAccountId, - serviceAccountJwk: JSON.stringify(serviceAccountJwk), - realm, - deploymentType: state.getDeploymentType(), - allowInsecureConnection: state.getAllowInsecureConnection(), - debug: state.getDebug(), - curlirize: state.getCurlirize(), - }, - }; - } - - const username = state.getUsername(); - const password = state.getPassword(); - if (host && username && password) { - return { - auth: { - mode: 'admin-account', - host, - username, - password, - realm, - deploymentType: state.getDeploymentType(), - allowInsecureConnection: state.getAllowInsecureConnection(), - debug: state.getDebug(), - curlirize: state.getCurlirize(), - }, - }; - } - - return { - auth: { - mode: 'state-config', - config: { - ...state.getState(), - realm, - }, - }, - }; -} From 795fec2aca5bfc731162a1dc39dfe185240ecc1b Mon Sep 17 00:00:00 2001 From: Volker Scheuber Date: Tue, 7 Apr 2026 21:10:13 -0600 Subject: [PATCH 23/69] fix: update @rockcarver/frodo-lib to version 4.0.0-36 and normalize agent import data handling --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index a6bccdf6f..dd52a659e 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,6 @@ "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", "@rockcarver/frodo-lib": "4.0.0-36", - "@modelcontextprotocol/sdk": "^1.29.0", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", From a4b9ae48095e92671cb13be73d14f41d1856ea62 Mon Sep 17 00:00:00 2001 From: brycentrivir Date: Fri, 17 Apr 2026 09:39:40 -0600 Subject: [PATCH 24/69] Update -M, --modified-properties to remove creation timestamps (#587) * feat: removing creation dates from cli export files instructions for -M flags * feat: update @rockcarver/frodo-lib to version 4.0.0-37 --------- Co-authored-by: Volker Scheuber --- package-lock.json | 8 +- package.json | 2 +- src/cli/authz/authz-policy-export.ts | 2 +- src/cli/authz/authz-set-export.ts | 2 +- src/cli/authz/authz-type-export.ts | 2 +- src/cli/config/config-export.ts | 2 +- src/cli/esv/esv-secret-export.ts | 2 +- src/cli/esv/esv-variable-export.ts | 2 +- src/cli/script/script-export.ts | 2 +- .../authz-policy-export.test.js.snap | 4 +- .../authz-set-export.test.js.snap | 4 +- .../authz-type-export.test.js.snap | 4 +- .../__snapshots__/config-export.test.js.snap | 4 +- .../esv-secret-export.test.js.snap | 4 +- .../esv-variable-export.test.js.snap | 4 +- .../__snapshots__/script-export.test.js.snap | 4 +- .../authz-policy-export.e2e.test.js.snap | 30 -- .../authz-set-export.e2e.test.js.snap | 38 -- .../authz-type-export.e2e.test.js.snap | 52 --- .../__snapshots__/idp-export.e2e.test.js.snap | 62 --- .../journey-export.e2e.test.js.snap | 212 ----------- .../oauth-client-export.e2e.test.js.snap | 16 - .../saml-export.e2e.test.js.snap | 38 -- .../script-export.e2e.test.js.snap | 352 ------------------ 24 files changed, 26 insertions(+), 826 deletions(-) diff --git a/package-lock.json b/package-lock.json index 87bea13a4..e47eec559 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ }, "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", - "@rockcarver/frodo-lib": "4.0.0-36", + "@rockcarver/frodo-lib": "4.0.0-37", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", @@ -1833,9 +1833,9 @@ } }, "node_modules/@rockcarver/frodo-lib": { - "version": "4.0.0-36", - "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.0.0-36.tgz", - "integrity": "sha512-4AReHTZGd54Ke5MCQDQtwsTBDHRlkgdxGa3K7DtXOwzicxBVFwii4YRAvU/E2p2epjas8np8fCklNPUZHJGKoQ==", + "version": "4.0.0-37", + "resolved": "https://registry.npmjs.org/@rockcarver/frodo-lib/-/frodo-lib-4.0.0-37.tgz", + "integrity": "sha512-i+Lx2jUqbdanH3pTjz5Y/oGbNIHOZXXP7r06+k6pwcN23nFZyy3pRvJoy6BZZvFtqvZ0mUo+q8JJiBDem3CXew==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index dd52a659e..145fba659 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ }, "devDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", - "@rockcarver/frodo-lib": "4.0.0-36", + "@rockcarver/frodo-lib": "4.0.0-37", "@types/colors": "^1.2.1", "@types/fs-extra": "^11.0.1", "@types/jest": "^29.2.3", diff --git a/src/cli/authz/authz-policy-export.ts b/src/cli/authz/authz-policy-export.ts index aab8b4dbe..353cad036 100644 --- a/src/cli/authz/authz-policy-export.ts +++ b/src/cli/authz/authz-policy-export.ts @@ -50,7 +50,7 @@ export default function setup() { .addOption( new Option( '-M, --modified-properties', - 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, etc.)' + 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, createdBy, creationDate, etc.)' ).default(false, 'false') ) .addOption( diff --git a/src/cli/authz/authz-set-export.ts b/src/cli/authz/authz-set-export.ts index 94ff9d98e..c8152f1f2 100644 --- a/src/cli/authz/authz-set-export.ts +++ b/src/cli/authz/authz-set-export.ts @@ -42,7 +42,7 @@ export default function setup() { .addOption( new Option( '-M, --modified-properties', - 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, etc.)' + 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, createdBy, creationDate, etc.)' ).default(false, 'false') ) .addOption( diff --git a/src/cli/authz/authz-type-export.ts b/src/cli/authz/authz-type-export.ts index 216030fd7..7ab91f2f5 100644 --- a/src/cli/authz/authz-type-export.ts +++ b/src/cli/authz/authz-type-export.ts @@ -49,7 +49,7 @@ export default function setup() { .addOption( new Option( '-M, --modified-properties', - 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, etc.)' + 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, createdBy, creationDate, etc.)' ).default(false, 'false') ) .action( diff --git a/src/cli/config/config-export.ts b/src/cli/config/config-export.ts index 822a40f94..d1ab08860 100644 --- a/src/cli/config/config-export.ts +++ b/src/cli/config/config-export.ts @@ -54,7 +54,7 @@ export default function setup() { .addOption( new Option( '-M, --modified-properties', - 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, etc.)' + 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, createdBy, creationDate, etc.)' ).default(false, 'false') ) .addOption( diff --git a/src/cli/esv/esv-secret-export.ts b/src/cli/esv/esv-secret-export.ts index 71ddb0f5b..57da05c80 100644 --- a/src/cli/esv/esv-secret-export.ts +++ b/src/cli/esv/esv-secret-export.ts @@ -52,7 +52,7 @@ export default function setup() { .addOption( new Option( '-M, --modified-properties', - 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, etc.)' + 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, createdBy, creationDate, etc.)' ).default(false, 'false') ) .addOption( diff --git a/src/cli/esv/esv-variable-export.ts b/src/cli/esv/esv-variable-export.ts index 19f00b306..9cfbea576 100644 --- a/src/cli/esv/esv-variable-export.ts +++ b/src/cli/esv/esv-variable-export.ts @@ -57,7 +57,7 @@ export default function setup() { .addOption( new Option( '-M, --modified-properties', - 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, etc.)' + 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, createdBy, creationDate, etc.)' ).default(false, 'false') ) .action( diff --git a/src/cli/script/script-export.ts b/src/cli/script/script-export.ts index d77a4bf92..ca6074825 100644 --- a/src/cli/script/script-export.ts +++ b/src/cli/script/script-export.ts @@ -49,7 +49,7 @@ export default function setup() { .addOption( new Option( '-M, --modified-properties', - 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, etc.)' + 'Include modified properties in export (e.g. lastModifiedDate, lastModifiedBy, createdBy, creationDate, etc.)' ).default(false, 'false') ) // deprecated option diff --git a/test/client_cli/en/__snapshots__/authz-policy-export.test.js.snap b/test/client_cli/en/__snapshots__/authz-policy-export.test.js.snap index 02d62afbc..1b45e4968 100644 --- a/test/client_cli/en/__snapshots__/authz-policy-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/authz-policy-export.test.js.snap @@ -28,8 +28,8 @@ Options: -f, --file Name of the export file. -i, --policy-id Policy id. If specified, -a and -A are ignored. -M, --modified-properties Include modified properties in export (e.g. - lastModifiedDate, lastModifiedBy, etc.) (default: - false) + lastModifiedDate, lastModifiedBy, createdBy, + creationDate, etc.) (default: false) -N, --no-metadata Does not include metadata in the export file. --no-deps Do not include dependencies (scripts). --prereqs Include prerequisites (policy sets, resource diff --git a/test/client_cli/en/__snapshots__/authz-set-export.test.js.snap b/test/client_cli/en/__snapshots__/authz-set-export.test.js.snap index fb7a55623..8f2fcdd87 100644 --- a/test/client_cli/en/__snapshots__/authz-set-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/authz-set-export.test.js.snap @@ -27,8 +27,8 @@ Options: -i, --set-id Policy set id/name. If specified, -a and -A are ignored. -M, --modified-properties Include modified properties in export (e.g. - lastModifiedDate, lastModifiedBy, etc.) (default: - false) + lastModifiedDate, lastModifiedBy, createdBy, + creationDate, etc.) (default: false) -N, --no-metadata Does not include metadata in the export file. --no-deps Do not include any dependencies (policies, scripts). diff --git a/test/client_cli/en/__snapshots__/authz-type-export.test.js.snap b/test/client_cli/en/__snapshots__/authz-type-export.test.js.snap index 8f8aaf927..e95e50e3b 100644 --- a/test/client_cli/en/__snapshots__/authz-type-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/authz-type-export.test.js.snap @@ -29,8 +29,8 @@ Options: -i, --type-id Resource type uuid. If specified, -a and -A are ignored. -M, --modified-properties Include modified properties in export (e.g. - lastModifiedDate, lastModifiedBy, etc.) (default: - false) + lastModifiedDate, lastModifiedBy, createdBy, + creationDate, etc.) (default: false) -n, --type-name Resource type name. If specified, -a and -A are ignored. -N, --no-metadata Does not include metadata in the export file. diff --git a/test/client_cli/en/__snapshots__/config-export.test.js.snap b/test/client_cli/en/__snapshots__/config-export.test.js.snap index 647ee250c..abf3d9eac 100644 --- a/test/client_cli/en/__snapshots__/config-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-export.test.js.snap @@ -40,8 +40,8 @@ Options: exported from. Use --target to have another environment perform the encryption. -M, --modified-properties Include modified properties in export (e.g. - lastModifiedDate, lastModifiedBy, etc.) (default: - false) + lastModifiedDate, lastModifiedBy, createdBy, + creationDate, etc.) (default: false) -N, --no-metadata Does not include metadata in the export file. --no-coords Do not include the x and y coordinate positions of the journey/tree nodes. diff --git a/test/client_cli/en/__snapshots__/esv-secret-export.test.js.snap b/test/client_cli/en/__snapshots__/esv-secret-export.test.js.snap index 116d0b18c..840b0c1f3 100644 --- a/test/client_cli/en/__snapshots__/esv-secret-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/esv-secret-export.test.js.snap @@ -31,8 +31,8 @@ Options: are exported from. Use --target to have another environment perform the encryption. -M, --modified-properties Include modified properties in export (e.g. - lastModifiedDate, lastModifiedBy, etc.) (default: - false) + lastModifiedDate, lastModifiedBy, createdBy, + creationDate, etc.) (default: false) -N, --no-metadata Does not include metadata in the export file. --target Host URL of the environment to perform secret value encryption. The URL must resolve to an diff --git a/test/client_cli/en/__snapshots__/esv-variable-export.test.js.snap b/test/client_cli/en/__snapshots__/esv-variable-export.test.js.snap index 6b09270c2..163078293 100644 --- a/test/client_cli/en/__snapshots__/esv-variable-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/esv-variable-export.test.js.snap @@ -27,8 +27,8 @@ Options: -i, --variable-id Variable id. If specified, -a and -A are ignored. -M, --modified-properties Include modified properties in export (e.g. - lastModifiedDate, lastModifiedBy, etc.) - (default: false) + lastModifiedDate, lastModifiedBy, createdBy, + creationDate, etc.) (default: false) -N, --no-metadata Does not include metadata in the export file. --no-decode Do not include decoded variable value in export diff --git a/test/client_cli/en/__snapshots__/script-export.test.js.snap b/test/client_cli/en/__snapshots__/script-export.test.js.snap index fc0ec5002..7fce45b49 100644 --- a/test/client_cli/en/__snapshots__/script-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/script-export.test.js.snap @@ -29,8 +29,8 @@ Options: -i, --script-id Uuid of the script. If specified, -a and -A are ignored. -M, --modified-properties Include modified properties in export (e.g. - lastModifiedDate, lastModifiedBy, etc.) (default: - false) + lastModifiedDate, lastModifiedBy, createdBy, + creationDate, etc.) (default: false) -n, --script-name Name of the script. If specified, -a and -A are ignored. -N, --no-metadata Does not include metadata in the export file. diff --git a/test/e2e/__snapshots__/authz-policy-export.e2e.test.js.snap b/test/e2e/__snapshots__/authz-policy-export.e2e.test.js.snap index edf800ca3..1b87f837e 100644 --- a/test/e2e/__snapshots__/authz-policy-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/authz-policy-export.e2e.test.js.snap @@ -13,8 +13,6 @@ exports[`frodo authz policy export "frodo authz policy export --all --file my-al "actionValues": {}, "active": true, "applicationName": "test-policy-set", - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.459Z", "description": "FeatureStorePolicy", "name": "FeatureStorePolicy", "resourceTypeUuid": "76656a38-5f8e-401b-83aa-4ccb74ce88d2", @@ -52,8 +50,6 @@ exports[`frodo authz policy export "frodo authz policy export --all --file my-al ], "type": "AND", }, - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.545Z", "description": "Test Policy Description", "name": "Test Policy", "resourceAttributes": [ @@ -100,8 +96,6 @@ exports[`frodo authz policy export "frodo authz policy export --all --file my-al "SimpleTime", "Transaction", ], - "createdBy": "id=fbdeb2a9-beb6-4a14-ae66-e35f16ce421d,ou=user,ou=am-config", - "creationDate": 1693494279401, "description": "Test Policy Set Description", "displayName": "Test Policy Set", "editable": true, @@ -136,8 +130,6 @@ exports[`frodo authz policy export "frodo authz policy export --all --file my-al "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -429,8 +421,6 @@ exports[`frodo authz policy export "frodo authz policy export --policy-id 'Test ], "type": "AND", }, - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.545Z", "description": "Test Policy Description", "name": "Test Policy", "resourceAttributes": [ @@ -477,8 +467,6 @@ exports[`frodo authz policy export "frodo authz policy export --policy-id 'Test "SimpleTime", "Transaction", ], - "createdBy": "id=fbdeb2a9-beb6-4a14-ae66-e35f16ce421d,ou=user,ou=am-config", - "creationDate": 1693494279401, "description": "Test Policy Set Description", "displayName": "Test Policy Set", "editable": true, @@ -513,8 +501,6 @@ exports[`frodo authz policy export "frodo authz policy export --policy-id 'Test "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -541,8 +527,6 @@ exports[`frodo authz policy export "frodo authz policy export -A": should export "actionValues": {}, "active": true, "applicationName": "test-policy-set", - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.459Z", "description": "FeatureStorePolicy", "name": "FeatureStorePolicy", "resourceTypeUuid": "76656a38-5f8e-401b-83aa-4ccb74ce88d2", @@ -591,8 +575,6 @@ exports[`frodo authz policy export "frodo authz policy export -A": should export ], "type": "AND", }, - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.545Z", "description": "Test Policy Description", "name": "Test Policy", "resourceAttributes": [ @@ -619,8 +601,6 @@ exports[`frodo authz policy export "frodo authz policy export -A": should export "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", @@ -857,8 +837,6 @@ exports[`frodo authz policy export "frodo authz policy export -a": should export "actionValues": {}, "active": true, "applicationName": "test-policy-set", - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.459Z", "description": "FeatureStorePolicy", "name": "FeatureStorePolicy", "resourceTypeUuid": "76656a38-5f8e-401b-83aa-4ccb74ce88d2", @@ -896,8 +874,6 @@ exports[`frodo authz policy export "frodo authz policy export -a": should export ], "type": "AND", }, - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.545Z", "description": "Test Policy Description", "name": "Test Policy", "resourceAttributes": [ @@ -924,8 +900,6 @@ exports[`frodo authz policy export "frodo authz policy export -a": should export "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", @@ -993,8 +967,6 @@ exports[`frodo authz policy export "frodo authz policy export -i 'Test Policy'": ], "type": "AND", }, - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.545Z", "description": "Test Policy Description", "name": "Test Policy", "resourceAttributes": [ @@ -1021,8 +993,6 @@ exports[`frodo authz policy export "frodo authz policy export -i 'Test Policy'": "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", diff --git a/test/e2e/__snapshots__/authz-set-export.e2e.test.js.snap b/test/e2e/__snapshots__/authz-set-export.e2e.test.js.snap index b0d2c4252..2000d3c02 100644 --- a/test/e2e/__snapshots__/authz-set-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/authz-set-export.e2e.test.js.snap @@ -34,8 +34,6 @@ exports[`frodo authz set export "frodo authz set export --all --file my-allAlpha "SimpleTime", "Transaction", ], - "createdBy": "id=8efaa5b6-8c98-4489-9b21-ee41f5589ab7,ou=user,ou=am-config", - "creationDate": 1695912757709, "description": null, "displayName": "FeatureStorePolicySet", "editable": true, @@ -83,8 +81,6 @@ exports[`frodo authz set export "frodo authz set export --all --file my-allAlpha "SimpleTime", "Transaction", ], - "createdBy": "id=fbdeb2a9-beb6-4a14-ae66-e35f16ce421d,ou=user,ou=am-config", - "creationDate": 1693494279401, "description": "Test Policy Set Description", "displayName": "Test Policy Set", "editable": true, @@ -119,8 +115,6 @@ exports[`frodo authz set export "frodo authz set export --all --file my-allAlpha "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -417,8 +411,6 @@ exports[`frodo authz set export "frodo authz set export --set-id test-policy-set "SimpleTime", "Transaction", ], - "createdBy": "id=fbdeb2a9-beb6-4a14-ae66-e35f16ce421d,ou=user,ou=am-config", - "creationDate": 1693494279401, "description": "Test Policy Set Description", "displayName": "Test Policy Set", "editable": true, @@ -453,8 +445,6 @@ exports[`frodo authz set export "frodo authz set export --set-id test-policy-set "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -502,8 +492,6 @@ exports[`frodo authz set export "frodo authz set export -A": should export all p "SimpleTime", "Transaction", ], - "createdBy": "id=8efaa5b6-8c98-4489-9b21-ee41f5589ab7,ou=user,ou=am-config", - "creationDate": 1695912757709, "description": null, "displayName": "FeatureStorePolicySet", "editable": true, @@ -541,8 +529,6 @@ exports[`frodo authz set export "frodo authz set export -A": should export all p "actionValues": {}, "active": true, "applicationName": "test-policy-set", - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.459Z", "description": "FeatureStorePolicy", "name": "FeatureStorePolicy", "resourceTypeUuid": "76656a38-5f8e-401b-83aa-4ccb74ce88d2", @@ -580,8 +566,6 @@ exports[`frodo authz set export "frodo authz set export -A": should export all p ], "type": "AND", }, - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.545Z", "description": "Test Policy Description", "name": "Test Policy", "resourceAttributes": [ @@ -628,8 +612,6 @@ exports[`frodo authz set export "frodo authz set export -A": should export all p "SimpleTime", "Transaction", ], - "createdBy": "id=fbdeb2a9-beb6-4a14-ae66-e35f16ce421d,ou=user,ou=am-config", - "creationDate": 1693494279401, "description": "Test Policy Set Description", "displayName": "Test Policy Set", "editable": true, @@ -658,8 +640,6 @@ exports[`frodo authz set export "frodo authz set export -A": should export all p "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", @@ -1119,8 +1099,6 @@ exports[`frodo authz set export "frodo authz set export -a": should export all p "actionValues": {}, "active": true, "applicationName": "test-policy-set", - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.459Z", "description": "FeatureStorePolicy", "name": "FeatureStorePolicy", "resourceTypeUuid": "76656a38-5f8e-401b-83aa-4ccb74ce88d2", @@ -1158,8 +1136,6 @@ exports[`frodo authz set export "frodo authz set export -a": should export all p ], "type": "AND", }, - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.545Z", "description": "Test Policy Description", "name": "Test Policy", "resourceAttributes": [ @@ -1206,8 +1182,6 @@ exports[`frodo authz set export "frodo authz set export -a": should export all p "SimpleTime", "Transaction", ], - "createdBy": "id=8efaa5b6-8c98-4489-9b21-ee41f5589ab7,ou=user,ou=am-config", - "creationDate": 1695912757709, "description": null, "displayName": "FeatureStorePolicySet", "editable": true, @@ -1255,8 +1229,6 @@ exports[`frodo authz set export "frodo authz set export -a": should export all p "SimpleTime", "Transaction", ], - "createdBy": "id=fbdeb2a9-beb6-4a14-ae66-e35f16ce421d,ou=user,ou=am-config", - "creationDate": 1693494279401, "description": "Test Policy Set Description", "displayName": "Test Policy Set", "editable": true, @@ -1285,8 +1257,6 @@ exports[`frodo authz set export "frodo authz set export -a": should export all p "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", @@ -1332,8 +1302,6 @@ exports[`frodo authz set export "frodo authz set export -i test-policy-set": sho "actionValues": {}, "active": true, "applicationName": "test-policy-set", - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.459Z", "description": "FeatureStorePolicy", "name": "FeatureStorePolicy", "resourceTypeUuid": "76656a38-5f8e-401b-83aa-4ccb74ce88d2", @@ -1371,8 +1339,6 @@ exports[`frodo authz set export "frodo authz set export -i test-policy-set": sho ], "type": "AND", }, - "createdBy": "id=b672336b-41ef-428d-ae4a-e0c082875377,ou=user,ou=am-config", - "creationDate": "2023-10-17T19:44:38.545Z", "description": "Test Policy Description", "name": "Test Policy", "resourceAttributes": [ @@ -1419,8 +1385,6 @@ exports[`frodo authz set export "frodo authz set export -i test-policy-set": sho "SimpleTime", "Transaction", ], - "createdBy": "id=fbdeb2a9-beb6-4a14-ae66-e35f16ce421d,ou=user,ou=am-config", - "creationDate": 1693494279401, "description": "Test Policy Set Description", "displayName": "Test Policy Set", "editable": true, @@ -1449,8 +1413,6 @@ exports[`frodo authz set export "frodo authz set export -i test-policy-set": sho "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", diff --git a/test/e2e/__snapshots__/authz-type-export.e2e.test.js.snap b/test/e2e/__snapshots__/authz-type-export.e2e.test.js.snap index 0462eae92..dfb85d975 100644 --- a/test/e2e/__snapshots__/authz-type-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/authz-type-export.e2e.test.js.snap @@ -15,8 +15,6 @@ exports[`frodo authz type export "frodo authz type export --all": should export "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147346, "description": "Frodo Test Resource Type Thirteen", "name": "FrodoTestResourceType13", "patterns": [ @@ -30,8 +28,6 @@ exports[`frodo authz type export "frodo authz type export --all": should export "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147437, "description": "Frodo Test Resource Type Fourteen", "name": "FrodoTestResourceType14", "patterns": [ @@ -45,8 +41,6 @@ exports[`frodo authz type export "frodo authz type export --all": should export "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684545571229, "description": "Frodo Test Resource Type Fifteen", "name": "FrodoTestResourceType15", "patterns": [ @@ -60,8 +54,6 @@ exports[`frodo authz type export "frodo authz type export --all": should export "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147204, "description": "Frodo Test Resource Type Twelve", "name": "FrodoTestResourceType12", "patterns": [ @@ -80,8 +72,6 @@ exports[`frodo authz type export "frodo authz type export --all": should export "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -95,8 +85,6 @@ exports[`frodo authz type export "frodo authz type export --all": should export "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147077, "description": "Frodo Test Resource Type Eleven", "name": "FrodoTestResourceType11", "patterns": [ @@ -109,8 +97,6 @@ exports[`frodo authz type export "frodo authz type export --all": should export "actions": { "GRANT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030586, "description": "The built-in OAuth2 Scope Resource Type for OAuth2policy-provided scope.", "name": "OAuth2 Scope", "patterns": [ @@ -208,8 +194,6 @@ exports[`frodo authz type export "frodo authz type export --type-id 76656a38-5f8 "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -243,8 +227,6 @@ exports[`frodo authz type export "frodo authz type export --type-name URL -f tes "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -273,8 +255,6 @@ exports[`frodo authz type export "frodo authz type export -A": should export all "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147077, "description": "Frodo Test Resource Type Eleven", "name": "FrodoTestResourceType11", "patterns": [ @@ -299,8 +279,6 @@ exports[`frodo authz type export "frodo authz type export -A": should export all "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147204, "description": "Frodo Test Resource Type Twelve", "name": "FrodoTestResourceType12", "patterns": [ @@ -325,8 +303,6 @@ exports[`frodo authz type export "frodo authz type export -A": should export all "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147346, "description": "Frodo Test Resource Type Thirteen", "name": "FrodoTestResourceType13", "patterns": [ @@ -351,8 +327,6 @@ exports[`frodo authz type export "frodo authz type export -A": should export all "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147437, "description": "Frodo Test Resource Type Fourteen", "name": "FrodoTestResourceType14", "patterns": [ @@ -377,8 +351,6 @@ exports[`frodo authz type export "frodo authz type export -A": should export all "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684545571229, "description": "Frodo Test Resource Type Fifteen", "name": "FrodoTestResourceType15", "patterns": [ @@ -402,8 +374,6 @@ exports[`frodo authz type export "frodo authz type export -A": should export all "actions": { "GRANT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030586, "description": "The built-in OAuth2 Scope Resource Type for OAuth2policy-provided scope.", "name": "OAuth2 Scope", "patterns": [ @@ -434,8 +404,6 @@ exports[`frodo authz type export "frodo authz type export -A": should export all "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -557,8 +525,6 @@ exports[`frodo authz type export "frodo authz type export -Ni 76656a38-5f8e-401b "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -587,8 +553,6 @@ exports[`frodo authz type export "frodo authz type export -a --file my-allAlphaR "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147346, "description": "Frodo Test Resource Type Thirteen", "name": "FrodoTestResourceType13", "patterns": [ @@ -602,8 +566,6 @@ exports[`frodo authz type export "frodo authz type export -a --file my-allAlphaR "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147437, "description": "Frodo Test Resource Type Fourteen", "name": "FrodoTestResourceType14", "patterns": [ @@ -617,8 +579,6 @@ exports[`frodo authz type export "frodo authz type export -a --file my-allAlphaR "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684545571229, "description": "Frodo Test Resource Type Fifteen", "name": "FrodoTestResourceType15", "patterns": [ @@ -632,8 +592,6 @@ exports[`frodo authz type export "frodo authz type export -a --file my-allAlphaR "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147204, "description": "Frodo Test Resource Type Twelve", "name": "FrodoTestResourceType12", "patterns": [ @@ -652,8 +610,6 @@ exports[`frodo authz type export "frodo authz type export -a --file my-allAlphaR "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -667,8 +623,6 @@ exports[`frodo authz type export "frodo authz type export -a --file my-allAlphaR "action1": true, "action2": true, }, - "createdBy": "id=8d9723a9-a439-4cbf-beb4-30e52811789d,ou=user,ou=am-config", - "creationDate": 1684544147077, "description": "Frodo Test Resource Type Eleven", "name": "FrodoTestResourceType11", "patterns": [ @@ -681,8 +635,6 @@ exports[`frodo authz type export "frodo authz type export -a --file my-allAlphaR "actions": { "GRANT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030586, "description": "The built-in OAuth2 Scope Resource Type for OAuth2policy-provided scope.", "name": "OAuth2 Scope", "patterns": [ @@ -717,8 +669,6 @@ exports[`frodo authz type export "frodo authz type export -i 76656a38-5f8e-401b- "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ @@ -752,8 +702,6 @@ exports[`frodo authz type export "frodo authz type export -n URL": should export "POST": true, "PUT": true, }, - "createdBy": "id=dsameuser,ou=user,ou=am-config", - "creationDate": 1595479030487, "description": "The built-in URL Resource Type available to OpenAMPolicies.", "name": "URL", "patterns": [ diff --git a/test/e2e/__snapshots__/idp-export.e2e.test.js.snap b/test/e2e/__snapshots__/idp-export.e2e.test.js.snap index 0822e0150..6cf09dcbc 100644 --- a/test/e2e/__snapshots__/idp-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/idp-export.e2e.test.js.snap @@ -385,8 +385,6 @@ exports[`frodo idp export "frodo idp export --all": should export all idp provid "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "language": "GROOVY", @@ -419,8 +417,6 @@ exports[`frodo idp export "frodo idp export --all": should export all idp provid "484e6246-dbc6-4288-97e6-54e55431402e": { "_id": "484e6246-dbc6-4288-97e6-54e55431402e", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Apple", "language": "GROOVY", @@ -480,8 +476,6 @@ exports[`frodo idp export "frodo idp export --all": should export all idp provid "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", @@ -513,8 +507,6 @@ exports[`frodo idp export "frodo idp export --all": should export all idp provid "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "language": "GROOVY", @@ -547,8 +539,6 @@ exports[`frodo idp export "frodo idp export --all": should export all idp provid "73cecbfc-dad0-4395-be6a-6858ee3a80e5": { "_id": "73cecbfc-dad0-4395-be6a-6858ee3a80e5", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Microsoft", "language": "GROOVY", @@ -601,8 +591,6 @@ exports[`frodo idp export "frodo idp export --all": should export all idp provid "bae1d54a-e97d-4997-aa5d-c027f21af82c": { "_id": "bae1d54a-e97d-4997-aa5d-c027f21af82c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Facebook", "language": "GROOVY", @@ -633,8 +621,6 @@ exports[`frodo idp export "frodo idp export --all": should export all idp provid "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "language": "JAVASCRIPT", @@ -797,8 +783,6 @@ exports[`frodo idp export "frodo idp export --all-separate --no-metadata --direc "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "evaluatorVersion": "1.0", @@ -946,8 +930,6 @@ exports[`frodo idp export "frodo idp export --all-separate --no-metadata --direc "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -1040,8 +1022,6 @@ exports[`frodo idp export "frodo idp export --all-separate --no-metadata --direc "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "evaluatorVersion": "1.0", @@ -1139,8 +1119,6 @@ exports[`frodo idp export "frodo idp export --idp-id google": should export the "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", @@ -1237,8 +1215,6 @@ exports[`frodo idp export "frodo idp export -A": should export all idp providers "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "language": "JAVASCRIPT", @@ -1400,8 +1376,6 @@ exports[`frodo idp export "frodo idp export -A": should export all idp providers "484e6246-dbc6-4288-97e6-54e55431402e": { "_id": "484e6246-dbc6-4288-97e6-54e55431402e", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Apple", "language": "GROOVY", @@ -1523,8 +1497,6 @@ exports[`frodo idp export "frodo idp export -A": should export all idp providers "484e6246-dbc6-4288-97e6-54e55431402e": { "_id": "484e6246-dbc6-4288-97e6-54e55431402e", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Apple", "language": "GROOVY", @@ -1636,8 +1608,6 @@ exports[`frodo idp export "frodo idp export -A": should export all idp providers "73cecbfc-dad0-4395-be6a-6858ee3a80e5": { "_id": "73cecbfc-dad0-4395-be6a-6858ee3a80e5", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Microsoft", "language": "GROOVY", @@ -1741,8 +1711,6 @@ exports[`frodo idp export "frodo idp export -A": should export all idp providers "bae1d54a-e97d-4997-aa5d-c027f21af82c": { "_id": "bae1d54a-e97d-4997-aa5d-c027f21af82c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Facebook", "language": "GROOVY", @@ -1822,8 +1790,6 @@ exports[`frodo idp export "frodo idp export -A": should export all idp providers "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "language": "GROOVY", @@ -1917,8 +1883,6 @@ exports[`frodo idp export "frodo idp export -A": should export all idp providers "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", @@ -2004,8 +1968,6 @@ exports[`frodo idp export "frodo idp export -A": should export all idp providers "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "language": "GROOVY", @@ -2189,8 +2151,6 @@ exports[`frodo idp export "frodo idp export -NaD idpExportTestDir2": should expo "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -2224,8 +2184,6 @@ exports[`frodo idp export "frodo idp export -NaD idpExportTestDir2": should expo "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "evaluatorVersion": "1.0", @@ -2258,8 +2216,6 @@ exports[`frodo idp export "frodo idp export -NaD idpExportTestDir2": should expo "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "evaluatorVersion": "1.0", @@ -2423,8 +2379,6 @@ exports[`frodo idp export "frodo idp export -Ni google -D idpExportTestDir1": sh "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "evaluatorVersion": "1.0", @@ -2843,8 +2797,6 @@ exports[`frodo idp export "frodo idp export -a --file my-allAlphaProviders.idp.j "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "language": "GROOVY", @@ -2877,8 +2829,6 @@ exports[`frodo idp export "frodo idp export -a --file my-allAlphaProviders.idp.j "484e6246-dbc6-4288-97e6-54e55431402e": { "_id": "484e6246-dbc6-4288-97e6-54e55431402e", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Apple", "language": "GROOVY", @@ -2938,8 +2888,6 @@ exports[`frodo idp export "frodo idp export -a --file my-allAlphaProviders.idp.j "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", @@ -2971,8 +2919,6 @@ exports[`frodo idp export "frodo idp export -a --file my-allAlphaProviders.idp.j "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "language": "GROOVY", @@ -3005,8 +2951,6 @@ exports[`frodo idp export "frodo idp export -a --file my-allAlphaProviders.idp.j "73cecbfc-dad0-4395-be6a-6858ee3a80e5": { "_id": "73cecbfc-dad0-4395-be6a-6858ee3a80e5", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Microsoft", "language": "GROOVY", @@ -3059,8 +3003,6 @@ exports[`frodo idp export "frodo idp export -a --file my-allAlphaProviders.idp.j "bae1d54a-e97d-4997-aa5d-c027f21af82c": { "_id": "bae1d54a-e97d-4997-aa5d-c027f21af82c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Facebook", "language": "GROOVY", @@ -3091,8 +3033,6 @@ exports[`frodo idp export "frodo idp export -a --file my-allAlphaProviders.idp.j "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "language": "JAVASCRIPT", @@ -3257,8 +3197,6 @@ exports[`frodo idp export "frodo idp export -i google -f my-google.idp.json": sh "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "language": "GROOVY", diff --git a/test/e2e/__snapshots__/journey-export.e2e.test.js.snap b/test/e2e/__snapshots__/journey-export.e2e.test.js.snap index f7ef99f53..83ebfc0ee 100644 --- a/test/e2e/__snapshots__/journey-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/journey-export.e2e.test.js.snap @@ -182,8 +182,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -193,8 +191,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "3cb43516-ae69-433a-8787-501d45db14e9": { "_id": "3cb43516-ae69-433a-8787-501d45db14e9", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Display sharedState, transientState, and headers.", "language": "JAVASCRIPT", @@ -204,8 +200,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -215,8 +209,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -480,8 +472,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -491,8 +481,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -502,8 +490,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -768,8 +754,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -779,8 +763,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -790,8 +772,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -1056,8 +1036,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -1067,8 +1045,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -1078,8 +1054,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -1344,8 +1318,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -1355,8 +1327,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -1366,8 +1336,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -1632,8 +1600,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -1643,8 +1609,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -1654,8 +1618,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -1920,8 +1882,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -1931,8 +1891,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -1942,8 +1900,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -2208,8 +2164,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -2219,8 +2173,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -2230,8 +2182,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -2496,8 +2446,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -2507,8 +2455,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -2518,8 +2464,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -2784,8 +2728,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -2795,8 +2737,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -2806,8 +2746,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -3072,8 +3010,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -3083,8 +3019,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -3094,8 +3028,6 @@ exports[`frodo journey export "frodo journey export --all --file my-allAlphaJour "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -6513,8 +6445,6 @@ a{ "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -6525,8 +6455,6 @@ a{ "484e6246-dbc6-4288-97e6-54e55431402e": { "_id": "484e6246-dbc6-4288-97e6-54e55431402e", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Apple", "evaluatorVersion": "1.0", @@ -6537,8 +6465,6 @@ a{ "58c824ae-84ed-4724-82cd-db128fc3f6c": { "_id": "58c824ae-84ed-4724-82cd-db128fc3f6c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Converts a normalized social profile into a managed user", "evaluatorVersion": "1.0", @@ -6549,8 +6475,6 @@ a{ "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "evaluatorVersion": "1.0", @@ -6561,8 +6485,6 @@ a{ "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -6573,8 +6495,6 @@ a{ "739bdc48-fd24-4c52-b353-88706d75558a": { "_id": "739bdc48-fd24-4c52-b353-88706d75558a", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if username has already been collected.", "evaluatorVersion": "1.0", @@ -6585,8 +6505,6 @@ a{ "73cecbfc-dad0-4395-be6a-6858ee3a80e5": { "_id": "73cecbfc-dad0-4395-be6a-6858ee3a80e5", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Microsoft", "evaluatorVersion": "1.0", @@ -7924,8 +7842,6 @@ a{ "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -7936,8 +7852,6 @@ a{ "484e6246-dbc6-4288-97e6-54e55431402e": { "_id": "484e6246-dbc6-4288-97e6-54e55431402e", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Apple", "evaluatorVersion": "1.0", @@ -7948,8 +7862,6 @@ a{ "58c824ae-84ed-4724-82cd-db128fc3f6c": { "_id": "58c824ae-84ed-4724-82cd-db128fc3f6c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Converts a normalized social profile into a managed user", "evaluatorVersion": "1.0", @@ -7960,8 +7872,6 @@ a{ "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "evaluatorVersion": "1.0", @@ -7972,8 +7882,6 @@ a{ "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -7984,8 +7892,6 @@ a{ "739bdc48-fd24-4c52-b353-88706d75558a": { "_id": "739bdc48-fd24-4c52-b353-88706d75558a", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if username has already been collected.", "evaluatorVersion": "1.0", @@ -7996,8 +7902,6 @@ a{ "73cecbfc-dad0-4395-be6a-6858ee3a80e5": { "_id": "73cecbfc-dad0-4395-be6a-6858ee3a80e5", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Microsoft", "evaluatorVersion": "1.0", @@ -8008,8 +7912,6 @@ a{ "bae1d54a-e97d-4997-aa5d-c027f21af82c": { "_id": "bae1d54a-e97d-4997-aa5d-c027f21af82c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Facebook", "evaluatorVersion": "1.0", @@ -8020,8 +7922,6 @@ a{ "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "evaluatorVersion": "1.0", @@ -10145,8 +10045,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "evaluatorVersion": "1.0", @@ -10157,8 +10055,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "3cb43516-ae69-433a-8787-501d45db14e9": { "_id": "3cb43516-ae69-433a-8787-501d45db14e9", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Display sharedState, transientState, and headers.", "evaluatorVersion": "1.0", @@ -10169,8 +10065,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "evaluatorVersion": "1.0", @@ -10181,8 +10075,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "evaluatorVersion": "1.0", @@ -10454,8 +10346,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "evaluatorVersion": "1.0", @@ -10466,8 +10356,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "evaluatorVersion": "1.0", @@ -10478,8 +10366,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "evaluatorVersion": "1.0", @@ -10752,8 +10638,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "evaluatorVersion": "1.0", @@ -10764,8 +10648,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "evaluatorVersion": "1.0", @@ -10776,8 +10658,6 @@ exports[`frodo journey export "frodo journey export -NAD journeyTestDirectory3": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "evaluatorVersion": "1.0", @@ -13483,8 +13363,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -13494,8 +13372,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "3cb43516-ae69-433a-8787-501d45db14e9": { "_id": "3cb43516-ae69-433a-8787-501d45db14e9", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Display sharedState, transientState, and headers.", "language": "JAVASCRIPT", @@ -13505,8 +13381,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -13516,8 +13390,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -13781,8 +13653,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -13792,8 +13662,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -13803,8 +13671,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -14069,8 +13935,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -14080,8 +13944,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -14091,8 +13953,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -14357,8 +14217,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -14368,8 +14226,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -14379,8 +14235,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -14645,8 +14499,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -14656,8 +14508,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -14667,8 +14517,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -14933,8 +14781,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -14944,8 +14790,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -14955,8 +14799,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -15221,8 +15063,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -15232,8 +15072,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -15243,8 +15081,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -15509,8 +15345,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -15520,8 +15354,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -15531,8 +15363,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -15797,8 +15627,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -15808,8 +15636,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -15819,8 +15645,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -16085,8 +15909,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -16096,8 +15918,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -16107,8 +15927,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -16373,8 +16191,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -16384,8 +16200,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -16395,8 +16209,6 @@ exports[`frodo journey export "frodo journey export -a": should export all journ "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", @@ -17062,8 +16874,6 @@ a{ "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -17074,8 +16884,6 @@ a{ "484e6246-dbc6-4288-97e6-54e55431402e": { "_id": "484e6246-dbc6-4288-97e6-54e55431402e", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Apple", "evaluatorVersion": "1.0", @@ -17086,8 +16894,6 @@ a{ "58c824ae-84ed-4724-82cd-db128fc3f6c": { "_id": "58c824ae-84ed-4724-82cd-db128fc3f6c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Converts a normalized social profile into a managed user", "evaluatorVersion": "1.0", @@ -17098,8 +16904,6 @@ a{ "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "evaluatorVersion": "1.0", @@ -17110,8 +16914,6 @@ a{ "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -17122,8 +16924,6 @@ a{ "739bdc48-fd24-4c52-b353-88706d75558a": { "_id": "739bdc48-fd24-4c52-b353-88706d75558a", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if username has already been collected.", "evaluatorVersion": "1.0", @@ -17134,8 +16934,6 @@ a{ "73cecbfc-dad0-4395-be6a-6858ee3a80e5": { "_id": "73cecbfc-dad0-4395-be6a-6858ee3a80e5", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Microsoft", "evaluatorVersion": "1.0", @@ -17146,8 +16944,6 @@ a{ "bae1d54a-e97d-4997-aa5d-c027f21af82c": { "_id": "bae1d54a-e97d-4997-aa5d-c027f21af82c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Facebook", "evaluatorVersion": "1.0", @@ -17158,8 +16954,6 @@ a{ "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "evaluatorVersion": "1.0", @@ -17949,8 +17743,6 @@ exports[`frodo journey export "frodo journey export -i j01 -f my-j01.json": shou "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "language": "JAVASCRIPT", @@ -17960,8 +17752,6 @@ exports[`frodo journey export "frodo journey export -i j01 -f my-j01.json": shou "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "language": "JAVASCRIPT", @@ -17971,8 +17761,6 @@ exports[`frodo journey export "frodo journey export -i j01 -f my-j01.json": shou "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "language": "JAVASCRIPT", diff --git a/test/e2e/__snapshots__/oauth-client-export.e2e.test.js.snap b/test/e2e/__snapshots__/oauth-client-export.e2e.test.js.snap index c1420a7c4..6ec0ced45 100644 --- a/test/e2e/__snapshots__/oauth-client-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/oauth-client-export.e2e.test.js.snap @@ -15612,8 +15612,6 @@ exports[`frodo oauth client export "frodo oauth client export --all-separate --n "36863ffb-40ec-48b9-94b1-9a99f71cc3b5": { "_id": "36863ffb-40ec-48b9-94b1-9a99f71cc3b5", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OIDC claims", "evaluatorVersion": "1.0", @@ -16246,8 +16244,6 @@ exports[`frodo oauth client export "frodo oauth client export --all-separate --n "d22f9a0c-426a-4466-b95e-d0f125b0d5fa": { "_id": "d22f9a0c-426a-4466-b95e-d0f125b0d5fa", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OAuth2 Access Token Modification", "evaluatorVersion": "1.0", @@ -29896,8 +29892,6 @@ exports[`frodo oauth client export "frodo oauth client export -A": should export "36863ffb-40ec-48b9-94b1-9a99f71cc3b5": { "_id": "36863ffb-40ec-48b9-94b1-9a99f71cc3b5", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OIDC claims", "evaluatorVersion": "1.0", @@ -30530,8 +30524,6 @@ exports[`frodo oauth client export "frodo oauth client export -A": should export "d22f9a0c-426a-4466-b95e-d0f125b0d5fa": { "_id": "d22f9a0c-426a-4466-b95e-d0f125b0d5fa", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OAuth2 Access Token Modification", "evaluatorVersion": "1.0", @@ -41440,8 +41432,6 @@ exports[`frodo oauth client export "frodo oauth client export -NaD oauthClientEx "36863ffb-40ec-48b9-94b1-9a99f71cc3b5": { "_id": "36863ffb-40ec-48b9-94b1-9a99f71cc3b5", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OIDC claims", "evaluatorVersion": "1.0", @@ -42074,8 +42064,6 @@ exports[`frodo oauth client export "frodo oauth client export -NaD oauthClientEx "d22f9a0c-426a-4466-b95e-d0f125b0d5fa": { "_id": "d22f9a0c-426a-4466-b95e-d0f125b0d5fa", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OAuth2 Access Token Modification", "evaluatorVersion": "1.0", @@ -52278,8 +52266,6 @@ exports[`frodo oauth client export "frodo oauth client export -a": should export "36863ffb-40ec-48b9-94b1-9a99f71cc3b5": { "_id": "36863ffb-40ec-48b9-94b1-9a99f71cc3b5", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OIDC claims", "evaluatorVersion": "1.0", @@ -52912,8 +52898,6 @@ exports[`frodo oauth client export "frodo oauth client export -a": should export "d22f9a0c-426a-4466-b95e-d0f125b0d5fa": { "_id": "d22f9a0c-426a-4466-b95e-d0f125b0d5fa", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OAuth2 Access Token Modification", "evaluatorVersion": "1.0", diff --git a/test/e2e/__snapshots__/saml-export.e2e.test.js.snap b/test/e2e/__snapshots__/saml-export.e2e.test.js.snap index 98be21132..c7c4a0f6f 100644 --- a/test/e2e/__snapshots__/saml-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/saml-export.e2e.test.js.snap @@ -1683,8 +1683,6 @@ exports[`frodo saml export "frodo saml export --all --file my-allAlphaProviders. "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -1923,8 +1921,6 @@ exports[`frodo saml export "frodo saml export --all --file my-allAlphaProviders. "248b8a56-df81-4b1b-b4ba-45d994f6504c": { "_id": "248b8a56-df81-4b1b-b4ba-45d994f6504c", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for SAML2 IDP Adapter", "evaluatorVersion": "1.0", @@ -2086,8 +2082,6 @@ exports[`frodo saml export "frodo saml export --all --file my-allAlphaProviders. "85523e71-2d77-4577-b078-6f9674cc54e2": { "_id": "85523e71-2d77-4577-b078-6f9674cc54e2", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -2736,8 +2730,6 @@ exports[`frodo saml export "frodo saml export --all-separate --no-metadata --dir "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -3253,8 +3245,6 @@ exports[`frodo saml export "frodo saml export --all-separate --no-metadata --dir "85523e71-2d77-4577-b078-6f9674cc54e2": { "_id": "85523e71-2d77-4577-b078-6f9674cc54e2", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -3665,8 +3655,6 @@ exports[`frodo saml export "frodo saml export --all-separate --no-metadata --dir "248b8a56-df81-4b1b-b4ba-45d994f6504c": { "_id": "248b8a56-df81-4b1b-b4ba-45d994f6504c", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for SAML2 IDP Adapter", "evaluatorVersion": "1.0", @@ -4861,8 +4849,6 @@ exports[`frodo saml export "frodo saml export --entity-id iSPAzure": should expo "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -5583,8 +5569,6 @@ exports[`frodo saml export "frodo saml export -A": should export all saml provid "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -6101,8 +6085,6 @@ exports[`frodo saml export "frodo saml export -A": should export all saml provid "85523e71-2d77-4577-b078-6f9674cc54e2": { "_id": "85523e71-2d77-4577-b078-6f9674cc54e2", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -6514,8 +6496,6 @@ exports[`frodo saml export "frodo saml export -A": should export all saml provid "248b8a56-df81-4b1b-b4ba-45d994f6504c": { "_id": "248b8a56-df81-4b1b-b4ba-45d994f6504c", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for SAML2 IDP Adapter", "evaluatorVersion": "1.0", @@ -9154,8 +9134,6 @@ exports[`frodo saml export "frodo saml export -NaD samlExportTestDir2": should e "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -9394,8 +9372,6 @@ exports[`frodo saml export "frodo saml export -NaD samlExportTestDir2": should e "248b8a56-df81-4b1b-b4ba-45d994f6504c": { "_id": "248b8a56-df81-4b1b-b4ba-45d994f6504c", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for SAML2 IDP Adapter", "evaluatorVersion": "1.0", @@ -9557,8 +9533,6 @@ exports[`frodo saml export "frodo saml export -NaD samlExportTestDir2": should e "85523e71-2d77-4577-b078-6f9674cc54e2": { "_id": "85523e71-2d77-4577-b078-6f9674cc54e2", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -11411,8 +11385,6 @@ exports[`frodo saml export "frodo saml export -a": should export all saml provid "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -11651,8 +11623,6 @@ exports[`frodo saml export "frodo saml export -a": should export all saml provid "248b8a56-df81-4b1b-b4ba-45d994f6504c": { "_id": "248b8a56-df81-4b1b-b4ba-45d994f6504c", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for SAML2 IDP Adapter", "evaluatorVersion": "1.0", @@ -11814,8 +11784,6 @@ exports[`frodo saml export "frodo saml export -a": should export all saml provid "85523e71-2d77-4577-b078-6f9674cc54e2": { "_id": "85523e71-2d77-4577-b078-6f9674cc54e2", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -12228,8 +12196,6 @@ exports[`frodo saml export "frodo saml export -i iSPAzure -f my-iSPAzure.saml.js "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -12712,8 +12678,6 @@ exports[`frodo saml export "frodo saml export -i iSPAzure": should export the sa "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -13195,8 +13159,6 @@ exports[`frodo saml export "frodo saml export Ni iSPAzure -D samlExportTestDir1" "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", diff --git a/test/e2e/__snapshots__/script-export.e2e.test.js.snap b/test/e2e/__snapshots__/script-export.e2e.test.js.snap index 3d4ba38f4..4a6aa1526 100644 --- a/test/e2e/__snapshots__/script-export.e2e.test.js.snap +++ b/test/e2e/__snapshots__/script-export.e2e.test.js.snap @@ -11,8 +11,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -251,8 +249,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "evaluatorVersion": "1.0", @@ -269,8 +265,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "207f172f-ffb5-439d-b7df-e8e80408830b": { "_id": "207f172f-ffb5-439d-b7df-e8e80408830b", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -304,8 +298,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "223739f3-9c54-43b7-9572-3c5338786145": { "_id": "223739f3-9c54-43b7-9572-3c5338786145", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -321,8 +313,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -356,8 +346,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "2c38c998-aec0-4e56-8d46-bff6e24a704e": { "_id": "2c38c998-aec0-4e56-8d46-bff6e24a704e", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Library", "evaluatorVersion": "2.0", @@ -404,8 +392,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "39c08084-1238-43e8-857f-2e11005eac49": { "_id": "39c08084-1238-43e8-857f-2e11005eac49", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Default alpha realm script for OAuth2 Access Token Modification", "evaluatorVersion": "1.0", @@ -553,8 +539,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "3bd13a46-61c4-4974-8efb-1700c80c64e3": { "_id": "3bd13a46-61c4-4974-8efb-1700c80c64e3", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Inactive Device Match Script", "evaluatorVersion": "1.0", @@ -571,8 +555,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "3cb43516-ae69-433a-8787-501d45db14e9": { "_id": "3cb43516-ae69-433a-8787-501d45db14e9", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Display sharedState, transientState, and headers.", "evaluatorVersion": "1.0", @@ -645,8 +627,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "evaluatorVersion": "1.0", @@ -663,8 +643,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "4c963bb3-7084-43d0-bcdc-a47482cf1825": { "_id": "4c963bb3-7084-43d0-bcdc-a47482cf1825", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Dummy", "evaluatorVersion": "2.0", @@ -679,8 +657,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "4e053815-adde-46ac-9fe2-d3ae93517c14": { "_id": "4e053815-adde-46ac-9fe2-d3ae93517c14", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "2.0", @@ -694,8 +670,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "evaluatorVersion": "1.0", @@ -749,8 +723,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "5ce0d38a-154c-4be5-bd22-f9879c77e895": { "_id": "5ce0d38a-154c-4be5-bd22-f9879c77e895", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -989,8 +961,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "6002c349-f1d0-4317-baa2-a18590fc3cff": { "_id": "6002c349-f1d0-4317-baa2-a18590fc3cff", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -1024,8 +994,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -1059,8 +1027,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "647f2a33-9211-4315-a83f-a521d8b77d7b": { "_id": "647f2a33-9211-4315-a83f-a521d8b77d7b", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -1094,8 +1060,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "739bdc48-fd24-4c52-b353-88706d75558a": { "_id": "739bdc48-fd24-4c52-b353-88706d75558a", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if username has already been collected.", "evaluatorVersion": "1.0", @@ -1128,8 +1092,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "85523e71-2d77-4577-b078-6f9674cc54e2": { "_id": "85523e71-2d77-4577-b078-6f9674cc54e2", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -1298,8 +1260,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "9535446c-0ff6-4a76-8576-616599119d64": { "_id": "9535446c-0ff6-4a76-8576-616599119d64", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Remove button from page.", "evaluatorVersion": "1.0", @@ -1340,8 +1300,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "994a4e8f-2741-424a-83e7-3c5f78da01f5": { "_id": "994a4e8f-2741-424a-83e7-3c5f78da01f5", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -1510,8 +1468,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "bb393d07-a121-47e2-9d24-1a1066f39ec0": { "_id": "bb393d07-a121-47e2-9d24-1a1066f39ec0", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Script Using Libraries", "evaluatorVersion": "2.0", @@ -1535,8 +1491,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "cf3515f0-8278-4ee3-a530-1bad7424c416": { "_id": "cf3515f0-8278-4ee3-a530-1bad7424c416", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Default alpha realm script for OIDC claims", "evaluatorVersion": "1.0", @@ -2169,8 +2123,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "d2dc1ae7-ca1b-4ce4-81b8-5d58dfba73b1": { "_id": "d2dc1ae7-ca1b-4ce4-81b8-5d58dfba73b1", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -2339,8 +2291,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "d58977ed-0542-4147-8197-973ef7300191": { "_id": "d58977ed-0542-4147-8197-973ef7300191", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Custom Device Match Script", "evaluatorVersion": "1.0", @@ -2357,8 +2307,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "da7a96a8-7969-4dab-9c6e-a812938cc76d": { "_id": "da7a96a8-7969-4dab-9c6e-a812938cc76d", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Script that uses secrets and variables", "evaluatorVersion": "2.0", @@ -2378,8 +2326,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "evaluatorVersion": "1.0", @@ -2480,8 +2426,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "e1db8a0a-0329-4962-a5bf-ecffaca376ae": { "_id": "e1db8a0a-0329-4962-a5bf-ecffaca376ae", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Used by endUserUIClient", "evaluatorVersion": "1.0", @@ -3114,8 +3058,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "e232cff3-2460-47cd-80b2-36c86c0d0f06": { "_id": "e232cff3-2460-47cd-80b2-36c86c0d0f06", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Used by endUserUIClient", "evaluatorVersion": "1.0", @@ -3140,8 +3082,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "e5c302c8-f838-4698-87cc-d7225fc82454": { "_id": "e5c302c8-f838-4698-87cc-d7225fc82454", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -3169,8 +3109,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "fb09ba1b-e9b9-4517-8f11-a7cfe8b65dfd": { "_id": "fb09ba1b-e9b9-4517-8f11-a7cfe8b65dfd", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -3409,8 +3347,6 @@ exports[`frodo script export "frodo script export --all": should export all scri "fdb60c75-d58b-409f-bef2-ce4ebb04c77c": { "_id": "fdb60c75-d58b-409f-bef2-ce4ebb04c77c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -3527,8 +3463,6 @@ exports[`frodo script export "frodo script export --extract --script-id 'bb393d0 "2c38c998-aec0-4e56-8d46-bff6e24a704e": { "_id": "2c38c998-aec0-4e56-8d46-bff6e24a704e", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Library", "evaluatorVersion": "2.0", @@ -3560,8 +3494,6 @@ exports[`frodo script export "frodo script export --extract --script-id 'bb393d0 "6c49bebe-3a62-11ed-a261-0242ac120002": { "_id": "6c49bebe-3a62-11ed-a261-0242ac120002", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global library script to be referenced from other scripts", "evaluatorVersion": "2.0", @@ -3594,8 +3526,6 @@ exports[`frodo script export "frodo script export --extract --script-id 'bb393d0 "bb393d07-a121-47e2-9d24-1a1066f39ec0": { "_id": "bb393d07-a121-47e2-9d24-1a1066f39ec0", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Script Using Libraries", "evaluatorVersion": "2.0", @@ -12671,8 +12601,6 @@ exports[`frodo script export "frodo script export --no-deps -i 'bb393d07-a121-47 "bb393d07-a121-47e2-9d24-1a1066f39ec0": { "_id": "bb393d07-a121-47e2-9d24-1a1066f39ec0", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Script Using Libraries", "evaluatorVersion": "2.0", @@ -12709,8 +12637,6 @@ exports[`frodo script export "frodo script export --script-name 'GitHub Profile "a7a78773-445b-4eca-bb93-409e86bced81": { "_id": "a7a78773-445b-4eca-bb93-409e86bced81", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -12750,8 +12676,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "evaluatorVersion": "1.0", @@ -12860,8 +12784,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "39c08084-1238-43e8-857f-2e11005eac49": { "_id": "39c08084-1238-43e8-857f-2e11005eac49", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Default alpha realm script for OAuth2 Access Token Modification", "evaluatorVersion": "1.0", @@ -13017,8 +12939,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "cf3515f0-8278-4ee3-a530-1bad7424c416": { "_id": "cf3515f0-8278-4ee3-a530-1bad7424c416", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Default alpha realm script for OIDC claims", "evaluatorVersion": "1.0", @@ -13659,8 +13579,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "e232cff3-2460-47cd-80b2-36c86c0d0f06": { "_id": "e232cff3-2460-47cd-80b2-36c86c0d0f06", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Used by endUserUIClient", "evaluatorVersion": "1.0", @@ -13693,8 +13611,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "e1db8a0a-0329-4962-a5bf-ecffaca376ae": { "_id": "e1db8a0a-0329-4962-a5bf-ecffaca376ae", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Used by endUserUIClient", "evaluatorVersion": "1.0", @@ -14335,8 +14251,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "739bdc48-fd24-4c52-b353-88706d75558a": { "_id": "739bdc48-fd24-4c52-b353-88706d75558a", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if username has already been collected.", "evaluatorVersion": "1.0", @@ -14377,8 +14291,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "d58977ed-0542-4147-8197-973ef7300191": { "_id": "d58977ed-0542-4147-8197-973ef7300191", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Custom Device Match Script", "evaluatorVersion": "1.0", @@ -14403,8 +14315,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "4c963bb3-7084-43d0-bcdc-a47482cf1825": { "_id": "4c963bb3-7084-43d0-bcdc-a47482cf1825", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Dummy", "evaluatorVersion": "2.0", @@ -14427,8 +14337,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "e5c302c8-f838-4698-87cc-d7225fc82454": { "_id": "e5c302c8-f838-4698-87cc-d7225fc82454", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -14464,8 +14372,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "223739f3-9c54-43b7-9572-3c5338786145": { "_id": "223739f3-9c54-43b7-9572-3c5338786145", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -14489,8 +14395,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -14737,8 +14641,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "5ce0d38a-154c-4be5-bd22-f9879c77e895": { "_id": "5ce0d38a-154c-4be5-bd22-f9879c77e895", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -14985,8 +14887,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "fb09ba1b-e9b9-4517-8f11-a7cfe8b65dfd": { "_id": "fb09ba1b-e9b9-4517-8f11-a7cfe8b65dfd", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -15233,8 +15133,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -15276,8 +15174,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "207f172f-ffb5-439d-b7df-e8e80408830b": { "_id": "207f172f-ffb5-439d-b7df-e8e80408830b", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -15319,8 +15215,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "fdb60c75-d58b-409f-bef2-ce4ebb04c77c": { "_id": "fdb60c75-d58b-409f-bef2-ce4ebb04c77c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -15362,8 +15256,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "3bd13a46-61c4-4974-8efb-1700c80c64e3": { "_id": "3bd13a46-61c4-4974-8efb-1700c80c64e3", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Inactive Device Match Script", "evaluatorVersion": "1.0", @@ -15388,8 +15280,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "2c38c998-aec0-4e56-8d46-bff6e24a704e": { "_id": "2c38c998-aec0-4e56-8d46-bff6e24a704e", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Library", "evaluatorVersion": "2.0", @@ -15444,8 +15334,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "bb393d07-a121-47e2-9d24-1a1066f39ec0": { "_id": "bb393d07-a121-47e2-9d24-1a1066f39ec0", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Script Using Libraries", "evaluatorVersion": "2.0", @@ -15477,8 +15365,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "4e053815-adde-46ac-9fe2-d3ae93517c14": { "_id": "4e053815-adde-46ac-9fe2-d3ae93517c14", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "2.0", @@ -15500,8 +15386,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -15543,8 +15427,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "6002c349-f1d0-4317-baa2-a18590fc3cff": { "_id": "6002c349-f1d0-4317-baa2-a18590fc3cff", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -15586,8 +15468,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "647f2a33-9211-4315-a83f-a521d8b77d7b": { "_id": "647f2a33-9211-4315-a83f-a521d8b77d7b", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -15629,8 +15509,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "9535446c-0ff6-4a76-8576-616599119d64": { "_id": "9535446c-0ff6-4a76-8576-616599119d64", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Remove button from page.", "evaluatorVersion": "1.0", @@ -15679,8 +15557,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "85523e71-2d77-4577-b078-6f9674cc54e2": { "_id": "85523e71-2d77-4577-b078-6f9674cc54e2", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -15857,8 +15733,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "d2dc1ae7-ca1b-4ce4-81b8-5d58dfba73b1": { "_id": "d2dc1ae7-ca1b-4ce4-81b8-5d58dfba73b1", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -16035,8 +15909,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "994a4e8f-2741-424a-83e7-3c5f78da01f5": { "_id": "994a4e8f-2741-424a-83e7-3c5f78da01f5", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -16213,8 +16085,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "3cb43516-ae69-433a-8787-501d45db14e9": { "_id": "3cb43516-ae69-433a-8787-501d45db14e9", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Display sharedState, transientState, and headers.", "evaluatorVersion": "1.0", @@ -16295,8 +16165,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "evaluatorVersion": "1.0", @@ -16321,8 +16189,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "evaluatorVersion": "1.0", @@ -16384,8 +16250,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "evaluatorVersion": "1.0", @@ -16410,8 +16274,6 @@ exports[`frodo script export "frodo script export -A": should export all scripts "da7a96a8-7969-4dab-9c6e-a812938cc76d": { "_id": "da7a96a8-7969-4dab-9c6e-a812938cc76d", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Script that uses secrets and variables", "evaluatorVersion": "2.0", @@ -20088,8 +19950,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "evaluatorVersion": "1.0", @@ -20246,8 +20106,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "39c08084-1238-43e8-857f-2e11005eac49": { "_id": "39c08084-1238-43e8-857f-2e11005eac49", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Default alpha realm script for OAuth2 Access Token Modification", "evaluatorVersion": "1.0", @@ -20889,8 +20747,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "cf3515f0-8278-4ee3-a530-1bad7424c416": { "_id": "cf3515f0-8278-4ee3-a530-1bad7424c416", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Default alpha realm script for OIDC claims", "evaluatorVersion": "1.0", @@ -20924,8 +20780,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "e232cff3-2460-47cd-80b2-36c86c0d0f06": { "_id": "e232cff3-2460-47cd-80b2-36c86c0d0f06", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Used by endUserUIClient", "evaluatorVersion": "1.0", @@ -21567,8 +21421,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "e1db8a0a-0329-4962-a5bf-ecffaca376ae": { "_id": "e1db8a0a-0329-4962-a5bf-ecffaca376ae", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Used by endUserUIClient", "evaluatorVersion": "1.0", @@ -21611,8 +21463,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "739bdc48-fd24-4c52-b353-88706d75558a": { "_id": "739bdc48-fd24-4c52-b353-88706d75558a", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if username has already been collected.", "evaluatorVersion": "1.0", @@ -21639,8 +21489,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "d58977ed-0542-4147-8197-973ef7300191": { "_id": "d58977ed-0542-4147-8197-973ef7300191", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Custom Device Match Script", "evaluatorVersion": "1.0", @@ -21664,8 +21512,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "4c963bb3-7084-43d0-bcdc-a47482cf1825": { "_id": "4c963bb3-7084-43d0-bcdc-a47482cf1825", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Dummy", "evaluatorVersion": "2.0", @@ -21703,8 +21549,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "e5c302c8-f838-4698-87cc-d7225fc82454": { "_id": "e5c302c8-f838-4698-87cc-d7225fc82454", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -21730,8 +21574,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "223739f3-9c54-43b7-9572-3c5338786145": { "_id": "223739f3-9c54-43b7-9572-3c5338786145", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -21980,8 +21822,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -22230,8 +22070,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "5ce0d38a-154c-4be5-bd22-f9879c77e895": { "_id": "5ce0d38a-154c-4be5-bd22-f9879c77e895", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -22480,8 +22318,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "fb09ba1b-e9b9-4517-8f11-a7cfe8b65dfd": { "_id": "fb09ba1b-e9b9-4517-8f11-a7cfe8b65dfd", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -22525,8 +22361,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -22570,8 +22404,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "207f172f-ffb5-439d-b7df-e8e80408830b": { "_id": "207f172f-ffb5-439d-b7df-e8e80408830b", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -22615,8 +22447,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "fdb60c75-d58b-409f-bef2-ce4ebb04c77c": { "_id": "fdb60c75-d58b-409f-bef2-ce4ebb04c77c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -22643,8 +22473,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "3bd13a46-61c4-4974-8efb-1700c80c64e3": { "_id": "3bd13a46-61c4-4974-8efb-1700c80c64e3", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Inactive Device Match Script", "evaluatorVersion": "1.0", @@ -22680,8 +22508,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "2c38c998-aec0-4e56-8d46-bff6e24a704e": { "_id": "2c38c998-aec0-4e56-8d46-bff6e24a704e", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Library", "evaluatorVersion": "2.0", @@ -22736,8 +22562,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "bb393d07-a121-47e2-9d24-1a1066f39ec0": { "_id": "bb393d07-a121-47e2-9d24-1a1066f39ec0", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Script Using Libraries", "evaluatorVersion": "2.0", @@ -22760,8 +22584,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "4e053815-adde-46ac-9fe2-d3ae93517c14": { "_id": "4e053815-adde-46ac-9fe2-d3ae93517c14", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "2.0", @@ -22806,8 +22628,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -22851,8 +22671,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "6002c349-f1d0-4317-baa2-a18590fc3cff": { "_id": "6002c349-f1d0-4317-baa2-a18590fc3cff", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -22896,8 +22714,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "647f2a33-9211-4315-a83f-a521d8b77d7b": { "_id": "647f2a33-9211-4315-a83f-a521d8b77d7b", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -22948,8 +22764,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "9535446c-0ff6-4a76-8576-616599119d64": { "_id": "9535446c-0ff6-4a76-8576-616599119d64", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Remove button from page.", "evaluatorVersion": "1.0", @@ -23128,8 +22942,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "85523e71-2d77-4577-b078-6f9674cc54e2": { "_id": "85523e71-2d77-4577-b078-6f9674cc54e2", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -23308,8 +23120,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "d2dc1ae7-ca1b-4ce4-81b8-5d58dfba73b1": { "_id": "d2dc1ae7-ca1b-4ce4-81b8-5d58dfba73b1", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -23488,8 +23298,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "994a4e8f-2741-424a-83e7-3c5f78da01f5": { "_id": "994a4e8f-2741-424a-83e7-3c5f78da01f5", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -23572,8 +23380,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "3cb43516-ae69-433a-8787-501d45db14e9": { "_id": "3cb43516-ae69-433a-8787-501d45db14e9", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Display sharedState, transientState, and headers.", "evaluatorVersion": "1.0", @@ -23600,8 +23406,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "evaluatorVersion": "1.0", @@ -23665,8 +23469,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "evaluatorVersion": "1.0", @@ -23693,8 +23495,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "evaluatorVersion": "1.0", @@ -23722,8 +23522,6 @@ exports[`frodo script export "frodo script export -NAxD scriptExportTestDir3": s "da7a96a8-7969-4dab-9c6e-a812938cc76d": { "_id": "da7a96a8-7969-4dab-9c6e-a812938cc76d", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Script that uses secrets and variables", "evaluatorVersion": "2.0", @@ -23747,8 +23545,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "01e1a3c0-038b-4c16-956a-6c9d89328cff": { "_id": "01e1a3c0-038b-4c16-956a-6c9d89328cff", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for a scripted decision node", "evaluatorVersion": "1.0", @@ -23767,8 +23563,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "07ee6240-d106-4e25-a781-5fcabc477d22": { "_id": "07ee6240-d106-4e25-a781-5fcabc477d22", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -24007,8 +23801,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "1244e639-4a31-401d-ab61-d75133d8dc9e": { "_id": "1244e639-4a31-401d-ab61-d75133d8dc9e", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Instagram", "evaluatorVersion": "1.0", @@ -24035,8 +23827,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "13e3f263-9cd3-4844-8d1c-040fd0dd02eb": { "_id": "13e3f263-9cd3-4844-8d1c-040fd0dd02eb", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script template for Device Profile Match decision node script for Authentication Tree", "evaluatorVersion": "1.0", @@ -24129,8 +23919,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "157298c0-7d31-4059-a95b-eeb08473b7e5": { "_id": "157298c0-7d31-4059-a95b-eeb08473b7e5", "context": "AUTHENTICATION_CLIENT_SIDE", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for client side Device Id (Match) Authentication Module", "evaluatorVersion": "1.0", @@ -24396,8 +24184,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "1b52a7e0-4019-40fa-958a-15a49870e901": { "_id": "1b52a7e0-4019-40fa-958a-15a49870e901", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set the same shared state variable", "evaluatorVersion": "1.0", @@ -24414,8 +24200,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "1d475815-72cb-42eb-aafd-4026989d28a7": { "_id": "1d475815-72cb-42eb-aafd-4026989d28a7", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for Social Identity Provider Profile Transformation", "evaluatorVersion": "1.0", @@ -24436,8 +24220,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "1f389a3d-21cf-417c-a6d3-42ea620071f0": { "_id": "1f389a3d-21cf-417c-a6d3-42ea620071f0", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Internal OIDC Claims script", "evaluatorVersion": "1.0", @@ -25070,8 +24852,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "207f172f-ffb5-439d-b7df-e8e80408830b": { "_id": "207f172f-ffb5-439d-b7df-e8e80408830b", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -25105,8 +24885,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "223739f3-9c54-43b7-9572-3c5338786145": { "_id": "223739f3-9c54-43b7-9572-3c5338786145", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -25122,8 +24900,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "23143919-6b78-40c3-b25e-beca19b229e0": { "_id": "23143919-6b78-40c3-b25e-beca19b229e0", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -25157,8 +24933,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "248b8a56-df81-4b1b-b4ba-45d994f6504c": { "_id": "248b8a56-df81-4b1b-b4ba-45d994f6504c", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for SAML2 IDP Adapter", "evaluatorVersion": "1.0", @@ -25320,8 +25094,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "25e6c06d-cf70-473b-bd28-26931edc476b": { "_id": "25e6c06d-cf70-473b-bd28-26931edc476b", "context": "OAUTH2_VALIDATE_SCOPE", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OAuth2 Scope Validation", "evaluatorVersion": "1.0", @@ -25418,8 +25190,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "2c38c998-aec0-4e56-8d46-bff6e24a704e": { "_id": "2c38c998-aec0-4e56-8d46-bff6e24a704e", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Library", "evaluatorVersion": "2.0", @@ -25466,8 +25236,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "312e951f-70c5-49d2-a9ae-93aef909d5df": { "_id": "312e951f-70c5-49d2-a9ae-93aef909d5df", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Salesforce", "evaluatorVersion": "1.0", @@ -25500,8 +25268,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "36863ffb-40ec-48b9-94b1-9a99f71cc3b5": { "_id": "36863ffb-40ec-48b9-94b1-9a99f71cc3b5", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OIDC claims", "evaluatorVersion": "1.0", @@ -26134,8 +25900,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "39c08084-1238-43e8-857f-2e11005eac49": { "_id": "39c08084-1238-43e8-857f-2e11005eac49", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Default alpha realm script for OAuth2 Access Token Modification", "evaluatorVersion": "1.0", @@ -26283,8 +26047,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "3bd13a46-61c4-4974-8efb-1700c80c64e3": { "_id": "3bd13a46-61c4-4974-8efb-1700c80c64e3", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Inactive Device Match Script", "evaluatorVersion": "1.0", @@ -26301,8 +26063,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "3cb43516-ae69-433a-8787-501d45db14e9": { "_id": "3cb43516-ae69-433a-8787-501d45db14e9", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Display sharedState, transientState, and headers.", "evaluatorVersion": "1.0", @@ -26375,8 +26135,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "3d97c436-42c0-4dd0-a571-ea6f34f752b3": { "_id": "3d97c436-42c0-4dd0-a571-ea6f34f752b3", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Itsme", "evaluatorVersion": "1.0", @@ -26410,8 +26168,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "3f93ef6e-e54a-4393-aba1-f322656db28a": { "_id": "3f93ef6e-e54a-4393-aba1-f322656db28a", "context": "OAUTH2_AUTHORIZE_ENDPOINT_DATA_PROVIDER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OAuth2 Authorize Endpoint Data Provider", "evaluatorVersion": "1.0", @@ -26513,8 +26269,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "400e48ba-3f13-4144-ac7b-f824ea8e98c5": { "_id": "400e48ba-3f13-4144-ac7b-f824ea8e98c5", "context": "OAUTH2_SCRIPTED_JWT_ISSUER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for scripted JWT Issuers", "evaluatorVersion": "1.0", @@ -26601,8 +26355,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "403cf226-6051-4368-8b72-9ba14f9a5140": { "_id": "403cf226-6051-4368-8b72-9ba14f9a5140", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from VKontakte", "evaluatorVersion": "1.0", @@ -26634,8 +26386,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "41c24257-d7fc-4654-8b46-c2666dc5b56d": { "_id": "41c24257-d7fc-4654-8b46-c2666dc5b56d", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "set per level shared state variable", "evaluatorVersion": "1.0", @@ -26652,8 +26402,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "424da748-82cc-4b54-be6f-82bd64d82a74": { "_id": "424da748-82cc-4b54-be6f-82bd64d82a74", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Yahoo", "evaluatorVersion": "1.0", @@ -26686,8 +26434,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "472534ec-a25f-468d-a606-3fb1935190df": { "_id": "472534ec-a25f-468d-a606-3fb1935190df", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from WeChat", "evaluatorVersion": "1.0", @@ -26716,8 +26462,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "484e6246-dbc6-4288-97e6-54e55431402e": { "_id": "484e6246-dbc6-4288-97e6-54e55431402e", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Apple", "evaluatorVersion": "1.0", @@ -26778,8 +26522,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "4a171d3a-056b-4ab7-a19f-d7e93ddf7ae5": { "_id": "4a171d3a-056b-4ab7-a19f-d7e93ddf7ae5", "context": "SAML2_NAMEID_MAPPER", - "createdBy": "id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org", - "creationDate": 1433147666269, "default": true, "description": "Default global script for SAML2 NameID Mapper", "evaluatorVersion": "2.0", @@ -26805,8 +26547,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "4c963bb3-7084-43d0-bcdc-a47482cf1825": { "_id": "4c963bb3-7084-43d0-bcdc-a47482cf1825", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Dummy", "evaluatorVersion": "2.0", @@ -26821,8 +26561,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "4e053815-adde-46ac-9fe2-d3ae93517c14": { "_id": "4e053815-adde-46ac-9fe2-d3ae93517c14", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "2.0", @@ -26836,8 +26574,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "58c824ae-84ed-4724-82cd-db128fc3f6c": { "_id": "58c824ae-84ed-4724-82cd-db128fc3f6c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Converts a normalized social profile into a managed user", "evaluatorVersion": "1.0", @@ -26850,8 +26586,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "58d29080-4563-480b-89bb-1e7719776a21": { "_id": "58d29080-4563-480b-89bb-1e7719776a21", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Google", "evaluatorVersion": "1.0", @@ -26884,8 +26618,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "5bbdaeff-ddee-44b9-b608-8d413d7d65a6": { "_id": "5bbdaeff-ddee-44b9-b608-8d413d7d65a6", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if mode has already been set.", "evaluatorVersion": "1.0", @@ -26939,8 +26671,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "5ce0d38a-154c-4be5-bd22-f9879c77e895": { "_id": "5ce0d38a-154c-4be5-bd22-f9879c77e895", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -27179,8 +26909,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "5e854779-6ec1-4c39-aeba-0477e0986646": { "_id": "5e854779-6ec1-4c39-aeba-0477e0986646", "context": "CONFIG_PROVIDER_NODE", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Script to provide values for a config provider node", "evaluatorVersion": "1.0", @@ -27258,8 +26986,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "6002c349-f1d0-4317-baa2-a18590fc3cff": { "_id": "6002c349-f1d0-4317-baa2-a18590fc3cff", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -27293,8 +27019,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "60609c1a-4cef-4729-a417-354aafdebf3f": { "_id": "60609c1a-4cef-4729-a417-354aafdebf3f", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org", - "creationDate": 1433147666269, "default": true, "description": "Normalizes raw profile data from LINE", "evaluatorVersion": "1.0", @@ -27345,8 +27069,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "6325cf19-a49b-471e-8d26-7e4df76df0e2": { "_id": "6325cf19-a49b-471e-8d26-7e4df76df0e2", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -27380,8 +27102,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "647f2a33-9211-4315-a83f-a521d8b77d7b": { "_id": "647f2a33-9211-4315-a83f-a521d8b77d7b", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -27415,8 +27135,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "69f06e63-128c-4e2f-af52-079a8a6f448b": { "_id": "69f06e63-128c-4e2f-af52-079a8a6f448b", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for SAML2 SP Adapter", "evaluatorVersion": "1.0", @@ -27655,8 +27373,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "6b3cfd48-62d3-48ff-a96f-fe8f3a22ab30": { "_id": "6b3cfd48-62d3-48ff-a96f-fe8f3a22ab30", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Amazon", "evaluatorVersion": "1.0", @@ -27685,8 +27401,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "6c49bebe-3a62-11ed-a261-0242ac120002": { "_id": "6c49bebe-3a62-11ed-a261-0242ac120002", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global library script to be referenced from other scripts", "evaluatorVersion": "2.0", @@ -27754,8 +27468,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "703dab1a-1921-4981-98dd-b8e5349d8548": { "_id": "703dab1a-1921-4981-98dd-b8e5349d8548", "context": "AUTHENTICATION_SERVER_SIDE", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for server side Device Id (Match) Authentication Module", "evaluatorVersion": "1.0", @@ -28599,8 +28311,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "739bdc48-fd24-4c52-b353-88706d75558a": { "_id": "739bdc48-fd24-4c52-b353-88706d75558a", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Check if username has already been collected.", "evaluatorVersion": "1.0", @@ -28633,8 +28343,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "73cecbfc-dad0-4395-be6a-6858ee3a80e5": { "_id": "73cecbfc-dad0-4395-be6a-6858ee3a80e5", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Microsoft", "evaluatorVersion": "1.0", @@ -28688,8 +28396,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "7e3d7067-d50f-4674-8c76-a3e13a810c33": { "_id": "7e3d7067-d50f-4674-8c76-a3e13a810c33", "context": "AUTHENTICATION_SERVER_SIDE", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for server side Scripted Authentication Module", "evaluatorVersion": "1.0", @@ -28787,8 +28493,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "85523e71-2d77-4577-b078-6f9674cc54e2": { "_id": "85523e71-2d77-4577-b078-6f9674cc54e2", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -28957,8 +28661,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "8862ca8f-7770-4af5-a888-ac0df0947f36": { "_id": "8862ca8f-7770-4af5-a888-ac0df0947f36", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from LinkedIn", "evaluatorVersion": "1.0", @@ -28989,8 +28691,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "8e298710-b55e-4085-a464-88a375a4004b": { "_id": "8e298710-b55e-4085-a464-88a375a4004b", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Twitter", "evaluatorVersion": "1.0", @@ -29020,8 +28720,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "91d197de-5916-4dca-83b5-9a4df26e7159": { "_id": "91d197de-5916-4dca-83b5-9a4df26e7159", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from WordPress", "evaluatorVersion": "1.0", @@ -29051,8 +28749,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "9535446c-0ff6-4a76-8576-616599119d64": { "_id": "9535446c-0ff6-4a76-8576-616599119d64", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Remove button from page.", "evaluatorVersion": "1.0", @@ -29093,8 +28789,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "994a4e8f-2741-424a-83e7-3c5f78da01f5": { "_id": "994a4e8f-2741-424a-83e7-3c5f78da01f5", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -29263,8 +28957,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "9de3eb62-f131-4fac-a294-7bd170fd4acb": { "_id": "9de3eb62-f131-4fac-a294-7bd170fd4acb", "context": "POLICY_CONDITION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for Scripted Policy Conditions", "evaluatorVersion": "1.0", @@ -29419,8 +29111,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "a7a78773-445b-4eca-bb93-409e86bced81": { "_id": "a7a78773-445b-4eca-bb93-409e86bced81", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -29448,8 +29138,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "b4f3facb-c754-4e7f-b1c0-f4d46f592126": { "_id": "b4f3facb-c754-4e7f-b1c0-f4d46f592126", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "id=dsameuser,ou=user,dc=openam,dc=forgerock,dc=org", - "creationDate": 1433147666269, "default": true, "description": "Normalizes raw profile data from LinkedIn", "evaluatorVersion": "1.0", @@ -29483,8 +29171,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "bae1d54a-e97d-4997-aa5d-c027f21af82c": { "_id": "bae1d54a-e97d-4997-aa5d-c027f21af82c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from Facebook", "evaluatorVersion": "1.0", @@ -29516,8 +29202,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "bb393d07-a121-47e2-9d24-1a1066f39ec0": { "_id": "bb393d07-a121-47e2-9d24-1a1066f39ec0", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "My Example Script Using Libraries", "evaluatorVersion": "2.0", @@ -29541,8 +29225,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "c234ba0b-58a1-4cfd-9567-09edde980745": { "_id": "c234ba0b-58a1-4cfd-9567-09edde980745", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 1433147666269, "default": true, "description": "Internal token modification script", "evaluatorVersion": "1.0", @@ -29563,8 +29245,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "c4f22465-2368-4e27-8013-e6399974fd48": { "_id": "c4f22465-2368-4e27-8013-e6399974fd48", "context": "SAML2_IDP_ATTRIBUTE_MAPPER", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for SAML2 IDP Attribute Mapper", "evaluatorVersion": "1.0", @@ -29736,8 +29416,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "c735de08-f8f2-4e69-aa4a-2d8d3d438323": { "_id": "c735de08-f8f2-4e69-aa4a-2d8d3d438323", "context": "OAUTH2_MAY_ACT", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OAuth2 May Act", "evaluatorVersion": "1.0", @@ -29791,8 +29469,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "c827d2b4-3608-4693-868e-bbcf86bd87c7": { "_id": "c827d2b4-3608-4693-868e-bbcf86bd87c7", "context": "AUTHENTICATION_CLIENT_SIDE", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for client side Scripted Authentication Module", "evaluatorVersion": "1.0", @@ -29813,8 +29489,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "cf3515f0-8278-4ee3-a530-1bad7424c416": { "_id": "cf3515f0-8278-4ee3-a530-1bad7424c416", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Default alpha realm script for OIDC claims", "evaluatorVersion": "1.0", @@ -30447,8 +30121,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "d22f9a0c-426a-4466-b95e-d0f125b0d5fa": { "_id": "d22f9a0c-426a-4466-b95e-d0f125b0d5fa", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OAuth2 Access Token Modification", "evaluatorVersion": "1.0", @@ -30596,8 +30268,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "d2dc1ae7-ca1b-4ce4-81b8-5d58dfba73b1": { "_id": "d2dc1ae7-ca1b-4ce4-81b8-5d58dfba73b1", "context": "SAML2_IDP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Always redirect browser pre-auth", "evaluatorVersion": "1.0", @@ -30766,8 +30436,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "d58977ed-0542-4147-8197-973ef7300191": { "_id": "d58977ed-0542-4147-8197-973ef7300191", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Custom Device Match Script", "evaluatorVersion": "1.0", @@ -30784,8 +30452,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "da56fe60-8b38-4c46-a405-d6b306d4b336": { "_id": "da56fe60-8b38-4c46-a405-d6b306d4b336", "context": "OAUTH2_EVALUATE_SCOPE", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Default global script for OAuth2 Scope Evaluation", "evaluatorVersion": "1.0", @@ -30849,8 +30515,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "da7a96a8-7969-4dab-9c6e-a812938cc76d": { "_id": "da7a96a8-7969-4dab-9c6e-a812938cc76d", "context": "LIBRARY", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Script that uses secrets and variables", "evaluatorVersion": "2.0", @@ -30870,8 +30534,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "dbe0bf9a-72aa-49d5-8483-9db147985a47": { "_id": "dbe0bf9a-72aa-49d5-8483-9db147985a47", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from ADFS", "evaluatorVersion": "1.0", @@ -30972,8 +30634,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "e1db8a0a-0329-4962-a5bf-ecffaca376ae": { "_id": "e1db8a0a-0329-4962-a5bf-ecffaca376ae", "context": "OIDC_CLAIMS", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Used by endUserUIClient", "evaluatorVersion": "1.0", @@ -31606,8 +31266,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "e232cff3-2460-47cd-80b2-36c86c0d0f06": { "_id": "e232cff3-2460-47cd-80b2-36c86c0d0f06", "context": "OAUTH2_ACCESS_TOKEN_MODIFICATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Used by endUserUIClient", "evaluatorVersion": "1.0", @@ -31632,8 +31290,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "e5c302c8-f838-4698-87cc-d7225fc82454": { "_id": "e5c302c8-f838-4698-87cc-d7225fc82454", "context": "AUTHENTICATION_TREE_DECISION_NODE", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -31661,8 +31317,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "ed685f9f-5909-4726-86e8-22bd38b47663": { "_id": "ed685f9f-5909-4726-86e8-22bd38b47663", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Converts a normalized social profile into an Identity", "evaluatorVersion": "1.0", @@ -31697,8 +31351,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "fb09ba1b-e9b9-4517-8f11-a7cfe8b65dfd": { "_id": "fb09ba1b-e9b9-4517-8f11-a7cfe8b65dfd", "context": "SAML2_SP_ADAPTER", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "null", "evaluatorVersion": "1.0", @@ -31937,8 +31589,6 @@ exports[`frodo script export "frodo script export -ad --file my-allAlphaScripts. "fdb60c75-d58b-409f-bef2-ce4ebb04c77c": { "_id": "fdb60c75-d58b-409f-bef2-ce4ebb04c77c", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": false, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", @@ -31984,8 +31634,6 @@ exports[`frodo script export "frodo script export -n 'GitHub Profile Normalizati "a7a78773-445b-4eca-bb93-409e86bced81": { "_id": "a7a78773-445b-4eca-bb93-409e86bced81", "context": "SOCIAL_IDP_PROFILE_TRANSFORMATION", - "createdBy": "null", - "creationDate": 0, "default": true, "description": "Normalizes raw profile data from GitHub", "evaluatorVersion": "1.0", From 58f45cf5949bdb996e8765be03a2e2ae639bb8d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 16:57:54 +0000 Subject: [PATCH 25/69] Updated changelog and version for release v4.0.0-44 --- CHANGELOG.md | 5 ++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 66fc856e2..d763c49a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [4.0.0-44] - 2026-04-17 + ## [4.0.0-43] - 2026-04-08 ## [4.0.0-42] - 2026-04-08 @@ -2249,7 +2251,8 @@ Frodo CLI 2.x automatically refreshes session and access tokens before they expi - Fixed problem with adding connection profiles - Miscellaneous bug fixes -[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-43...HEAD +[unreleased]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-44...HEAD +[4.0.0-44]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-43...v4.0.0-44 [4.0.0-43]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-42...v4.0.0-43 [4.0.0-42]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-41...v4.0.0-42 [4.0.0-41]: https://github.com/rockcarver/frodo-cli/compare/v4.0.0-40...v4.0.0-41 diff --git a/package-lock.json b/package-lock.json index e47eec559..7606f8f05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-43", + "version": "4.0.0-44", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-43", + "version": "4.0.0-44", "license": "MIT", "bin": { "frodo": "dist/launch.cjs" diff --git a/package.json b/package.json index 145fba659..95191a5ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rockcarver/frodo-cli", - "version": "4.0.0-43", + "version": "4.0.0-44", "type": "module", "description": "A command line interface to manage ForgeRock Identity Cloud tenants, ForgeOps deployments, and classic deployments.", "keywords": [ From 1c6557a278695fff9b343d3e465a61815e057058 Mon Sep 17 00:00:00 2001 From: brycentrivir Date: Fri, 17 Apr 2026 11:24:15 -0600 Subject: [PATCH 26/69] Make extraction the default for exports (#588) * feat: flipped extraction flag, rebuilding of failing tests afterwards * Update -M, --modified-properties to remove creation timestamps (#587) * feat: removing creation dates from cli export files instructions for -M flags * feat: update @rockcarver/frodo-lib to version 4.0.0-37 --------- Co-authored-by: Volker Scheuber * Updated changelog and version for release v4.0.0-44 * feat: flipped extraction flag, rebuilding of failing tests afterwards * Update snapshot and fix error in package.json --------- Co-authored-by: Volker Scheuber Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- package.json | 2 +- src/cli/config/config-export.ts | 6 +- src/cli/node/node-export.ts | 6 +- src/cli/script/script-export.ts | 6 +- src/cli/server/server-export.ts | 8 +- .../__snapshots__/config-export.test.js.snap | 5 +- .../en/__snapshots__/node-export.test.js.snap | 4 +- .../__snapshots__/script-export.test.js.snap | 4 +- .../__snapshots__/server-export.test.js.snap | 5 +- .../config-export.e2e.test.js.snap | 16 - .../node-export.e2e.test.js.snap | 4491 +- .../script-export.e2e.test.js.snap | 36249 ++++++++-------- .../server-export.e2e.test.js.snap | 12521 +++--- test/e2e/config-export.e2e.test.js | 12 +- .../am_1076162899/recording.har | 0 .../oauth2_393036114/recording.har | 0 .../openidm_3290118515/recording.har | 0 .../am_1076162899/recording.har | 0 .../oauth2_393036114/recording.har | 0 .../openidm_3290118515/recording.har | 0 .../am_1076162899/recording.har | 0 .../oauth2_393036114/recording.har | 0 .../openidm_3290118515/recording.har | 0 .../am_1076162899/recording.har | 0 .../oauth2_393036114/recording.har | 0 .../openidm_3290118515/recording.har | 0 .../am_1076162899/recording.har | 0 .../oauth2_393036114/recording.har | 0 .../openidm_3290118515/recording.har | 0 .../am_1076162899/recording.har | 0 .../am_1076162899/recording.har | 0 .../am_1076162899/recording.har | 0 test/e2e/node-export.e2e.test.js | 21 +- test/e2e/script-export.e2e.test.js | 14 +- test/e2e/server-export.e2e.test.js | 41 +- 35 files changed, 26378 insertions(+), 27033 deletions(-) rename test/e2e/mocks/node_2982235661/export_4211608755/{0_all-separate_extract_directory_use-string-arrays_1044561342 => 0_all-separate_no-extract_directory_use-string-arrays_2175757408}/am_1076162899/recording.har (100%) rename test/e2e/mocks/node_2982235661/export_4211608755/{0_all-separate_extract_directory_use-string-arrays_1044561342 => 0_all-separate_no-extract_directory_use-string-arrays_2175757408}/oauth2_393036114/recording.har (100%) rename test/e2e/mocks/node_2982235661/export_4211608755/{0_all-separate_extract_directory_use-string-arrays_1044561342 => 0_all-separate_no-extract_directory_use-string-arrays_2175757408}/openidm_3290118515/recording.har (100%) rename test/e2e/mocks/node_2982235661/export_4211608755/{0_node-id_193359214 => 0_node-id_D_781094437}/am_1076162899/recording.har (100%) rename test/e2e/mocks/node_2982235661/export_4211608755/{0_node-id_193359214 => 0_node-id_D_781094437}/oauth2_393036114/recording.har (100%) rename test/e2e/mocks/node_2982235661/export_4211608755/{0_node-id_193359214 => 0_node-id_D_781094437}/openidm_3290118515/recording.har (100%) rename test/e2e/mocks/node_2982235661/export_4211608755/{0_node-name_use-string-arrays_2043637667 => 0_node-name_use-string-arrays_no-extract_1586525519}/am_1076162899/recording.har (100%) rename test/e2e/mocks/node_2982235661/export_4211608755/{0_node-name_use-string-arrays_2043637667 => 0_node-name_use-string-arrays_no-extract_1586525519}/oauth2_393036114/recording.har (100%) rename test/e2e/mocks/node_2982235661/export_4211608755/{0_node-name_use-string-arrays_2043637667 => 0_node-name_use-string-arrays_no-extract_1586525519}/openidm_3290118515/recording.har (100%) rename test/e2e/mocks/script_540962730/export_4211608755/{0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095 => 0_modified-properties_all-separate_no-metadata_default_no-extract_directory_3440431201}/am_1076162899/recording.har (100%) rename test/e2e/mocks/script_540962730/export_4211608755/{0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095 => 0_modified-properties_all-separate_no-metadata_default_no-extract_directory_3440431201}/oauth2_393036114/recording.har (100%) rename test/e2e/mocks/script_540962730/export_4211608755/{0_modified-properties_all-separate_no-metadata_default_extract_directory_1410389095 => 0_modified-properties_all-separate_no-metadata_default_no-extract_directory_3440431201}/openidm_3290118515/recording.har (100%) rename test/e2e/mocks/script_540962730/export_4211608755/{0_extract_script-id_directory_3126738353 => 0_no-extract_script-id_directory_3322257391}/am_1076162899/recording.har (100%) rename test/e2e/mocks/script_540962730/export_4211608755/{0_extract_script-id_directory_3126738353 => 0_no-extract_script-id_directory_3322257391}/oauth2_393036114/recording.har (100%) rename test/e2e/mocks/script_540962730/export_4211608755/{0_extract_script-id_directory_3126738353 => 0_no-extract_script-id_directory_3322257391}/openidm_3290118515/recording.har (100%) rename test/e2e/mocks/server_1085029842/export_4211608755/{0_server-id_2035896751 => 0_server-id_directory_1227895731}/am_1076162899/recording.har (100%) rename test/e2e/mocks/server_1085029842/export_4211608755/{0_server-url_extract_directory_434708301 => 0_server-url_no-extract_directory_2567965531}/am_1076162899/recording.har (100%) rename test/e2e/mocks/server_1085029842/export_4211608755/{0_u_file_default_no-metadata_256171004 => 0_u_file_default_no-metadata_directory_2134419444}/am_1076162899/recording.har (100%) diff --git a/package.json b/package.json index 95191a5ab..9a4faf397 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/rockcarver/frodo-cli.git" + "url": "git+https://github.com/rockcarver/frodo-cli.git" }, "bugs": { "url": "https://github.com/rockcarver/frodo-cli/issues" diff --git a/src/cli/config/config-export.ts b/src/cli/config/config-export.ts index d1ab08860..f3ab91426 100644 --- a/src/cli/config/config-export.ts +++ b/src/cli/config/config-export.ts @@ -41,9 +41,9 @@ export default function setup() { ) .addOption( new Option( - '-x, --extract', - 'Extract scripts and server properties from the exported file, and save it to a separate file. Ignored with -a.' - ) + '-x, --no-extract', + 'Do not extract scripts and server properties from the exported file to a separate file.' + ).default(true, 'true') ) .addOption( new Option( diff --git a/src/cli/node/node-export.ts b/src/cli/node/node-export.ts index ac5dc1f0f..41a2c25d5 100644 --- a/src/cli/node/node-export.ts +++ b/src/cli/node/node-export.ts @@ -47,9 +47,9 @@ export default function setup() { ) .addOption( new Option( - '-x, --extract', - 'Extract the script from the exported file, and save it to a separate file. Ignored with -a.' - ) + '-x, --no-extract', + 'Do not extract the script from the exported file to a separate file.' + ).default(true, 'true') ) .addOption( new Option( diff --git a/src/cli/script/script-export.ts b/src/cli/script/script-export.ts index ca6074825..84d80c5fc 100644 --- a/src/cli/script/script-export.ts +++ b/src/cli/script/script-export.ts @@ -61,9 +61,9 @@ export default function setup() { ) .addOption( new Option( - '-x, --extract', - 'Extract the script from the exported file, and save it to a separate file. Ignored with -a.' - ) + '-x, --no-extract', + 'Do not extract the script from the exported file to a separate file.' + ).default(true, 'true') ) .addOption( new Option( diff --git a/src/cli/server/server-export.ts b/src/cli/server/server-export.ts index ae8598526..583ab4b8d 100644 --- a/src/cli/server/server-export.ts +++ b/src/cli/server/server-export.ts @@ -46,9 +46,9 @@ export default function setup() { ) .addOption( new Option( - '-x, --extract', - 'Extract scripts and server properties from the exported file, and save it to a separate file. Ignored with -a.' - ) + '-x, --no-extract', + 'Do not extract the server properties from the exported file to a separate file.' + ).default(true, 'true') ) .addOption( new Option( @@ -101,7 +101,7 @@ export default function setup() { verboseMessage(`Exporting all servers to a single file...`); const outcome = await exportServersToFile( options.file, - options.extract, + false, options.metadata, { includeDefault: options.default, diff --git a/test/client_cli/en/__snapshots__/config-export.test.js.snap b/test/client_cli/en/__snapshots__/config-export.test.js.snap index abf3d9eac..74a40c546 100644 --- a/test/client_cli/en/__snapshots__/config-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/config-export.test.js.snap @@ -65,9 +65,8 @@ Options: source environment. --use-string-arrays Where applicable, use string arrays to store multi-line text (e.g. scripts). (default: off) - -x, --extract Extract scripts and server properties from the - exported file, and save it to a separate file. - Ignored with -a. + -x, --no-extract Do not extract scripts and server properties from + the exported file to a separate file. -h, --help Help -hh, --help-more Help with all options. -hhh, --help-all Help with all options, environment variables, and diff --git a/test/client_cli/en/__snapshots__/node-export.test.js.snap b/test/client_cli/en/__snapshots__/node-export.test.js.snap index 7fda336e3..1b2e19832 100644 --- a/test/client_cli/en/__snapshots__/node-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/node-export.test.js.snap @@ -35,8 +35,8 @@ Options: -N, --no-metadata Does not include metadata in the export file. --use-string-arrays Where applicable, use string arrays to store scripts. (default: off) - -x, --extract Extract the script from the exported file, and - save it to a separate file. Ignored with -a. + -x, --no-extract Do not extract the script from the exported file + to a separate file. -h, --help Help -hh, --help-more Help with all options. -hhh, --help-all Help with all options, environment variables, and diff --git a/test/client_cli/en/__snapshots__/script-export.test.js.snap b/test/client_cli/en/__snapshots__/script-export.test.js.snap index 7fce45b49..8dc91938b 100644 --- a/test/client_cli/en/__snapshots__/script-export.test.js.snap +++ b/test/client_cli/en/__snapshots__/script-export.test.js.snap @@ -38,8 +38,8 @@ Options: scripts). Ignored with -a and -A. -s, --script