@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 +9 -1
- package/cjs/ops/Saml2Ops.js +13 -5
- package/cjs/ops/Saml2Ops.js.map +1 -1
- package/esm/ops/Saml2Ops.mjs +13 -5
- package/package.json +1 -1
- package/types/ops/Saml2Ops.d.ts.map +1 -1
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.
|
|
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
|
|
package/cjs/ops/Saml2Ops.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/cjs/ops/Saml2Ops.js.map
CHANGED
|
@@ -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":"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"}
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;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;AAoCjC;AACA;AACA;AACA;AACA;AAJA;EAAA,wCApCA,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/DmB,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/DmB,QAAQ,CAACnB,MAAM,CAAC0B,kBAAkB,CAAC,GAAGH,WAAU;IAClD;IACA,IAAMI,gBAAgB,SAASZ,mBAAmB,CAACG,YAAY,CAACL,QAAQ,CAAC;IACzE,IAAI,CAACc,gBAAgB,EAAE;MACrB,MAAM,IAAIC,KAAK,0CACqBhB,sBAAsB,CACtDM,YAAY,CAACL,QAAQ,CACtB,EACF;IACH;IACAM,QAAQ,CAAClB,IAAI,CAACG,QAAQ,CAACc,YAAY,CAACW,GAAG,CAAC,GAAG,IAAAC,8CAA2B,EACpE,IAAAC,qBAAe,EAACJ,gBAAgB,CAAC,CAClC;EACH,CAAC;EAAA;AAAA;AAAA,SAOqBK,oBAAoB;EAAA;AAAA;AAiB1C;AACA;AACA;AACA;AACA;AAJA;EAAA,0CAjBO,WACLnB,QAAgB,EACY;IAC5B,IAAAoB,qBAAY,2DAAmDpB,QAAQ,OAAI;IAC3E,IAAMqB,KAAK,SAAS,IAAAC,uBAAa,yBAAiBtB,QAAQ,OAAI;IAC9D,QAAQqB,KAAK,CAACE,WAAW;MACvB,KAAK,CAAC;QACJ,MAAM,IAAIR,KAAK,uCAAgCf,QAAQ,aAAU;MACnE,KAAK,CAAC;QAAE;UACN,IAAAoB,qBAAY,yDAAiDpB,QAAQ,OAAI;UACzE,OAAOqB,KAAK,CAAC5B,MAAM,CAAC,CAAC,CAAC;QACxB;MACA;QACE,MAAM,IAAIsB,KAAK,8CAAuCf,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,IAAAoB,qBAAY,uDAA+CpB,QAAQ,OAAI;IACvE,IAAMyB,IAAI,SAASN,oBAAoB,CAACnB,QAAQ,CAAC;IACjD,IAAM;MAAEJ;IAAS,CAAC,GAAG6B,IAAI;IACzB,IAAMC,EAAE,GAAGD,IAAI,CAACT,GAAG;IACnB,IAAMX,YAAY,SAASV,0BAA0B,CAACC,QAAQ,EAAE8B,EAAE,CAAC;IACnE,IAAAN,qBAAY,qDAA6CpB,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,IAAAoB,qBAAY,0DAAkDpB,QAAQ,OAAI;IAC1E,IAAMyB,IAAI,SAASN,oBAAoB,CAACnB,QAAQ,CAAC;IACjD,IAAM;MAAEJ;IAAS,CAAC,GAAG6B,IAAI;IACzB,IAAMC,EAAE,GAAGD,IAAI,CAACT,GAAG;IACnB,IAAMX,YAAY,SAAS,IAAAuB,uCAA6B,EAAChC,QAAQ,EAAE8B,EAAE,CAAC;IACtE,IAAAN,qBAAY,wDAAgDpB,QAAQ,OAAI;IACxE,OAAOK,YAAY;EACrB,CAAC;EAAA;AAAA;AAAA,SAMqBwB,oBAAoB;EAAA;AAAA;AAiB1C;AACA;AACA;AACA;AACA;AAJA;EAAA,0CAjBO,aAAwE;IAC7E,IAAAT,qBAAY,yCAAwC;IACpD,IAAMU,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,CAACT,GAAG,CACT;MACDc,SAAS,CAACG,IAAI,CAACD,QAAQ,CAAC;IAC1B;IACA,IAAAZ,qBAAY,wDACqCU,SAAS,CAACI,MAAM,iBAChE;IACD,OAAOJ,SAAS;EAClB,CAAC;EAAA;AAAA;AAAA,SAOqBK,mBAAmB;EAAA;AAAA;AAmBzC;AACA;AACA;AACA;AAHA;EAAA,yCAnBO,WACLnC,QAAgB,EACe;IAC/B,IAAAoB,qBAAY,0DAAkDpB,QAAQ,OAAI;IAC1E,IAAMoC,UAAU,GAAGpD,yBAAyB,EAAE;IAC9C,IAAMyC,IAAI,SAASN,oBAAoB,CAACnB,QAAQ,CAAC;IACjD,IAAM;MAAEJ;IAAS,CAAC,GAAG6B,IAAI;IACzB,IAAMC,EAAE,GAAGD,IAAI,CAACT,GAAG;IACnB,IAAMX,YAAY,SAASV,0BAA0B,CAACC,QAAQ,EAAE8B,EAAE,CAAC;IACnEU,UAAU,CAAChD,IAAI,CAACqC,IAAI,CAAC7B,QAAQ,CAAC,CAACS,YAAY,CAACW,GAAG,CAAC,GAAGX,YAAY;IAC/D,IAAI;MACF,MAAMD,kBAAkB,CAACC,YAAY,EAAE+B,UAAU,CAAC;IACpD,CAAC,CAAC,OAAOC,KAAK,EAAE;MACd,IAAAC,qBAAY,EAACD,KAAK,CAACE,OAAO,EAAE,OAAO,CAAC;IACtC;IACA,IAAAnB,qBAAY,wDAAgDpB,QAAQ,OAAI;IACxE,OAAOoC,UAAU;EACnB,CAAC;EAAA;AAAA;AAAA,SAMqBI,oBAAoB;EAAA;AAAA;AAkB1C;AACA;AACA;AACA;AACA;AAJA;EAAA,0CAlBO,aAAqE;IAC1E,IAAMlC,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,CAACT,GAAG,CACT;MACD,IAAI;QACF,MAAMZ,kBAAkB,CAACC,YAAY,EAAEC,QAAQ,CAAC;MAClD,CAAC,CAAC,OAAO+B,KAAK,EAAE;QACd,IAAAC,qBAAY,EAACD,KAAK,EAAE,OAAO,CAAC;MAC9B;MACA/B,QAAQ,CAAClB,IAAI,CAACqC,IAAI,CAAC7B,QAAQ,CAAC,CAACS,YAAY,CAACW,GAAG,CAAC,GAAGX,YAAY;IAC/D;IACA,OAAOC,QAAQ;EACjB,CAAC;EAAA;AAAA;AAAA,SAOcmC,kBAAkB;EAAA;AAAA;AAiCjC;AACA;AACA;AACA;AACA;AACA;AALA;EAAA,wCAjCA,WAAkCpC,YAAY,EAAEC,QAAQ,EAAE;IACxD,IAAAc,qBAAY,uCAAsC;IAClD,IAAMb,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,IAAAa,qBAAY,+DAC4Cb,kBAAkB,EACzE;MACD,IAAMG,UAAU,GAAGF,eAAC,CAACC,GAAG,CAACH,QAAQ,EAAE,CAAC,QAAQ,EAAEC,kBAAkB,CAAC,CAAC;MAClEG,UAAU,CAACvB,MAAM,GAAG,IAAAuD,2CAAwB,EAAChC,UAAU,CAACvB,MAAM,CAAC;MAC/D,MAAM,IAAAwD,oBAAS,EAACpC,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,IAAAO,qBAAY,0DACuCP,kBAAkB,EACpE;MACD,IAAMH,YAAU,GAAGF,eAAC,CAACC,GAAG,CAACH,QAAQ,EAAE,CAAC,QAAQ,EAAEO,kBAAkB,CAAC,CAAC;MAClEH,YAAU,CAACvB,MAAM,GAAG,IAAAuD,2CAAwB,EAAChC,YAAU,CAACvB,MAAM,CAAC;MAC/D,MAAM,IAAAwD,oBAAS,EAAC9B,kBAAkB,EAAEH,YAAU,CAAC;IACjD;IACA,IAAAU,qBAAY,qCAAoC;EAClD,CAAC;EAAA;AAAA;AAQD,SAASwB,WAAW,CAClB/C,UAAkB,EAClBgD,IAA0B,EACJ;EACtB,IAAIA,IAAI,CAACzD,IAAI,CAACC,MAAM,CAACQ,UAAU,CAAC,EAAE;IAChC,OAAOiD,8BAAoB,CAACC,MAAM;EACpC;EACA,IAAIF,IAAI,CAACzD,IAAI,CAACE,MAAM,CAACO,UAAU,CAAC,EAAE;IAChC,OAAOiD,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,WACLlD,QAAgB,EAChBmD,UAAgC,EACd;IAClB,IAAA/B,qBAAY,wCAAuC;IACnD,IAAMvB,UAAU,GAAG,IAAAuD,YAAM,EAACpD,QAAQ,EAAE,KAAK,CAAC;IAC1C,IAAMJ,QAAQ,GAAGgD,WAAW,CAAC/C,UAAU,EAAEsD,UAAU,CAAC;IACpD,IAAA/B,qBAAY,mDACgCpB,QAAQ,0BAAgBH,UAAU,wBAAcD,QAAQ,EACnG;IACD,IAAIA,QAAQ,EAAE;MACZ,IAAMS,YAAY,GAAG8C,UAAU,CAAC/D,IAAI,CAACQ,QAAQ,CAAC,CAACC,UAAU,CAAC;MAC1D,MAAM4C,kBAAkB,CAACpC,YAAY,EAAE8C,UAAU,CAAC;MAClD,IAAIE,QAAQ,GAAG,IAAI;MACnB,IAAIzD,QAAQ,KAAKkD,8BAAoB,CAACE,MAAM,EAAE;QAC5CK,QAAQ,GAAG,IAAAC,8CAA2B,EACpCH,UAAU,CAAC/D,IAAI,CAACG,QAAQ,CAACM,UAAU,CAAC,CACrC;MACH;MACA,IAAI;QACF,MAAM,IAAA0D,wBAAc,EAAC3D,QAAQ,EAAES,YAAY,EAAEgD,QAAQ,CAAC;MACxD,CAAC,CAAC,OAAOhB,KAAK,EAAE;QACd,MAAM,IAAAmB,wBAAc,EAAC5D,QAAQ,EAAES,YAAY,CAAC;MAC9C;IACF,CAAC,MAAM;MACL,MAAM,IAAIU,KAAK,oBAAaf,QAAQ,gCAA6B;IACnE;IACA,IAAAoB,qBAAY,sCAAqC;IACjD,OAAO,IAAI;EACb,CAAC;EAAA;AAAA;AAAA,SAMqBqC,oBAAoB;EAAA;AAAA,EAmE1C;AAEA;AACA;AACA;AACA;AACA;AAJA;EAAA,0CArEO,WACLN,UAAgC,EACC;IACjC,IAAA/B,qBAAY,yCAAwC;IACpD,IAAMsC,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,CAACd,UAAU,CAAC/D,IAAI,CAACC,MAAM,CAAC;MACrD,IAAM6E,SAAS,GAAGF,MAAM,CAACC,IAAI,CAACd,UAAU,CAAC/D,IAAI,CAACE,MAAM,CAAC;MACrD,IAAM6E,WAAW,GAAGJ,SAAS,CAACK,MAAM,CAACF,SAAS,CAAC;MAC/CR,QAAQ,CAACC,KAAK,GAAGQ,WAAW,CAACjC,MAAM;MACnC,KAAK,IAAMrC,UAAU,IAAIsE,WAAW,EAAE;QACpC,IAAA/C,qBAAY,oDACiC,IAAAiD,qBAAe,EAACxE,UAAU,CAAC,EACvE;QACD,IAAMD,QAAQ,GAAGmE,SAAS,CAACO,QAAQ,CAACzE,UAAU,CAAC,GAC3CiD,8BAAoB,CAACC,MAAM,GAC3BD,8BAAoB,CAACE,MAAM;QAC/B,IAAMhD,QAAQ,GAAG,IAAAuE,YAAM,EAAC1E,UAAU,CAAC;QACnC,IAAMQ,YAAY,GAAG8C,UAAU,CAAC/D,IAAI,CAACQ,QAAQ,CAAC,CAACC,UAAU,CAAC;QAC1D,IAAI;UACF,MAAM4C,kBAAkB,CAACpC,YAAY,EAAE8C,UAAU,CAAC;QACpD,CAAC,CAAC,OAAOqB,qBAAqB,EAAE;UAC9Bd,QAAQ,CAACG,QAAQ,IAAI,CAAC;UACtB,IAAAvB,qBAAY,iDAC8BtC,QAAQ,GAChD,MAAM,CACP;UACD,IAAAsC,qBAAY,EAACkC,qBAAqB,CAACC,QAAQ,CAAC5B,IAAI,EAAE,OAAO,CAAC;QAC5D;QACA,IAAIQ,QAAQ,GAAG,IAAI;QACnB,IAAIzD,QAAQ,KAAKkD,8BAAoB,CAACE,MAAM,EAAE;UAC5CK,QAAQ,GAAG,IAAAC,8CAA2B,EACpCH,UAAU,CAAC/D,IAAI,CAACG,QAAQ,CAACM,UAAU,CAAC,CACrC;QACH;QACA,IAAI;UACF,MAAM,IAAA0D,wBAAc,EAAC3D,QAAQ,EAAES,YAAY,EAAEgD,QAAQ,CAAC;UACtDK,QAAQ,CAACE,SAAS,IAAI,CAAC;QACzB,CAAC,CAAC,OAAOc,iBAAiB,EAAE;UAC1B,IAAI;YACF,MAAM,IAAAlB,wBAAc,EAAC5D,QAAQ,EAAES,YAAY,CAAC;YAC5CqD,QAAQ,CAACE,SAAS,IAAI,CAAC;UACzB,CAAC,CAAC,OAAOe,mBAAmB,EAAE;YAAA;YAC5BjB,QAAQ,CAACI,QAAQ,IAAI,CAAC;YACtB,IAAAxB,qBAAY,uCACoBtC,QAAQ,eAAK2E,mBAAmB,CAACpC,OAAO,GACtE,OAAO,CACR;YACD,IAAAD,qBAAY,2BAACqC,mBAAmB,CAACF,QAAQ,0DAA5B,sBAA8B5B,IAAI,EAAE,OAAO,CAAC;UAC3D;QACF;MACF;MACAa,QAAQ,CAACnB,OAAO,aAAMmB,QAAQ,CAACE,SAAS,cAAIF,QAAQ,CAACC,KAAK,yBAAsB;IAClF,CAAC,CAAC,OAAOtB,KAAK,EAAE;MACdqB,QAAQ,CAACI,QAAQ,IAAI,CAAC;MACtB,IAAAxB,qBAAY,wCAAgCD,KAAK,CAACE,OAAO,GAAI,OAAO,CAAC;IACvE;IACA,IAAAnB,qBAAY,uCAAsC;IAClD,OAAOsC,QAAQ;EACjB,CAAC;EAAA;AAAA;AAAA,SASqBkB,sBAAsB;EAAA;AAAA;AAS5C;AACA;AACA;AAFA;EAAA,4CATO,WACL5E,QAAgB,EACgB;IAChC,IAAAoB,qBAAY,0DAAkDpB,QAAQ,OAAI;IAC1E,IAAMyE,QAAQ,SAAS,IAAAI,2BAAiB,EAAC7E,QAAQ,CAAC;IAClD,IAAAoB,qBAAY,wDAAgDpB,QAAQ,OAAI;IACxE,OAAOyE,QAAQ;EACjB,CAAC;EAAA;AAAA;AAAA,SAKqBK,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,IAAA7C,qBAAY,iCAAyB6C,IAAI,CAACnE,GAAG,GAAI,OAAO,CAAC;MACzDiE,yBAAyB,CAAChD,IAAI,CAAC,IAAA4C,2BAAiB,EAACM,IAAI,CAACnE,GAAG,CAAC,CAAC;IAC7D,CAAC,CAAC;IACF,IAAMoE,uBAAuB,SAASC,OAAO,CAACC,GAAG,CAACL,yBAAyB,CAAC;IAC5E,IAAIG,uBAAuB,CAAClD,MAAM,IAAI6C,eAAe,CAAC7C,MAAM,EAAE;MAC5D,IAAAI,qBAAY,EAAC,0BAA0B,EAAE,MAAM,CAAC;IAClD;IACA,OAAO8C,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"}
|
package/esm/ops/Saml2Ops.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 +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"]}
|