@rockcarver/frodo-lib 0.18.2 → 0.18.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 CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.18.3] - 2023-01-27
11
+
12
+ ### Changed
13
+
14
+ - rockcarver/frodo-cli#192: Backend support for better error handling and reporting in frodo-cli
15
+
10
16
  ## [0.18.2] - 2023-01-25
11
17
 
12
18
  ### Added
@@ -1040,7 +1046,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1040
1046
  - Fixed problem with adding connection profiles
1041
1047
  - Miscellaneous bug fixes
1042
1048
 
1043
- [Unreleased]: https://github.com/rockcarver/frodo-lib/compare/v0.18.2...HEAD
1049
+ [Unreleased]: https://github.com/rockcarver/frodo-lib/compare/v0.18.3...HEAD
1050
+
1051
+ [0.18.3]: https://github.com/rockcarver/frodo-lib/compare/v0.18.2...v0.18.3
1044
1052
 
1045
1053
  [0.18.2]: https://github.com/rockcarver/frodo-lib/compare/v0.18.2-0...v0.18.2
1046
1054
 
@@ -127,18 +127,18 @@ function _exportDependencies() {
127
127
  if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {
128
128
  var scriptData = yield (0, _ScriptApi.getScript)(attrMapperScriptId);
129
129
  scriptData.script = (0, _ExportImportUtils.convertBase64TextToArray)(scriptData.script);
130
- // eslint-disable-next-line no-param-reassign
131
130
  fileData.script[attrMapperScriptId] = scriptData;
132
131
  }
133
132
  var idpAdapterScriptId = _lodash.default.get(providerData, ['identityProvider', 'advanced', 'idpAdapter', 'idpAdapterScript']);
134
133
  if (idpAdapterScriptId && idpAdapterScriptId !== '[Empty]') {
135
134
  var _scriptData = yield (0, _ScriptApi.getScript)(idpAdapterScriptId);
136
135
  _scriptData.script = (0, _ExportImportUtils.convertBase64TextToArray)(_scriptData.script);
137
- // eslint-disable-next-line no-param-reassign
138
136
  fileData.script[idpAdapterScriptId] = _scriptData;
139
137
  }
140
138
  var metaDataResponse = yield getProviderMetadata(providerData.entityId);
141
- // eslint-disable-next-line no-param-reassign
139
+ if (!metaDataResponse) {
140
+ throw new Error("Unable to obtain metadata from ".concat(getProviderMetadataUrl(providerData.entityId)));
141
+ }
142
142
  fileData.saml.metadata[providerData._id] = (0, _ExportImportUtils.convertBase64UrlTextToArray)((0, _Base.encodeBase64Url)(metaDataResponse));
143
143
  });
144
144
  return _exportDependencies.apply(this, arguments);
@@ -252,7 +252,11 @@ function _exportSaml2Provider() {
252
252
  var id = stub._id;
253
253
  var providerData = yield getProviderByLocationAndId(location, id);
254
254
  exportData.saml[stub.location][providerData._id] = providerData;
255
- yield exportDependencies(providerData, exportData);
255
+ try {
256
+ yield exportDependencies(providerData, exportData);
257
+ } catch (error) {
258
+ (0, _Console.printMessage)(error.message, 'error');
259
+ }
256
260
  (0, _Console.debugMessage)("Saml2Ops.exportSaml2Provider: end [entityId=".concat(entityId, "]"));
257
261
  return exportData;
258
262
  });
