diff --git a/src/cli/config-manager/config-manager-push/config-manager-push-scripts.ts b/src/cli/config-manager/config-manager-push/config-manager-push-scripts.ts new file mode 100644 index 000000000..8b629ec10 --- /dev/null +++ b/src/cli/config-manager/config-manager-push/config-manager-push-scripts.ts @@ -0,0 +1,38 @@ +import { Option } from 'commander'; + +import { configManagerImportScripts } from '../../../configManagerOps/FrConfigScriptOps'; +import { getTokens } from '../../../ops/AuthenticateOps'; +import { verboseMessage } from '../../../utils/Console'; +import { FrodoCommand } from '../../FrodoCommand'; + +export default function setup() { + const program = new FrodoCommand('frodo config-manager push scripts'); + + program + .description('Import scripts.') + .addOption( + new Option( + '-n, --name ', + 'Script name, import only specified endpoint' + ) + ); + + program.action(async (host, realm, user, password, options, command) => { + command.handleDefaultArgsAndOpts( + host, + realm, + user, + password, + options, + command + ); + + const getTokensIsSuccessful = await getTokens(false, true); + if (!getTokensIsSuccessful) process.exit(1); + verboseMessage('Importing scripts'); + const outcome = await configManagerImportScripts(realm, options.name); + if (!outcome) 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 542ec2c7e..e7a8ead27 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 @@ -22,6 +22,7 @@ import PasswordPolicy from './config-manager-push-password-policy'; import RemoteServers from './config-manager-push-remote-servers'; import Restart from './config-manager-push-restart'; import Schedules from './config-manager-push-schedules'; +import Scripts from './config-manager-push-scripts'; import SecretMappings from './config-manager-push-secret-mappings'; import ServiceObjects from './config-manager-push-service-objects'; import TermsAndConditions from './config-manager-push-terms-and-conditions'; @@ -62,6 +63,7 @@ export default function setup() { program.addCommand(Restart().name('restart')); program.addCommand(Journeys().name('journeys')); program.addCommand(Variables().name('variables')); + program.addCommand(Scripts().name('scripts')); return program; } diff --git a/src/configManagerOps/FrConfigScriptOps.ts b/src/configManagerOps/FrConfigScriptOps.ts index c68a6a852..47545100a 100644 --- a/src/configManagerOps/FrConfigScriptOps.ts +++ b/src/configManagerOps/FrConfigScriptOps.ts @@ -1,12 +1,13 @@ import { frodo, state } from '@rockcarver/frodo-lib'; import { ScriptSkeleton } from '@rockcarver/frodo-lib/types/api/ScriptApi'; +import fs from 'fs'; import { printError, verboseMessage } from '../utils/Console'; import { realmList, safeFileName } from '../utils/FrConfig'; const { getFilePath, saveJsonToFile, decodeBase64, saveTextToFile } = frodo.utils; -const { readScripts, readScriptByName } = frodo.script; +const { readScripts, readScriptByName, importScripts } = frodo.script; type ByName = { scriptName: string }; type BySkeleton = { ss: ScriptSkeleton }; @@ -33,6 +34,8 @@ export async function configManagerExportScript( justContent: boolean = false, // create only the content folder for the specified script, outranks justConfig justConfig: boolean = false // create only the config folder, ignored if justContent is set ): Promise { + const realm = state.getRealm(); + const realmDir = realm === '/' ? 'root' : realm; try { const s: ScriptSkeleton = 'ss' in criteria @@ -58,7 +61,7 @@ export async function configManagerExportScript( saveJsonToFile( { ...s, script: fileObj }, getFilePath( - `realms/${state.getRealm()}/scripts/scripts-config/${s._id}.json`, + `realms/${realmDir}/scripts/scripts-config/${s._id}.json`, true ), false, @@ -75,7 +78,7 @@ export async function configManagerExportScript( // create script file saveTextToFile( decodedScript, - getFilePath(`realms/${state.getRealm()}/scripts/${relScriptPath}`, true) + getFilePath(`realms/${realmDir}/scripts/${relScriptPath}`, true) ); return true; @@ -83,7 +86,7 @@ export async function configManagerExportScript( printError( error, 'scriptName' in criteria - ? `Script "${criteria.scriptName}" was not found is in the realm "${state.getRealm()}"` + ? `Script "${criteria.scriptName}" was not found is in the realm "${realmDir}"` : '' ); return false; @@ -108,7 +111,9 @@ export async function configManagerExportScriptsRealms( ): Promise { try { // create scripts directory if it doesnt exist even if there are no scripts, thats what fr-config-manager does - getFilePath(`realms/${state.getRealm()}/scripts/`, true); + const realm = state.getRealm(); + const realmDir = realm === '/' ? 'root' : realm; + getFilePath(`realms/${realmDir}/scripts/`, true); let allScripts: ScriptSkeleton[] = await readScripts(); // get scripts that start with prefix @@ -116,7 +121,7 @@ export async function configManagerExportScriptsRealms( allScripts = allScripts.filter((ss) => ss.name.startsWith(prefix)); if (allScripts.length === 0) { verboseMessage( - `There are no scripts that start with "${prefix}" in the ${state.getRealm()} realm.` + `There are no scripts that start with "${prefix}" in the ${realmDir} realm.` ); return true; } @@ -127,7 +132,7 @@ export async function configManagerExportScriptsRealms( allScripts = allScripts.filter((ss) => ss.context === scriptType); if (allScripts.length === 0) { verboseMessage( - `There are no scripts of type "${scriptType}" in the ${state.getRealm()} realm.` + `There are no scripts of type "${scriptType}" in the ${realmDir} realm.` ); return true; } @@ -145,7 +150,7 @@ export async function configManagerExportScriptsRealms( allScripts = allScripts.filter((ss) => ss.language === 'GROOVY'); if (allScripts.length === 0) { verboseMessage( - `There are no scripts written in groovy in the ${state.getRealm()} realm.` + `There are no scripts written in groovy in the ${realmDir} realm.` ); return true; } @@ -154,7 +159,7 @@ export async function configManagerExportScriptsRealms( allScripts = allScripts.filter((ss) => ss.language === 'JAVASCRIPT'); if (allScripts.length === 0) { verboseMessage( - `There are no scripts written in javascript in the ${state.getRealm()} realm.` + `There are no scripts written in javascript in the ${realmDir} realm.` ); return true; } @@ -170,7 +175,7 @@ export async function configManagerExportScriptsRealms( } } } else { - verboseMessage(`There are no scripts in the realm "${state.getRealm()}"`); + verboseMessage(`There are no scripts in the realm "${realmDir}"`); } return true; } catch (error) { @@ -219,3 +224,58 @@ export async function configManagerExportScriptsAll( return false; } } + +/** + * Import script in fr-config-manager format + * @param {string} realm option to determine which realm to import + * @param {string} name option to import a specific script by name + * @returns True if Import was successful + */ +export async function configManagerImportScripts( + realm?: string, + name?: string +): Promise { + try { + const realmsDir = getFilePath('realms/'); + const realms: string[] = realm + ? [realm] + : fs + .readdirSync(realmsDir, { withFileTypes: true }) + .filter((entry) => entry.isDirectory()) + .map((entry) => entry.name); + + for (const realm of realms) { + state.setRealm(realm); + + const configDir = getFilePath(`realms/${realm}/scripts/scripts-config/`); + + const configFiles = name ? [name] : fs.readdirSync(configDir); + + const scripts = { script: {} }; + + for (const file of configFiles) { + try { + const configPath = `${configDir}/${file}`; + if (!fs.existsSync(configPath)) continue; + const importData = JSON.parse(fs.readFileSync(configPath, 'utf8')); + if (name && importData.script.name !== name) continue; + const fullScriptPath = getFilePath( + `realms/${realm}/scripts/${importData.script.file}` + ); + delete importData.script.file; + importData.script = fs.readFileSync(fullScriptPath, 'utf8'); + scripts.script[importData._id] = importData; + } catch (error) { + printError(error); + } + } + + await importScripts(null, null, scripts); + } + + return true; + } catch (error) { + printError(error); + return false; + } +} diff --git a/test/client_cli/en/__snapshots__/config-manager-push-scripts.test.js.snap b/test/client_cli/en/__snapshots__/config-manager-push-scripts.test.js.snap new file mode 100644 index 000000000..0fae30a97 --- /dev/null +++ b/test/client_cli/en/__snapshots__/config-manager-push-scripts.test.js.snap @@ -0,0 +1,30 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CLI help interface for 'config-manager push scripts' should be expected english 1`] = ` +"Usage: frodo config-manager push scripts [options] [host] [realm] [username] [password] + +[Experimental] Import scripts. + +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. + If given without a password, and it matches the username + already stored in the connection profile for the target + host, frodo uses that profile's stored password instead of + requiring it on the command line. + password Password. + +Options: + -n, --name Script name, import only specified endpoint + -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 e0c932fb4..342e78743 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 @@ -34,6 +34,7 @@ Commands: password-policy [Experimental] Import password-policy objects. remote-servers [Experimental] Import RCS config. schedules [Experimental] Import schedules. + scripts [Experimental] Import scripts. 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-scripts.test.js b/test/client_cli/en/config-manager-push-scripts.test.js new file mode 100644 index 000000000..cf0da1c5d --- /dev/null +++ b/test/client_cli/en/config-manager-push-scripts.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 scripts --help'; +const { stdout } = await exec(CMD); + +test("CLI help interface for 'config-manager push scripts' should be expected english", async () => { + expect(stdout).toMatchSnapshot(); +}); diff --git a/test/e2e/__snapshots__/config-manager-push-scripts.e2e.test.js.snap b/test/e2e/__snapshots__/config-manager-push-scripts.e2e.test.js.snap new file mode 100644 index 000000000..4cc516557 --- /dev/null +++ b/test/e2e/__snapshots__/config-manager-push-scripts.e2e.test.js.snap @@ -0,0 +1,15 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`frodo config-manager push schedules "frodo config-manager push scripts -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import the scripts into forgeops" 1`] = `""`; + +exports[`frodo config-manager push schedules "frodo config-manager push scripts -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import the scripts into forgeops" 2`] = ` +"Experimental feature in use: 'frodo config-manager push scripts'. This feature may change without notice. +" +`; + +exports[`frodo config-manager push schedules "frodo config-manager push scripts -n testing.js -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import the scripts into forgeops" 1`] = `""`; + +exports[`frodo config-manager push schedules "frodo config-manager push scripts -n testing.js -D test/e2e/exports/fr-config-manager/forgeops -m forgeops": should import the scripts into forgeops" 2`] = ` +"Experimental feature in use: 'frodo config-manager push scripts'. This feature may change without notice. +" +`; diff --git a/test/e2e/config-manager-push-scripts.e2e.test.js b/test/e2e/config-manager-push-scripts.e2e.test.js new file mode 100644 index 000000000..1fd6c3de2 --- /dev/null +++ b/test/e2e/config-manager-push-scripts.e2e.test.js @@ -0,0 +1,84 @@ +/** + * 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 scripts -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 scripts -n testing.js -D test/e2e/exports/fr-config-manager/forgeops -m forgeops + + +*/ + + +import { getEnv, testSuccess } from './utils/TestUtils'; +import { forgeops_connection as fc } from './utils/TestConfig'; + + + +process.env['FRODO_MOCK'] = '1'; +const forgeopsEnv = getEnv(fc); + +const allDirectory = "test/e2e/exports/fr-config-manager/forgeops"; + + +describe('frodo config-manager push schedules', () => { + test(`"frodo config-manager push scripts -D ${allDirectory} -m forgeops": should import the scripts into forgeops"`, async () => { + const CMD = `frodo config-manager push scripts -D ${allDirectory} -m forgeops`; + await testSuccess(CMD, { + env: { + ...forgeopsEnv.env, + FRODO_REALM: 'alpha' + } + }); + }); + test(`"frodo config-manager push scripts -n testing.js -D ${allDirectory} -m forgeops": should import the scripts into forgeops"`, async () => { + const CMD = `frodo config-manager push scripts -n testing.js -D ${allDirectory} -m forgeops`; + await testSuccess(CMD, forgeopsEnv); + + }); +}); \ No newline at end of file diff --git a/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-config/0575fa2f-12cf-42e3-8fe3-0b45d99d3aa8.json b/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-config/832807d9-fb5d-4810-88ef-6e0a1aa89924.json similarity index 50% rename from test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-config/0575fa2f-12cf-42e3-8fe3-0b45d99d3aa8.json rename to test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-config/832807d9-fb5d-4810-88ef-6e0a1aa89924.json index f9e761517..3fc707c74 100644 --- a/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-config/0575fa2f-12cf-42e3-8fe3-0b45d99d3aa8.json +++ b/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-config/832807d9-fb5d-4810-88ef-6e0a1aa89924.json @@ -1,16 +1,16 @@ { - "_id": "0575fa2f-12cf-42e3-8fe3-0b45d99d3aa8", + "_id": "832807d9-fb5d-4810-88ef-6e0a1aa89924", "context": "SCRIPTED_DECISION_NODE", "createdBy": "id=amadmin,ou=user,ou=am-config", - "creationDate": 1784302526002, + "creationDate": 1774470672858, "default": false, - "description": "null", + "description": "testing", "evaluatorVersion": "2.0", "language": "JAVASCRIPT", "lastModifiedBy": "id=amadmin,ou=user,ou=am-config", - "lastModifiedDate": 1784302526002, - "name": "PaseUsername", + "lastModifiedDate": 1774470672858, + "name": "testing", "script": { - "file": "scripts-content/SCRIPTED_DECISION_NODE/PaseUsername.js" + "file": "scripts-content/SCRIPTED_DECISION_NODE/testing.js" } } diff --git a/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-content/SCRIPTED_DECISION_NODE/PaseUsername.js b/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-content/SCRIPTED_DECISION_NODE/PaseUsername.js deleted file mode 100644 index 2cc2031ca..000000000 --- a/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-content/SCRIPTED_DECISION_NODE/PaseUsername.js +++ /dev/null @@ -1,20 +0,0 @@ -var SCRIPT_OUTCOMES = { - OUTCOME: 'outcome' -}; - -function main() { - var username = nodeState.get('username'); - if (username.trim().toLowerCase().startsWith('fcpsedu\\')) { - username = username.substring(username.indexOf('\\') + 1); - } - if (username.trim().toLowerCase().endsWith('@fcpsschools.net')) { - username = username.substring(0, username.lastIndexOf('@')); - } - nodeState.putShared('username', username); - nodeState.putShared('objectAttributes', { - userName: username - }); - action.goTo(SCRIPT_OUTCOMES.OUTCOME); -} - -main(); diff --git a/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-content/SCRIPTED_DECISION_NODE/testing.js b/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-content/SCRIPTED_DECISION_NODE/testing.js new file mode 100644 index 000000000..ff7f4745d --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/realms/alpha/scripts/scripts-content/SCRIPTED_DECISION_NODE/testing.js @@ -0,0 +1,6 @@ +/* + - Data made available by nodes that have already executed are available in the sharedState variable. + - The script should set outcome to either "true" or "false". + */ + +// outcome = "true"; diff --git a/test/e2e/exports/fr-config-manager/forgeops/realms/bravo/scripts/scripts-config/01e1a3c0-038b-4c16-956a-6c9d89328cff.json b/test/e2e/exports/fr-config-manager/forgeops/realms/bravo/scripts/scripts-config/01e1a3c0-038b-4c16-956a-6c9d89328cff.json new file mode 100644 index 000000000..c3e37634b --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/realms/bravo/scripts/scripts-config/01e1a3c0-038b-4c16-956a-6c9d89328cff.json @@ -0,0 +1,16 @@ +{ + "_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", + "language": "JAVASCRIPT", + "lastModifiedBy": "null", + "lastModifiedDate": 0, + "name": "Authentication Tree Decision Node Script", + "script": { + "file": "scripts-content/AUTHENTICATION_TREE_DECISION_NODE/Authentication Tree Decision Node Script.js" + } +} diff --git a/test/e2e/exports/fr-config-manager/forgeops/realms/bravo/scripts/scripts-content/AUTHENTICATION_TREE_DECISION_NODE/Authentication Tree Decision Node Script.js b/test/e2e/exports/fr-config-manager/forgeops/realms/bravo/scripts/scripts-content/AUTHENTICATION_TREE_DECISION_NODE/Authentication Tree Decision Node Script.js new file mode 100644 index 000000000..d78155005 --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/realms/bravo/scripts/scripts-content/AUTHENTICATION_TREE_DECISION_NODE/Authentication Tree Decision Node Script.js @@ -0,0 +1,6 @@ +/* + - Data made available by nodes that have already executed are available in the sharedState variable. + - The script should set outcome to either "true" or "false". + */ + +outcome = "true"; diff --git a/test/e2e/exports/fr-config-manager/forgeops/realms/bravo/scripts/scripts-content/AUTHENTICATION_TREE_DECISION_NODE/Device Profile Match Template - Decision Node Script.js b/test/e2e/exports/fr-config-manager/forgeops/realms/bravo/scripts/scripts-content/AUTHENTICATION_TREE_DECISION_NODE/Device Profile Match Template - Decision Node Script.js new file mode 100644 index 000000000..45eb79b6e --- /dev/null +++ b/test/e2e/exports/fr-config-manager/forgeops/realms/bravo/scripts/scripts-content/AUTHENTICATION_TREE_DECISION_NODE/Device Profile Match Template - Decision Node Script.js @@ -0,0 +1,82 @@ +/* + * Copyright 2020-2025 Ping Identity Corporation. All Rights Reserved + * + * This code is to be used exclusively in connection with Ping Identity + * Corporation software or services. Ping Identity Corporation only offers + * such software or services to legal entities who have entered into a + * binding license agreement with Ping Identity Corporation. + */ + +/** ****************************************************************** + * + * The following script is a simplified template for understanding + * the basics of device matching. _This is not functionally complete._ + * For a functionally complete script as well as a development toolkit, + * visit https://github.com/ForgeRock/forgerock-device-match-script. + * + * Global node variables accessible within this scope: + * 1. `sharedState` provides access to incoming request + * 2. `deviceProfilesDao` provides access to stored profiles + * 3. `outcome` variable maps to auth tree node outcomes; values are + * 'true', 'false', or 'unknownDevice' (notice _all_ are strings). + * ******************************************************************/ + +/** + * Get the incoming request's device profile. + * Returns serialized JSON (type string); parsing this will result a + * native JS object. + */ +var incomingJson = sharedState.get('forgeRock.device.profile').toString(); +var incoming = JSON.parse(incomingJson); + +/** + * Get the incoming user's username and realm. + * Notice the use of `.asString()`. + */ +var username = sharedState.get("username").asString(); +var realm = sharedState.get("realm").asString(); + +/** + * Get the user's stored profiles for appropriate realm. + * Returns a _special_ object with methods for profile data + */ +var storedProfiles = deviceProfilesDao.getDeviceProfiles(username, realm); + +// Default to `outcome` of 'unknownDevice' +outcome = 'unknownDevice'; + +if (storedProfiles) { + var i = 0; + // NOTE: `.size()` method returns the number of stored profiles + var len = storedProfiles.size(); + + for (i; i < len; i++) { + /** + * Get the stored profile. + * Returns serialized JSON (type string); parsing this will result + * a native JS object. + */ + var storedJson = storedProfiles.get(i); + var stored = JSON.parse(storedJson); + + /** + * Find a stored profile with the same identifier. + */ + if (incoming.identifier === stored.identifier) { + + /** + * Now that you've found the appropriate profile, you will perform + * the logic here to match the values of the `incoming` profile + * with that of the `stored` profile. + * + * The result of the matching logic is assigned to `outcome`. Since + * we have profiles of the same identifier, the value (type string) + * should now be either 'true' or 'false' (properties matched or not). + * + * For more information about this topic, visit this Github repo: + * https://github.com/ForgeRock/forgerock-device-match-script + */ + outcome = 'false'; + } + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_D_m_314327836/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_D_m_314327836/am_1076162899/recording.har new file mode 100644 index 000000000..6d89843d5 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_D_m_314327836/am_1076162899/recording.har @@ -0,0 +1,784 @@ +{ + "log": { + "_recordingName": "config-manager/push/scripts/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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 367, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 585, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 585, + "text": "{\"_id\":\"*\",\"_rev\":\"-2120245986\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":true,\"forgotPassword\":\"true\",\"forgotUsername\":\"true\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"true\",\"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": "" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "585" + }, + { + "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": "" + }, + { + "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-08-24T15:23:44.532Z", + "time": 22, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 22 + } + }, + { + "_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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "" + }, + { + "name": "x-openam-password", + "value": "" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 494, + "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": "" + }, + { + "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-08-24T15:23:44.561Z", + "time": 19, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 19 + } + }, + { + "_id": "7a2803b95b7b030f104baf5a89ef50c3", + "_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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 434, + "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/realms/alpha/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-08-24T15:23:44Z\",\"maxIdleExpirationTime\":\"2026-08-24T15:53:44Z\",\"maxSessionExpirationTime\":\"2026-08-24T17:23:43Z\",\"properties\":{\"AMCtxId\":\"2982752b-a54f-4f84-8879-cb02dc9ba53d-6551\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "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-08-24T15:23:44.588Z", + "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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 517, + "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": "" + }, + { + "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": "" + }, + { + "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-08-24T15:23:44.600Z", + "time": 7, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 7 + } + }, + { + "_id": "318e4db919fc78b43e8f569af5603f61", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 618, + "cookies": [], + "headers": [ + { + "name": "accept", + "value": "application/json, text/plain, */*" + }, + { + "name": "content-type", + "value": "application/json" + }, + { + "name": "user-agent", + "value": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "protocol=2.0,resource=1.0" + }, + { + "name": "cookie", + "value": "iPlanetDirectoryPro=" + }, + { + "name": "content-length", + "value": "618" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 602, + "httpVersion": "HTTP/1.1", + "method": "PUT", + "postData": { + "mimeType": "application/json", + "params": [], + "text": "{\"_id\":\"832807d9-fb5d-4810-88ef-6e0a1aa89924\",\"context\":\"SCRIPTED_DECISION_NODE\",\"createdBy\":\"id=amadmin,ou=user,ou=am-config\",\"creationDate\":1774470672858,\"default\":false,\"description\":\"testing\",\"evaluatorVersion\":\"2.0\",\"language\":\"JAVASCRIPT\",\"lastModifiedBy\":\"id=amadmin,ou=user,ou=am-config\",\"lastModifiedDate\":1774470672858,\"name\":\"testing\",\"script\":\"LyoKICAtIERhdGEgbWFkZSBhdmFpbGFibGUgYnkgbm9kZXMgdGhhdCBoYXZlIGFscmVhZHkgZXhlY3V0ZWQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgc2hhcmVkU3RhdGUgdmFyaWFibGUuCiAgLSBUaGUgc2NyaXB0IHNob3VsZCBzZXQgb3V0Y29tZSB0byBlaXRoZXIgInRydWUiIG9yICJmYWxzZSIuCiAqLwoKLy8gb3V0Y29tZSA9ICJ0cnVlIjsK\"}" + }, + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/realms/root/realms/alpha/scripts/832807d9-fb5d-4810-88ef-6e0a1aa89924" + }, + "response": { + "bodySize": 618, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 618, + "text": "{\"_id\":\"832807d9-fb5d-4810-88ef-6e0a1aa89924\",\"name\":\"testing\",\"description\":\"testing\",\"script\":\"LyoKICAtIERhdGEgbWFkZSBhdmFpbGFibGUgYnkgbm9kZXMgdGhhdCBoYXZlIGFscmVhZHkgZXhlY3V0ZWQgYXJlIGF2YWlsYWJsZSBpbiB0aGUgc2hhcmVkU3RhdGUgdmFyaWFibGUuCiAgLSBUaGUgc2NyaXB0IHNob3VsZCBzZXQgb3V0Y29tZSB0byBlaXRoZXIgInRydWUiIG9yICJmYWxzZSIuCiAqLwoKLy8gb3V0Y29tZSA9ICJ0cnVlIjsK\",\"default\":false,\"language\":\"JAVASCRIPT\",\"context\":\"SCRIPTED_DECISION_NODE\",\"createdBy\":\"id=amadmin,ou=user,ou=am-config\",\"creationDate\":1787584148830,\"lastModifiedBy\":\"id=amadmin,ou=user,ou=am-config\",\"lastModifiedDate\":1787585024815,\"evaluatorVersion\":\"2.0\"}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "618" + }, + { + "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=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": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 609, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-24T15:23:44.684Z", + "time": 13, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 13 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_D_m_314327836/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_D_m_314327836/oauth2_393036114/recording.har new file mode 100644 index 000000000..5d8788332 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_D_m_314327836/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/scripts/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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 562, + "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=aG6QrWYsKPKx28TCW9GkUDqKFak.*AAJTSQACMDIAAlNLABxmMCtpNDZYN3ZMeG1YUEtQNDVKUjA1ZFZmQms9AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=jCrq_zPHgjK7DGbwM7HhDc3fU9xXu87T8isKEVhr7K8&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": "" + }, + { + "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=bTwNPDsntEHdYP4K18tGGwZQ_yc&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=bTwNPDsntEHdYP4K18tGGwZQ_yc&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-08-24T15:23:44.612Z", + "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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 421, + "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=bTwNPDsntEHdYP4K18tGGwZQ_yc&code_verifier=fNp3Hikc6af1Yjnq5WyMyAH6ndqs1ZAOSrFAY2ejAmU" + }, + "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": "" + }, + { + "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-08-24T15:23:44.635Z", + "time": 43, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 43 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_n_D_m_1348920437/am_1076162899/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_n_D_m_1348920437/am_1076162899/recording.har new file mode 100644 index 000000000..46abcb4b3 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_n_D_m_1348920437/am_1076162899/recording.har @@ -0,0 +1,631 @@ +{ + "log": { + "_recordingName": "config-manager/push/scripts/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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 367, + "httpVersion": "HTTP/1.1", + "method": "GET", + "queryString": [], + "url": "https://platform.dev.trivir.com/am/json/serverinfo/*" + }, + "response": { + "bodySize": 585, + "content": { + "mimeType": "application/json;charset=UTF-8", + "size": 585, + "text": "{\"_id\":\"*\",\"_rev\":\"-2120245986\",\"domains\":[],\"protectedUserAttributes\":[\"telephoneNumber\",\"mail\"],\"cookieName\":\"iPlanetDirectoryPro\",\"secureCookie\":true,\"forgotPassword\":\"true\",\"forgotUsername\":\"true\",\"kbaEnabled\":\"false\",\"selfRegistration\":\"true\",\"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": "" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "content-length", + "value": "585" + }, + { + "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": "" + }, + { + "name": "expires", + "value": "0" + }, + { + "name": "pragma", + "value": "no-cache" + }, + { + "name": "strict-transport-security", + "value": "max-age=31536000; includeSubDomains" + } + ], + "headersSize": 632, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-24T15:23:15.402Z", + "time": 23, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 23 + } + }, + { + "_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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "name": "accept-api-version", + "value": "resource=2.0, protocol=1.0" + }, + { + "name": "x-openam-username", + "value": "" + }, + { + "name": "x-openam-password", + "value": "" + }, + { + "name": "content-length", + "value": "2" + }, + { + "name": "accept-encoding", + "value": "gzip, compress, deflate, br" + }, + { + "name": "host", + "value": "openam-frodo-dev.forgeblocks.com" + } + ], + "headersSize": 494, + "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": "" + }, + { + "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-08-24T15:23:15.432Z", + "time": 24, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 24 + } + }, + { + "_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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 421, + "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-08-24T15:23:15Z\",\"maxIdleExpirationTime\":\"2026-08-24T15:53:15Z\",\"maxSessionExpirationTime\":\"2026-08-24T17:23:14Z\",\"properties\":{\"AMCtxId\":\"2982752b-a54f-4f84-8879-cb02dc9ba53d-6472\"}}" + }, + "cookies": [ + { + "httpOnly": true, + "name": "route", + "path": "/am", + "secure": true, + "value": "" + } + ], + "headers": [ + { + "name": "date", + "value": "" + }, + { + "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-08-24T15:23:15.464Z", + "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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 517, + "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": "" + }, + { + "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": "" + }, + { + "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-08-24T15:23:15.477Z", + "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/scripts_2605322907/0_n_D_m_1348920437/oauth2_393036114/recording.har b/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_n_D_m_1348920437/oauth2_393036114/recording.har new file mode 100644 index 000000000..ab4f52930 --- /dev/null +++ b/test/e2e/mocks/config-manager_4167095917/push_2272264157/scripts_2605322907/0_n_D_m_1348920437/oauth2_393036114/recording.har @@ -0,0 +1,289 @@ +{ + "log": { + "_recordingName": "config-manager/push/scripts/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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 562, + "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=P27RD3qkH-Lhj1dpyv4Q-6Lfr5g.*AAJTSQACMDIAAlNLABx3UTVBVTNiRkdLaFZ5WGtmQzUxRHdjVzZzNGs9AAR0eXBlAANDVFMAAlMxAAIwMQ..*&decision=allow&code_challenge=-v6YIp9rKGWSv-ngmWuCFJ4prlDIdhHYM7fQpA3NCic&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": "" + }, + { + "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=o8KqSab2rKtgn7oDubCr-683GPI&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=o8KqSab2rKtgn7oDubCr-683GPI&iss=https%3A%2F%2Fplatform.dev.trivir.com%2Fam%2Foauth2&client_id=idm-admin-ui", + "status": 302, + "statusText": "Found" + }, + "startedDateTime": "2026-08-24T15:23:15.490Z", + "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": "" + }, + { + "name": "x-forgerock-transactionid", + "value": "" + }, + { + "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": 421, + "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=o8KqSab2rKtgn7oDubCr-683GPI&code_verifier=DO9H1I8NsONip4Lcpb7kGIUmFUxS137IF6ckK7FUvlg" + }, + "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": "" + }, + { + "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": 403, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2026-08-24T15:23:15.511Z", + "time": 43, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 43 + } + } + ], + "pages": [], + "version": "1.2" + } +} diff --git a/test/e2e/mocks/github_584874290/recording.har b/test/e2e/mocks/github_584874290/recording.har index 0637bdcf9..462fb7538 100644 --- a/test/e2e/mocks/github_584874290/recording.har +++ b/test/e2e/mocks/github_584874290/recording.har @@ -45,7 +45,6 @@ "response": { "bodySize": 31106, "content": { - "encoding": "base64", "mimeType": "application/json; charset=utf-8", "size": 31106, "text": "[\"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\"]" @@ -96,37 +95,41 @@ "name": "strict-transport-security", "value": "max-age=31536000; includeSubdomains; preload" }, + { + "name": "x-content-type-options", + "value": "nosniff" + }, { "name": "x-frame-options", "value": "deny" }, { - "name": "x-content-type-options", - "value": "nosniff" + "name": "x-xss-protection", + "value": "1; mode=block" }, { - "name": "x-xss-protection", - "value": "0" + "name": "content-security-policy", + "value": "default-src 'none'; style-src 'unsafe-inline'" }, { - "name": "referrer-policy", - "value": "origin-when-cross-origin, strict-origin-when-cross-origin" + "name": "access-control-allow-origin", + "value": "*" }, { - "name": "content-security-policy", - "value": "default-src 'none'" + "name": "access-control-expose-headers", + "value": "ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-RateLimit-Used, X-RateLimit-Resource, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, Deprecation, Sunset" }, { - "name": "content-encoding", - "value": "gzip" + "name": "content-type", + "value": "application/json; charset=utf-8" }, { - "name": "server", - "value": "github.com" + "name": "referrer-policy", + "value": "origin-when-cross-origin, strict-origin-when-cross-origin" }, { - "name": "accept-ranges", - "value": "bytes" + "name": "x-github-media-type", + "value": "github.v3; format=json" }, { "name": "x-ratelimit-limit", @@ -160,8 +163,8 @@ "headersSize": 1405, "httpVersion": "HTTP/1.1", "redirectURL": "", - "status": 200, - "statusText": "OK" + "status": 403, + "statusText": "Forbidden" }, "startedDateTime": "2026-07-13T18:05:22.795Z", "time": 294,