@rockcarver/frodo-lib 2.0.0-2 → 2.0.0-3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -1
- package/cjs/index.js +6 -0
- package/cjs/index.js.map +1 -1
- package/cjs/ops/AuthenticateOps.js +9 -5
- package/cjs/ops/AuthenticateOps.js.map +1 -1
- package/cjs/ops/JourneyOps.js.map +1 -1
- package/cjs/ops/Saml2Ops.js +1 -9
- package/cjs/ops/Saml2Ops.js.map +1 -1
- package/esm/index.mjs +1 -1
- package/esm/ops/AuthenticateOps.mjs +9 -5
- package/esm/ops/Saml2Ops.mjs +0 -6
- package/package.json +1 -1
- package/types/index.d.ts +1 -1
- package/types/index.d.ts.map +1 -1
- package/types/ops/AuthenticateOps.d.ts.map +1 -1
- package/types/ops/JourneyOps.d.ts +1 -2
- package/types/ops/JourneyOps.d.ts.map +1 -1
- package/types/ops/Saml2Ops.d.ts +0 -6
- package/types/ops/Saml2Ops.d.ts.map +1 -1
package/cjs/ops/Saml2Ops.js
CHANGED
|
@@ -17,7 +17,6 @@ exports.getSaml2ProviderStub = getSaml2ProviderStub;
|
|
|
17
17
|
exports.getSaml2ProviderStubs = getSaml2ProviderStubs;
|
|
18
18
|
exports.importSaml2Provider = importSaml2Provider;
|
|
19
19
|
exports.importSaml2Providers = importSaml2Providers;
|
|
20
|
-
exports.roleMap = void 0;
|
|
21
20
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
22
21
|
var _ApiTypes = require("../api/ApiTypes");
|
|
23
22
|
var _Saml2Api = require("../api/Saml2Api");
|
|
@@ -207,16 +206,9 @@ class Saml2Ops {
|
|
|
207
206
|
})();
|
|
208
207
|
}
|
|
209
208
|
}
|
|
210
|
-
exports.default = Saml2Ops;
|
|
211
|
-
var roleMap = {
|
|
212
|
-
identityProvider: 'IDP',
|
|
213
|
-
serviceProvider: 'SP',
|
|
214
|
-
attributeQueryProvider: 'AttrQuery',
|
|
215
|
-
xacmlPolicyEnforcementPoint: 'XACML PEP'
|
|
216
|
-
};
|
|
217
209
|
|
|
218
210
|
// use a function vs a template variable to avoid problems in loops
|
|
219
|
-
exports.
|
|
211
|
+
exports.default = Saml2Ops;
|
|
220
212
|
function createSaml2ExportTemplate(_ref) {
|
|
221
213
|
var {
|
|
222
214
|
state
|
package/cjs/ops/Saml2Ops.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Saml2Ops.js","names":["_lodash","_interopRequireDefault","require","_ApiTypes","_Saml2Api","_ScriptApi","_Base","_ScriptOps","_Console","_ExportImportUtils","obj","__esModule","default","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","Saml2Ops","constructor","state","getSaml2ProviderStubs","_this","getProviderByLocationAndId","location","entityId64","_this2","getProviderMetadataUrl","entityId","getProviderMetadata","_this3","getSaml2ProviderStub","_this4","getSaml2Provider","_this5","deleteSaml2Provider","_this6","deleteSaml2Providers","_this7","exportSaml2Provider","_this8","exportSaml2Providers","_this9","importSaml2Provider","importData","_this10","importSaml2Providers","_this11","exports","roleMap","identityProvider","serviceProvider","attributeQueryProvider","xacmlPolicyEnforcementPoint","createSaml2ExportTemplate","_ref","meta","getMetadata","script","saml","hosted","remote","metadata","_x","_getSaml2ProviderStubs","_ref2","result","getProviders","_x2","_getProviderByLocationAndId2","_ref3","_getProviderByLocationAndId","_ref4","_getProviderMetadataUrl","_x3","_getProviderMetadata2","_ref5","_getProviderMetadata","exportDependencies","_x4","_exportDependencies","_ref6","providerData","fileData","attrMapperScriptId","_","get","scriptData","getScript","scriptId","convertBase64TextToArray","idpAdapterScriptId","metaDataResponse","Error","concat","_id","convertBase64UrlTextToArray","encodeBase64Url","_x5","_getSaml2ProviderStub","_ref7","debugMessage","found","findProviders","filter","resultCount","_x6","_getSaml2Provider","_ref8","stub","id","_x7","_deleteSaml2Provider","_ref9","deleteProviderByLocationAndId","_x8","_deleteSaml2Providers","_ref10","providers","stubs","provider","push","length","_x9","_exportSaml2Provider","_ref11","exportData","printMessage","message","_x10","_exportSaml2Providers","_ref12","importDependencies","_x11","_importDependencies","_ref13","convertTextArrayToBase64","putScript","getLocation","data","Saml2ProiderLocation","HOSTED","REMOTE","_x12","_importSaml2Provider","_ref14","encode","metaData","convertTextArrayToBase64Url","createProvider","updateProvider","_x13","_importSaml2Providers","_ref15","myStatus","total","successes","warnings","failures","hostedIds","Object","keys","remoteIds","providerIds","decodeBase64Url","includes","decode","importDependenciesErr","response","createProviderErr","updateProviderError","_updateProviderError$"],"sources":["ops/Saml2Ops.ts"],"sourcesContent":["import _ from 'lodash';\nimport {\n Saml2ProiderLocation,\n Saml2ProviderSkeleton,\n Saml2ProviderStub,\n} from '../api/ApiTypes';\nimport {\n createProvider,\n updateProvider,\n findProviders,\n getProviderByLocationAndId as _getProviderByLocationAndId,\n getProviderMetadata as _getProviderMetadata,\n getProviderMetadataUrl as _getProviderMetadataUrl,\n getProviders,\n deleteProviderByLocationAndId,\n} from '../api/Saml2Api';\nimport { getScript } from '../api/ScriptApi';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from '../api/utils/Base64';\nimport { MultiOpStatusInterface, Saml2ExportInterface } from './OpsTypes';\nimport { putScript } from './ScriptOps';\nimport { debugMessage, printMessage } from './utils/Console';\nimport {\n convertBase64TextToArray,\n convertBase64UrlTextToArray,\n convertTextArrayToBase64,\n convertTextArrayToBase64Url,\n getMetadata,\n} from './utils/ExportImportUtils';\nimport State from '../shared/State';\n\nexport default class Saml2Ops {\n state: State;\n constructor(state: State) {\n this.state = state;\n }\n\n /**\n * Get SAML2 entity provider stubs\n * @returns {Promise<Saml2ProviderStub[]>} a promise that resolves to an array of saml2 entity stubs\n */\n async getSaml2ProviderStubs(): Promise<Saml2ProviderStub[]> {\n return getSaml2ProviderStubs({ state: this.state });\n }\n\n /**\n * Geta SAML2 entity provider by location and id\n * @param {string} location Entity provider location (hosted or remote)\n * @param {string} entityId64 Base64-encoded-without-padding provider entity id\n * @returns {Promise} a promise that resolves to a saml2 entity provider object\n */\n async getProviderByLocationAndId(location: string, entityId64: string) {\n return getProviderByLocationAndId({\n location,\n entityId64,\n state: this.state,\n });\n }\n\n /**\n * Get a SAML2 entity provider's metadata URL by entity id\n * @param {string} entityId SAML2 entity id\n * @returns {string} the URL to get the metadata from\n */\n getProviderMetadataUrl(entityId: string): string {\n return getProviderMetadataUrl({ entityId, state: this.state });\n }\n\n /**\n * Get a SAML2 entity provider's metadata by entity id\n * @param {string} entityId SAML2 entity id\n * @returns {Promise<object>} a promise that resolves to an object containing a SAML2 metadata\n */\n async getProviderMetadata(entityId: string) {\n return getProviderMetadata({ entityId, state: this.state });\n }\n\n /**\n *\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderStub>} Promise resolving to a Saml2ExportInterface object.\n */\n async getSaml2ProviderStub(entityId: string): Promise<Saml2ProviderStub> {\n return getSaml2ProviderStub({ entityId, state: this.state });\n }\n\n /**\n * Export a single entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\n async getSaml2Provider(entityId: string): Promise<Saml2ProviderSkeleton> {\n return getSaml2Provider({ entityId, state: this.state });\n }\n\n /**\n * Delete an entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\n async deleteSaml2Provider(entityId: string): Promise<Saml2ProviderSkeleton> {\n return deleteSaml2Provider({ entityId, state: this.state });\n }\n\n /**\n * Delete all entity providers.\n * @returns {Promise<Saml2ProviderSkeleton[]>} Promise resolving to an array of Saml2ProviderSkeleton objects.\n */\n async deleteSaml2Providers(): Promise<Saml2ProviderSkeleton[]> {\n return deleteSaml2Providers({ state: this.state });\n }\n\n /**\n * Export a single entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ExportInterface>} Promise resolving to a Saml2ExportInterface object.\n */\n async exportSaml2Provider(entityId: string): Promise<Saml2ExportInterface> {\n return exportSaml2Provider({ entityId, state: this.state });\n }\n\n /**\n * Export all entity providers. The response can be saved to file as is.\n * @returns {Promise<Saml2ExportInterface>} Promise resolving to a Saml2ExportInterface object.\n */\n async exportSaml2Providers(): Promise<Saml2ExportInterface> {\n return exportSaml2Providers({ state: this.state });\n }\n\n /**\n * Import a SAML entity provider\n * @param {string} entityId Provider entity id\n * @param {Saml2ExportInterface} importData Import data\n */\n async importSaml2Provider(\n entityId: string,\n importData: Saml2ExportInterface\n ): Promise<boolean> {\n return importSaml2Provider({ entityId, importData, state: this.state });\n }\n\n /**\n * Import SAML entity providers\n * @param {Saml2ExportInterface} importData Import data\n */\n async importSaml2Providers(\n importData: Saml2ExportInterface\n ): Promise<MultiOpStatusInterface> {\n return importSaml2Providers({ importData, state: this.state });\n }\n}\n\nexport const roleMap = {\n identityProvider: 'IDP',\n serviceProvider: 'SP',\n attributeQueryProvider: 'AttrQuery',\n xacmlPolicyEnforcementPoint: 'XACML PEP',\n};\n\n// use a function vs a template variable to avoid problems in loops\nexport function createSaml2ExportTemplate({\n state,\n}: {\n state: State;\n}): Saml2ExportInterface {\n return {\n meta: getMetadata({ state }),\n script: {},\n saml: {\n hosted: {},\n remote: {},\n metadata: {},\n },\n } as Saml2ExportInterface;\n}\n\n/**\n * Get SAML2 entity provider stubs\n * @returns {Promise<Saml2ProviderStub[]>} a promise that resolves to an array of saml2 entity stubs\n */\nexport async function getSaml2ProviderStubs({\n state,\n}: {\n state: State;\n}): Promise<Saml2ProviderStub[]> {\n const { result } = await getProviders({ state });\n return result;\n}\n\n/**\n * Geta SAML2 entity provider by location and id\n * @param {string} location Entity provider location (hosted or remote)\n * @param {string} entityId64 Base64-encoded-without-padding provider entity id\n * @returns {Promise} a promise that resolves to a saml2 entity provider object\n */\nexport async function getProviderByLocationAndId({\n location,\n entityId64,\n state,\n}: {\n location: string;\n entityId64: string;\n state: State;\n}) {\n return _getProviderByLocationAndId({ location, entityId64, state });\n}\n\n/**\n * Get a SAML2 entity provider's metadata URL by entity id\n * @param {string} entityId SAML2 entity id\n * @returns {string} the URL to get the metadata from\n */\nexport function getProviderMetadataUrl({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): string {\n return _getProviderMetadataUrl({ entityId, state });\n}\n\n/**\n * Get a SAML2 entity provider's metadata by entity id\n * @param {string} entityId SAML2 entity id\n * @returns {Promise<object>} a promise that resolves to an object containing a SAML2 metadata\n */\nexport async function getProviderMetadata({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}) {\n return _getProviderMetadata({ entityId, state });\n}\n\n/**\n * Include dependencies in the export file\n * @param {object} providerData Object representing a SAML entity provider\n * @param {object} fileData File data object to add dependencies to\n */\nasync function exportDependencies({\n providerData,\n fileData,\n state,\n}: {\n providerData: Saml2ProviderSkeleton;\n fileData: Saml2ExportInterface;\n state: State;\n}) {\n const attrMapperScriptId = _.get(providerData, [\n 'identityProvider',\n 'assertionProcessing',\n 'attributeMapper',\n 'attributeMapperScript',\n ]);\n if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {\n const scriptData = await getScript({ scriptId: attrMapperScriptId, state });\n scriptData.script = convertBase64TextToArray(scriptData.script);\n fileData.script[attrMapperScriptId] = scriptData;\n }\n const idpAdapterScriptId = _.get(providerData, [\n 'identityProvider',\n 'advanced',\n 'idpAdapter',\n 'idpAdapterScript',\n ]);\n if (idpAdapterScriptId && idpAdapterScriptId !== '[Empty]') {\n const scriptData = await getScript({ scriptId: idpAdapterScriptId, state });\n scriptData.script = convertBase64TextToArray(scriptData.script);\n fileData.script[idpAdapterScriptId] = scriptData;\n }\n const metaDataResponse = await getProviderMetadata({\n entityId: providerData.entityId,\n state,\n });\n if (!metaDataResponse) {\n throw new Error(\n `Unable to obtain metadata from ${getProviderMetadataUrl({\n entityId: providerData.entityId,\n state,\n })}`\n );\n }\n fileData.saml.metadata[providerData._id] = convertBase64UrlTextToArray(\n encodeBase64Url(metaDataResponse)\n );\n}\n\n/**\n *\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderStub>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function getSaml2ProviderStub({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): Promise<Saml2ProviderStub> {\n debugMessage(`Saml2Ops.getSaml2ProviderStub: start [entityId=${entityId}]`);\n const found = await findProviders({\n filter: `entityId eq '${entityId}'`,\n state,\n });\n switch (found.resultCount) {\n case 0:\n throw new Error(`No provider with entity id '${entityId}' found`);\n case 1: {\n debugMessage(`Saml2Ops.getSaml2ProviderStub: end [entityId=${entityId}]`);\n return found.result[0];\n }\n default:\n throw new Error(`Multiple providers with entity id '${entityId}' found`);\n }\n}\n\n/**\n * Export a single entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function getSaml2Provider({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.getSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub({ entityId, state });\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId({\n location,\n entityId64: id,\n state,\n });\n debugMessage(`Saml2Ops.getSaml2Provider: end [entityId=${entityId}]`);\n return providerData;\n}\n\n/**\n * Delete an entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function deleteSaml2Provider({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub({ entityId, state });\n const { location } = stub;\n const id = stub._id;\n const providerData = await deleteProviderByLocationAndId({\n location,\n entityId64: id,\n state,\n });\n debugMessage(`Saml2Ops.deleteSaml2Provider: end [entityId=${entityId}]`);\n return providerData;\n}\n\n/**\n * Delete all entity providers.\n * @returns {Promise<Saml2ProviderSkeleton[]>} Promise resolving to an array of Saml2ProviderSkeleton objects.\n */\nexport async function deleteSaml2Providers({\n state,\n}: {\n state: State;\n}): Promise<Saml2ProviderSkeleton[]> {\n debugMessage(`Saml2Ops.deleteSaml2Providers: start`);\n const providers: Saml2ProviderSkeleton[] = [];\n const stubs = await getSaml2ProviderStubs({ state });\n for (const stub of stubs) {\n const provider = await deleteProviderByLocationAndId({\n location: stub.location,\n entityId64: stub._id,\n state,\n });\n providers.push(provider);\n }\n debugMessage(\n `Saml2Ops.deleteSaml2Providers: end [deleted ${providers.length} providers]`\n );\n return providers;\n}\n\n/**\n * Export a single entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ExportInterface>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function exportSaml2Provider({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): Promise<Saml2ExportInterface> {\n debugMessage(`Saml2Ops.exportSaml2Provider: start [entityId=${entityId}]`);\n const exportData = createSaml2ExportTemplate({ state });\n const stub = await getSaml2ProviderStub({ entityId, state });\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId({\n location,\n entityId64: id,\n state,\n });\n exportData.saml[stub.location][providerData._id] = providerData;\n try {\n await exportDependencies({ providerData, fileData: exportData, state });\n } catch (error) {\n printMessage(error.message, 'error');\n }\n debugMessage(`Saml2Ops.exportSaml2Provider: end [entityId=${entityId}]`);\n return exportData;\n}\n\n/**\n * Export all entity providers. The response can be saved to file as is.\n * @returns {Promise<Saml2ExportInterface>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function exportSaml2Providers({\n state,\n}: {\n state: State;\n}): Promise<Saml2ExportInterface> {\n const fileData = createSaml2ExportTemplate({ state });\n const stubs = await getSaml2ProviderStubs({ state });\n for (const stub of stubs) {\n const providerData = await getProviderByLocationAndId({\n location: stub.location,\n entityId64: stub._id,\n state,\n });\n try {\n await exportDependencies({ providerData, fileData, state });\n } catch (error) {\n printMessage(error, 'error');\n }\n fileData.saml[stub.location][providerData._id] = providerData;\n }\n return fileData;\n}\n\n/**\n * Include dependencies from the import file\n * @param {object} providerData Object representing a SAML entity provider\n * @param {object} fileData File data object to read dependencies from\n */\nasync function importDependencies({\n providerData,\n fileData,\n state,\n}: {\n providerData: Saml2ProviderSkeleton;\n fileData: Saml2ExportInterface;\n state: State;\n}) {\n debugMessage(`Saml2Ops.importDependencies: start`);\n const attrMapperScriptId = _.get(providerData, [\n 'identityProvider',\n 'assertionProcessing',\n 'attributeMapper',\n 'attributeMapperScript',\n ]);\n if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {\n debugMessage(\n `Saml2Ops.importDependencies: attributeMapperScript=${attrMapperScriptId}`\n );\n const scriptData = _.get(fileData, ['script', attrMapperScriptId]);\n scriptData.script = convertTextArrayToBase64(scriptData.script as string[]);\n await putScript({ scriptId: attrMapperScriptId, scriptData, state });\n }\n const idpAdapterScriptId = _.get(providerData, [\n 'identityProvider',\n 'advanced',\n 'idpAdapter',\n 'idpAdapterScript',\n ]);\n if (idpAdapterScriptId && idpAdapterScriptId !== '[Empty]') {\n debugMessage(\n `Saml2Ops.importDependencies: idpAdapterScript=${idpAdapterScriptId}`\n );\n const scriptData = _.get(fileData, ['script', idpAdapterScriptId]);\n scriptData.script = convertTextArrayToBase64(scriptData.script as string[]);\n await putScript({ scriptId: idpAdapterScriptId, scriptData, state });\n }\n debugMessage(`Saml2Ops.importDependencies: end`);\n}\n\n/**\n * Find provider in import file and return its location\n * @param {string} entityId64 Base64-encoded provider entity id\n * @param {Saml2ExportInterface} data Import file json data\n * @returns {string} 'hosted' or 'remote' if found, undefined otherwise\n */\nfunction getLocation(\n entityId64: string,\n data: Saml2ExportInterface\n): Saml2ProiderLocation {\n if (data.saml.hosted[entityId64]) {\n return Saml2ProiderLocation.HOSTED;\n }\n if (data.saml.remote[entityId64]) {\n return Saml2ProiderLocation.REMOTE;\n }\n return undefined;\n}\n\n/**\n * Import a SAML entity provider\n * @param {string} entityId Provider entity id\n * @param {Saml2ExportInterface} importData Import data\n */\nexport async function importSaml2Provider({\n entityId,\n importData,\n state,\n}: {\n entityId: string;\n importData: Saml2ExportInterface;\n state: State;\n}): Promise<boolean> {\n debugMessage(`Saml2Ops.importSaml2Provider: start`);\n const entityId64 = encode(entityId, false);\n const location = getLocation(entityId64, importData);\n debugMessage(\n `Saml2Ops.importSaml2Provider: entityId=${entityId}, entityId64=${entityId64}, location=${location}`\n );\n if (location) {\n const providerData = importData.saml[location][entityId64];\n await importDependencies({ providerData, fileData: importData, state });\n let metaData = null;\n if (location === Saml2ProiderLocation.REMOTE) {\n metaData = convertTextArrayToBase64Url(\n importData.saml.metadata[entityId64]\n );\n }\n try {\n await createProvider({ location, providerData, metaData, state });\n } catch (error) {\n await updateProvider({ location, providerData, state });\n }\n } else {\n throw new Error(`Provider ${entityId} not found in import data!`);\n }\n debugMessage(`Saml2Ops.importSaml2Provider: end`);\n return true;\n}\n\n/**\n * Import SAML entity providers\n * @param {Saml2ExportInterface} importData Import data\n */\nexport async function importSaml2Providers({\n importData,\n state,\n}: {\n importData: Saml2ExportInterface;\n state: State;\n}): Promise<MultiOpStatusInterface> {\n debugMessage(`Saml2Ops.importSaml2Providers: start`);\n const myStatus: MultiOpStatusInterface = {\n total: 0,\n successes: 0,\n warnings: 0,\n failures: 0,\n };\n try {\n // find providers in hosted and in remote and map locations\n const hostedIds = Object.keys(importData.saml.hosted);\n const remoteIds = Object.keys(importData.saml.remote);\n const providerIds = hostedIds.concat(remoteIds);\n myStatus.total = providerIds.length;\n for (const entityId64 of providerIds) {\n debugMessage(\n `Saml2Ops.importSaml2Providers: entityId=${decodeBase64Url(entityId64)}`\n );\n const location = hostedIds.includes(entityId64)\n ? Saml2ProiderLocation.HOSTED\n : Saml2ProiderLocation.REMOTE;\n const entityId = decode(entityId64);\n const providerData = importData.saml[location][entityId64];\n try {\n await importDependencies({ providerData, fileData: importData, state });\n } catch (importDependenciesErr) {\n myStatus.warnings += 1;\n printMessage(\n `\\nWarning importing dependencies for ${entityId}`,\n 'warn'\n );\n printMessage(importDependenciesErr.response.data, 'error');\n }\n let metaData = null;\n if (location === Saml2ProiderLocation.REMOTE) {\n metaData = convertTextArrayToBase64Url(\n importData.saml.metadata[entityId64]\n );\n }\n try {\n await createProvider({ location, providerData, metaData, state });\n myStatus.successes += 1;\n } catch (createProviderErr) {\n try {\n await updateProvider({ location, providerData, state });\n myStatus.successes += 1;\n } catch (updateProviderError) {\n myStatus.failures += 1;\n printMessage(\n `\\nError importing provider ${entityId}: ${updateProviderError.message}`,\n 'error'\n );\n printMessage(updateProviderError.response?.data, 'error');\n }\n }\n }\n myStatus.message = `${myStatus.successes}/${myStatus.total} providers imported.`;\n } catch (error) {\n myStatus.failures += 1;\n printMessage(`\\nError importing providers ${error.message}`, 'error');\n }\n debugMessage(`Saml2Ops.importSaml2Providers: end`);\n return myStatus;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Saml2Ops.js","names":["_lodash","_interopRequireDefault","require","_ApiTypes","_Saml2Api","_ScriptApi","_Base","_ScriptOps","_Console","_ExportImportUtils","obj","__esModule","default","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","Saml2Ops","constructor","state","getSaml2ProviderStubs","_this","getProviderByLocationAndId","location","entityId64","_this2","getProviderMetadataUrl","entityId","getProviderMetadata","_this3","getSaml2ProviderStub","_this4","getSaml2Provider","_this5","deleteSaml2Provider","_this6","deleteSaml2Providers","_this7","exportSaml2Provider","_this8","exportSaml2Providers","_this9","importSaml2Provider","importData","_this10","importSaml2Providers","_this11","exports","createSaml2ExportTemplate","_ref","meta","getMetadata","script","saml","hosted","remote","metadata","_x","_getSaml2ProviderStubs","_ref2","result","getProviders","_x2","_getProviderByLocationAndId2","_ref3","_getProviderByLocationAndId","_ref4","_getProviderMetadataUrl","_x3","_getProviderMetadata2","_ref5","_getProviderMetadata","exportDependencies","_x4","_exportDependencies","_ref6","providerData","fileData","attrMapperScriptId","_","get","scriptData","getScript","scriptId","convertBase64TextToArray","idpAdapterScriptId","metaDataResponse","Error","concat","_id","convertBase64UrlTextToArray","encodeBase64Url","_x5","_getSaml2ProviderStub","_ref7","debugMessage","found","findProviders","filter","resultCount","_x6","_getSaml2Provider","_ref8","stub","id","_x7","_deleteSaml2Provider","_ref9","deleteProviderByLocationAndId","_x8","_deleteSaml2Providers","_ref10","providers","stubs","provider","push","length","_x9","_exportSaml2Provider","_ref11","exportData","printMessage","message","_x10","_exportSaml2Providers","_ref12","importDependencies","_x11","_importDependencies","_ref13","convertTextArrayToBase64","putScript","getLocation","data","Saml2ProiderLocation","HOSTED","REMOTE","_x12","_importSaml2Provider","_ref14","encode","metaData","convertTextArrayToBase64Url","createProvider","updateProvider","_x13","_importSaml2Providers","_ref15","myStatus","total","successes","warnings","failures","hostedIds","Object","keys","remoteIds","providerIds","decodeBase64Url","includes","decode","importDependenciesErr","response","createProviderErr","updateProviderError","_updateProviderError$"],"sources":["ops/Saml2Ops.ts"],"sourcesContent":["import _ from 'lodash';\nimport {\n Saml2ProiderLocation,\n Saml2ProviderSkeleton,\n Saml2ProviderStub,\n} from '../api/ApiTypes';\nimport {\n createProvider,\n updateProvider,\n findProviders,\n getProviderByLocationAndId as _getProviderByLocationAndId,\n getProviderMetadata as _getProviderMetadata,\n getProviderMetadataUrl as _getProviderMetadataUrl,\n getProviders,\n deleteProviderByLocationAndId,\n} from '../api/Saml2Api';\nimport { getScript } from '../api/ScriptApi';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from '../api/utils/Base64';\nimport { MultiOpStatusInterface, Saml2ExportInterface } from './OpsTypes';\nimport { putScript } from './ScriptOps';\nimport { debugMessage, printMessage } from './utils/Console';\nimport {\n convertBase64TextToArray,\n convertBase64UrlTextToArray,\n convertTextArrayToBase64,\n convertTextArrayToBase64Url,\n getMetadata,\n} from './utils/ExportImportUtils';\nimport State from '../shared/State';\n\nexport default class Saml2Ops {\n state: State;\n constructor(state: State) {\n this.state = state;\n }\n\n /**\n * Get SAML2 entity provider stubs\n * @returns {Promise<Saml2ProviderStub[]>} a promise that resolves to an array of saml2 entity stubs\n */\n async getSaml2ProviderStubs(): Promise<Saml2ProviderStub[]> {\n return getSaml2ProviderStubs({ state: this.state });\n }\n\n /**\n * Geta SAML2 entity provider by location and id\n * @param {string} location Entity provider location (hosted or remote)\n * @param {string} entityId64 Base64-encoded-without-padding provider entity id\n * @returns {Promise} a promise that resolves to a saml2 entity provider object\n */\n async getProviderByLocationAndId(location: string, entityId64: string) {\n return getProviderByLocationAndId({\n location,\n entityId64,\n state: this.state,\n });\n }\n\n /**\n * Get a SAML2 entity provider's metadata URL by entity id\n * @param {string} entityId SAML2 entity id\n * @returns {string} the URL to get the metadata from\n */\n getProviderMetadataUrl(entityId: string): string {\n return getProviderMetadataUrl({ entityId, state: this.state });\n }\n\n /**\n * Get a SAML2 entity provider's metadata by entity id\n * @param {string} entityId SAML2 entity id\n * @returns {Promise<object>} a promise that resolves to an object containing a SAML2 metadata\n */\n async getProviderMetadata(entityId: string) {\n return getProviderMetadata({ entityId, state: this.state });\n }\n\n /**\n *\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderStub>} Promise resolving to a Saml2ExportInterface object.\n */\n async getSaml2ProviderStub(entityId: string): Promise<Saml2ProviderStub> {\n return getSaml2ProviderStub({ entityId, state: this.state });\n }\n\n /**\n * Export a single entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\n async getSaml2Provider(entityId: string): Promise<Saml2ProviderSkeleton> {\n return getSaml2Provider({ entityId, state: this.state });\n }\n\n /**\n * Delete an entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\n async deleteSaml2Provider(entityId: string): Promise<Saml2ProviderSkeleton> {\n return deleteSaml2Provider({ entityId, state: this.state });\n }\n\n /**\n * Delete all entity providers.\n * @returns {Promise<Saml2ProviderSkeleton[]>} Promise resolving to an array of Saml2ProviderSkeleton objects.\n */\n async deleteSaml2Providers(): Promise<Saml2ProviderSkeleton[]> {\n return deleteSaml2Providers({ state: this.state });\n }\n\n /**\n * Export a single entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ExportInterface>} Promise resolving to a Saml2ExportInterface object.\n */\n async exportSaml2Provider(entityId: string): Promise<Saml2ExportInterface> {\n return exportSaml2Provider({ entityId, state: this.state });\n }\n\n /**\n * Export all entity providers. The response can be saved to file as is.\n * @returns {Promise<Saml2ExportInterface>} Promise resolving to a Saml2ExportInterface object.\n */\n async exportSaml2Providers(): Promise<Saml2ExportInterface> {\n return exportSaml2Providers({ state: this.state });\n }\n\n /**\n * Import a SAML entity provider\n * @param {string} entityId Provider entity id\n * @param {Saml2ExportInterface} importData Import data\n */\n async importSaml2Provider(\n entityId: string,\n importData: Saml2ExportInterface\n ): Promise<boolean> {\n return importSaml2Provider({ entityId, importData, state: this.state });\n }\n\n /**\n * Import SAML entity providers\n * @param {Saml2ExportInterface} importData Import data\n */\n async importSaml2Providers(\n importData: Saml2ExportInterface\n ): Promise<MultiOpStatusInterface> {\n return importSaml2Providers({ importData, state: this.state });\n }\n}\n\n// use a function vs a template variable to avoid problems in loops\nexport function createSaml2ExportTemplate({\n state,\n}: {\n state: State;\n}): Saml2ExportInterface {\n return {\n meta: getMetadata({ state }),\n script: {},\n saml: {\n hosted: {},\n remote: {},\n metadata: {},\n },\n } as Saml2ExportInterface;\n}\n\n/**\n * Get SAML2 entity provider stubs\n * @returns {Promise<Saml2ProviderStub[]>} a promise that resolves to an array of saml2 entity stubs\n */\nexport async function getSaml2ProviderStubs({\n state,\n}: {\n state: State;\n}): Promise<Saml2ProviderStub[]> {\n const { result } = await getProviders({ state });\n return result;\n}\n\n/**\n * Geta SAML2 entity provider by location and id\n * @param {string} location Entity provider location (hosted or remote)\n * @param {string} entityId64 Base64-encoded-without-padding provider entity id\n * @returns {Promise} a promise that resolves to a saml2 entity provider object\n */\nexport async function getProviderByLocationAndId({\n location,\n entityId64,\n state,\n}: {\n location: string;\n entityId64: string;\n state: State;\n}) {\n return _getProviderByLocationAndId({ location, entityId64, state });\n}\n\n/**\n * Get a SAML2 entity provider's metadata URL by entity id\n * @param {string} entityId SAML2 entity id\n * @returns {string} the URL to get the metadata from\n */\nexport function getProviderMetadataUrl({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): string {\n return _getProviderMetadataUrl({ entityId, state });\n}\n\n/**\n * Get a SAML2 entity provider's metadata by entity id\n * @param {string} entityId SAML2 entity id\n * @returns {Promise<object>} a promise that resolves to an object containing a SAML2 metadata\n */\nexport async function getProviderMetadata({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}) {\n return _getProviderMetadata({ entityId, state });\n}\n\n/**\n * Include dependencies in the export file\n * @param {object} providerData Object representing a SAML entity provider\n * @param {object} fileData File data object to add dependencies to\n */\nasync function exportDependencies({\n providerData,\n fileData,\n state,\n}: {\n providerData: Saml2ProviderSkeleton;\n fileData: Saml2ExportInterface;\n state: State;\n}) {\n const attrMapperScriptId = _.get(providerData, [\n 'identityProvider',\n 'assertionProcessing',\n 'attributeMapper',\n 'attributeMapperScript',\n ]);\n if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {\n const scriptData = await getScript({ scriptId: attrMapperScriptId, state });\n scriptData.script = convertBase64TextToArray(scriptData.script);\n fileData.script[attrMapperScriptId] = scriptData;\n }\n const idpAdapterScriptId = _.get(providerData, [\n 'identityProvider',\n 'advanced',\n 'idpAdapter',\n 'idpAdapterScript',\n ]);\n if (idpAdapterScriptId && idpAdapterScriptId !== '[Empty]') {\n const scriptData = await getScript({ scriptId: idpAdapterScriptId, state });\n scriptData.script = convertBase64TextToArray(scriptData.script);\n fileData.script[idpAdapterScriptId] = scriptData;\n }\n const metaDataResponse = await getProviderMetadata({\n entityId: providerData.entityId,\n state,\n });\n if (!metaDataResponse) {\n throw new Error(\n `Unable to obtain metadata from ${getProviderMetadataUrl({\n entityId: providerData.entityId,\n state,\n })}`\n );\n }\n fileData.saml.metadata[providerData._id] = convertBase64UrlTextToArray(\n encodeBase64Url(metaDataResponse)\n );\n}\n\n/**\n *\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderStub>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function getSaml2ProviderStub({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): Promise<Saml2ProviderStub> {\n debugMessage(`Saml2Ops.getSaml2ProviderStub: start [entityId=${entityId}]`);\n const found = await findProviders({\n filter: `entityId eq '${entityId}'`,\n state,\n });\n switch (found.resultCount) {\n case 0:\n throw new Error(`No provider with entity id '${entityId}' found`);\n case 1: {\n debugMessage(`Saml2Ops.getSaml2ProviderStub: end [entityId=${entityId}]`);\n return found.result[0];\n }\n default:\n throw new Error(`Multiple providers with entity id '${entityId}' found`);\n }\n}\n\n/**\n * Export a single entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function getSaml2Provider({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.getSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub({ entityId, state });\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId({\n location,\n entityId64: id,\n state,\n });\n debugMessage(`Saml2Ops.getSaml2Provider: end [entityId=${entityId}]`);\n return providerData;\n}\n\n/**\n * Delete an entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function deleteSaml2Provider({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub({ entityId, state });\n const { location } = stub;\n const id = stub._id;\n const providerData = await deleteProviderByLocationAndId({\n location,\n entityId64: id,\n state,\n });\n debugMessage(`Saml2Ops.deleteSaml2Provider: end [entityId=${entityId}]`);\n return providerData;\n}\n\n/**\n * Delete all entity providers.\n * @returns {Promise<Saml2ProviderSkeleton[]>} Promise resolving to an array of Saml2ProviderSkeleton objects.\n */\nexport async function deleteSaml2Providers({\n state,\n}: {\n state: State;\n}): Promise<Saml2ProviderSkeleton[]> {\n debugMessage(`Saml2Ops.deleteSaml2Providers: start`);\n const providers: Saml2ProviderSkeleton[] = [];\n const stubs = await getSaml2ProviderStubs({ state });\n for (const stub of stubs) {\n const provider = await deleteProviderByLocationAndId({\n location: stub.location,\n entityId64: stub._id,\n state,\n });\n providers.push(provider);\n }\n debugMessage(\n `Saml2Ops.deleteSaml2Providers: end [deleted ${providers.length} providers]`\n );\n return providers;\n}\n\n/**\n * Export a single entity provider. The response can be saved to file as is.\n * @param {string} entityId Provider entity id\n * @returns {Promise<Saml2ExportInterface>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function exportSaml2Provider({\n entityId,\n state,\n}: {\n entityId: string;\n state: State;\n}): Promise<Saml2ExportInterface> {\n debugMessage(`Saml2Ops.exportSaml2Provider: start [entityId=${entityId}]`);\n const exportData = createSaml2ExportTemplate({ state });\n const stub = await getSaml2ProviderStub({ entityId, state });\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId({\n location,\n entityId64: id,\n state,\n });\n exportData.saml[stub.location][providerData._id] = providerData;\n try {\n await exportDependencies({ providerData, fileData: exportData, state });\n } catch (error) {\n printMessage(error.message, 'error');\n }\n debugMessage(`Saml2Ops.exportSaml2Provider: end [entityId=${entityId}]`);\n return exportData;\n}\n\n/**\n * Export all entity providers. The response can be saved to file as is.\n * @returns {Promise<Saml2ExportInterface>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function exportSaml2Providers({\n state,\n}: {\n state: State;\n}): Promise<Saml2ExportInterface> {\n const fileData = createSaml2ExportTemplate({ state });\n const stubs = await getSaml2ProviderStubs({ state });\n for (const stub of stubs) {\n const providerData = await getProviderByLocationAndId({\n location: stub.location,\n entityId64: stub._id,\n state,\n });\n try {\n await exportDependencies({ providerData, fileData, state });\n } catch (error) {\n printMessage(error, 'error');\n }\n fileData.saml[stub.location][providerData._id] = providerData;\n }\n return fileData;\n}\n\n/**\n * Include dependencies from the import file\n * @param {object} providerData Object representing a SAML entity provider\n * @param {object} fileData File data object to read dependencies from\n */\nasync function importDependencies({\n providerData,\n fileData,\n state,\n}: {\n providerData: Saml2ProviderSkeleton;\n fileData: Saml2ExportInterface;\n state: State;\n}) {\n debugMessage(`Saml2Ops.importDependencies: start`);\n const attrMapperScriptId = _.get(providerData, [\n 'identityProvider',\n 'assertionProcessing',\n 'attributeMapper',\n 'attributeMapperScript',\n ]);\n if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {\n debugMessage(\n `Saml2Ops.importDependencies: attributeMapperScript=${attrMapperScriptId}`\n );\n const scriptData = _.get(fileData, ['script', attrMapperScriptId]);\n scriptData.script = convertTextArrayToBase64(scriptData.script as string[]);\n await putScript({ scriptId: attrMapperScriptId, scriptData, state });\n }\n const idpAdapterScriptId = _.get(providerData, [\n 'identityProvider',\n 'advanced',\n 'idpAdapter',\n 'idpAdapterScript',\n ]);\n if (idpAdapterScriptId && idpAdapterScriptId !== '[Empty]') {\n debugMessage(\n `Saml2Ops.importDependencies: idpAdapterScript=${idpAdapterScriptId}`\n );\n const scriptData = _.get(fileData, ['script', idpAdapterScriptId]);\n scriptData.script = convertTextArrayToBase64(scriptData.script as string[]);\n await putScript({ scriptId: idpAdapterScriptId, scriptData, state });\n }\n debugMessage(`Saml2Ops.importDependencies: end`);\n}\n\n/**\n * Find provider in import file and return its location\n * @param {string} entityId64 Base64-encoded provider entity id\n * @param {Saml2ExportInterface} data Import file json data\n * @returns {string} 'hosted' or 'remote' if found, undefined otherwise\n */\nfunction getLocation(\n entityId64: string,\n data: Saml2ExportInterface\n): Saml2ProiderLocation {\n if (data.saml.hosted[entityId64]) {\n return Saml2ProiderLocation.HOSTED;\n }\n if (data.saml.remote[entityId64]) {\n return Saml2ProiderLocation.REMOTE;\n }\n return undefined;\n}\n\n/**\n * Import a SAML entity provider\n * @param {string} entityId Provider entity id\n * @param {Saml2ExportInterface} importData Import data\n */\nexport async function importSaml2Provider({\n entityId,\n importData,\n state,\n}: {\n entityId: string;\n importData: Saml2ExportInterface;\n state: State;\n}): Promise<boolean> {\n debugMessage(`Saml2Ops.importSaml2Provider: start`);\n const entityId64 = encode(entityId, false);\n const location = getLocation(entityId64, importData);\n debugMessage(\n `Saml2Ops.importSaml2Provider: entityId=${entityId}, entityId64=${entityId64}, location=${location}`\n );\n if (location) {\n const providerData = importData.saml[location][entityId64];\n await importDependencies({ providerData, fileData: importData, state });\n let metaData = null;\n if (location === Saml2ProiderLocation.REMOTE) {\n metaData = convertTextArrayToBase64Url(\n importData.saml.metadata[entityId64]\n );\n }\n try {\n await createProvider({ location, providerData, metaData, state });\n } catch (error) {\n await updateProvider({ location, providerData, state });\n }\n } else {\n throw new Error(`Provider ${entityId} not found in import data!`);\n }\n debugMessage(`Saml2Ops.importSaml2Provider: end`);\n return true;\n}\n\n/**\n * Import SAML entity providers\n * @param {Saml2ExportInterface} importData Import data\n */\nexport async function importSaml2Providers({\n importData,\n state,\n}: {\n importData: Saml2ExportInterface;\n state: State;\n}): Promise<MultiOpStatusInterface> {\n debugMessage(`Saml2Ops.importSaml2Providers: start`);\n const myStatus: MultiOpStatusInterface = {\n total: 0,\n successes: 0,\n warnings: 0,\n failures: 0,\n };\n try {\n // find providers in hosted and in remote and map locations\n const hostedIds = Object.keys(importData.saml.hosted);\n const remoteIds = Object.keys(importData.saml.remote);\n const providerIds = hostedIds.concat(remoteIds);\n myStatus.total = providerIds.length;\n for (const entityId64 of providerIds) {\n debugMessage(\n `Saml2Ops.importSaml2Providers: entityId=${decodeBase64Url(entityId64)}`\n );\n const location = hostedIds.includes(entityId64)\n ? Saml2ProiderLocation.HOSTED\n : Saml2ProiderLocation.REMOTE;\n const entityId = decode(entityId64);\n const providerData = importData.saml[location][entityId64];\n try {\n await importDependencies({ providerData, fileData: importData, state });\n } catch (importDependenciesErr) {\n myStatus.warnings += 1;\n printMessage(\n `\\nWarning importing dependencies for ${entityId}`,\n 'warn'\n );\n printMessage(importDependenciesErr.response.data, 'error');\n }\n let metaData = null;\n if (location === Saml2ProiderLocation.REMOTE) {\n metaData = convertTextArrayToBase64Url(\n importData.saml.metadata[entityId64]\n );\n }\n try {\n await createProvider({ location, providerData, metaData, state });\n myStatus.successes += 1;\n } catch (createProviderErr) {\n try {\n await updateProvider({ location, providerData, state });\n myStatus.successes += 1;\n } catch (updateProviderError) {\n myStatus.failures += 1;\n printMessage(\n `\\nError importing provider ${entityId}: ${updateProviderError.message}`,\n 'error'\n );\n printMessage(updateProviderError.response?.data, 'error');\n }\n }\n }\n myStatus.message = `${myStatus.successes}/${myStatus.total} providers imported.`;\n } catch (error) {\n myStatus.failures += 1;\n printMessage(`\\nError importing providers ${error.message}`, 'error');\n }\n debugMessage(`Saml2Ops.importSaml2Providers: end`);\n return myStatus;\n}\n"],"mappings":"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"}
|
package/esm/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { frodo, state } from './lib/FrodoLib';
|
|
1
|
+
export { frodo, state, FrodoLib } from './lib/FrodoLib';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -488,11 +488,15 @@ async function determineDeploymentTypeAndDefaultRealmAndVersion(state) {
|
|
|
488
488
|
async function getLoggedInSubject(state) {
|
|
489
489
|
let subjectString = `user ${state.getUsername()}`;
|
|
490
490
|
if (state.getUseBearerTokenForAmApis()) {
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
491
|
+
try {
|
|
492
|
+
const name = (await getServiceAccount({
|
|
493
|
+
serviceAccountId: state.getServiceAccountId(),
|
|
494
|
+
state
|
|
495
|
+
})).name;
|
|
496
|
+
subjectString = `service account ${name} [${state.getServiceAccountId()}]`;
|
|
497
|
+
} catch (error) {
|
|
498
|
+
subjectString = `service account ${state.getServiceAccountId()}`;
|
|
499
|
+
}
|
|
496
500
|
}
|
|
497
501
|
return subjectString;
|
|
498
502
|
}
|
package/esm/ops/Saml2Ops.mjs
CHANGED
|
@@ -151,12 +151,6 @@ export default class Saml2Ops {
|
|
|
151
151
|
});
|
|
152
152
|
}
|
|
153
153
|
}
|
|
154
|
-
export const roleMap = {
|
|
155
|
-
identityProvider: 'IDP',
|
|
156
|
-
serviceProvider: 'SP',
|
|
157
|
-
attributeQueryProvider: 'AttrQuery',
|
|
158
|
-
xacmlPolicyEnforcementPoint: 'XACML PEP'
|
|
159
|
-
};
|
|
160
154
|
|
|
161
155
|
// use a function vs a template variable to avoid problems in loops
|
|
162
156
|
export function createSaml2ExportTemplate({
|
package/package.json
CHANGED
package/types/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { frodo, state } from './lib/FrodoLib';
|
|
1
|
+
export { frodo, state, FrodoLib } from './lib/FrodoLib';
|
package/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC","file":"index.d.ts","sourcesContent":["export { frodo, state } from './lib/FrodoLib';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC","file":"index.d.ts","sourcesContent":["export { frodo, state, FrodoLib } from './lib/FrodoLib';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ops/AuthenticateOps.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,iBAAiB,CAAC;AAQpC,OAAO,EAAE,MAAM,EAAwB,MAAM,WAAW,CAAC;AAKzD,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,KAAK,EAAE,KAAK,CAAC;gBACD,KAAK,EAAE,KAAK;IAIxB;;;OAGG;IACG,+BAA+B,CACnC,IAAI,GAAE,MAAkB,EACxB,KAAK,GAAE,MAAkB,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIzB;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,UAAQ;CAGnC;AAmaD;;;;GAIG;AACH,wBAAsB,+BAA+B,CAAC,EACpD,IAAgB,EAChB,KAAiB,EACjB,KAAK,GACN,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4BzB;AAmDD;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,EAC9B,gBAAwB,EACxB,KAAK,GACN,EAAE;IACD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;CACd,GAAG,OAAO,CAAC,OAAO,CAAC,CA4HnB","file":"AuthenticateOps.d.ts","sourcesContent":["import url from 'url';\nimport { createHash, randomBytes } from 'crypto';\nimport readlineSync from 'readline-sync';\nimport { encodeBase64Url } from '../api/utils/Base64';\nimport State from '../shared/State';\nimport * as globalConfig from '../storage/StaticStorage';\nimport { getServerInfo, getServerVersionInfo } from '../api/ServerInfoApi';\nimport { step } from '../api/AuthenticateApi';\nimport { accessToken, authorize } from '../api/OAuth2OIDCApi';\nimport { getConnectionProfile } from './ConnectionProfileOps';\nimport { v4 } from 'uuid';\nimport { parseUrl } from '../api/utils/ApiUtils';\nimport { JwkRsa, createSignedJwtToken } from './JoseOps';\nimport { getServiceAccount } from './cloud/ServiceAccountOps';\nimport { isValidUrl } from './utils/OpsUtils';\nimport { debugMessage, printMessage, verboseMessage } from './utils/Console';\n\nexport default class AuthenticateOps {\n state: State;\n constructor(state: State) {\n this.state = state;\n }\n\n /**\n * Get access token for service account\n * @returns {string | null} Access token or null\n */\n async getAccessTokenForServiceAccount(\n saId: string = undefined,\n saJwk: JwkRsa = undefined\n ): Promise<string | null> {\n return getAccessTokenForServiceAccount({ saId, saJwk, state: this.state });\n }\n\n /**\n * Get tokens\n * @param {boolean} forceLoginAsUser true to force login as user even if a service account is available (default: false)\n * @returns {Promise<boolean>} true if tokens were successfully obtained, false otherwise\n */\n getTokens(forceLoginAsUser = false) {\n return getTokens({ forceLoginAsUser, state: this.state });\n }\n}\n\nconst adminClientPassword = 'doesnotmatter';\nconst redirectUrlTemplate = '/platform/appAuthHelperRedirect.html';\n\nconst cloudIdmAdminScopes = 'openid fr:idm:* fr:idc:esv:*';\nconst forgeopsIdmAdminScopes = 'openid fr:idm:*';\nconst serviceAccountScopes = 'fr:am:* fr:idm:* fr:idc:esv:*';\n\nlet adminClientId = 'idmAdminClient';\n\n/**\n * Helper function to get cookie name\n * @param {State} state library state\n * @returns {string} cookie name\n */\nasync function determineCookieName(state: State) {\n const data = await getServerInfo({ state });\n debugMessage(\n `AuthenticateOps.determineCookieName: cookieName=${data.cookieName}`\n );\n return data.cookieName;\n}\n\n/**\n * Helper function to determine if this is a setup mfa prompt in the ID Cloud tenant admin login journey\n * @param {Object} payload response from the previous authentication journey step\n * @param {State} state library state\n * @returns {Object} an object indicating if 2fa is required and the original payload\n */\nfunction checkAndHandle2FA(payload, state: State) {\n debugMessage(`AuthenticateOps.checkAndHandle2FA: start`);\n // let skippable = false;\n if ('callbacks' in payload) {\n for (const callback of payload.callbacks) {\n // select localAuthentication if Admin Federation is enabled\n if (callback.type === 'SelectIdPCallback') {\n debugMessage(\n `AuthenticateOps.checkAndHandle2FA: Admin federation enabled. Allowed providers:`\n );\n let localAuth = false;\n for (const value of callback.output[0].value) {\n debugMessage(`${value.provider}`);\n if (value.provider === 'localAuthentication') {\n localAuth = true;\n }\n }\n if (localAuth) {\n debugMessage(`local auth allowed`);\n callback.input[0].value = 'localAuthentication';\n } else {\n debugMessage(`local auth NOT allowed`);\n }\n }\n if (callback.type === 'HiddenValueCallback') {\n if (callback.input[0].value.includes('skip')) {\n // skippable = true;\n callback.input[0].value = 'Skip';\n // debugMessage(\n // `AuthenticateOps.checkAndHandle2FA: end [need2fa=true, skippable=true]`\n // );\n // return {\n // nextStep: true,\n // need2fa: true,\n // factor: 'None',\n // supported: true,\n // payload,\n // };\n }\n if (callback.input[0].value.includes('webAuthnOutcome')) {\n // webauthn!!!\n debugMessage(\n `AuthenticateOps.checkAndHandle2FA: end [need2fa=true, unsupported factor: webauthn]`\n );\n return {\n nextStep: false,\n need2fa: true,\n factor: 'WebAuthN',\n supported: false,\n payload,\n };\n }\n }\n if (callback.type === 'NameCallback') {\n if (callback.output[0].value.includes('code')) {\n // skippable = false;\n debugMessage(\n `AuthenticateOps.checkAndHandle2FA: need2fa=true, skippable=false`\n );\n printMessage('2FA is enabled and required for this user...');\n const code = readlineSync.question(`${callback.output[0].value}: `);\n callback.input[0].value = code;\n debugMessage(\n `AuthenticateOps.checkAndHandle2FA: end [need2fa=true, skippable=false, factor=Code]`\n );\n return {\n nextStep: true,\n need2fa: true,\n factor: 'Code',\n supported: true,\n payload,\n };\n } else {\n // answer callback\n callback.input[0].value = state.getUsername();\n }\n }\n if (callback.type === 'PasswordCallback') {\n // answer callback\n callback.input[0].value = state.getPassword();\n }\n }\n debugMessage(`AuthenticateOps.checkAndHandle2FA: end [need2fa=false]`);\n // debugMessage(payload);\n return {\n nextStep: true,\n need2fa: false,\n factor: 'None',\n supported: true,\n payload,\n };\n }\n debugMessage(`AuthenticateOps.checkAndHandle2FA: end [need2fa=false]`);\n // debugMessage(payload);\n return {\n nextStep: false,\n need2fa: false,\n factor: 'None',\n supported: true,\n payload,\n };\n}\n\n/**\n * Helper function to set the default realm by deployment type\n * @param {State} state library state\n */\nfunction determineDefaultRealm(state: State) {\n if (\n !state.getRealm() ||\n state.getRealm() === globalConfig.DEFAULT_REALM_KEY\n ) {\n state.setRealm(\n globalConfig.DEPLOYMENT_TYPE_REALM_MAP[state.getDeploymentType()]\n );\n }\n}\n\n/**\n * Helper function to determine the deployment type\n * @param {State} state library state\n * @returns {Promise<string>} deployment type\n */\nasync function determineDeploymentType(state: State): Promise<string> {\n const cookieValue = state.getCookieValue();\n\n // if we are using a service account, we know it's cloud\n if (state.getUseBearerTokenForAmApis())\n return globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;\n\n const fidcClientId = 'idmAdminClient';\n const forgeopsClientId = 'idm-admin-ui';\n\n const verifier = encodeBase64Url(randomBytes(32));\n const challenge = encodeBase64Url(\n createHash('sha256').update(verifier).digest()\n );\n const challengeMethod = 'S256';\n const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);\n\n const config = {\n maxRedirects: 0,\n headers: {\n [state.getCookieName()]: state.getCookieValue(),\n },\n };\n let bodyFormData = `redirect_uri=${redirectURL}&scope=${cloudIdmAdminScopes}&response_type=code&client_id=${fidcClientId}&csrf=${cookieValue}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;\n\n let deploymentType = globalConfig.CLASSIC_DEPLOYMENT_TYPE_KEY;\n try {\n await authorize({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config,\n state,\n });\n } catch (e) {\n // debugMessage(e.response);\n if (\n e.response?.status === 302 &&\n e.response.headers?.location?.indexOf('code=') > -1\n ) {\n verboseMessage(`ForgeRock Identity Cloud`['brightCyan'] + ` detected.`);\n deploymentType = globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;\n } else {\n try {\n bodyFormData = `redirect_uri=${redirectURL}&scope=${forgeopsIdmAdminScopes}&response_type=code&client_id=${forgeopsClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;\n await authorize({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config,\n state,\n });\n } catch (ex) {\n if (\n ex.response?.status === 302 &&\n ex.response.headers?.location?.indexOf('code=') > -1\n ) {\n adminClientId = forgeopsClientId;\n verboseMessage(`ForgeOps deployment`['brightCyan'] + ` detected.`);\n deploymentType = globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY;\n } else {\n verboseMessage(`Classic deployment`['brightCyan'] + ` detected.`);\n }\n }\n }\n }\n return deploymentType;\n}\n\n/**\n * Helper function to extract the semantic version string from a version info object\n * @param {Object} versionInfo version info object\n * @returns {String} semantic version\n */\nfunction getSemanticVersion(versionInfo) {\n if ('version' in versionInfo) {\n const versionString = versionInfo.version;\n const rx = /([\\d]\\.[\\d]\\.[\\d](\\.[\\d])*)/g;\n const version = versionString.match(rx);\n return version[0];\n }\n throw new Error('Cannot extract semantic version from version info object.');\n}\n\n/**\n * Helper function to authenticate and obtain and store session cookie\n * @param {State} state library state\n * @returns {string} Session token or null\n */\nasync function authenticate(state: State): Promise<string> {\n debugMessage(`AuthenticateOps.authenticate: start`);\n const config = {\n headers: {\n 'X-OpenAM-Username': state.getUsername(),\n 'X-OpenAM-Password': state.getPassword(),\n },\n };\n let response = await step({ body: {}, config, state });\n\n let skip2FA = null;\n let steps = 0;\n const maxSteps = 3;\n do {\n skip2FA = checkAndHandle2FA(response, state);\n\n // throw exception if 2fa required but factor not supported by frodo (e.g. WebAuthN)\n if (!skip2FA.supported) {\n throw new Error(`Unsupported 2FA factor: ${skip2FA.factor}`);\n }\n\n if (skip2FA.nextStep) {\n steps++;\n response = await step({ body: skip2FA.payload, state });\n }\n\n if ('tokenId' in response) {\n debugMessage(\n `AuthenticateOps.authenticate: end [tokenId=${response['tokenId']}]`\n );\n return response['tokenId'] as string;\n }\n } while (skip2FA.nextStep && steps < maxSteps);\n debugMessage(`AuthenticateOps.authenticate: end [no session]`);\n return null;\n}\n\n/**\n * Helper function to obtain an oauth2 authorization code\n * @param {string} redirectURL oauth2 redirect uri\n * @param {string} codeChallenge PKCE code challenge\n * @param {string} codeChallengeMethod PKCE code challenge method\n * @param {State} state library state\n * @returns {string} oauth2 authorization code or null\n */\nasync function getAuthCode(\n redirectURL: string,\n codeChallenge: string,\n codeChallengeMethod: string,\n state: State\n) {\n try {\n const bodyFormData = `redirect_uri=${redirectURL}&scope=${\n state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY\n ? cloudIdmAdminScopes\n : forgeopsIdmAdminScopes\n }&response_type=code&client_id=${adminClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${codeChallenge}&code_challenge_method=${codeChallengeMethod}`;\n const config = {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n maxRedirects: 0,\n };\n let response = undefined;\n try {\n response = await authorize({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config,\n state,\n });\n } catch (error) {\n response = error.response;\n }\n if (response.status < 200 || response.status > 399) {\n printMessage('error getting auth code', 'error');\n printMessage(\n 'likely cause: mismatched parameters with OAuth client config',\n 'error'\n );\n return null;\n }\n const redirectLocationURL = response.headers?.location;\n const queryObject = url.parse(redirectLocationURL, true).query;\n if ('code' in queryObject) {\n return queryObject.code;\n }\n printMessage('auth code not found', 'error');\n return null;\n } catch (error) {\n printMessage(`error getting auth code - ${error.message}`, 'error');\n printMessage(error.response?.data, 'error');\n debugMessage(error.stack);\n return null;\n }\n}\n\n/**\n * Helper function to obtain oauth2 access token\n * @param {State} state library state\n * @returns {Promise<string | null>} access token or null\n */\nasync function getAccessTokenForUser(state: State): Promise<string | null> {\n debugMessage(`AuthenticateOps.getAccessTokenForUser: start`);\n try {\n const verifier = encodeBase64Url(randomBytes(32));\n const challenge = encodeBase64Url(\n createHash('sha256').update(verifier).digest()\n );\n const challengeMethod = 'S256';\n const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);\n const authCode = await getAuthCode(\n redirectURL,\n challenge,\n challengeMethod,\n state\n );\n if (authCode == null) {\n printMessage('error getting auth code', 'error');\n return null;\n }\n let response = null;\n if (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY) {\n const config = {\n auth: {\n username: adminClientId,\n password: adminClientPassword,\n },\n };\n const bodyFormData = `redirect_uri=${redirectURL}&grant_type=authorization_code&code=${authCode}&code_verifier=${verifier}`;\n response = await accessToken({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config,\n state,\n });\n } else {\n const bodyFormData = `client_id=${adminClientId}&redirect_uri=${redirectURL}&grant_type=authorization_code&code=${authCode}&code_verifier=${verifier}`;\n response = await accessToken({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config: {},\n state,\n });\n }\n if ('access_token' in response.data) {\n debugMessage(`AuthenticateOps.getAccessTokenForUser: end with token`);\n return response.data.access_token;\n }\n printMessage('No access token in response.', 'error');\n } catch (error) {\n debugMessage(`Error getting access token for user: ${error}`);\n debugMessage(error.response?.data);\n }\n debugMessage(`AuthenticateOps.getAccessTokenForUser: end without token`);\n return null;\n}\n\nfunction createPayload(serviceAccountId: string, host: string) {\n const u = parseUrl(host);\n const aud = `${u.origin}:${\n u.port ? u.port : u.protocol === 'https' ? '443' : '80'\n }${u.pathname}/oauth2/access_token`;\n\n // Cross platform way of setting JWT expiry time 3 minutes in the future, expressed as number of seconds since EPOCH\n const exp = Math.floor(new Date().getTime() / 1000 + 180);\n\n // A unique ID for the JWT which is required when requesting the openid scope\n const jti = v4();\n\n const iss = serviceAccountId;\n const sub = serviceAccountId;\n\n // Create the payload for our bearer token\n const payload = { iss, sub, aud, exp, jti };\n\n return payload;\n}\n\n/**\n * Get access token for service account\n * @param {State} state library state\n * @returns {string | null} Access token or null\n */\nexport async function getAccessTokenForServiceAccount({\n saId = undefined,\n saJwk = undefined,\n state,\n}: {\n saId?: string;\n saJwk?: JwkRsa;\n state: State;\n}): Promise<string | null> {\n saId = saId ? saId : state.getServiceAccountId();\n saJwk = saJwk ? saJwk : state.getServiceAccountJwk();\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: start`);\n const payload = createPayload(saId, state.getHost());\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: payload:`);\n debugMessage(payload);\n const jwt = await createSignedJwtToken(payload, saJwk);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: jwt:`);\n debugMessage(jwt);\n const bodyFormData = `assertion=${jwt}&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=${serviceAccountScopes}`;\n const response = await accessToken({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config: {},\n state,\n });\n if ('access_token' in response.data) {\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: token:`);\n debugMessage(response.data.access_token);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);\n return response.data.access_token;\n }\n debugMessage(\n `AuthenticateOps.getAccessTokenForServiceAccount: No access token in response.`\n );\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);\n return null;\n}\n\n/**\n * Helper function to determine deployment type, default realm, and version and update library state\n * @param state library state\n */\nasync function determineDeploymentTypeAndDefaultRealmAndVersion(\n state: State\n): Promise<void> {\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: start`\n );\n if (!state.getDeploymentType()) {\n state.setDeploymentType(await determineDeploymentType(state));\n }\n determineDefaultRealm(state);\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: realm=${state.getRealm()}, type=${state.getDeploymentType()}`\n );\n\n const versionInfo = await getServerVersionInfo({ state });\n\n // https://github.com/rockcarver/frodo-cli/issues/109\n debugMessage(`Full version: ${versionInfo.fullVersion}`);\n\n const version = await getSemanticVersion(versionInfo);\n state.setAmVersion(version);\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: end`\n );\n}\n\n/**\n * Get logged-in subject\n * @param {State} state library state\n * @returns {string} a string identifying subject type and id\n */\nasync function getLoggedInSubject(state: State): Promise<string> {\n let subjectString = `user ${state.getUsername()}`;\n if (state.getUseBearerTokenForAmApis()) {\n const name = (\n await getServiceAccount({\n serviceAccountId: state.getServiceAccountId(),\n state,\n })\n ).name;\n subjectString = `service account ${name} [${state.getServiceAccountId()}]`;\n }\n return subjectString;\n}\n\n/**\n * Get tokens\n * @param {boolean} forceLoginAsUser true to force login as user even if a service account is available (default: false)\n * @param {State} state library state\n * @returns {Promise<boolean>} true if tokens were successfully obtained, false otherwise\n */\nexport async function getTokens({\n forceLoginAsUser = false,\n state,\n}: {\n forceLoginAsUser?: boolean;\n state: State;\n}): Promise<boolean> {\n debugMessage(`AuthenticateOps.getTokens: start`);\n if (!state.getHost()) {\n printMessage(\n `No host specified and FRODO_HOST env variable not set!`,\n 'error'\n );\n return false;\n }\n try {\n // if username/password on cli are empty, try to read from connections.json\n if (\n state.getUsername() == null &&\n state.getPassword() == null &&\n !state.getServiceAccountId() &&\n !state.getServiceAccountJwk()\n ) {\n const conn = await getConnectionProfile({ state });\n if (conn) {\n state.setHost(conn.tenant);\n state.setUsername(conn.username);\n state.setPassword(conn.password);\n state.setAuthenticationService(conn.authenticationService);\n state.setAuthenticationHeaderOverrides(\n conn.authenticationHeaderOverrides\n );\n state.setServiceAccountId(conn.svcacctId);\n state.setServiceAccountJwk(conn.svcacctJwk);\n } else {\n return false;\n }\n }\n\n // if host is not a valid URL, try to locate a valid URL from connections.json\n if (!isValidUrl(state.getHost())) {\n const conn = await getConnectionProfile({ state });\n if (conn) {\n state.setHost(conn.tenant);\n } else {\n return false;\n }\n }\n\n // now that we have the full tenant URL we can lookup the cookie name\n state.setCookieName(await determineCookieName(state));\n\n // use service account to login?\n if (\n !forceLoginAsUser &&\n state.getServiceAccountId() &&\n state.getServiceAccountJwk()\n ) {\n debugMessage(\n `AuthenticateOps.getTokens: Authenticating with service account ${state.getServiceAccountId()}`\n );\n try {\n const token = await getAccessTokenForServiceAccount({ state });\n state.setBearerToken(token);\n state.setUseBearerTokenForAmApis(true);\n await determineDeploymentTypeAndDefaultRealmAndVersion(state);\n } catch (saErr) {\n debugMessage(saErr.response?.data || saErr);\n debugMessage(state);\n throw new Error(\n `Service account login error: ${\n saErr.response?.data?.error_description ||\n saErr.response?.data?.message ||\n saErr\n }`\n );\n }\n }\n // use user account to login\n else if (state.getUsername() && state.getPassword()) {\n debugMessage(\n `AuthenticateOps.getTokens: Authenticating with user account ${state.getUsername()}`\n );\n const token = await authenticate(state);\n if (token) state.setCookieValue(token);\n await determineDeploymentTypeAndDefaultRealmAndVersion(state);\n if (\n state.getCookieValue() &&\n !state.getBearerToken() &&\n (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY ||\n state.getDeploymentType() ===\n globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY)\n ) {\n const accessToken = await getAccessTokenForUser(state);\n if (accessToken) state.setBearerToken(accessToken);\n }\n }\n // incomplete or no credentials\n else {\n printMessage(`Incomplete or no credentials!`, 'error');\n return false;\n }\n if (\n state.getCookieValue() ||\n (state.getUseBearerTokenForAmApis() && state.getBearerToken())\n ) {\n // https://github.com/rockcarver/frodo-cli/issues/102\n printMessage(\n `Connected to ${state.getHost()} [${\n state.getRealm() ? state.getRealm() : 'root'\n }] as ${await getLoggedInSubject(state)}`,\n 'info'\n );\n debugMessage(`AuthenticateOps.getTokens: end with tokens`);\n return true;\n }\n } catch (error) {\n // regular error\n printMessage(error.message, 'error');\n // axios error am api\n printMessage(error.response?.data?.message, 'error');\n // axios error am oauth2 api\n printMessage(error.response?.data?.error_description, 'error');\n // axios error data\n debugMessage(error.response?.data);\n // stack trace\n debugMessage(error.stack || new Error().stack);\n }\n debugMessage(`AuthenticateOps.getTokens: end without tokens`);\n return false;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ops/AuthenticateOps.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,iBAAiB,CAAC;AAQpC,OAAO,EAAE,MAAM,EAAwB,MAAM,WAAW,CAAC;AAKzD,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,KAAK,EAAE,KAAK,CAAC;gBACD,KAAK,EAAE,KAAK;IAIxB;;;OAGG;IACG,+BAA+B,CACnC,IAAI,GAAE,MAAkB,EACxB,KAAK,GAAE,MAAkB,GACxB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIzB;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,UAAQ;CAGnC;AAmaD;;;;GAIG;AACH,wBAAsB,+BAA+B,CAAC,EACpD,IAAgB,EAChB,KAAiB,EACjB,KAAK,GACN,EAAE;IACD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;CACd,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4BzB;AAuDD;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,EAC9B,gBAAwB,EACxB,KAAK,GACN,EAAE;IACD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,KAAK,CAAC;CACd,GAAG,OAAO,CAAC,OAAO,CAAC,CA4HnB","file":"AuthenticateOps.d.ts","sourcesContent":["import url from 'url';\nimport { createHash, randomBytes } from 'crypto';\nimport readlineSync from 'readline-sync';\nimport { encodeBase64Url } from '../api/utils/Base64';\nimport State from '../shared/State';\nimport * as globalConfig from '../storage/StaticStorage';\nimport { getServerInfo, getServerVersionInfo } from '../api/ServerInfoApi';\nimport { step } from '../api/AuthenticateApi';\nimport { accessToken, authorize } from '../api/OAuth2OIDCApi';\nimport { getConnectionProfile } from './ConnectionProfileOps';\nimport { v4 } from 'uuid';\nimport { parseUrl } from '../api/utils/ApiUtils';\nimport { JwkRsa, createSignedJwtToken } from './JoseOps';\nimport { getServiceAccount } from './cloud/ServiceAccountOps';\nimport { isValidUrl } from './utils/OpsUtils';\nimport { debugMessage, printMessage, verboseMessage } from './utils/Console';\n\nexport default class AuthenticateOps {\n state: State;\n constructor(state: State) {\n this.state = state;\n }\n\n /**\n * Get access token for service account\n * @returns {string | null} Access token or null\n */\n async getAccessTokenForServiceAccount(\n saId: string = undefined,\n saJwk: JwkRsa = undefined\n ): Promise<string | null> {\n return getAccessTokenForServiceAccount({ saId, saJwk, state: this.state });\n }\n\n /**\n * Get tokens\n * @param {boolean} forceLoginAsUser true to force login as user even if a service account is available (default: false)\n * @returns {Promise<boolean>} true if tokens were successfully obtained, false otherwise\n */\n getTokens(forceLoginAsUser = false) {\n return getTokens({ forceLoginAsUser, state: this.state });\n }\n}\n\nconst adminClientPassword = 'doesnotmatter';\nconst redirectUrlTemplate = '/platform/appAuthHelperRedirect.html';\n\nconst cloudIdmAdminScopes = 'openid fr:idm:* fr:idc:esv:*';\nconst forgeopsIdmAdminScopes = 'openid fr:idm:*';\nconst serviceAccountScopes = 'fr:am:* fr:idm:* fr:idc:esv:*';\n\nlet adminClientId = 'idmAdminClient';\n\n/**\n * Helper function to get cookie name\n * @param {State} state library state\n * @returns {string} cookie name\n */\nasync function determineCookieName(state: State) {\n const data = await getServerInfo({ state });\n debugMessage(\n `AuthenticateOps.determineCookieName: cookieName=${data.cookieName}`\n );\n return data.cookieName;\n}\n\n/**\n * Helper function to determine if this is a setup mfa prompt in the ID Cloud tenant admin login journey\n * @param {Object} payload response from the previous authentication journey step\n * @param {State} state library state\n * @returns {Object} an object indicating if 2fa is required and the original payload\n */\nfunction checkAndHandle2FA(payload, state: State) {\n debugMessage(`AuthenticateOps.checkAndHandle2FA: start`);\n // let skippable = false;\n if ('callbacks' in payload) {\n for (const callback of payload.callbacks) {\n // select localAuthentication if Admin Federation is enabled\n if (callback.type === 'SelectIdPCallback') {\n debugMessage(\n `AuthenticateOps.checkAndHandle2FA: Admin federation enabled. Allowed providers:`\n );\n let localAuth = false;\n for (const value of callback.output[0].value) {\n debugMessage(`${value.provider}`);\n if (value.provider === 'localAuthentication') {\n localAuth = true;\n }\n }\n if (localAuth) {\n debugMessage(`local auth allowed`);\n callback.input[0].value = 'localAuthentication';\n } else {\n debugMessage(`local auth NOT allowed`);\n }\n }\n if (callback.type === 'HiddenValueCallback') {\n if (callback.input[0].value.includes('skip')) {\n // skippable = true;\n callback.input[0].value = 'Skip';\n // debugMessage(\n // `AuthenticateOps.checkAndHandle2FA: end [need2fa=true, skippable=true]`\n // );\n // return {\n // nextStep: true,\n // need2fa: true,\n // factor: 'None',\n // supported: true,\n // payload,\n // };\n }\n if (callback.input[0].value.includes('webAuthnOutcome')) {\n // webauthn!!!\n debugMessage(\n `AuthenticateOps.checkAndHandle2FA: end [need2fa=true, unsupported factor: webauthn]`\n );\n return {\n nextStep: false,\n need2fa: true,\n factor: 'WebAuthN',\n supported: false,\n payload,\n };\n }\n }\n if (callback.type === 'NameCallback') {\n if (callback.output[0].value.includes('code')) {\n // skippable = false;\n debugMessage(\n `AuthenticateOps.checkAndHandle2FA: need2fa=true, skippable=false`\n );\n printMessage('2FA is enabled and required for this user...');\n const code = readlineSync.question(`${callback.output[0].value}: `);\n callback.input[0].value = code;\n debugMessage(\n `AuthenticateOps.checkAndHandle2FA: end [need2fa=true, skippable=false, factor=Code]`\n );\n return {\n nextStep: true,\n need2fa: true,\n factor: 'Code',\n supported: true,\n payload,\n };\n } else {\n // answer callback\n callback.input[0].value = state.getUsername();\n }\n }\n if (callback.type === 'PasswordCallback') {\n // answer callback\n callback.input[0].value = state.getPassword();\n }\n }\n debugMessage(`AuthenticateOps.checkAndHandle2FA: end [need2fa=false]`);\n // debugMessage(payload);\n return {\n nextStep: true,\n need2fa: false,\n factor: 'None',\n supported: true,\n payload,\n };\n }\n debugMessage(`AuthenticateOps.checkAndHandle2FA: end [need2fa=false]`);\n // debugMessage(payload);\n return {\n nextStep: false,\n need2fa: false,\n factor: 'None',\n supported: true,\n payload,\n };\n}\n\n/**\n * Helper function to set the default realm by deployment type\n * @param {State} state library state\n */\nfunction determineDefaultRealm(state: State) {\n if (\n !state.getRealm() ||\n state.getRealm() === globalConfig.DEFAULT_REALM_KEY\n ) {\n state.setRealm(\n globalConfig.DEPLOYMENT_TYPE_REALM_MAP[state.getDeploymentType()]\n );\n }\n}\n\n/**\n * Helper function to determine the deployment type\n * @param {State} state library state\n * @returns {Promise<string>} deployment type\n */\nasync function determineDeploymentType(state: State): Promise<string> {\n const cookieValue = state.getCookieValue();\n\n // if we are using a service account, we know it's cloud\n if (state.getUseBearerTokenForAmApis())\n return globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;\n\n const fidcClientId = 'idmAdminClient';\n const forgeopsClientId = 'idm-admin-ui';\n\n const verifier = encodeBase64Url(randomBytes(32));\n const challenge = encodeBase64Url(\n createHash('sha256').update(verifier).digest()\n );\n const challengeMethod = 'S256';\n const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);\n\n const config = {\n maxRedirects: 0,\n headers: {\n [state.getCookieName()]: state.getCookieValue(),\n },\n };\n let bodyFormData = `redirect_uri=${redirectURL}&scope=${cloudIdmAdminScopes}&response_type=code&client_id=${fidcClientId}&csrf=${cookieValue}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;\n\n let deploymentType = globalConfig.CLASSIC_DEPLOYMENT_TYPE_KEY;\n try {\n await authorize({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config,\n state,\n });\n } catch (e) {\n // debugMessage(e.response);\n if (\n e.response?.status === 302 &&\n e.response.headers?.location?.indexOf('code=') > -1\n ) {\n verboseMessage(`ForgeRock Identity Cloud`['brightCyan'] + ` detected.`);\n deploymentType = globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;\n } else {\n try {\n bodyFormData = `redirect_uri=${redirectURL}&scope=${forgeopsIdmAdminScopes}&response_type=code&client_id=${forgeopsClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;\n await authorize({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config,\n state,\n });\n } catch (ex) {\n if (\n ex.response?.status === 302 &&\n ex.response.headers?.location?.indexOf('code=') > -1\n ) {\n adminClientId = forgeopsClientId;\n verboseMessage(`ForgeOps deployment`['brightCyan'] + ` detected.`);\n deploymentType = globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY;\n } else {\n verboseMessage(`Classic deployment`['brightCyan'] + ` detected.`);\n }\n }\n }\n }\n return deploymentType;\n}\n\n/**\n * Helper function to extract the semantic version string from a version info object\n * @param {Object} versionInfo version info object\n * @returns {String} semantic version\n */\nfunction getSemanticVersion(versionInfo) {\n if ('version' in versionInfo) {\n const versionString = versionInfo.version;\n const rx = /([\\d]\\.[\\d]\\.[\\d](\\.[\\d])*)/g;\n const version = versionString.match(rx);\n return version[0];\n }\n throw new Error('Cannot extract semantic version from version info object.');\n}\n\n/**\n * Helper function to authenticate and obtain and store session cookie\n * @param {State} state library state\n * @returns {string} Session token or null\n */\nasync function authenticate(state: State): Promise<string> {\n debugMessage(`AuthenticateOps.authenticate: start`);\n const config = {\n headers: {\n 'X-OpenAM-Username': state.getUsername(),\n 'X-OpenAM-Password': state.getPassword(),\n },\n };\n let response = await step({ body: {}, config, state });\n\n let skip2FA = null;\n let steps = 0;\n const maxSteps = 3;\n do {\n skip2FA = checkAndHandle2FA(response, state);\n\n // throw exception if 2fa required but factor not supported by frodo (e.g. WebAuthN)\n if (!skip2FA.supported) {\n throw new Error(`Unsupported 2FA factor: ${skip2FA.factor}`);\n }\n\n if (skip2FA.nextStep) {\n steps++;\n response = await step({ body: skip2FA.payload, state });\n }\n\n if ('tokenId' in response) {\n debugMessage(\n `AuthenticateOps.authenticate: end [tokenId=${response['tokenId']}]`\n );\n return response['tokenId'] as string;\n }\n } while (skip2FA.nextStep && steps < maxSteps);\n debugMessage(`AuthenticateOps.authenticate: end [no session]`);\n return null;\n}\n\n/**\n * Helper function to obtain an oauth2 authorization code\n * @param {string} redirectURL oauth2 redirect uri\n * @param {string} codeChallenge PKCE code challenge\n * @param {string} codeChallengeMethod PKCE code challenge method\n * @param {State} state library state\n * @returns {string} oauth2 authorization code or null\n */\nasync function getAuthCode(\n redirectURL: string,\n codeChallenge: string,\n codeChallengeMethod: string,\n state: State\n) {\n try {\n const bodyFormData = `redirect_uri=${redirectURL}&scope=${\n state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY\n ? cloudIdmAdminScopes\n : forgeopsIdmAdminScopes\n }&response_type=code&client_id=${adminClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${codeChallenge}&code_challenge_method=${codeChallengeMethod}`;\n const config = {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n maxRedirects: 0,\n };\n let response = undefined;\n try {\n response = await authorize({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config,\n state,\n });\n } catch (error) {\n response = error.response;\n }\n if (response.status < 200 || response.status > 399) {\n printMessage('error getting auth code', 'error');\n printMessage(\n 'likely cause: mismatched parameters with OAuth client config',\n 'error'\n );\n return null;\n }\n const redirectLocationURL = response.headers?.location;\n const queryObject = url.parse(redirectLocationURL, true).query;\n if ('code' in queryObject) {\n return queryObject.code;\n }\n printMessage('auth code not found', 'error');\n return null;\n } catch (error) {\n printMessage(`error getting auth code - ${error.message}`, 'error');\n printMessage(error.response?.data, 'error');\n debugMessage(error.stack);\n return null;\n }\n}\n\n/**\n * Helper function to obtain oauth2 access token\n * @param {State} state library state\n * @returns {Promise<string | null>} access token or null\n */\nasync function getAccessTokenForUser(state: State): Promise<string | null> {\n debugMessage(`AuthenticateOps.getAccessTokenForUser: start`);\n try {\n const verifier = encodeBase64Url(randomBytes(32));\n const challenge = encodeBase64Url(\n createHash('sha256').update(verifier).digest()\n );\n const challengeMethod = 'S256';\n const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);\n const authCode = await getAuthCode(\n redirectURL,\n challenge,\n challengeMethod,\n state\n );\n if (authCode == null) {\n printMessage('error getting auth code', 'error');\n return null;\n }\n let response = null;\n if (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY) {\n const config = {\n auth: {\n username: adminClientId,\n password: adminClientPassword,\n },\n };\n const bodyFormData = `redirect_uri=${redirectURL}&grant_type=authorization_code&code=${authCode}&code_verifier=${verifier}`;\n response = await accessToken({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config,\n state,\n });\n } else {\n const bodyFormData = `client_id=${adminClientId}&redirect_uri=${redirectURL}&grant_type=authorization_code&code=${authCode}&code_verifier=${verifier}`;\n response = await accessToken({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config: {},\n state,\n });\n }\n if ('access_token' in response.data) {\n debugMessage(`AuthenticateOps.getAccessTokenForUser: end with token`);\n return response.data.access_token;\n }\n printMessage('No access token in response.', 'error');\n } catch (error) {\n debugMessage(`Error getting access token for user: ${error}`);\n debugMessage(error.response?.data);\n }\n debugMessage(`AuthenticateOps.getAccessTokenForUser: end without token`);\n return null;\n}\n\nfunction createPayload(serviceAccountId: string, host: string) {\n const u = parseUrl(host);\n const aud = `${u.origin}:${\n u.port ? u.port : u.protocol === 'https' ? '443' : '80'\n }${u.pathname}/oauth2/access_token`;\n\n // Cross platform way of setting JWT expiry time 3 minutes in the future, expressed as number of seconds since EPOCH\n const exp = Math.floor(new Date().getTime() / 1000 + 180);\n\n // A unique ID for the JWT which is required when requesting the openid scope\n const jti = v4();\n\n const iss = serviceAccountId;\n const sub = serviceAccountId;\n\n // Create the payload for our bearer token\n const payload = { iss, sub, aud, exp, jti };\n\n return payload;\n}\n\n/**\n * Get access token for service account\n * @param {State} state library state\n * @returns {string | null} Access token or null\n */\nexport async function getAccessTokenForServiceAccount({\n saId = undefined,\n saJwk = undefined,\n state,\n}: {\n saId?: string;\n saJwk?: JwkRsa;\n state: State;\n}): Promise<string | null> {\n saId = saId ? saId : state.getServiceAccountId();\n saJwk = saJwk ? saJwk : state.getServiceAccountJwk();\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: start`);\n const payload = createPayload(saId, state.getHost());\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: payload:`);\n debugMessage(payload);\n const jwt = await createSignedJwtToken(payload, saJwk);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: jwt:`);\n debugMessage(jwt);\n const bodyFormData = `assertion=${jwt}&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=${serviceAccountScopes}`;\n const response = await accessToken({\n amBaseUrl: state.getHost(),\n data: bodyFormData,\n config: {},\n state,\n });\n if ('access_token' in response.data) {\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: token:`);\n debugMessage(response.data.access_token);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);\n return response.data.access_token;\n }\n debugMessage(\n `AuthenticateOps.getAccessTokenForServiceAccount: No access token in response.`\n );\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);\n return null;\n}\n\n/**\n * Helper function to determine deployment type, default realm, and version and update library state\n * @param state library state\n */\nasync function determineDeploymentTypeAndDefaultRealmAndVersion(\n state: State\n): Promise<void> {\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: start`\n );\n if (!state.getDeploymentType()) {\n state.setDeploymentType(await determineDeploymentType(state));\n }\n determineDefaultRealm(state);\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: realm=${state.getRealm()}, type=${state.getDeploymentType()}`\n );\n\n const versionInfo = await getServerVersionInfo({ state });\n\n // https://github.com/rockcarver/frodo-cli/issues/109\n debugMessage(`Full version: ${versionInfo.fullVersion}`);\n\n const version = await getSemanticVersion(versionInfo);\n state.setAmVersion(version);\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: end`\n );\n}\n\n/**\n * Get logged-in subject\n * @param {State} state library state\n * @returns {string} a string identifying subject type and id\n */\nasync function getLoggedInSubject(state: State): Promise<string> {\n let subjectString = `user ${state.getUsername()}`;\n if (state.getUseBearerTokenForAmApis()) {\n try {\n const name = (\n await getServiceAccount({\n serviceAccountId: state.getServiceAccountId(),\n state,\n })\n ).name;\n subjectString = `service account ${name} [${state.getServiceAccountId()}]`;\n } catch (error) {\n subjectString = `service account ${state.getServiceAccountId()}`;\n }\n }\n return subjectString;\n}\n\n/**\n * Get tokens\n * @param {boolean} forceLoginAsUser true to force login as user even if a service account is available (default: false)\n * @param {State} state library state\n * @returns {Promise<boolean>} true if tokens were successfully obtained, false otherwise\n */\nexport async function getTokens({\n forceLoginAsUser = false,\n state,\n}: {\n forceLoginAsUser?: boolean;\n state: State;\n}): Promise<boolean> {\n debugMessage(`AuthenticateOps.getTokens: start`);\n if (!state.getHost()) {\n printMessage(\n `No host specified and FRODO_HOST env variable not set!`,\n 'error'\n );\n return false;\n }\n try {\n // if username/password on cli are empty, try to read from connections.json\n if (\n state.getUsername() == null &&\n state.getPassword() == null &&\n !state.getServiceAccountId() &&\n !state.getServiceAccountJwk()\n ) {\n const conn = await getConnectionProfile({ state });\n if (conn) {\n state.setHost(conn.tenant);\n state.setUsername(conn.username);\n state.setPassword(conn.password);\n state.setAuthenticationService(conn.authenticationService);\n state.setAuthenticationHeaderOverrides(\n conn.authenticationHeaderOverrides\n );\n state.setServiceAccountId(conn.svcacctId);\n state.setServiceAccountJwk(conn.svcacctJwk);\n } else {\n return false;\n }\n }\n\n // if host is not a valid URL, try to locate a valid URL from connections.json\n if (!isValidUrl(state.getHost())) {\n const conn = await getConnectionProfile({ state });\n if (conn) {\n state.setHost(conn.tenant);\n } else {\n return false;\n }\n }\n\n // now that we have the full tenant URL we can lookup the cookie name\n state.setCookieName(await determineCookieName(state));\n\n // use service account to login?\n if (\n !forceLoginAsUser &&\n state.getServiceAccountId() &&\n state.getServiceAccountJwk()\n ) {\n debugMessage(\n `AuthenticateOps.getTokens: Authenticating with service account ${state.getServiceAccountId()}`\n );\n try {\n const token = await getAccessTokenForServiceAccount({ state });\n state.setBearerToken(token);\n state.setUseBearerTokenForAmApis(true);\n await determineDeploymentTypeAndDefaultRealmAndVersion(state);\n } catch (saErr) {\n debugMessage(saErr.response?.data || saErr);\n debugMessage(state);\n throw new Error(\n `Service account login error: ${\n saErr.response?.data?.error_description ||\n saErr.response?.data?.message ||\n saErr\n }`\n );\n }\n }\n // use user account to login\n else if (state.getUsername() && state.getPassword()) {\n debugMessage(\n `AuthenticateOps.getTokens: Authenticating with user account ${state.getUsername()}`\n );\n const token = await authenticate(state);\n if (token) state.setCookieValue(token);\n await determineDeploymentTypeAndDefaultRealmAndVersion(state);\n if (\n state.getCookieValue() &&\n !state.getBearerToken() &&\n (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY ||\n state.getDeploymentType() ===\n globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY)\n ) {\n const accessToken = await getAccessTokenForUser(state);\n if (accessToken) state.setBearerToken(accessToken);\n }\n }\n // incomplete or no credentials\n else {\n printMessage(`Incomplete or no credentials!`, 'error');\n return false;\n }\n if (\n state.getCookieValue() ||\n (state.getUseBearerTokenForAmApis() && state.getBearerToken())\n ) {\n // https://github.com/rockcarver/frodo-cli/issues/102\n printMessage(\n `Connected to ${state.getHost()} [${\n state.getRealm() ? state.getRealm() : 'root'\n }] as ${await getLoggedInSubject(state)}`,\n 'info'\n );\n debugMessage(`AuthenticateOps.getTokens: end with tokens`);\n return true;\n }\n } catch (error) {\n // regular error\n printMessage(error.message, 'error');\n // axios error am api\n printMessage(error.response?.data?.message, 'error');\n // axios error am oauth2 api\n printMessage(error.response?.data?.error_description, 'error');\n // axios error data\n debugMessage(error.response?.data);\n // stack trace\n debugMessage(error.stack || new Error().stack);\n }\n debugMessage(`AuthenticateOps.getTokens: end without tokens`);\n return false;\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import State from '../shared/State';
|
|
2
|
-
import { JourneyClassification, TreeExportResolverInterface } from './OpsTypes';
|
|
3
2
|
import { InnerNodeRefSkeletonInterface, NodeRefSkeletonInterface, NodeSkeleton, TreeSkeleton } from '../api/ApiTypes';
|
|
4
|
-
import { SingleTreeExportInterface, MultiTreeExportInterface, TreeDependencyMapInterface, TreeExportOptions, TreeImportOptions } from './OpsTypes';
|
|
3
|
+
import { JourneyClassification, TreeExportResolverInterface, SingleTreeExportInterface, MultiTreeExportInterface, TreeDependencyMapInterface, TreeExportOptions, TreeImportOptions } from './OpsTypes';
|
|
5
4
|
export default class JourneyOps {
|
|
6
5
|
state: State;
|
|
7
6
|
constructor(state: State);
|