@@ -272,7 +276,11 @@ function _exportSaml2Providers() {
272
276
  var stubs = yield getSaml2ProviderStubs();
273
277
  for (var stub of stubs) {
274
278
  var providerData = yield getProviderByLocationAndId(stub.location, stub._id);
275
- yield exportDependencies(providerData, fileData);
279
+ try {
280
+ yield exportDependencies(providerData, fileData);
281
+ } catch (error) {
282
+ (0, _Console.printMessage)(error, 'error');
283
+ }
276
284
  fileData.saml[stub.location][providerData._id] = providerData;
277
285
  }
278
286
  return fileData;
@@ -1 +1 @@
1
- {"version":3,"file":"Saml2Ops.js","names":["roleMap","identityProvider","serviceProvider","attributeQueryProvider","xacmlPolicyEnforcementPoint","createSaml2ExportTemplate","meta","getMetadata","script","saml","hosted","remote","metadata","getSaml2ProviderStubs","result","getProviders","getProviderByLocationAndId","location","entityId64","_getProviderByLocationAndId","getProviderMetadataUrl","entityId","_getProviderMetadataUrl","getProviderMetadata","_getProviderMetadata","exportDependencies","providerData","fileData","attrMapperScriptId","_","get","scriptData","getScript","convertBase64TextToArray","idpAdapterScriptId","metaDataResponse","_id","convertBase64UrlTextToArray","encodeBase64Url","getSaml2ProviderStub","debugMessage","found","findProviders","resultCount","Error","getSaml2Provider","stub","id","deleteSaml2Provider","deleteProviderByLocationAndId","deleteSaml2Providers","providers","stubs","provider","push","length","exportSaml2Provider","exportData","exportSaml2Providers","importDependencies","convertTextArrayToBase64","putScript","getLocation","data","Saml2ProiderLocation","HOSTED","REMOTE","undefined","importSaml2Provider","importData","encode","metaData","convertTextArrayToBase64Url","createProvider","error","updateProvider","importSaml2Providers","myStatus","total","successes","warnings","failures","hostedIds","Object","keys","remoteIds","providerIds","concat","decodeBase64Url","includes","decode","importDependenciesErr","printMessage","response","createProviderErr","updateProviderError","message","deleteRawSaml2Provider","deleteRawProvider","deleteRawSaml2Providers","applicationList","getRawSaml2Providers","deleteApplicationPromises","forEach","item","deleteApplicationResult","Promise","all","_getRawProviders","getRawSaml2Provider","_getRawProvider","putRawSaml2Provider","entityData","_putRawProvider"],"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 deleteRawProvider,\n findProviders,\n getProviderByLocationAndId as _getProviderByLocationAndId,\n getProviderMetadata as _getProviderMetadata,\n getProviderMetadataUrl as _getProviderMetadataUrl,\n getRawProvider as _getRawProvider,\n getProviders,\n getRawProviders as _getRawProviders,\n putRawProvider as _putRawProvider,\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';\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(): Saml2ExportInterface {\n return {\n meta: getMetadata(),\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(): Promise<Saml2ProviderStub[]> {\n const { result } = await getProviders();\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: string,\n entityId64: string\n) {\n return _getProviderByLocationAndId(location, entityId64);\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(entityId: string): string {\n return _getProviderMetadataUrl(entityId);\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(entityId) {\n return _getProviderMetadata(entityId);\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(providerData, fileData) {\n const attrMapperScriptId = _.get(providerData, [\n 'identityProvider',\n 'assertionProcessing',\n 'attributeMapper',\n 'attributeMapperScript',\n ]);\n if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {\n const scriptData = await getScript(attrMapperScriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n // eslint-disable-next-line no-param-reassign\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(idpAdapterScriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n // eslint-disable-next-line no-param-reassign\n fileData.script[idpAdapterScriptId] = scriptData;\n }\n const metaDataResponse = await getProviderMetadata(providerData.entityId);\n // eslint-disable-next-line no-param-reassign\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: string\n): Promise<Saml2ProviderStub> {\n debugMessage(`Saml2Ops.getSaml2ProviderStub: start [entityId=${entityId}]`);\n const found = await findProviders(`entityId eq '${entityId}'`);\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: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.getSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId(location, id);\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: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await deleteProviderByLocationAndId(location, id);\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(): Promise<Saml2ProviderSkeleton[]> {\n debugMessage(`Saml2Ops.deleteSaml2Providers: start`);\n const providers: Saml2ProviderSkeleton[] = [];\n const stubs = await getSaml2ProviderStubs();\n for (const stub of stubs) {\n const provider = await deleteProviderByLocationAndId(\n stub.location,\n stub._id\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: string\n): Promise<Saml2ExportInterface> {\n debugMessage(`Saml2Ops.exportSaml2Provider: start [entityId=${entityId}]`);\n const exportData = createSaml2ExportTemplate();\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId(location, id);\n exportData.saml[stub.location][providerData._id] = providerData;\n await exportDependencies(providerData, exportData);\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(): Promise<Saml2ExportInterface> {\n const fileData = createSaml2ExportTemplate();\n const stubs = await getSaml2ProviderStubs();\n for (const stub of stubs) {\n const providerData = await getProviderByLocationAndId(\n stub.location,\n stub._id\n );\n await exportDependencies(providerData, fileData);\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(providerData, fileData) {\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);\n await putScript(attrMapperScriptId, scriptData);\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);\n await putScript(idpAdapterScriptId, scriptData);\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: string,\n importData: Saml2ExportInterface\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, importData);\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);\n } catch (error) {\n await updateProvider(location, providerData);\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: Saml2ExportInterface\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, importData);\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);\n myStatus.successes += 1;\n } catch (createProviderErr) {\n try {\n await updateProvider(location, providerData);\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\n// Contributions using legacy APIs. Need to investigate if those will be deprecated in the future\n\n/**\n * Deletes entity provider\n * @param {string} entityId The entity id for the entity to be deleted\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function deleteRawSaml2Provider(\n entityId: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const response = await deleteRawProvider(entityId);\n debugMessage(`Saml2Ops.deleteSaml2Provider: end [entityId=${entityId}]`);\n return response;\n}\n\n/**\n * Deletes all entity providers.\n */\nexport async function deleteRawSaml2Providers(): Promise<\n Saml2ProviderSkeleton[]\n> {\n const applicationList = (await getRawSaml2Providers()).result;\n const deleteApplicationPromises = [];\n applicationList.forEach((item) => {\n printMessage(`Deleting Application ${item._id}`, 'error');\n deleteApplicationPromises.push(deleteRawProvider(item._id));\n });\n const deleteApplicationResult = await Promise.all(deleteApplicationPromises);\n if (deleteApplicationResult.length == applicationList.length) {\n printMessage('SAML Entity cleanup done', 'info');\n }\n return deleteApplicationResult;\n}\n\n/**\n * Retrieves all entity providers using the legacy federation enpoints.\n * @returns {Promise} a promise that resolves to an object containing an array of providers\n */\nexport async function getRawSaml2Providers() {\n return _getRawProviders();\n}\n\n/**\n * Retrieves all entity providers using the legacy federation enpoints.\n * @param {string} entityId The entity provider id\n * @returns {Promise} a promise that resolves to an object containing an array of providers\n */\nexport async function getRawSaml2Provider(entityId: string) {\n return _getRawProvider(entityId);\n}\n\n/**\n * Stores a new SAML2 entity provider\n * @param {string} entityId The entity provider id\n * @param {string} entityData The actual data containing the entity provider configuration\n * @returns {Promise} Promise that resolves to a provider object\n */\nexport async function putRawSaml2Provider(entityId: string, entityData) {\n return _putRawProvider(entityId, entityData);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AAKA;AAcA;AACA;AAOA;AACA;AACA;AAMmC;AAAA;AAAA;AAE5B,IAAMA,OAAO,GAAG;EACrBC,gBAAgB,EAAE,KAAK;EACvBC,eAAe,EAAE,IAAI;EACrBC,sBAAsB,EAAE,WAAW;EACnCC,2BAA2B,EAAE;AAC/B,CAAC;;AAED;AAAA;AACO,SAASC,yBAAyB,GAAyB;EAChE,OAAO;IACLC,IAAI,EAAE,IAAAC,8BAAW,GAAE;IACnBC,MAAM,EAAE,CAAC,CAAC;IACVC,IAAI,EAAE;MACJC,MAAM,EAAE,CAAC,CAAC;MACVC,MAAM,EAAE,CAAC,CAAC;MACVC,QAAQ,EAAE,CAAC;IACb;EACF,CAAC;AACH;;AAEA;AACA;AACA;AACA;AAHA,SAIsBC,qBAAqB;EAAA;AAAA;AAK3C;AACA;AACA;AACA;AACA;AACA;AALA;EAAA,2CALO,aAAqE;IAC1E,IAAM;MAAEC;IAAO,CAAC,SAAS,IAAAC,sBAAY,GAAE;IACvC,OAAOD,MAAM;EACf,CAAC;EAAA;AAAA;AAAA,SAQqBE,0BAA0B;EAAA;AAAA;AAOhD;AACA;AACA;AACA;AACA;AAJA;EAAA,iDAPO,WACLC,QAAgB,EAChBC,UAAkB,EAClB;IACA,OAAO,IAAAC,oCAA2B,EAACF,QAAQ,EAAEC,UAAU,CAAC;EAC1D,CAAC;EAAA;AAAA;AAOM,SAASE,sBAAsB,CAACC,QAAgB,EAAU;EAC/D,OAAO,IAAAC,gCAAuB,EAACD,QAAQ,CAAC;AAC1C;;AAEA;AACA;AACA;AACA;AACA;AAJA,SAKsBE,mBAAmB;EAAA;AAAA;AAIzC;AACA;AACA;AACA;AACA;AAJA;EAAA,0CAJO,WAAmCF,QAAQ,EAAE;IAClD,OAAO,IAAAG,6BAAoB,EAACH,QAAQ,CAAC;EACvC,CAAC;EAAA;AAAA;AAAA,SAOcI,kBAAkB;EAAA;AAAA;AAgCjC;AACA;AACA;AACA;AACA;AAJA;EAAA,wCAhCA,WAAkCC,YAAY,EAAEC,QAAQ,EAAE;IACxD,IAAMC,kBAAkB,GAAGC,eAAC,CAACC,GAAG,CAACJ,YAAY,EAAE,CAC7C,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,CACxB,CAAC;IACF,IAAIE,kBAAkB,IAAIA,kBAAkB,KAAK,SAAS,EAAE;MAC1D,IAAMG,UAAU,SAAS,IAAAC,oBAAS,EAACJ,kBAAkB,CAAC;MACtDG,UAAU,CAACvB,MAAM,GAAG,IAAAyB,2CAAwB,EAACF,UAAU,CAACvB,MAAM,CAAC;MAC/D;MACAmB,QAAQ,CAACnB,MAAM,CAACoB,kBAAkB,CAAC,GAAGG,UAAU;IAClD;IACA,IAAMG,kBAAkB,GAAGL,eAAC,CAACC,GAAG,CAACJ,YAAY,EAAE,CAC7C,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,kBAAkB,CACnB,CAAC;IACF,IAAIQ,kBAAkB,IAAIA,kBAAkB,KAAK,SAAS,EAAE;MAC1D,IAAMH,WAAU,SAAS,IAAAC,oBAAS,EAACE,kBAAkB,CAAC;MACtDH,WAAU,CAACvB,MAAM,GAAG,IAAAyB,2CAAwB,EAACF,WAAU,CAACvB,MAAM,CAAC;MAC/D;MACAmB,QAAQ,CAACnB,MAAM,CAAC0B,kBAAkB,CAAC,GAAGH,WAAU;IAClD;IACA,IAAMI,gBAAgB,SAASZ,mBAAmB,CAACG,YAAY,CAACL,QAAQ,CAAC;IACzE;IACAM,QAAQ,CAAClB,IAAI,CAACG,QAAQ,CAACc,YAAY,CAACU,GAAG,CAAC,GAAG,IAAAC,8CAA2B,EACpE,IAAAC,qBAAe,EAACH,gBAAgB,CAAC,CAClC;EACH,CAAC;EAAA;AAAA;AAAA,SAOqBI,oBAAoB;EAAA;AAAA;AAiB1C;AACA;AACA;AACA;AACA;AAJA;EAAA,0CAjBO,WACLlB,QAAgB,EACY;IAC5B,IAAAmB,qBAAY,2DAAmDnB,QAAQ,OAAI;IAC3E,IAAMoB,KAAK,SAAS,IAAAC,uBAAa,yBAAiBrB,QAAQ,OAAI;IAC9D,QAAQoB,KAAK,CAACE,WAAW;MACvB,KAAK,CAAC;QACJ,MAAM,IAAIC,KAAK,uCAAgCvB,QAAQ,aAAU;MACnE,KAAK,CAAC;QAAE;UACN,IAAAmB,qBAAY,yDAAiDnB,QAAQ,OAAI;UACzE,OAAOoB,KAAK,CAAC3B,MAAM,CAAC,CAAC,CAAC;QACxB;MACA;QACE,MAAM,IAAI8B,KAAK,8CAAuCvB,QAAQ,aAAU;IAAC;EAE/E,CAAC;EAAA;AAAA;AAAA,SAOqBwB,gBAAgB;EAAA;AAAA;AAYtC;AACA;AACA;AACA;AACA;AAJA;EAAA,sCAZO,WACLxB,QAAgB,EACgB;IAChC,IAAAmB,qBAAY,uDAA+CnB,QAAQ,OAAI;IACvE,IAAMyB,IAAI,SAASP,oBAAoB,CAAClB,QAAQ,CAAC;IACjD,IAAM;MAAEJ;IAAS,CAAC,GAAG6B,IAAI;IACzB,IAAMC,EAAE,GAAGD,IAAI,CAACV,GAAG;IACnB,IAAMV,YAAY,SAASV,0BAA0B,CAACC,QAAQ,EAAE8B,EAAE,CAAC;IACnE,IAAAP,qBAAY,qDAA6CnB,QAAQ,OAAI;IACrE,OAAOK,YAAY;EACrB,CAAC;EAAA;AAAA;AAAA,SAOqBsB,mBAAmB;EAAA;AAAA;AAYzC;AACA;AACA;AACA;AAHA;EAAA,yCAZO,WACL3B,QAAgB,EACgB;IAChC,IAAAmB,qBAAY,0DAAkDnB,QAAQ,OAAI;IAC1E,IAAMyB,IAAI,SAASP,oBAAoB,CAAClB,QAAQ,CAAC;IACjD,IAAM;MAAEJ;IAAS,CAAC,GAAG6B,IAAI;IACzB,IAAMC,EAAE,GAAGD,IAAI,CAACV,GAAG;IACnB,IAAMV,YAAY,SAAS,IAAAuB,uCAA6B,EAAChC,QAAQ,EAAE8B,EAAE,CAAC;IACtE,IAAAP,qBAAY,wDAAgDnB,QAAQ,OAAI;IACxE,OAAOK,YAAY;EACrB,CAAC;EAAA;AAAA;AAAA,SAMqBwB,oBAAoB;EAAA;AAAA;AAiB1C;AACA;AACA;AACA;AACA;AAJA;EAAA,0CAjBO,aAAwE;IAC7E,IAAAV,qBAAY,yCAAwC;IACpD,IAAMW,SAAkC,GAAG,EAAE;IAC7C,IAAMC,KAAK,SAASvC,qBAAqB,EAAE;IAC3C,KAAK,IAAMiC,IAAI,IAAIM,KAAK,EAAE;MACxB,IAAMC,QAAQ,SAAS,IAAAJ,uCAA6B,EAClDH,IAAI,CAAC7B,QAAQ,EACb6B,IAAI,CAACV,GAAG,CACT;MACDe,SAAS,CAACG,IAAI,CAACD,QAAQ,CAAC;IAC1B;IACA,IAAAb,qBAAY,wDACqCW,SAAS,CAACI,MAAM,iBAChE;IACD,OAAOJ,SAAS;EAClB,CAAC;EAAA;AAAA;AAAA,SAOqBK,mBAAmB;EAAA;AAAA;AAezC;AACA;AACA;AACA;AAHA;EAAA,yCAfO,WACLnC,QAAgB,EACe;IAC/B,IAAAmB,qBAAY,0DAAkDnB,QAAQ,OAAI;IAC1E,IAAMoC,UAAU,GAAGpD,yBAAyB,EAAE;IAC9C,IAAMyC,IAAI,SAASP,oBAAoB,CAAClB,QAAQ,CAAC;IACjD,IAAM;MAAEJ;IAAS,CAAC,GAAG6B,IAAI;IACzB,IAAMC,EAAE,GAAGD,IAAI,CAACV,GAAG;IACnB,IAAMV,YAAY,SAASV,0BAA0B,CAACC,QAAQ,EAAE8B,EAAE,CAAC;IACnEU,UAAU,CAAChD,IAAI,CAACqC,IAAI,CAAC7B,QAAQ,CAAC,CAACS,YAAY,CAACU,GAAG,CAAC,GAAGV,YAAY;IAC/D,MAAMD,kBAAkB,CAACC,YAAY,EAAE+B,UAAU,CAAC;IAClD,IAAAjB,qBAAY,wDAAgDnB,QAAQ,OAAI;IACxE,OAAOoC,UAAU;EACnB,CAAC;EAAA;AAAA;AAAA,SAMqBC,oBAAoB;EAAA;AAAA;AAc1C;AACA;AACA;AACA;AACA;AAJA;EAAA,0CAdO,aAAqE;IAC1E,IAAM/B,QAAQ,GAAGtB,yBAAyB,EAAE;IAC5C,IAAM+C,KAAK,SAASvC,qBAAqB,EAAE;IAC3C,KAAK,IAAMiC,IAAI,IAAIM,KAAK,EAAE;MACxB,IAAM1B,YAAY,SAASV,0BAA0B,CACnD8B,IAAI,CAAC7B,QAAQ,EACb6B,IAAI,CAACV,GAAG,CACT;MACD,MAAMX,kBAAkB,CAACC,YAAY,EAAEC,QAAQ,CAAC;MAChDA,QAAQ,CAAClB,IAAI,CAACqC,IAAI,CAAC7B,QAAQ,CAAC,CAACS,YAAY,CAACU,GAAG,CAAC,GAAGV,YAAY;IAC/D;IACA,OAAOC,QAAQ;EACjB,CAAC;EAAA;AAAA;AAAA,SAOcgC,kBAAkB;EAAA;AAAA;AAiCjC;AACA;AACA;AACA;AACA;AACA;AALA;EAAA,wCAjCA,WAAkCjC,YAAY,EAAEC,QAAQ,EAAE;IACxD,IAAAa,qBAAY,uCAAsC;IAClD,IAAMZ,kBAAkB,GAAGC,eAAC,CAACC,GAAG,CAACJ,YAAY,EAAE,CAC7C,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,CACxB,CAAC;IACF,IAAIE,kBAAkB,IAAIA,kBAAkB,KAAK,SAAS,EAAE;MAC1D,IAAAY,qBAAY,+DAC4CZ,kBAAkB,EACzE;MACD,IAAMG,UAAU,GAAGF,eAAC,CAACC,GAAG,CAACH,QAAQ,EAAE,CAAC,QAAQ,EAAEC,kBAAkB,CAAC,CAAC;MAClEG,UAAU,CAACvB,MAAM,GAAG,IAAAoD,2CAAwB,EAAC7B,UAAU,CAACvB,MAAM,CAAC;MAC/D,MAAM,IAAAqD,oBAAS,EAACjC,kBAAkB,EAAEG,UAAU,CAAC;IACjD;IACA,IAAMG,kBAAkB,GAAGL,eAAC,CAACC,GAAG,CAACJ,YAAY,EAAE,CAC7C,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,kBAAkB,CACnB,CAAC;IACF,IAAIQ,kBAAkB,IAAIA,kBAAkB,KAAK,SAAS,EAAE;MAC1D,IAAAM,qBAAY,0DACuCN,kBAAkB,EACpE;MACD,IAAMH,YAAU,GAAGF,eAAC,CAACC,GAAG,CAACH,QAAQ,EAAE,CAAC,QAAQ,EAAEO,kBAAkB,CAAC,CAAC;MAClEH,YAAU,CAACvB,MAAM,GAAG,IAAAoD,2CAAwB,EAAC7B,YAAU,CAACvB,MAAM,CAAC;MAC/D,MAAM,IAAAqD,oBAAS,EAAC3B,kBAAkB,EAAEH,YAAU,CAAC;IACjD;IACA,IAAAS,qBAAY,qCAAoC;EAClD,CAAC;EAAA;AAAA;AAQD,SAASsB,WAAW,CAClB5C,UAAkB,EAClB6C,IAA0B,EACJ;EACtB,IAAIA,IAAI,CAACtD,IAAI,CAACC,MAAM,CAACQ,UAAU,CAAC,EAAE;IAChC,OAAO8C,8BAAoB,CAACC,MAAM;EACpC;EACA,IAAIF,IAAI,CAACtD,IAAI,CAACE,MAAM,CAACO,UAAU,CAAC,EAAE;IAChC,OAAO8C,8BAAoB,CAACE,MAAM;EACpC;EACA,OAAOC,SAAS;AAClB;;AAEA;AACA;AACA;AACA;AACA;AAJA,SAKsBC,mBAAmB;EAAA;AAAA;AA+BzC;AACA;AACA;AACA;AAHA;EAAA,yCA/BO,WACL/C,QAAgB,EAChBgD,UAAgC,EACd;IAClB,IAAA7B,qBAAY,wCAAuC;IACnD,IAAMtB,UAAU,GAAG,IAAAoD,YAAM,EAACjD,QAAQ,EAAE,KAAK,CAAC;IAC1C,IAAMJ,QAAQ,GAAG6C,WAAW,CAAC5C,UAAU,EAAEmD,UAAU,CAAC;IACpD,IAAA7B,qBAAY,mDACgCnB,QAAQ,0BAAgBH,UAAU,wBAAcD,QAAQ,EACnG;IACD,IAAIA,QAAQ,EAAE;MACZ,IAAMS,YAAY,GAAG2C,UAAU,CAAC5D,IAAI,CAACQ,QAAQ,CAAC,CAACC,UAAU,CAAC;MAC1D,MAAMyC,kBAAkB,CAACjC,YAAY,EAAE2C,UAAU,CAAC;MAClD,IAAIE,QAAQ,GAAG,IAAI;MACnB,IAAItD,QAAQ,KAAK+C,8BAAoB,CAACE,MAAM,EAAE;QAC5CK,QAAQ,GAAG,IAAAC,8CAA2B,EACpCH,UAAU,CAAC5D,IAAI,CAACG,QAAQ,CAACM,UAAU,CAAC,CACrC;MACH;MACA,IAAI;QACF,MAAM,IAAAuD,wBAAc,EAACxD,QAAQ,EAAES,YAAY,EAAE6C,QAAQ,CAAC;MACxD,CAAC,CAAC,OAAOG,KAAK,EAAE;QACd,MAAM,IAAAC,wBAAc,EAAC1D,QAAQ,EAAES,YAAY,CAAC;MAC9C;IACF,CAAC,MAAM;MACL,MAAM,IAAIkB,KAAK,oBAAavB,QAAQ,gCAA6B;IACnE;IACA,IAAAmB,qBAAY,sCAAqC;IACjD,OAAO,IAAI;EACb,CAAC;EAAA;AAAA;AAAA,SAMqBoC,oBAAoB;EAAA;AAAA,EAmE1C;AAEA;AACA;AACA;AACA;AACA;AAJA;EAAA,0CArEO,WACLP,UAAgC,EACC;IACjC,IAAA7B,qBAAY,yCAAwC;IACpD,IAAMqC,QAAgC,GAAG;MACvCC,KAAK,EAAE,CAAC;MACRC,SAAS,EAAE,CAAC;MACZC,QAAQ,EAAE,CAAC;MACXC,QAAQ,EAAE;IACZ,CAAC;IACD,IAAI;MACF;MACA,IAAMC,SAAS,GAAGC,MAAM,CAACC,IAAI,CAACf,UAAU,CAAC5D,IAAI,CAACC,MAAM,CAAC;MACrD,IAAM2E,SAAS,GAAGF,MAAM,CAACC,IAAI,CAACf,UAAU,CAAC5D,IAAI,CAACE,MAAM,CAAC;MACrD,IAAM2E,WAAW,GAAGJ,SAAS,CAACK,MAAM,CAACF,SAAS,CAAC;MAC/CR,QAAQ,CAACC,KAAK,GAAGQ,WAAW,CAAC/B,MAAM;MACnC,KAAK,IAAMrC,UAAU,IAAIoE,WAAW,EAAE;QACpC,IAAA9C,qBAAY,oDACiC,IAAAgD,qBAAe,EAACtE,UAAU,CAAC,EACvE;QACD,IAAMD,QAAQ,GAAGiE,SAAS,CAACO,QAAQ,CAACvE,UAAU,CAAC,GAC3C8C,8BAAoB,CAACC,MAAM,GAC3BD,8BAAoB,CAACE,MAAM;QAC/B,IAAM7C,QAAQ,GAAG,IAAAqE,YAAM,EAACxE,UAAU,CAAC;QACnC,IAAMQ,YAAY,GAAG2C,UAAU,CAAC5D,IAAI,CAACQ,QAAQ,CAAC,CAACC,UAAU,CAAC;QAC1D,IAAI;UACF,MAAMyC,kBAAkB,CAACjC,YAAY,EAAE2C,UAAU,CAAC;QACpD,CAAC,CAAC,OAAOsB,qBAAqB,EAAE;UAC9Bd,QAAQ,CAACG,QAAQ,IAAI,CAAC;UACtB,IAAAY,qBAAY,iDAC8BvE,QAAQ,GAChD,MAAM,CACP;UACD,IAAAuE,qBAAY,EAACD,qBAAqB,CAACE,QAAQ,CAAC9B,IAAI,EAAE,OAAO,CAAC;QAC5D;QACA,IAAIQ,QAAQ,GAAG,IAAI;QACnB,IAAItD,QAAQ,KAAK+C,8BAAoB,CAACE,MAAM,EAAE;UAC5CK,QAAQ,GAAG,IAAAC,8CAA2B,EACpCH,UAAU,CAAC5D,IAAI,CAACG,QAAQ,CAACM,UAAU,CAAC,CACrC;QACH;QACA,IAAI;UACF,MAAM,IAAAuD,wBAAc,EAACxD,QAAQ,EAAES,YAAY,EAAE6C,QAAQ,CAAC;UACtDM,QAAQ,CAACE,SAAS,IAAI,CAAC;QACzB,CAAC,CAAC,OAAOe,iBAAiB,EAAE;UAC1B,IAAI;YACF,MAAM,IAAAnB,wBAAc,EAAC1D,QAAQ,EAAES,YAAY,CAAC;YAC5CmD,QAAQ,CAACE,SAAS,IAAI,CAAC;UACzB,CAAC,CAAC,OAAOgB,mBAAmB,EAAE;YAAA;YAC5BlB,QAAQ,CAACI,QAAQ,IAAI,CAAC;YACtB,IAAAW,qBAAY,uCACoBvE,QAAQ,eAAK0E,mBAAmB,CAACC,OAAO,GACtE,OAAO,CACR;YACD,IAAAJ,qBAAY,2BAACG,mBAAmB,CAACF,QAAQ,0DAA5B,sBAA8B9B,IAAI,EAAE,OAAO,CAAC;UAC3D;QACF;MACF;MACAc,QAAQ,CAACmB,OAAO,aAAMnB,QAAQ,CAACE,SAAS,cAAIF,QAAQ,CAACC,KAAK,yBAAsB;IAClF,CAAC,CAAC,OAAOJ,KAAK,EAAE;MACdG,QAAQ,CAACI,QAAQ,IAAI,CAAC;MACtB,IAAAW,qBAAY,wCAAgClB,KAAK,CAACsB,OAAO,GAAI,OAAO,CAAC;IACvE;IACA,IAAAxD,qBAAY,uCAAsC;IAClD,OAAOqC,QAAQ;EACjB,CAAC;EAAA;AAAA;AAAA,SASqBoB,sBAAsB;EAAA;AAAA;AAS5C;AACA;AACA;AAFA;EAAA,4CATO,WACL5E,QAAgB,EACgB;IAChC,IAAAmB,qBAAY,0DAAkDnB,QAAQ,OAAI;IAC1E,IAAMwE,QAAQ,SAAS,IAAAK,2BAAiB,EAAC7E,QAAQ,CAAC;IAClD,IAAAmB,qBAAY,wDAAgDnB,QAAQ,OAAI;IACxE,OAAOwE,QAAQ;EACjB,CAAC;EAAA;AAAA;AAAA,SAKqBM,uBAAuB;EAAA;AAAA;AAgB7C;AACA;AACA;AACA;AAHA;EAAA,6CAhBO,aAEL;IACA,IAAMC,eAAe,GAAG,OAAOC,oBAAoB,EAAE,EAAEvF,MAAM;IAC7D,IAAMwF,yBAAyB,GAAG,EAAE;IACpCF,eAAe,CAACG,OAAO,CAAEC,IAAI,IAAK;MAChC,IAAAZ,qBAAY,iCAAyBY,IAAI,CAACpE,GAAG,GAAI,OAAO,CAAC;MACzDkE,yBAAyB,CAAChD,IAAI,CAAC,IAAA4C,2BAAiB,EAACM,IAAI,CAACpE,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC;IACF,IAAMqE,uBAAuB,SAASC,OAAO,CAACC,GAAG,CAACL,yBAAyB,CAAC;IAC5E,IAAIG,uBAAuB,CAAClD,MAAM,IAAI6C,eAAe,CAAC7C,MAAM,EAAE;MAC5D,IAAAqC,qBAAY,EAAC,0BAA0B,EAAE,MAAM,CAAC;IAClD;IACA,OAAOa,uBAAuB;EAChC,CAAC;EAAA;AAAA;AAAA,SAMqBJ,oBAAoB;EAAA;AAAA;AAI1C;AACA;AACA;AACA;AACA;AAJA;EAAA,0CAJO,aAAsC;IAC3C,OAAO,IAAAO,yBAAgB,GAAE;EAC3B,CAAC;EAAA;AAAA;AAAA,SAOqBC,mBAAmB;EAAA;AAAA;AAIzC;AACA;AACA;AACA;AACA;AACA;AALA;EAAA,yCAJO,WAAmCxF,QAAgB,EAAE;IAC1D,OAAO,IAAAyF,wBAAe,EAACzF,QAAQ,CAAC;EAClC,CAAC;EAAA;AAAA;AAAA,SAQqB0F,mBAAmB;EAAA;AAAA;AAAA;EAAA,yCAAlC,WAAmC1F,QAAgB,EAAE2F,UAAU,EAAE;IACtE,OAAO,IAAAC,wBAAe,EAAC5F,QAAQ,EAAE2F,UAAU,CAAC;EAC9C,CAAC;EAAA;AAAA"}
1
+ {"version":3,"file":"Saml2Ops.js","names":["roleMap","identityProvider","serviceProvider","attributeQueryProvider","xacmlPolicyEnforcementPoint","createSaml2ExportTemplate","meta","getMetadata","script","saml","hosted","remote","metadata","getSaml2ProviderStubs","result","getProviders","getProviderByLocationAndId","location","entityId64","_getProviderByLocationAndId","getProviderMetadataUrl","entityId","_getProviderMetadataUrl","getProviderMetadata","_getProviderMetadata","exportDependencies","providerData","fileData","attrMapperScriptId","_","get","scriptData","getScript","convertBase64TextToArray","idpAdapterScriptId","metaDataResponse","Error","_id","convertBase64UrlTextToArray","encodeBase64Url","getSaml2ProviderStub","debugMessage","found","findProviders","resultCount","getSaml2Provider","stub","id","deleteSaml2Provider","deleteProviderByLocationAndId","deleteSaml2Providers","providers","stubs","provider","push","length","exportSaml2Provider","exportData","error","printMessage","message","exportSaml2Providers","importDependencies","convertTextArrayToBase64","putScript","getLocation","data","Saml2ProiderLocation","HOSTED","REMOTE","undefined","importSaml2Provider","importData","encode","metaData","convertTextArrayToBase64Url","createProvider","updateProvider","importSaml2Providers","myStatus","total","successes","warnings","failures","hostedIds","Object","keys","remoteIds","providerIds","concat","decodeBase64Url","includes","decode","importDependenciesErr","response","createProviderErr","updateProviderError","deleteRawSaml2Provider","deleteRawProvider","deleteRawSaml2Providers","applicationList","getRawSaml2Providers","deleteApplicationPromises","forEach","item","deleteApplicationResult","Promise","all","_getRawProviders","getRawSaml2Provider","_getRawProvider","putRawSaml2Provider","entityData","_putRawProvider"],"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 deleteRawProvider,\n findProviders,\n getProviderByLocationAndId as _getProviderByLocationAndId,\n getProviderMetadata as _getProviderMetadata,\n getProviderMetadataUrl as _getProviderMetadataUrl,\n getRawProvider as _getRawProvider,\n getProviders,\n getRawProviders as _getRawProviders,\n putRawProvider as _putRawProvider,\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';\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(): Saml2ExportInterface {\n return {\n meta: getMetadata(),\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(): Promise<Saml2ProviderStub[]> {\n const { result } = await getProviders();\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: string,\n entityId64: string\n) {\n return _getProviderByLocationAndId(location, entityId64);\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(entityId: string): string {\n return _getProviderMetadataUrl(entityId);\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(entityId) {\n return _getProviderMetadata(entityId);\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(providerData, fileData) {\n const attrMapperScriptId = _.get(providerData, [\n 'identityProvider',\n 'assertionProcessing',\n 'attributeMapper',\n 'attributeMapperScript',\n ]);\n if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {\n const scriptData = await getScript(attrMapperScriptId);\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(idpAdapterScriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n fileData.script[idpAdapterScriptId] = scriptData;\n }\n const metaDataResponse = await getProviderMetadata(providerData.entityId);\n if (!metaDataResponse) {\n throw new Error(\n `Unable to obtain metadata from ${getProviderMetadataUrl(\n providerData.entityId\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: string\n): Promise<Saml2ProviderStub> {\n debugMessage(`Saml2Ops.getSaml2ProviderStub: start [entityId=${entityId}]`);\n const found = await findProviders(`entityId eq '${entityId}'`);\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: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.getSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId(location, id);\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: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await deleteProviderByLocationAndId(location, id);\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(): Promise<Saml2ProviderSkeleton[]> {\n debugMessage(`Saml2Ops.deleteSaml2Providers: start`);\n const providers: Saml2ProviderSkeleton[] = [];\n const stubs = await getSaml2ProviderStubs();\n for (const stub of stubs) {\n const provider = await deleteProviderByLocationAndId(\n stub.location,\n stub._id\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: string\n): Promise<Saml2ExportInterface> {\n debugMessage(`Saml2Ops.exportSaml2Provider: start [entityId=${entityId}]`);\n const exportData = createSaml2ExportTemplate();\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId(location, id);\n exportData.saml[stub.location][providerData._id] = providerData;\n try {\n await exportDependencies(providerData, exportData);\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(): Promise<Saml2ExportInterface> {\n const fileData = createSaml2ExportTemplate();\n const stubs = await getSaml2ProviderStubs();\n for (const stub of stubs) {\n const providerData = await getProviderByLocationAndId(\n stub.location,\n stub._id\n );\n try {\n await exportDependencies(providerData, fileData);\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(providerData, fileData) {\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);\n await putScript(attrMapperScriptId, scriptData);\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);\n await putScript(idpAdapterScriptId, scriptData);\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: string,\n importData: Saml2ExportInterface\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, importData);\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);\n } catch (error) {\n await updateProvider(location, providerData);\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: Saml2ExportInterface\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, importData);\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);\n myStatus.successes += 1;\n } catch (createProviderErr) {\n try {\n await updateProvider(location, providerData);\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\n// Contributions using legacy APIs. Need to investigate if those will be deprecated in the future\n\n/**\n * Deletes entity provider\n * @param {string} entityId The entity id for the entity to be deleted\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function deleteRawSaml2Provider(\n entityId: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const response = await deleteRawProvider(entityId);\n debugMessage(`Saml2Ops.deleteSaml2Provider: end [entityId=${entityId}]`);\n return response;\n}\n\n/**\n * Deletes all entity providers.\n */\nexport async function deleteRawSaml2Providers(): Promise<\n Saml2ProviderSkeleton[]\n> {\n const applicationList = (await getRawSaml2Providers()).result;\n const deleteApplicationPromises = [];\n applicationList.forEach((item) => {\n printMessage(`Deleting Application ${item._id}`, 'error');\n deleteApplicationPromises.push(deleteRawProvider(item._id));\n });\n const deleteApplicationResult = await Promise.all(deleteApplicationPromises);\n if (deleteApplicationResult.length == applicationList.length) {\n printMessage('SAML Entity cleanup done', 'info');\n }\n return deleteApplicationResult;\n}\n\n/**\n * Retrieves all entity providers using the legacy federation enpoints.\n * @returns {Promise} a promise that resolves to an object containing an array of providers\n */\nexport async function getRawSaml2Providers() {\n return _getRawProviders();\n}\n\n/**\n * Retrieves all entity providers using the legacy federation enpoints.\n * @param {string} entityId The entity provider id\n * @returns {Promise} a promise that resolves to an object containing an array of providers\n */\nexport async function getRawSaml2Provider(entityId: string) {\n return _getRawProvider(entityId);\n}\n\n/**\n * Stores a new SAML2 entity provider\n * @param {string} entityId The entity provider id\n * @param {string} entityData The actual data containing the entity provider configuration\n * @returns {Promise} Promise that resolves to a provider object\n */\nexport async function putRawSaml2Provider(entityId: string, entityData) {\n return _putRawProvider(entityId, entityData);\n}\n"],"mappings":"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"}
@@ -75,18 +75,18 @@ async function exportDependencies(providerData, fileData) {
75
75
  if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {
76
76
  const scriptData = await getScript(attrMapperScriptId);
77
77
  scriptData.script = convertBase64TextToArray(scriptData.script);
78
- // eslint-disable-next-line no-param-reassign
79
78
  fileData.script[attrMapperScriptId] = scriptData;
80
79
  }
81
80
  const idpAdapterScriptId = _.get(providerData, ['identityProvider', 'advanced', 'idpAdapter', 'idpAdapterScript']);
82
81
  if (idpAdapterScriptId && idpAdapterScriptId !== '[Empty]') {
83
82
  const scriptData = await getScript(idpAdapterScriptId);
84
83
  scriptData.script = convertBase64TextToArray(scriptData.script);
85
- // eslint-disable-next-line no-param-reassign
86
84
  fileData.script[idpAdapterScriptId] = scriptData;
87
85
  }
88
86
  const metaDataResponse = await getProviderMetadata(providerData.entityId);
89
- // eslint-disable-next-line no-param-reassign
87
+ if (!metaDataResponse) {
88
+ throw new Error(`Unable to obtain metadata from ${getProviderMetadataUrl(providerData.entityId)}`);
89
+ }
90
90
  fileData.saml.metadata[providerData._id] = convertBase64UrlTextToArray(encodeBase64Url(metaDataResponse));
91
91
  }
92
92
 
@@ -176,7 +176,11 @@ export async function exportSaml2Provider(entityId) {
176
176
  const id = stub._id;
177
177
  const providerData = await getProviderByLocationAndId(location, id);
178
178
  exportData.saml[stub.location][providerData._id] = providerData;
179
- await exportDependencies(providerData, exportData);
179
+ try {
180
+ await exportDependencies(providerData, exportData);
181
+ } catch (error) {
182
+ printMessage(error.message, 'error');
183
+ }
180
184
  debugMessage(`Saml2Ops.exportSaml2Provider: end [entityId=${entityId}]`);
181
185
  return exportData;
182
186
  }
@@ -190,7 +194,11 @@ export async function exportSaml2Providers() {
190
194
  const stubs = await getSaml2ProviderStubs();
191
195
  for (const stub of stubs) {
192
196
  const providerData = await getProviderByLocationAndId(stub.location, stub._id);
193
- await exportDependencies(providerData, fileData);
197
+ try {
198
+ await exportDependencies(providerData, fileData);
199
+ } catch (error) {
200
+ printMessage(error, 'error');
201
+ }
194
202
  fileData.saml[stub.location][providerData._id] = providerData;
195
203
  }
196
204
  return fileData;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rockcarver/frodo-lib",
3
- "version": "0.18.2",
3
+ "version": "0.18.3",
4
4
  "type": "commonjs",
5
5
  "main": "./cjs/index.js",
6
6
  "module": "./esm/index.mjs",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ops/Saml2Ops.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAsBzB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAW1E,eAAO,MAAM,OAAO;;;;;CAKnB,CAAC;AAGF,wBAAgB,yBAAyB,IAAI,oBAAoB,CAUhE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAG1E;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,gBAGnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,KAAA,gBAEjD;AAuCD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAe7E;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAW/B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAY1E;AA2DD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,OAAO,CAAC,CA0BlB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CA+DjC;AAID;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAKhC;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CACtD,qBAAqB,EAAE,CACxB,CAYA;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,iBAEzC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,gBAEzD;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,KAAA,gBAErE","file":"Saml2Ops.d.ts","sourcesContent":["import _ from 'lodash';\nimport {\n Saml2ProiderLocation,\n Saml2ProviderSkeleton,\n Saml2ProviderStub,\n} from '../api/ApiTypes';\nimport {\n createProvider,\n updateProvider,\n deleteRawProvider,\n findProviders,\n getProviderByLocationAndId as _getProviderByLocationAndId,\n getProviderMetadata as _getProviderMetadata,\n getProviderMetadataUrl as _getProviderMetadataUrl,\n getRawProvider as _getRawProvider,\n getProviders,\n getRawProviders as _getRawProviders,\n putRawProvider as _putRawProvider,\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';\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(): Saml2ExportInterface {\n return {\n meta: getMetadata(),\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(): Promise<Saml2ProviderStub[]> {\n const { result } = await getProviders();\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: string,\n entityId64: string\n) {\n return _getProviderByLocationAndId(location, entityId64);\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(entityId: string): string {\n return _getProviderMetadataUrl(entityId);\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(entityId) {\n return _getProviderMetadata(entityId);\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(providerData, fileData) {\n const attrMapperScriptId = _.get(providerData, [\n 'identityProvider',\n 'assertionProcessing',\n 'attributeMapper',\n 'attributeMapperScript',\n ]);\n if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {\n const scriptData = await getScript(attrMapperScriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n // eslint-disable-next-line no-param-reassign\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(idpAdapterScriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n // eslint-disable-next-line no-param-reassign\n fileData.script[idpAdapterScriptId] = scriptData;\n }\n const metaDataResponse = await getProviderMetadata(providerData.entityId);\n // eslint-disable-next-line no-param-reassign\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: string\n): Promise<Saml2ProviderStub> {\n debugMessage(`Saml2Ops.getSaml2ProviderStub: start [entityId=${entityId}]`);\n const found = await findProviders(`entityId eq '${entityId}'`);\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: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.getSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId(location, id);\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: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await deleteProviderByLocationAndId(location, id);\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(): Promise<Saml2ProviderSkeleton[]> {\n debugMessage(`Saml2Ops.deleteSaml2Providers: start`);\n const providers: Saml2ProviderSkeleton[] = [];\n const stubs = await getSaml2ProviderStubs();\n for (const stub of stubs) {\n const provider = await deleteProviderByLocationAndId(\n stub.location,\n stub._id\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: string\n): Promise<Saml2ExportInterface> {\n debugMessage(`Saml2Ops.exportSaml2Provider: start [entityId=${entityId}]`);\n const exportData = createSaml2ExportTemplate();\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId(location, id);\n exportData.saml[stub.location][providerData._id] = providerData;\n await exportDependencies(providerData, exportData);\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(): Promise<Saml2ExportInterface> {\n const fileData = createSaml2ExportTemplate();\n const stubs = await getSaml2ProviderStubs();\n for (const stub of stubs) {\n const providerData = await getProviderByLocationAndId(\n stub.location,\n stub._id\n );\n await exportDependencies(providerData, fileData);\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(providerData, fileData) {\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);\n await putScript(attrMapperScriptId, scriptData);\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);\n await putScript(idpAdapterScriptId, scriptData);\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: string,\n importData: Saml2ExportInterface\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, importData);\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);\n } catch (error) {\n await updateProvider(location, providerData);\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: Saml2ExportInterface\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, importData);\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);\n myStatus.successes += 1;\n } catch (createProviderErr) {\n try {\n await updateProvider(location, providerData);\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\n// Contributions using legacy APIs. Need to investigate if those will be deprecated in the future\n\n/**\n * Deletes entity provider\n * @param {string} entityId The entity id for the entity to be deleted\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function deleteRawSaml2Provider(\n entityId: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const response = await deleteRawProvider(entityId);\n debugMessage(`Saml2Ops.deleteSaml2Provider: end [entityId=${entityId}]`);\n return response;\n}\n\n/**\n * Deletes all entity providers.\n */\nexport async function deleteRawSaml2Providers(): Promise<\n Saml2ProviderSkeleton[]\n> {\n const applicationList = (await getRawSaml2Providers()).result;\n const deleteApplicationPromises = [];\n applicationList.forEach((item) => {\n printMessage(`Deleting Application ${item._id}`, 'error');\n deleteApplicationPromises.push(deleteRawProvider(item._id));\n });\n const deleteApplicationResult = await Promise.all(deleteApplicationPromises);\n if (deleteApplicationResult.length == applicationList.length) {\n printMessage('SAML Entity cleanup done', 'info');\n }\n return deleteApplicationResult;\n}\n\n/**\n * Retrieves all entity providers using the legacy federation enpoints.\n * @returns {Promise} a promise that resolves to an object containing an array of providers\n */\nexport async function getRawSaml2Providers() {\n return _getRawProviders();\n}\n\n/**\n * Retrieves all entity providers using the legacy federation enpoints.\n * @param {string} entityId The entity provider id\n * @returns {Promise} a promise that resolves to an object containing an array of providers\n */\nexport async function getRawSaml2Provider(entityId: string) {\n return _getRawProvider(entityId);\n}\n\n/**\n * Stores a new SAML2 entity provider\n * @param {string} entityId The entity provider id\n * @param {string} entityData The actual data containing the entity provider configuration\n * @returns {Promise} Promise that resolves to a provider object\n */\nexport async function putRawSaml2Provider(entityId: string, entityData) {\n return _putRawProvider(entityId, entityData);\n}\n"]}
1
+ {"version":3,"sources":["../src/ops/Saml2Ops.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAsBzB,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAW1E,eAAO,MAAM,OAAO;;;;;CAKnB,CAAC;AAGF,wBAAgB,yBAAyB,IAAI,oBAAoB,CAUhE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAG1E;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,gBAGnB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,KAAA,gBAEjD;AA2CD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,iBAAiB,CAAC,CAa5B;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAQhC;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAe7E;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CAe/B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAgB1E;AA2DD;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,OAAO,CAAC,CA0BlB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,oBAAoB,GAC/B,OAAO,CAAC,sBAAsB,CAAC,CA+DjC;AAID;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,qBAAqB,CAAC,CAKhC;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CACtD,qBAAqB,EAAE,CACxB,CAYA;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,iBAEzC;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,gBAEzD;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,KAAA,gBAErE","file":"Saml2Ops.d.ts","sourcesContent":["import _ from 'lodash';\nimport {\n Saml2ProiderLocation,\n Saml2ProviderSkeleton,\n Saml2ProviderStub,\n} from '../api/ApiTypes';\nimport {\n createProvider,\n updateProvider,\n deleteRawProvider,\n findProviders,\n getProviderByLocationAndId as _getProviderByLocationAndId,\n getProviderMetadata as _getProviderMetadata,\n getProviderMetadataUrl as _getProviderMetadataUrl,\n getRawProvider as _getRawProvider,\n getProviders,\n getRawProviders as _getRawProviders,\n putRawProvider as _putRawProvider,\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';\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(): Saml2ExportInterface {\n return {\n meta: getMetadata(),\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(): Promise<Saml2ProviderStub[]> {\n const { result } = await getProviders();\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: string,\n entityId64: string\n) {\n return _getProviderByLocationAndId(location, entityId64);\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(entityId: string): string {\n return _getProviderMetadataUrl(entityId);\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(entityId) {\n return _getProviderMetadata(entityId);\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(providerData, fileData) {\n const attrMapperScriptId = _.get(providerData, [\n 'identityProvider',\n 'assertionProcessing',\n 'attributeMapper',\n 'attributeMapperScript',\n ]);\n if (attrMapperScriptId && attrMapperScriptId !== '[Empty]') {\n const scriptData = await getScript(attrMapperScriptId);\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(idpAdapterScriptId);\n scriptData.script = convertBase64TextToArray(scriptData.script);\n fileData.script[idpAdapterScriptId] = scriptData;\n }\n const metaDataResponse = await getProviderMetadata(providerData.entityId);\n if (!metaDataResponse) {\n throw new Error(\n `Unable to obtain metadata from ${getProviderMetadataUrl(\n providerData.entityId\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: string\n): Promise<Saml2ProviderStub> {\n debugMessage(`Saml2Ops.getSaml2ProviderStub: start [entityId=${entityId}]`);\n const found = await findProviders(`entityId eq '${entityId}'`);\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: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.getSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId(location, id);\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: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await deleteProviderByLocationAndId(location, id);\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(): Promise<Saml2ProviderSkeleton[]> {\n debugMessage(`Saml2Ops.deleteSaml2Providers: start`);\n const providers: Saml2ProviderSkeleton[] = [];\n const stubs = await getSaml2ProviderStubs();\n for (const stub of stubs) {\n const provider = await deleteProviderByLocationAndId(\n stub.location,\n stub._id\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: string\n): Promise<Saml2ExportInterface> {\n debugMessage(`Saml2Ops.exportSaml2Provider: start [entityId=${entityId}]`);\n const exportData = createSaml2ExportTemplate();\n const stub = await getSaml2ProviderStub(entityId);\n const { location } = stub;\n const id = stub._id;\n const providerData = await getProviderByLocationAndId(location, id);\n exportData.saml[stub.location][providerData._id] = providerData;\n try {\n await exportDependencies(providerData, exportData);\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(): Promise<Saml2ExportInterface> {\n const fileData = createSaml2ExportTemplate();\n const stubs = await getSaml2ProviderStubs();\n for (const stub of stubs) {\n const providerData = await getProviderByLocationAndId(\n stub.location,\n stub._id\n );\n try {\n await exportDependencies(providerData, fileData);\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(providerData, fileData) {\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);\n await putScript(attrMapperScriptId, scriptData);\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);\n await putScript(idpAdapterScriptId, scriptData);\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: string,\n importData: Saml2ExportInterface\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, importData);\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);\n } catch (error) {\n await updateProvider(location, providerData);\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: Saml2ExportInterface\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, importData);\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);\n myStatus.successes += 1;\n } catch (createProviderErr) {\n try {\n await updateProvider(location, providerData);\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\n// Contributions using legacy APIs. Need to investigate if those will be deprecated in the future\n\n/**\n * Deletes entity provider\n * @param {string} entityId The entity id for the entity to be deleted\n * @returns {Promise<Saml2ProviderSkeleton>} Promise resolving to a Saml2ExportInterface object.\n */\nexport async function deleteRawSaml2Provider(\n entityId: string\n): Promise<Saml2ProviderSkeleton> {\n debugMessage(`Saml2Ops.deleteSaml2Provider: start [entityId=${entityId}]`);\n const response = await deleteRawProvider(entityId);\n debugMessage(`Saml2Ops.deleteSaml2Provider: end [entityId=${entityId}]`);\n return response;\n}\n\n/**\n * Deletes all entity providers.\n */\nexport async function deleteRawSaml2Providers(): Promise<\n Saml2ProviderSkeleton[]\n> {\n const applicationList = (await getRawSaml2Providers()).result;\n const deleteApplicationPromises = [];\n applicationList.forEach((item) => {\n printMessage(`Deleting Application ${item._id}`, 'error');\n deleteApplicationPromises.push(deleteRawProvider(item._id));\n });\n const deleteApplicationResult = await Promise.all(deleteApplicationPromises);\n if (deleteApplicationResult.length == applicationList.length) {\n printMessage('SAML Entity cleanup done', 'info');\n }\n return deleteApplicationResult;\n}\n\n/**\n * Retrieves all entity providers using the legacy federation enpoints.\n * @returns {Promise} a promise that resolves to an object containing an array of providers\n */\nexport async function getRawSaml2Providers() {\n return _getRawProviders();\n}\n\n/**\n * Retrieves all entity providers using the legacy federation enpoints.\n * @param {string} entityId The entity provider id\n * @returns {Promise} a promise that resolves to an object containing an array of providers\n */\nexport async function getRawSaml2Provider(entityId: string) {\n return _getRawProvider(entityId);\n}\n\n/**\n * Stores a new SAML2 entity provider\n * @param {string} entityId The entity provider id\n * @param {string} entityData The actual data containing the entity provider configuration\n * @returns {Promise} Promise that resolves to a provider object\n */\nexport async function putRawSaml2Provider(entityId: string, entityData) {\n return _putRawProvider(entityId, entityData);\n}\n"]}