@rockcarver/frodo-lib 0.18.4 → 0.18.7
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 +21 -1
- package/cjs/api/BaseApi.js +3 -1
- package/cjs/api/BaseApi.js.map +1 -1
- package/cjs/ops/AuthenticateOps.js +5 -4
- package/cjs/ops/AuthenticateOps.js.map +1 -1
- package/cjs/ops/ConnectionProfileOps.js +3 -1
- package/cjs/ops/ConnectionProfileOps.js.map +1 -1
- package/cjs/ops/IdpOps.js +3 -1
- package/cjs/ops/IdpOps.js.map +1 -1
- package/cjs/ops/InfoOps.js +3 -1
- package/cjs/ops/InfoOps.js.map +1 -1
- package/cjs/ops/JourneyOps.js +4 -4
- package/cjs/ops/JourneyOps.js.map +1 -1
- package/cjs/ops/ServiceOps.js +3 -1
- package/cjs/ops/ServiceOps.js.map +1 -1
- package/cjs/ops/utils/ExportImportUtils.js +1 -3
- package/cjs/ops/utils/ExportImportUtils.js.map +1 -1
- package/cjs/shared/State.js +3 -1
- package/cjs/shared/State.js.map +1 -1
- package/esm/ops/AuthenticateOps.mjs +5 -4
- package/package.json +2 -2
- package/types/ops/AuthenticateOps.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceOps.js","names":["createServiceExportTemplate","meta","service","getListOfServices","globalConfig","debugMessage","services","_getListOfServices","result","getFullServices","serviceList","fullServiceData","Promise","all","map","listItem","nextDescendents","getService","_id","getServiceDescendents","error","response","status","data","message","printMessage","filter","putFullService","serviceId","clean","_rev","enabled","deleteFullService","putService","length","descendent","type","_type","descendentId","undefined","putServiceNextDescendent","putFullServices","serviceEntries","results","id","push","detail","JSON","stringify","serviceNextDescendentData","nextDescendent","deleteServiceNextDescendent","deleteService","deleteFullServices","serviceListItem","exportService","exportData","exportServices","importService","importData","serviceData","importServices","Object","entries"],"sources":["ops/ServiceOps.ts"],"sourcesContent":["import { AmServiceSkeleton } from '../api/ApiTypes';\nimport {\n deleteService,\n deleteServiceNextDescendent,\n getService,\n getListOfServices as _getListOfServices,\n getServiceDescendents,\n putService,\n putServiceNextDescendent,\n ServiceNextDescendent,\n} from '../api/ServiceApi';\nimport { ServiceExportInterface } from './OpsTypes';\nimport { debugMessage, printMessage } from './utils/Console';\n\ninterface FullService extends AmServiceSkeleton {\n nextDescendents?: ServiceNextDescendent[];\n}\n\n/**\n * Create an empty service export template\n * @returns {SingleTreeExportInterface} an empty service export template\n */\nexport function createServiceExportTemplate(): ServiceExportInterface {\n return {\n meta: {},\n service: {},\n } as ServiceExportInterface;\n}\n\n/**\n * Get list of services\n * @param {boolean} globalConfig true if the list of global services is requested, false otherwise. Default: false.\n */\nexport async function getListOfServices(globalConfig = false) {\n debugMessage(`ServiceOps.getListOfServices: start`);\n const services = (await _getListOfServices(globalConfig)).result;\n debugMessage(`ServiceOps.getListOfServices: end`);\n return services;\n}\n\n/**\n * Get all services including their descendents.\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns Promise resolving to an array of services with their descendants\n */\nexport async function getFullServices(\n globalConfig = false\n): Promise<FullService[]> {\n debugMessage(\n `ServiceOps.getFullServices: start, globalConfig=${globalConfig}`\n );\n const serviceList = (await _getListOfServices(globalConfig)).result;\n\n const fullServiceData = await Promise.all(\n serviceList.map(async (listItem) => {\n try {\n const [service, nextDescendents] = await Promise.all([\n getService(listItem._id, globalConfig),\n getServiceDescendents(listItem._id, globalConfig),\n ]);\n\n return {\n ...service,\n nextDescendents,\n };\n } catch (error) {\n if (\n !(\n error.response?.status === 403 &&\n error.response?.data?.message ===\n 'This operation is not available in ForgeRock Identity Cloud.'\n )\n ) {\n const message = error.response?.data?.message;\n printMessage(\n `Unable to retrieve data for ${listItem._id} with error: ${message}`,\n 'error'\n );\n }\n }\n })\n );\n\n debugMessage(`ServiceOps.getFullServices: end`);\n return fullServiceData.filter((data) => !!data); // make sure to filter out any undefined objects\n}\n\n/**\n * Saves a service using the provide id and data, including descendents\n * @param {string} serviceId the service id / name\n * @param {string} fullServiceData service object including descendants\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns promise resolving to a service object\n */\nasync function putFullService(\n serviceId: string,\n fullServiceData: FullService,\n clean: boolean,\n globalConfig = false\n): Promise<AmServiceSkeleton> {\n debugMessage(\n `ServiceOps.putFullService: start, serviceId=${serviceId}, globalConfig=${globalConfig}`\n );\n const nextDescendents = fullServiceData.nextDescendents;\n\n delete fullServiceData.nextDescendents;\n delete fullServiceData._rev;\n delete fullServiceData.enabled;\n\n if (clean) {\n try {\n debugMessage(`ServiceOps.putFullService: clean`);\n await deleteFullService(serviceId, globalConfig);\n } catch (error) {\n if (\n !(\n error.response?.status === 404 &&\n error.response?.data?.message === 'Not Found'\n )\n ) {\n const message = error.response?.data?.message;\n printMessage(\n `Error deleting service '${serviceId}' before import: ${message}`,\n 'error'\n );\n }\n }\n }\n\n // create service first\n const result = await putService(serviceId, fullServiceData, globalConfig);\n\n // return fast if no next descendents supplied\n if (nextDescendents.length === 0) {\n debugMessage(`ServiceOps.putFullService: end (w/o descendents)`);\n return result;\n }\n\n // now create next descendents\n await Promise.all(\n nextDescendents.map(async (descendent) => {\n const type = descendent._type._id;\n const descendentId = descendent._id;\n debugMessage(`ServiceOps.putFullService: descendentId=${descendentId}`);\n let result = undefined;\n try {\n result = await putServiceNextDescendent(\n serviceId,\n type,\n descendentId,\n descendent,\n globalConfig\n );\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(\n `Put descendent '${descendentId}' of service '${serviceId}': ${message}`,\n 'error'\n );\n }\n return result;\n })\n );\n debugMessage(`ServiceOps.putFullService: end (w/ descendents)`);\n}\n\n/**\n * Saves multiple services using the serviceEntries which contain both id and data with descendants\n * @param {[string, FullService][]} serviceEntries The services to add\n * @param {boolean} clean Indicates whether to remove possible existing services first\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns {Promise<AmService[]>} promise resolving to an array of service objects\n */\nasync function putFullServices(\n serviceEntries: [string, FullService][],\n clean: boolean,\n globalConfig = false\n): Promise<AmServiceSkeleton[]> {\n debugMessage(\n `ServiceOps.putFullServices: start, globalConfig=${globalConfig}`\n );\n const results: AmServiceSkeleton[] = [];\n for (const [id, data] of serviceEntries) {\n try {\n const result = await putFullService(id, data, clean, globalConfig);\n results.push(result);\n printMessage(`Imported: ${id}`, 'info');\n } catch (error) {\n const message = error.response?.data?.message;\n const detail = error.response?.data?.detail;\n printMessage(`Import service '${id}': ${message}`, 'error');\n if (detail) {\n printMessage(`Details: ${JSON.stringify(detail)}`, 'error');\n }\n }\n }\n debugMessage(`ServiceOps.putFullServices: end`);\n return results;\n}\n\n/**\n * Deletes the specified service\n * @param {string} serviceId The service to delete\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n */\nexport async function deleteFullService(\n serviceId: string,\n globalConfig = false\n) {\n debugMessage(\n `ServiceOps.deleteFullService: start, globalConfig=${globalConfig}`\n );\n const serviceNextDescendentData = await getServiceDescendents(\n serviceId,\n globalConfig\n );\n\n await Promise.all(\n serviceNextDescendentData.map((nextDescendent) =>\n deleteServiceNextDescendent(\n serviceId,\n nextDescendent._type._id,\n nextDescendent._id,\n globalConfig\n )\n )\n );\n\n await deleteService(serviceId, globalConfig);\n debugMessage(`ServiceOps.deleteFullService: end`);\n}\n\n/**\n * Deletes all services\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n */\nexport async function deleteFullServices(globalConfig = false) {\n debugMessage(\n `ServiceOps.deleteFullServices: start, globalConfig=${globalConfig}`\n );\n try {\n const serviceList = (await _getListOfServices(globalConfig)).result;\n\n await Promise.all(\n serviceList.map(async (serviceListItem) => {\n try {\n await deleteFullService(serviceListItem._id, globalConfig);\n } catch (error) {\n if (\n !(\n error.response?.status === 403 &&\n error.response?.data?.message ===\n 'This operation is not available in ForgeRock Identity Cloud.'\n )\n ) {\n const message = error.response?.data?.message;\n printMessage(\n `Delete service '${serviceListItem._id}': ${message}`,\n 'error'\n );\n }\n }\n })\n );\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(`Delete services: ${message}`, 'error');\n }\n debugMessage(`ServiceOps.deleteFullServices: end`);\n}\n\n/**\n * Export service. The response can be saved to file as is.\n * @param serviceId service id/name\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns {Promise<ServiceExportInterface>} Promise resolving to a ServiceExportInterface object.\n */\nexport async function exportService(\n serviceId: string,\n globalConfig = false\n): Promise<ServiceExportInterface> {\n debugMessage(`ServiceOps.exportService: start, globalConfig=${globalConfig}`);\n const exportData = createServiceExportTemplate();\n try {\n const service = await getService(serviceId, globalConfig);\n service.nextDescendents = await getServiceDescendents(\n serviceId,\n globalConfig\n );\n exportData.service[serviceId] = service;\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(`Export service '${serviceId}': ${message}`, 'error');\n }\n debugMessage(`ServiceOps.exportService: end`);\n return exportData;\n}\n\n/**\n * Export all services\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n */\nexport async function exportServices(\n globalConfig = false\n): Promise<ServiceExportInterface> {\n debugMessage(\n `ServiceOps.exportServices: start, globalConfig=${globalConfig}`\n );\n const exportData = createServiceExportTemplate();\n try {\n const services = await getFullServices(globalConfig);\n for (const service of services) {\n exportData.service[service._type._id] = service;\n }\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(`Export servics: ${message}`, 'error');\n }\n debugMessage(`ServiceOps.exportServices: end`);\n return exportData;\n}\n\n/**\n * Imports a single service using a reference to the service and a file to read the data from. Optionally clean (remove) an existing service first\n * @param {string} serviceId The service id/name to add\n * @param {ServiceExportInterface} importData The service configuration export data to import\n * @param {boolean} clean Indicates whether to remove a possible existing service with the same id first.\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns Promise resolving when the service has been imported\n */\nexport async function importService(\n serviceId: string,\n importData: ServiceExportInterface,\n clean: boolean,\n globalConfig = false\n): Promise<AmServiceSkeleton> {\n debugMessage(`ServiceOps.importService: start, globalConfig=${globalConfig}`);\n const serviceData = importData.service[serviceId];\n const result = await putFullService(\n serviceId,\n serviceData,\n clean,\n globalConfig\n );\n debugMessage(`ServiceOps.importService: end`);\n return result;\n}\n\n/**\n * Imports multiple services from the same file. Optionally clean (remove) existing services first\n * @param {ServiceExportInterface} importData The service configuration export data to import\n * @param {boolean} clean Indicates whether to remove possible existing services first\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n */\nexport async function importServices(\n importData: ServiceExportInterface,\n clean: boolean,\n globalConfig = false\n) {\n debugMessage(\n `ServiceOps.importServices: start, globalConfig=${globalConfig}`\n );\n try {\n const result = await putFullServices(\n Object.entries(importData.service),\n clean,\n globalConfig\n );\n debugMessage(`ServiceOps.importServices: end`);\n return result;\n } catch (error) {\n const message = error.response?.data?.message;\n const detail = error.response?.data?.detail;\n printMessage(`Unable to import services: error: ${message}`, 'error');\n if (detail) {\n printMessage(`Details: ${JSON.stringify(detail)}`, 'error');\n }\n throw error;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ServiceOps.js","names":["createServiceExportTemplate","meta","service","getListOfServices","globalConfig","debugMessage","services","_getListOfServices","result","getFullServices","serviceList","fullServiceData","Promise","all","map","listItem","nextDescendents","getService","_id","getServiceDescendents","error","response","status","data","message","printMessage","filter","putFullService","serviceId","clean","_rev","enabled","deleteFullService","putService","length","descendent","type","_type","descendentId","undefined","putServiceNextDescendent","putFullServices","serviceEntries","results","id","push","detail","JSON","stringify","serviceNextDescendentData","nextDescendent","deleteServiceNextDescendent","deleteService","deleteFullServices","serviceListItem","exportService","exportData","exportServices","importService","importData","serviceData","importServices","Object","entries"],"sources":["ops/ServiceOps.ts"],"sourcesContent":["import { AmServiceSkeleton } from '../api/ApiTypes';\nimport {\n deleteService,\n deleteServiceNextDescendent,\n getService,\n getListOfServices as _getListOfServices,\n getServiceDescendents,\n putService,\n putServiceNextDescendent,\n ServiceNextDescendent,\n} from '../api/ServiceApi';\nimport { ServiceExportInterface } from './OpsTypes';\nimport { debugMessage, printMessage } from './utils/Console';\n\ninterface FullService extends AmServiceSkeleton {\n nextDescendents?: ServiceNextDescendent[];\n}\n\n/**\n * Create an empty service export template\n * @returns {SingleTreeExportInterface} an empty service export template\n */\nexport function createServiceExportTemplate(): ServiceExportInterface {\n return {\n meta: {},\n service: {},\n } as ServiceExportInterface;\n}\n\n/**\n * Get list of services\n * @param {boolean} globalConfig true if the list of global services is requested, false otherwise. Default: false.\n */\nexport async function getListOfServices(globalConfig = false) {\n debugMessage(`ServiceOps.getListOfServices: start`);\n const services = (await _getListOfServices(globalConfig)).result;\n debugMessage(`ServiceOps.getListOfServices: end`);\n return services;\n}\n\n/**\n * Get all services including their descendents.\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns Promise resolving to an array of services with their descendants\n */\nexport async function getFullServices(\n globalConfig = false\n): Promise<FullService[]> {\n debugMessage(\n `ServiceOps.getFullServices: start, globalConfig=${globalConfig}`\n );\n const serviceList = (await _getListOfServices(globalConfig)).result;\n\n const fullServiceData = await Promise.all(\n serviceList.map(async (listItem) => {\n try {\n const [service, nextDescendents] = await Promise.all([\n getService(listItem._id, globalConfig),\n getServiceDescendents(listItem._id, globalConfig),\n ]);\n\n return {\n ...service,\n nextDescendents,\n };\n } catch (error) {\n if (\n !(\n error.response?.status === 403 &&\n error.response?.data?.message ===\n 'This operation is not available in ForgeRock Identity Cloud.'\n )\n ) {\n const message = error.response?.data?.message;\n printMessage(\n `Unable to retrieve data for ${listItem._id} with error: ${message}`,\n 'error'\n );\n }\n }\n })\n );\n\n debugMessage(`ServiceOps.getFullServices: end`);\n return fullServiceData.filter((data) => !!data); // make sure to filter out any undefined objects\n}\n\n/**\n * Saves a service using the provide id and data, including descendents\n * @param {string} serviceId the service id / name\n * @param {string} fullServiceData service object including descendants\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns promise resolving to a service object\n */\nasync function putFullService(\n serviceId: string,\n fullServiceData: FullService,\n clean: boolean,\n globalConfig = false\n): Promise<AmServiceSkeleton> {\n debugMessage(\n `ServiceOps.putFullService: start, serviceId=${serviceId}, globalConfig=${globalConfig}`\n );\n const nextDescendents = fullServiceData.nextDescendents;\n\n delete fullServiceData.nextDescendents;\n delete fullServiceData._rev;\n delete fullServiceData.enabled;\n\n if (clean) {\n try {\n debugMessage(`ServiceOps.putFullService: clean`);\n await deleteFullService(serviceId, globalConfig);\n } catch (error) {\n if (\n !(\n error.response?.status === 404 &&\n error.response?.data?.message === 'Not Found'\n )\n ) {\n const message = error.response?.data?.message;\n printMessage(\n `Error deleting service '${serviceId}' before import: ${message}`,\n 'error'\n );\n }\n }\n }\n\n // create service first\n const result = await putService(serviceId, fullServiceData, globalConfig);\n\n // return fast if no next descendents supplied\n if (nextDescendents.length === 0) {\n debugMessage(`ServiceOps.putFullService: end (w/o descendents)`);\n return result;\n }\n\n // now create next descendents\n await Promise.all(\n nextDescendents.map(async (descendent) => {\n const type = descendent._type._id;\n const descendentId = descendent._id;\n debugMessage(`ServiceOps.putFullService: descendentId=${descendentId}`);\n let result = undefined;\n try {\n result = await putServiceNextDescendent(\n serviceId,\n type,\n descendentId,\n descendent,\n globalConfig\n );\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(\n `Put descendent '${descendentId}' of service '${serviceId}': ${message}`,\n 'error'\n );\n }\n return result;\n })\n );\n debugMessage(`ServiceOps.putFullService: end (w/ descendents)`);\n}\n\n/**\n * Saves multiple services using the serviceEntries which contain both id and data with descendants\n * @param {[string, FullService][]} serviceEntries The services to add\n * @param {boolean} clean Indicates whether to remove possible existing services first\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns {Promise<AmService[]>} promise resolving to an array of service objects\n */\nasync function putFullServices(\n serviceEntries: [string, FullService][],\n clean: boolean,\n globalConfig = false\n): Promise<AmServiceSkeleton[]> {\n debugMessage(\n `ServiceOps.putFullServices: start, globalConfig=${globalConfig}`\n );\n const results: AmServiceSkeleton[] = [];\n for (const [id, data] of serviceEntries) {\n try {\n const result = await putFullService(id, data, clean, globalConfig);\n results.push(result);\n printMessage(`Imported: ${id}`, 'info');\n } catch (error) {\n const message = error.response?.data?.message;\n const detail = error.response?.data?.detail;\n printMessage(`Import service '${id}': ${message}`, 'error');\n if (detail) {\n printMessage(`Details: ${JSON.stringify(detail)}`, 'error');\n }\n }\n }\n debugMessage(`ServiceOps.putFullServices: end`);\n return results;\n}\n\n/**\n * Deletes the specified service\n * @param {string} serviceId The service to delete\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n */\nexport async function deleteFullService(\n serviceId: string,\n globalConfig = false\n) {\n debugMessage(\n `ServiceOps.deleteFullService: start, globalConfig=${globalConfig}`\n );\n const serviceNextDescendentData = await getServiceDescendents(\n serviceId,\n globalConfig\n );\n\n await Promise.all(\n serviceNextDescendentData.map((nextDescendent) =>\n deleteServiceNextDescendent(\n serviceId,\n nextDescendent._type._id,\n nextDescendent._id,\n globalConfig\n )\n )\n );\n\n await deleteService(serviceId, globalConfig);\n debugMessage(`ServiceOps.deleteFullService: end`);\n}\n\n/**\n * Deletes all services\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n */\nexport async function deleteFullServices(globalConfig = false) {\n debugMessage(\n `ServiceOps.deleteFullServices: start, globalConfig=${globalConfig}`\n );\n try {\n const serviceList = (await _getListOfServices(globalConfig)).result;\n\n await Promise.all(\n serviceList.map(async (serviceListItem) => {\n try {\n await deleteFullService(serviceListItem._id, globalConfig);\n } catch (error) {\n if (\n !(\n error.response?.status === 403 &&\n error.response?.data?.message ===\n 'This operation is not available in ForgeRock Identity Cloud.'\n )\n ) {\n const message = error.response?.data?.message;\n printMessage(\n `Delete service '${serviceListItem._id}': ${message}`,\n 'error'\n );\n }\n }\n })\n );\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(`Delete services: ${message}`, 'error');\n }\n debugMessage(`ServiceOps.deleteFullServices: end`);\n}\n\n/**\n * Export service. The response can be saved to file as is.\n * @param serviceId service id/name\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns {Promise<ServiceExportInterface>} Promise resolving to a ServiceExportInterface object.\n */\nexport async function exportService(\n serviceId: string,\n globalConfig = false\n): Promise<ServiceExportInterface> {\n debugMessage(`ServiceOps.exportService: start, globalConfig=${globalConfig}`);\n const exportData = createServiceExportTemplate();\n try {\n const service = await getService(serviceId, globalConfig);\n service.nextDescendents = await getServiceDescendents(\n serviceId,\n globalConfig\n );\n exportData.service[serviceId] = service;\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(`Export service '${serviceId}': ${message}`, 'error');\n }\n debugMessage(`ServiceOps.exportService: end`);\n return exportData;\n}\n\n/**\n * Export all services\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n */\nexport async function exportServices(\n globalConfig = false\n): Promise<ServiceExportInterface> {\n debugMessage(\n `ServiceOps.exportServices: start, globalConfig=${globalConfig}`\n );\n const exportData = createServiceExportTemplate();\n try {\n const services = await getFullServices(globalConfig);\n for (const service of services) {\n exportData.service[service._type._id] = service;\n }\n } catch (error) {\n const message = error.response?.data?.message;\n printMessage(`Export servics: ${message}`, 'error');\n }\n debugMessage(`ServiceOps.exportServices: end`);\n return exportData;\n}\n\n/**\n * Imports a single service using a reference to the service and a file to read the data from. Optionally clean (remove) an existing service first\n * @param {string} serviceId The service id/name to add\n * @param {ServiceExportInterface} importData The service configuration export data to import\n * @param {boolean} clean Indicates whether to remove a possible existing service with the same id first.\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n * @returns Promise resolving when the service has been imported\n */\nexport async function importService(\n serviceId: string,\n importData: ServiceExportInterface,\n clean: boolean,\n globalConfig = false\n): Promise<AmServiceSkeleton> {\n debugMessage(`ServiceOps.importService: start, globalConfig=${globalConfig}`);\n const serviceData = importData.service[serviceId];\n const result = await putFullService(\n serviceId,\n serviceData,\n clean,\n globalConfig\n );\n debugMessage(`ServiceOps.importService: end`);\n return result;\n}\n\n/**\n * Imports multiple services from the same file. Optionally clean (remove) existing services first\n * @param {ServiceExportInterface} importData The service configuration export data to import\n * @param {boolean} clean Indicates whether to remove possible existing services first\n * @param {boolean} globalConfig true if the global service is the target of the operation, false otherwise. Default: false.\n */\nexport async function importServices(\n importData: ServiceExportInterface,\n clean: boolean,\n globalConfig = false\n) {\n debugMessage(\n `ServiceOps.importServices: start, globalConfig=${globalConfig}`\n );\n try {\n const result = await putFullServices(\n Object.entries(importData.service),\n clean,\n globalConfig\n );\n debugMessage(`ServiceOps.importServices: end`);\n return result;\n } catch (error) {\n const message = error.response?.data?.message;\n const detail = error.response?.data?.detail;\n printMessage(`Unable to import services: error: ${message}`, 'error');\n if (detail) {\n printMessage(`Details: ${JSON.stringify(detail)}`, 'error');\n }\n throw error;\n }\n}\n"],"mappings":"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"}
|
|
@@ -187,9 +187,7 @@ function findFilesByName(fileName) {
|
|
|
187
187
|
|
|
188
188
|
// search sub-folders
|
|
189
189
|
var folders = entries.filter(entry => entry.isDirectory());
|
|
190
|
-
for (var folder of folders)
|
|
191
|
-
files.push(...findFilesByName(fileName, fast, "".concat(path).concat(folder.name, "/")));
|
|
192
|
-
}
|
|
190
|
+
for (var folder of folders) files.push(...findFilesByName(fileName, fast, "".concat(path).concat(folder.name, "/")));
|
|
193
191
|
return files;
|
|
194
192
|
}
|
|
195
193
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportImportUtils.js","names":["getCurrentTimestamp","ts","Date","toISOString","getMetadata","metadata","origin","state","getHost","originAmVersion","getAmVersion","exportedBy","getUsername","exportDate","exportTool","FRODO_METADATA_ID","exportToolVersion","getFrodoVersion","titleCase","input","str","toString","splitStr","toLowerCase","split","i","length","charAt","toUpperCase","slice","join","getRealmString","realm","getRealm","reduce","result","item","convertBase64TextToArray","b64text","arrayOut","plainText","decode","replace","convertBase64UrlTextToArray","b64UTF8Text","decodeBase64Url","convertTextArrayToBase64","textArray","joinedText","b64encodedScript","encode","convertTextArrayToBase64Url","encodeBase64Url","validateImport","getTypedFilename","name","type","suffix","slug","slugify","getWorkingDirectory","wd","getDirectory","fs","existsSync","debugMessage","mkdirSync","recursive","saveToFile","data","identifier","filename","exportData","Array","isArray","forEach","element","writeFile","JSON","stringify","err","printMessage","saveJsonToFile","includeMeta","meta","writeFileSync","appendTextToFile","appendFileSync","error","message","findFilesByName","fileName","fast","path","entries","readdirSync","encoding","withFileTypes","files","filter","entry","isDirectory","file","map","folders","folder","push","readFilesRecursive","directory","items","readdir","filePathsNested","Promise","all","entity","lstat","flat"],"sources":["ops/utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport { lstat, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport slugify from 'slugify';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from '../../api/utils/Base64';\nimport * as state from '../../shared/State';\nimport { FRODO_METADATA_ID } from '../../storage/StaticStorage';\nimport { ExportMetaData } from '../OpsTypes';\nimport { debugMessage, printMessage } from './Console';\n\nexport function getCurrentTimestamp() {\n const ts = new Date();\n return ts.toISOString();\n}\n\nexport function getMetadata(): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: getCurrentTimestamp(),\n exportTool: FRODO_METADATA_ID,\n exportToolVersion: state.getFrodoVersion(),\n };\n return metadata;\n}\n\n/*\n * Output str in title case\n *\n * e.g.: 'ALL UPPERCASE AND all lowercase' = 'All Uppercase And All Lowercase'\n */\nexport function titleCase(input) {\n const str = input.toString();\n const splitStr = str.toLowerCase().split(' ');\n for (let i = 0; i < splitStr.length; i += 1) {\n splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].slice(1);\n }\n return splitStr.join(' ');\n}\n\nexport function getRealmString() {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text) {\n let arrayOut = [];\n let plainText = decode(b64text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertBase64UrlTextToArray(b64UTF8Text) {\n let arrayOut = [];\n let plainText = decodeBase64Url(b64UTF8Text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertTextArrayToBase64(textArray) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encodeBase64Url(joinedText);\n return b64encodedScript;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function validateImport(metadata): boolean {\n return metadata || true;\n}\n\nexport function getTypedFilename(name: string, type: string, suffix = 'json') {\n const slug = slugify(name.replace(/^http(s?):\\/\\//, ''));\n return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory() {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (!fs.existsSync(wd)) {\n debugMessage(\n `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`\n );\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\nexport function saveToFile(type, data, identifier, filename) {\n const exportData = {};\n exportData['meta'] = getMetadata();\n exportData[type] = {};\n\n if (Array.isArray(data)) {\n data.forEach((element) => {\n exportData[type][element[identifier]] = element;\n });\n } else {\n exportData[type][data[identifier]] = data;\n }\n fs.writeFile(filename, JSON.stringify(exportData, null, 2), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${type} to file`, 'error');\n }\n return '';\n });\n}\n\n/**\n * Save JSON object to file\n * @param {Object} data data object\n * @param {String} filename file name\n * @return {boolean} true if successful, false otherwise\n */\nexport function saveJsonToFile(data, filename, includeMeta = true): boolean {\n const exportData = data;\n if (includeMeta) exportData.meta = getMetadata();\n try {\n fs.writeFileSync(filename, JSON.stringify(exportData, null, 2));\n return true;\n } catch (err) {\n printMessage(`ERROR - can't save ${filename}`, 'error');\n return false;\n }\n}\n\n/**\n * Append text data to file\n * @param {String} data text data\n * @param {String} filename file name\n */\nexport function appendTextToFile(data, filename) {\n try {\n fs.appendFileSync(filename, data);\n } catch (error) {\n printMessage(`${error.message}`, 'error');\n }\n}\n\n/**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\nexport function findFilesByName(\n fileName: string,\n fast = true,\n path = './'\n): string[] {\n const entries = fs.readdirSync(path, {\n encoding: 'utf8',\n withFileTypes: true,\n });\n\n // Get files within the current directory and add a path key to the file objects\n const files: string[] = entries\n .filter((entry) => !entry.isDirectory())\n .filter((file) => file.name === fileName)\n // .map((file) => ({ ...file, path: path + file.name }));\n .map((file) => path + file.name);\n\n if (fast && files.length > 0) return files;\n\n // search sub-folders\n const folders = entries.filter((entry) => entry.isDirectory());\n for (const folder of folders)\n files.push(...findFilesByName(fileName, fast, `${path}${folder.name}/`));\n\n return files;\n}\n\n/**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\nexport async function readFilesRecursive(directory: string): Promise<string[]> {\n const items = await readdir(directory);\n\n const filePathsNested = await Promise.all(\n items.map(async (entity) => {\n const path = join(directory, entity);\n const isDirectory = (await lstat(path)).isDirectory();\n\n if (isDirectory) {\n return readFilesRecursive(path);\n }\n return path;\n })\n );\n\n return filePathsNested.flat();\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExportImportUtils.js","names":["getCurrentTimestamp","ts","Date","toISOString","getMetadata","metadata","origin","state","getHost","originAmVersion","getAmVersion","exportedBy","getUsername","exportDate","exportTool","FRODO_METADATA_ID","exportToolVersion","getFrodoVersion","titleCase","input","str","toString","splitStr","toLowerCase","split","i","length","charAt","toUpperCase","slice","join","getRealmString","realm","getRealm","reduce","result","item","convertBase64TextToArray","b64text","arrayOut","plainText","decode","replace","convertBase64UrlTextToArray","b64UTF8Text","decodeBase64Url","convertTextArrayToBase64","textArray","joinedText","b64encodedScript","encode","convertTextArrayToBase64Url","encodeBase64Url","validateImport","getTypedFilename","name","type","suffix","slug","slugify","getWorkingDirectory","wd","getDirectory","fs","existsSync","debugMessage","mkdirSync","recursive","saveToFile","data","identifier","filename","exportData","Array","isArray","forEach","element","writeFile","JSON","stringify","err","printMessage","saveJsonToFile","includeMeta","meta","writeFileSync","appendTextToFile","appendFileSync","error","message","findFilesByName","fileName","fast","path","entries","readdirSync","encoding","withFileTypes","files","filter","entry","isDirectory","file","map","folders","folder","push","readFilesRecursive","directory","items","readdir","filePathsNested","Promise","all","entity","lstat","flat"],"sources":["ops/utils/ExportImportUtils.ts"],"sourcesContent":["import fs from 'fs';\nimport { lstat, readdir } from 'fs/promises';\nimport { join } from 'path';\nimport slugify from 'slugify';\nimport {\n decode,\n decodeBase64Url,\n encode,\n encodeBase64Url,\n} from '../../api/utils/Base64';\nimport * as state from '../../shared/State';\nimport { FRODO_METADATA_ID } from '../../storage/StaticStorage';\nimport { ExportMetaData } from '../OpsTypes';\nimport { debugMessage, printMessage } from './Console';\n\nexport function getCurrentTimestamp() {\n const ts = new Date();\n return ts.toISOString();\n}\n\nexport function getMetadata(): ExportMetaData {\n const metadata: ExportMetaData = {\n origin: state.getHost(),\n originAmVersion: state.getAmVersion(),\n exportedBy: state.getUsername(),\n exportDate: getCurrentTimestamp(),\n exportTool: FRODO_METADATA_ID,\n exportToolVersion: state.getFrodoVersion(),\n };\n return metadata;\n}\n\n/*\n * Output str in title case\n *\n * e.g.: 'ALL UPPERCASE AND all lowercase' = 'All Uppercase And All Lowercase'\n */\nexport function titleCase(input) {\n const str = input.toString();\n const splitStr = str.toLowerCase().split(' ');\n for (let i = 0; i < splitStr.length; i += 1) {\n splitStr[i] = splitStr[i].charAt(0).toUpperCase() + splitStr[i].slice(1);\n }\n return splitStr.join(' ');\n}\n\nexport function getRealmString() {\n const realm = state.getRealm();\n return realm\n .split('/')\n .reduce((result, item) => `${result}${titleCase(item)}`, '');\n}\n\nexport function convertBase64TextToArray(b64text) {\n let arrayOut = [];\n let plainText = decode(b64text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertBase64UrlTextToArray(b64UTF8Text) {\n let arrayOut = [];\n let plainText = decodeBase64Url(b64UTF8Text);\n plainText = plainText.replace(/\\t/g, ' ');\n arrayOut = plainText.split('\\n');\n return arrayOut;\n}\n\nexport function convertTextArrayToBase64(textArray) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encode(joinedText);\n return b64encodedScript;\n}\n\nexport function convertTextArrayToBase64Url(textArray) {\n const joinedText = textArray.join('\\n');\n const b64encodedScript = encodeBase64Url(joinedText);\n return b64encodedScript;\n}\n\n// eslint-disable-next-line no-unused-vars\nexport function validateImport(metadata): boolean {\n return metadata || true;\n}\n\nexport function getTypedFilename(name: string, type: string, suffix = 'json') {\n const slug = slugify(name.replace(/^http(s?):\\/\\//, ''));\n return `${slug}.${type}.${suffix}`;\n}\n\nexport function getWorkingDirectory() {\n let wd = '.';\n if (state.getDirectory()) {\n wd = state.getDirectory().replace(/\\/$/, '');\n // create directory if it doesn't exist\n if (!fs.existsSync(wd)) {\n debugMessage(\n `ExportImportUtils.getWorkingDirectory: creating directory '${wd}'`\n );\n fs.mkdirSync(wd, { recursive: true });\n }\n }\n return wd;\n}\n\nexport function saveToFile(type, data, identifier, filename) {\n const exportData = {};\n exportData['meta'] = getMetadata();\n exportData[type] = {};\n\n if (Array.isArray(data)) {\n data.forEach((element) => {\n exportData[type][element[identifier]] = element;\n });\n } else {\n exportData[type][data[identifier]] = data;\n }\n fs.writeFile(filename, JSON.stringify(exportData, null, 2), (err) => {\n if (err) {\n return printMessage(`ERROR - can't save ${type} to file`, 'error');\n }\n return '';\n });\n}\n\n/**\n * Save JSON object to file\n * @param {Object} data data object\n * @param {String} filename file name\n * @return {boolean} true if successful, false otherwise\n */\nexport function saveJsonToFile(data, filename, includeMeta = true): boolean {\n const exportData = data;\n if (includeMeta) exportData.meta = getMetadata();\n try {\n fs.writeFileSync(filename, JSON.stringify(exportData, null, 2));\n return true;\n } catch (err) {\n printMessage(`ERROR - can't save ${filename}`, 'error');\n return false;\n }\n}\n\n/**\n * Append text data to file\n * @param {String} data text data\n * @param {String} filename file name\n */\nexport function appendTextToFile(data, filename) {\n try {\n fs.appendFileSync(filename, data);\n } catch (error) {\n printMessage(`${error.message}`, 'error');\n }\n}\n\n/**\n * Find files by name\n * @param {string} fileName file name to search for\n * @param {boolean} fast return first result and stop search\n * @param {string} path path to directory where to start the search\n * @returns {string[]} array of found file paths relative to starting directory\n */\nexport function findFilesByName(\n fileName: string,\n fast = true,\n path = './'\n): string[] {\n const entries = fs.readdirSync(path, {\n encoding: 'utf8',\n withFileTypes: true,\n });\n\n // Get files within the current directory and add a path key to the file objects\n const files: string[] = entries\n .filter((entry) => !entry.isDirectory())\n .filter((file) => file.name === fileName)\n // .map((file) => ({ ...file, path: path + file.name }));\n .map((file) => path + file.name);\n\n if (fast && files.length > 0) return files;\n\n // search sub-folders\n const folders = entries.filter((entry) => entry.isDirectory());\n for (const folder of folders)\n files.push(...findFilesByName(fileName, fast, `${path}${folder.name}/`));\n\n return files;\n}\n\n/**\n * find all (nested) files in a directory\n *\n * @param directory directory to search\n * @returns list of files\n */\nexport async function readFilesRecursive(directory: string): Promise<string[]> {\n const items = await readdir(directory);\n\n const filePathsNested = await Promise.all(\n items.map(async (entity) => {\n const path = join(directory, entity);\n const isDirectory = (await lstat(path)).isDirectory();\n\n if (isDirectory) {\n return readFilesRecursive(path);\n }\n return path;\n })\n );\n\n return filePathsNested.flat();\n}\n"],"mappings":"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"}
|
package/cjs/shared/State.js
CHANGED
|
@@ -10,7 +10,9 @@ var _url = require("url");
|
|
|
10
10
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
11
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
12
12
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
13
|
-
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
13
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
14
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
15
|
+
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
14
16
|
var _dirname = _path.default.dirname((0, _url.fileURLToPath)(require('url').pathToFileURL(__filename).toString()));
|
|
15
17
|
var pkg = JSON.parse(_fs.default.readFileSync(_path.default.resolve(_dirname, '../../package.json'), 'utf8'));
|
|
16
18
|
var _state = {
|
package/cjs/shared/State.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"State.js","names":["__dirname","path","dirname","fileURLToPath","pkg","JSON","parse","fs","readFileSync","resolve","_state","authenticationHeaderOverrides","printHandler","message","console","dir","depth","log","verboseHandler","getVerbose","debugHandler","getDebug","curlirizeHandler","setHost","host","getHost","process","env","FRODO_HOST","setTenant","getTenant","setUsername","username","getUsername","FRODO_USERNAME","setPassword","password","getPassword","FRODO_PASSWORD","setRealm","realm","getRealm","FRODO_REALM","setDeploymentType","type","deploymentType","getDeploymentType","setAllowInsecureConnection","allowInsecureConnection","getAllowInsecureConnection","setCookieName","name","cookieName","getCookieName","setCookieValue","value","cookieValue","getCookieValue","setAuthenticationHeaderOverrides","overrides","getAuthenticationHeaderOverrides","setAuthenticationService","service","authenticationService","getAuthenticationService","FRODO_AUTHENTICATION_SERVICE","setServiceAccountId","uuid","serviceAccountId","getServiceAccountId","FRODO_SA_ID","setServiceAccountJwk","jwk","serviceAccountJwk","getServiceAccountJwk","FRODO_SA_JWK","undefined","setUseBearerTokenForAmApis","useBearerTokenForAmApis","getUseBearerTokenForAmApis","setBearerToken","token","bearerToken","getBearerToken","setLogApiKey","key","logApiKey","getLogApiKey","FRODO_LOG_KEY","setLogApiSecret","secret","logApiSecret","getLogApiSecret","FRODO_LOG_SECRET","setAmVersion","version","amVersion","getAmVersion","setFrodoVersion","frodoVersion","getFrodoVersion","setConnectionProfilesPath","connectionProfilesPath","getConnectionProfilesPath","setMasterKeyPath","masterKeyPath","getMasterKeyPath","setOutputFile","file","outputFile","getOutputFile","setDirectory","directory","getDirectory","setPrintHandler","handler","getPrintHandler","setVerboseHandler","getVerboseHandler","setVerbose","verbose","setDebugHandler","getDebugHandler","setDebug","debug","FRODO_DEBUG","setCurlirizeHandler","getCurlirizeHandler","setCurlirize","curlirize","getCurlirize","setCreateProgressHandler","createProgressHandler","getCreateProgressHandler","setUpdateProgressHandler","updateProgressHandler","getUpdateProgressHandler","setStopProgressHandler","stopProgressHandler","getStopProgressHandler","session"],"sources":["shared/State.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { JwkRsa } from '../ops/JoseOps';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '../../package.json'), 'utf8')\n);\n\nexport interface StateInterface {\n // connection settings\n host?: string;\n username?: string;\n password?: string;\n realm?: string;\n deploymentType?: string;\n allowInsecureConnection?: boolean;\n // customize authentication\n authenticationHeaderOverrides?: Record<string, string>;\n authenticationService?: string;\n // cookie settings\n cookieName?: string;\n cookieValue?: string;\n // service account settings\n serviceAccountId?: string;\n serviceAccountJwk?: JwkRsa;\n // bearer token settings\n useBearerTokenForAmApis?: boolean;\n bearerToken?: string;\n // log api settings\n logApiKey?: string;\n logApiSecret?: string;\n // versions\n amVersion?: string;\n frodoVersion?: string;\n // miscellaneous settings\n connectionProfilesPath?: string;\n masterKeyPath?: string;\n outputFile?: string;\n directory?: string;\n // output handler settings\n printHandler?: (\n message: string | object,\n type?: string,\n newline?: boolean\n ) => void;\n verboseHandler?: (message: string | object) => void;\n verbose?: boolean;\n debugHandler?: (message: string | object) => void;\n debug?: boolean;\n curlirizeHandler?: (message: string) => void;\n curlirize?: boolean;\n createProgressHandler?: (\n type: string,\n total?: number,\n message?: string\n ) => void;\n updateProgressHandler?: (message: string) => void;\n stopProgressHandler?: (message: string, status?: string) => void;\n}\n\nconst _state: StateInterface = {\n authenticationHeaderOverrides: {},\n printHandler: (message: string | object) => {\n if (!message) return;\n if (typeof message === 'object') {\n console.dir(message, { depth: 3 });\n } else {\n console.log(message);\n }\n },\n verboseHandler: (message: string | object) => {\n if (!message) return;\n if (getVerbose()) {\n if (typeof message === 'object') {\n console.dir(message, { depth: 3 });\n } else {\n console.log(message);\n }\n }\n },\n debugHandler: (message: string | object) => {\n if (!message) return;\n if (getDebug()) {\n if (typeof message === 'object') {\n console.dir(message, { depth: 6 });\n } else {\n console.log(message);\n }\n }\n },\n curlirizeHandler: (message: string) => {\n if (!message) return;\n if (getDebug()) {\n console.log(message);\n }\n },\n};\n\nexport const setHost = (host: string) => (_state.host = host);\nexport const getHost = () => _state.host || process.env.FRODO_HOST;\n\n/**\n * @deprecated since v0.17.0 use `setHost(host: string)` instead\n */\nexport const setTenant = setHost;\n/**\n * @deprecated since v0.17.0 use `getHost` instead\n */\nexport const getTenant = getHost;\n\nexport const setUsername = (username: string) => (_state.username = username);\nexport const getUsername = () => _state.username || process.env.FRODO_USERNAME;\n\nexport const setPassword = (password: string) => (_state.password = password);\nexport const getPassword = () => _state.password || process.env.FRODO_PASSWORD;\n\nexport const setRealm = (realm: string) => (_state.realm = realm);\nexport const getRealm = () => _state.realm || process.env.FRODO_REALM;\n\nexport const setDeploymentType = (type: string) =>\n (_state.deploymentType = type);\nexport const getDeploymentType = () => _state.deploymentType;\n\nexport const setAllowInsecureConnection = (allowInsecureConnection: boolean) =>\n (_state.allowInsecureConnection = allowInsecureConnection);\nexport const getAllowInsecureConnection = () =>\n _state['allowInsecureConnection'];\n\nexport const setCookieName = (name: string) => (_state.cookieName = name);\nexport const getCookieName = () => _state.cookieName;\nexport const setCookieValue = (value: string) => (_state.cookieValue = value);\nexport const getCookieValue = () => _state.cookieValue;\n\nexport const setAuthenticationHeaderOverrides = (\n overrides: Record<string, string>\n) => (_state.authenticationHeaderOverrides = overrides);\nexport const getAuthenticationHeaderOverrides = () =>\n _state.authenticationHeaderOverrides;\nexport const setAuthenticationService = (service: string) =>\n (_state.authenticationService = service);\nexport const getAuthenticationService = () =>\n _state.authenticationService || process.env.FRODO_AUTHENTICATION_SERVICE;\n\nexport const setServiceAccountId = (uuid: string) =>\n (_state.serviceAccountId = uuid);\nexport const getServiceAccountId = (): string =>\n _state.serviceAccountId || process.env.FRODO_SA_ID;\nexport const setServiceAccountJwk = (jwk: JwkRsa) =>\n (_state.serviceAccountJwk = { ...jwk });\nexport const getServiceAccountJwk = (): JwkRsa =>\n _state.serviceAccountJwk ||\n (process.env.FRODO_SA_JWK ? JSON.parse(process.env.FRODO_SA_JWK) : undefined);\n\nexport const setUseBearerTokenForAmApis = (useBearerTokenForAmApis: boolean) =>\n (_state.useBearerTokenForAmApis = useBearerTokenForAmApis);\nexport const getUseBearerTokenForAmApis = () => _state.useBearerTokenForAmApis;\nexport const setBearerToken = (token: string) => (_state.bearerToken = token);\nexport const getBearerToken = () => _state.bearerToken;\n\nexport const setLogApiKey = (key: string) => (_state.logApiKey = key);\nexport const getLogApiKey = () => _state.logApiKey || process.env.FRODO_LOG_KEY;\nexport const setLogApiSecret = (secret: string) =>\n (_state.logApiSecret = secret);\nexport const getLogApiSecret = () =>\n _state.logApiSecret || process.env.FRODO_LOG_SECRET;\n\nexport const setAmVersion = (version: string) => (_state.amVersion = version);\nexport const getAmVersion = () => _state.amVersion;\n\nexport const setFrodoVersion = (version: string) =>\n (_state.frodoVersion = version);\nexport const getFrodoVersion = () =>\n _state.frodoVersion || `v${pkg.version} [${process.version}]`;\n\nexport const setConnectionProfilesPath = (path: string) =>\n (_state.connectionProfilesPath = path);\nexport const getConnectionProfilesPath = () => _state.connectionProfilesPath;\n\nexport const setMasterKeyPath = (path: string) => (_state.masterKeyPath = path);\nexport const getMasterKeyPath = () => _state.masterKeyPath;\n\nexport const setOutputFile = (file: string) => (_state.outputFile = file);\nexport const getOutputFile = () => _state.outputFile;\n\nexport const setDirectory = (directory: string) =>\n (_state.directory = directory);\nexport const getDirectory = () => _state.directory;\n\nexport const setPrintHandler = (\n handler: (message: string | object, type?: string, newline?: boolean) => void\n) => (_state.printHandler = handler);\nexport const getPrintHandler = () => _state.printHandler;\n\nexport const setVerboseHandler = (\n handler: (message: string | object) => void\n) => (_state.verboseHandler = handler);\nexport const getVerboseHandler = () => _state.verboseHandler;\nexport const setVerbose = (verbose: boolean) => (_state.verbose = verbose);\nexport const getVerbose = (): boolean => _state.verbose;\n\nexport const setDebugHandler = (handler: (message: string | object) => void) =>\n (_state.debugHandler = handler);\nexport const getDebugHandler = () => _state.debugHandler;\nexport const setDebug = (debug: boolean) => (_state.debug = debug);\nexport const getDebug = (): boolean =>\n _state.debug || process.env.FRODO_DEBUG !== undefined;\n\nexport const setCurlirizeHandler = (handler: (message: string) => void) =>\n (_state.curlirizeHandler = handler);\nexport const getCurlirizeHandler = () => _state.curlirizeHandler;\nexport const setCurlirize = (curlirize: boolean) =>\n (_state.curlirize = curlirize);\nexport const getCurlirize = (): boolean => _state.curlirize;\n\nexport const setCreateProgressHandler = (\n handler: (type: string, total?: number, message?: string) => void\n) => (_state.createProgressHandler = handler);\nexport const getCreateProgressHandler = () => _state.createProgressHandler;\nexport const setUpdateProgressHandler = (handler: (message: string) => void) =>\n (_state.updateProgressHandler = handler);\nexport const getUpdateProgressHandler = () => _state.updateProgressHandler;\nexport const setStopProgressHandler = (\n handler: (message: string, status?: string) => void\n) => (_state.stopProgressHandler = handler);\nexport const getStopProgressHandler = () => _state.stopProgressHandler;\n\n/**\n * @deprecated since version v0.17.0. Import state:\n *\n * ```import { state } from '@rockcarver/frodo-lib';```\n *\n * then call functions:\n *\n * ```const username = state.getUsername();```\n */\nexport default {\n session: {\n setHost,\n getHost,\n\n setTenant,\n getTenant,\n\n setUsername,\n getUsername,\n\n setPassword,\n getPassword,\n\n setRealm,\n getRealm,\n\n setDeploymentType,\n getDeploymentType,\n\n setAllowInsecureConnection,\n getAllowInsecureConnection,\n\n setCookieName,\n getCookieName,\n setCookieValue,\n getCookieValue,\n\n setAuthenticationHeaderOverrides,\n getAuthenticationHeaderOverrides,\n setAuthenticationService,\n getAuthenticationService,\n\n setServiceAccountId,\n getServiceAccountId,\n setServiceAccountJwk,\n getServiceAccountJwk,\n\n setUseBearerTokenForAmApis,\n getUseBearerTokenForAmApis,\n setBearerToken,\n getBearerToken,\n\n setLogApiKey,\n getLogApiKey,\n setLogApiSecret,\n getLogApiSecret,\n\n setAmVersion,\n getAmVersion,\n\n setFrodoVersion,\n getFrodoVersion,\n\n setConnectionProfilesPath,\n getConnectionProfilesPath,\n\n setMasterKeyPath,\n getMasterKeyPath,\n\n setOutputFile,\n getOutputFile,\n\n setDirectory,\n getDirectory,\n\n setPrintHandler,\n getPrintHandler,\n\n setVerboseHandler,\n getVerboseHandler,\n setVerbose,\n getVerbose,\n\n setDebugHandler,\n getDebugHandler,\n setDebug,\n getDebug,\n\n setCurlirizeHandler,\n getCurlirizeHandler,\n setCurlirize,\n getCurlirize,\n\n setCreateProgressHandler,\n getCreateProgressHandler,\n setUpdateProgressHandler,\n getUpdateProgressHandler,\n setStopProgressHandler,\n getStopProgressHandler,\n },\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"State.js","names":["__dirname","path","dirname","fileURLToPath","pkg","JSON","parse","fs","readFileSync","resolve","_state","authenticationHeaderOverrides","printHandler","message","console","dir","depth","log","verboseHandler","getVerbose","debugHandler","getDebug","curlirizeHandler","setHost","host","getHost","process","env","FRODO_HOST","setTenant","getTenant","setUsername","username","getUsername","FRODO_USERNAME","setPassword","password","getPassword","FRODO_PASSWORD","setRealm","realm","getRealm","FRODO_REALM","setDeploymentType","type","deploymentType","getDeploymentType","setAllowInsecureConnection","allowInsecureConnection","getAllowInsecureConnection","setCookieName","name","cookieName","getCookieName","setCookieValue","value","cookieValue","getCookieValue","setAuthenticationHeaderOverrides","overrides","getAuthenticationHeaderOverrides","setAuthenticationService","service","authenticationService","getAuthenticationService","FRODO_AUTHENTICATION_SERVICE","setServiceAccountId","uuid","serviceAccountId","getServiceAccountId","FRODO_SA_ID","setServiceAccountJwk","jwk","serviceAccountJwk","getServiceAccountJwk","FRODO_SA_JWK","undefined","setUseBearerTokenForAmApis","useBearerTokenForAmApis","getUseBearerTokenForAmApis","setBearerToken","token","bearerToken","getBearerToken","setLogApiKey","key","logApiKey","getLogApiKey","FRODO_LOG_KEY","setLogApiSecret","secret","logApiSecret","getLogApiSecret","FRODO_LOG_SECRET","setAmVersion","version","amVersion","getAmVersion","setFrodoVersion","frodoVersion","getFrodoVersion","setConnectionProfilesPath","connectionProfilesPath","getConnectionProfilesPath","setMasterKeyPath","masterKeyPath","getMasterKeyPath","setOutputFile","file","outputFile","getOutputFile","setDirectory","directory","getDirectory","setPrintHandler","handler","getPrintHandler","setVerboseHandler","getVerboseHandler","setVerbose","verbose","setDebugHandler","getDebugHandler","setDebug","debug","FRODO_DEBUG","setCurlirizeHandler","getCurlirizeHandler","setCurlirize","curlirize","getCurlirize","setCreateProgressHandler","createProgressHandler","getCreateProgressHandler","setUpdateProgressHandler","updateProgressHandler","getUpdateProgressHandler","setStopProgressHandler","stopProgressHandler","getStopProgressHandler","session"],"sources":["shared/State.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { JwkRsa } from '../ops/JoseOps';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst pkg = JSON.parse(\n fs.readFileSync(path.resolve(__dirname, '../../package.json'), 'utf8')\n);\n\nexport interface StateInterface {\n // connection settings\n host?: string;\n username?: string;\n password?: string;\n realm?: string;\n deploymentType?: string;\n allowInsecureConnection?: boolean;\n // customize authentication\n authenticationHeaderOverrides?: Record<string, string>;\n authenticationService?: string;\n // cookie settings\n cookieName?: string;\n cookieValue?: string;\n // service account settings\n serviceAccountId?: string;\n serviceAccountJwk?: JwkRsa;\n // bearer token settings\n useBearerTokenForAmApis?: boolean;\n bearerToken?: string;\n // log api settings\n logApiKey?: string;\n logApiSecret?: string;\n // versions\n amVersion?: string;\n frodoVersion?: string;\n // miscellaneous settings\n connectionProfilesPath?: string;\n masterKeyPath?: string;\n outputFile?: string;\n directory?: string;\n // output handler settings\n printHandler?: (\n message: string | object,\n type?: string,\n newline?: boolean\n ) => void;\n verboseHandler?: (message: string | object) => void;\n verbose?: boolean;\n debugHandler?: (message: string | object) => void;\n debug?: boolean;\n curlirizeHandler?: (message: string) => void;\n curlirize?: boolean;\n createProgressHandler?: (\n type: string,\n total?: number,\n message?: string\n ) => void;\n updateProgressHandler?: (message: string) => void;\n stopProgressHandler?: (message: string, status?: string) => void;\n}\n\nconst _state: StateInterface = {\n authenticationHeaderOverrides: {},\n printHandler: (message: string | object) => {\n if (!message) return;\n if (typeof message === 'object') {\n console.dir(message, { depth: 3 });\n } else {\n console.log(message);\n }\n },\n verboseHandler: (message: string | object) => {\n if (!message) return;\n if (getVerbose()) {\n if (typeof message === 'object') {\n console.dir(message, { depth: 3 });\n } else {\n console.log(message);\n }\n }\n },\n debugHandler: (message: string | object) => {\n if (!message) return;\n if (getDebug()) {\n if (typeof message === 'object') {\n console.dir(message, { depth: 6 });\n } else {\n console.log(message);\n }\n }\n },\n curlirizeHandler: (message: string) => {\n if (!message) return;\n if (getDebug()) {\n console.log(message);\n }\n },\n};\n\nexport const setHost = (host: string) => (_state.host = host);\nexport const getHost = () => _state.host || process.env.FRODO_HOST;\n\n/**\n * @deprecated since v0.17.0 use `setHost(host: string)` instead\n */\nexport const setTenant = setHost;\n/**\n * @deprecated since v0.17.0 use `getHost` instead\n */\nexport const getTenant = getHost;\n\nexport const setUsername = (username: string) => (_state.username = username);\nexport const getUsername = () => _state.username || process.env.FRODO_USERNAME;\n\nexport const setPassword = (password: string) => (_state.password = password);\nexport const getPassword = () => _state.password || process.env.FRODO_PASSWORD;\n\nexport const setRealm = (realm: string) => (_state.realm = realm);\nexport const getRealm = () => _state.realm || process.env.FRODO_REALM;\n\nexport const setDeploymentType = (type: string) =>\n (_state.deploymentType = type);\nexport const getDeploymentType = () => _state.deploymentType;\n\nexport const setAllowInsecureConnection = (allowInsecureConnection: boolean) =>\n (_state.allowInsecureConnection = allowInsecureConnection);\nexport const getAllowInsecureConnection = () =>\n _state['allowInsecureConnection'];\n\nexport const setCookieName = (name: string) => (_state.cookieName = name);\nexport const getCookieName = () => _state.cookieName;\nexport const setCookieValue = (value: string) => (_state.cookieValue = value);\nexport const getCookieValue = () => _state.cookieValue;\n\nexport const setAuthenticationHeaderOverrides = (\n overrides: Record<string, string>\n) => (_state.authenticationHeaderOverrides = overrides);\nexport const getAuthenticationHeaderOverrides = () =>\n _state.authenticationHeaderOverrides;\nexport const setAuthenticationService = (service: string) =>\n (_state.authenticationService = service);\nexport const getAuthenticationService = () =>\n _state.authenticationService || process.env.FRODO_AUTHENTICATION_SERVICE;\n\nexport const setServiceAccountId = (uuid: string) =>\n (_state.serviceAccountId = uuid);\nexport const getServiceAccountId = (): string =>\n _state.serviceAccountId || process.env.FRODO_SA_ID;\nexport const setServiceAccountJwk = (jwk: JwkRsa) =>\n (_state.serviceAccountJwk = { ...jwk });\nexport const getServiceAccountJwk = (): JwkRsa =>\n _state.serviceAccountJwk ||\n (process.env.FRODO_SA_JWK ? JSON.parse(process.env.FRODO_SA_JWK) : undefined);\n\nexport const setUseBearerTokenForAmApis = (useBearerTokenForAmApis: boolean) =>\n (_state.useBearerTokenForAmApis = useBearerTokenForAmApis);\nexport const getUseBearerTokenForAmApis = () => _state.useBearerTokenForAmApis;\nexport const setBearerToken = (token: string) => (_state.bearerToken = token);\nexport const getBearerToken = () => _state.bearerToken;\n\nexport const setLogApiKey = (key: string) => (_state.logApiKey = key);\nexport const getLogApiKey = () => _state.logApiKey || process.env.FRODO_LOG_KEY;\nexport const setLogApiSecret = (secret: string) =>\n (_state.logApiSecret = secret);\nexport const getLogApiSecret = () =>\n _state.logApiSecret || process.env.FRODO_LOG_SECRET;\n\nexport const setAmVersion = (version: string) => (_state.amVersion = version);\nexport const getAmVersion = () => _state.amVersion;\n\nexport const setFrodoVersion = (version: string) =>\n (_state.frodoVersion = version);\nexport const getFrodoVersion = () =>\n _state.frodoVersion || `v${pkg.version} [${process.version}]`;\n\nexport const setConnectionProfilesPath = (path: string) =>\n (_state.connectionProfilesPath = path);\nexport const getConnectionProfilesPath = () => _state.connectionProfilesPath;\n\nexport const setMasterKeyPath = (path: string) => (_state.masterKeyPath = path);\nexport const getMasterKeyPath = () => _state.masterKeyPath;\n\nexport const setOutputFile = (file: string) => (_state.outputFile = file);\nexport const getOutputFile = () => _state.outputFile;\n\nexport const setDirectory = (directory: string) =>\n (_state.directory = directory);\nexport const getDirectory = () => _state.directory;\n\nexport const setPrintHandler = (\n handler: (message: string | object, type?: string, newline?: boolean) => void\n) => (_state.printHandler = handler);\nexport const getPrintHandler = () => _state.printHandler;\n\nexport const setVerboseHandler = (\n handler: (message: string | object) => void\n) => (_state.verboseHandler = handler);\nexport const getVerboseHandler = () => _state.verboseHandler;\nexport const setVerbose = (verbose: boolean) => (_state.verbose = verbose);\nexport const getVerbose = (): boolean => _state.verbose;\n\nexport const setDebugHandler = (handler: (message: string | object) => void) =>\n (_state.debugHandler = handler);\nexport const getDebugHandler = () => _state.debugHandler;\nexport const setDebug = (debug: boolean) => (_state.debug = debug);\nexport const getDebug = (): boolean =>\n _state.debug || process.env.FRODO_DEBUG !== undefined;\n\nexport const setCurlirizeHandler = (handler: (message: string) => void) =>\n (_state.curlirizeHandler = handler);\nexport const getCurlirizeHandler = () => _state.curlirizeHandler;\nexport const setCurlirize = (curlirize: boolean) =>\n (_state.curlirize = curlirize);\nexport const getCurlirize = (): boolean => _state.curlirize;\n\nexport const setCreateProgressHandler = (\n handler: (type: string, total?: number, message?: string) => void\n) => (_state.createProgressHandler = handler);\nexport const getCreateProgressHandler = () => _state.createProgressHandler;\nexport const setUpdateProgressHandler = (handler: (message: string) => void) =>\n (_state.updateProgressHandler = handler);\nexport const getUpdateProgressHandler = () => _state.updateProgressHandler;\nexport const setStopProgressHandler = (\n handler: (message: string, status?: string) => void\n) => (_state.stopProgressHandler = handler);\nexport const getStopProgressHandler = () => _state.stopProgressHandler;\n\n/**\n * @deprecated since version v0.17.0. Import state:\n *\n * ```import { state } from '@rockcarver/frodo-lib';```\n *\n * then call functions:\n *\n * ```const username = state.getUsername();```\n */\nexport default {\n session: {\n setHost,\n getHost,\n\n setTenant,\n getTenant,\n\n setUsername,\n getUsername,\n\n setPassword,\n getPassword,\n\n setRealm,\n getRealm,\n\n setDeploymentType,\n getDeploymentType,\n\n setAllowInsecureConnection,\n getAllowInsecureConnection,\n\n setCookieName,\n getCookieName,\n setCookieValue,\n getCookieValue,\n\n setAuthenticationHeaderOverrides,\n getAuthenticationHeaderOverrides,\n setAuthenticationService,\n getAuthenticationService,\n\n setServiceAccountId,\n getServiceAccountId,\n setServiceAccountJwk,\n getServiceAccountJwk,\n\n setUseBearerTokenForAmApis,\n getUseBearerTokenForAmApis,\n setBearerToken,\n getBearerToken,\n\n setLogApiKey,\n getLogApiKey,\n setLogApiSecret,\n getLogApiSecret,\n\n setAmVersion,\n getAmVersion,\n\n setFrodoVersion,\n getFrodoVersion,\n\n setConnectionProfilesPath,\n getConnectionProfilesPath,\n\n setMasterKeyPath,\n getMasterKeyPath,\n\n setOutputFile,\n getOutputFile,\n\n setDirectory,\n getDirectory,\n\n setPrintHandler,\n getPrintHandler,\n\n setVerboseHandler,\n getVerboseHandler,\n setVerbose,\n getVerbose,\n\n setDebugHandler,\n getDebugHandler,\n setDebug,\n getDebug,\n\n setCurlirizeHandler,\n getCurlirizeHandler,\n setCurlirize,\n getCurlirize,\n\n setCreateProgressHandler,\n getCreateProgressHandler,\n setUpdateProgressHandler,\n getUpdateProgressHandler,\n setStopProgressHandler,\n getStopProgressHandler,\n },\n};\n"],"mappings":"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"}
|
|
@@ -15,7 +15,8 @@ import { createSignedJwtToken } from './JoseOps';
|
|
|
15
15
|
import { getServiceAccount } from './cloud/ServiceAccountOps';
|
|
16
16
|
const adminClientPassword = 'doesnotmatter';
|
|
17
17
|
const redirectUrlTemplate = '/platform/appAuthHelperRedirect.html';
|
|
18
|
-
const
|
|
18
|
+
const cloudIdmAdminScopes = 'openid fr:idm:* fr:idc:esv:*';
|
|
19
|
+
const forgeopsIdmAdminScopes = 'openid fr:idm:*';
|
|
19
20
|
const serviceAccountScopes = 'fr:am:* fr:idm:* fr:idc:esv:*';
|
|
20
21
|
let adminClientId = 'idmAdminClient';
|
|
21
22
|
|
|
@@ -118,7 +119,7 @@ async function determineDeploymentType() {
|
|
|
118
119
|
[state.getCookieName()]: state.getCookieValue()
|
|
119
120
|
}
|
|
120
121
|
};
|
|
121
|
-
let bodyFormData = `redirect_uri=${redirectURL}&scope=${
|
|
122
|
+
let bodyFormData = `redirect_uri=${redirectURL}&scope=${cloudIdmAdminScopes}&response_type=code&client_id=${fidcClientId}&csrf=${cookieValue}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;
|
|
122
123
|
let deploymentType = globalConfig.CLASSIC_DEPLOYMENT_TYPE_KEY;
|
|
123
124
|
try {
|
|
124
125
|
await authorize(bodyFormData, config);
|
|
@@ -130,7 +131,7 @@ async function determineDeploymentType() {
|
|
|
130
131
|
deploymentType = globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;
|
|
131
132
|
} else {
|
|
132
133
|
try {
|
|
133
|
-
bodyFormData = `redirect_uri=${redirectURL}&scope=${
|
|
134
|
+
bodyFormData = `redirect_uri=${redirectURL}&scope=${forgeopsIdmAdminScopes}&response_type=code&client_id=${forgeopsClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;
|
|
134
135
|
await authorize(bodyFormData, config);
|
|
135
136
|
} catch (ex) {
|
|
136
137
|
var _ex$response, _ex$response$headers, _ex$response$headers$;
|
|
@@ -197,7 +198,7 @@ async function authenticate(username, password) {
|
|
|
197
198
|
async function getAuthCode(redirectURL, codeChallenge, codeChallengeMethod) {
|
|
198
199
|
try {
|
|
199
200
|
var _response$headers;
|
|
200
|
-
const bodyFormData = `redirect_uri=${redirectURL}&scope=${
|
|
201
|
+
const bodyFormData = `redirect_uri=${redirectURL}&scope=${state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY ? cloudIdmAdminScopes : forgeopsIdmAdminScopes}&response_type=code&client_id=${adminClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${codeChallenge}&code_challenge_method=${codeChallengeMethod}`;
|
|
201
202
|
const config = {
|
|
202
203
|
headers: {
|
|
203
204
|
'Content-Type': 'application/x-www-form-urlencoded'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rockcarver/frodo-lib",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.7",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"main": "./cjs/index.js",
|
|
6
6
|
"module": "./esm/index.mjs",
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
"fs-extra": "^10.0.0",
|
|
115
115
|
"https-proxy-agent": "^5.0.1",
|
|
116
116
|
"lodash": "^4.17.21",
|
|
117
|
-
"node-jose": "^2.
|
|
117
|
+
"node-jose": "^2.2.0",
|
|
118
118
|
"properties-reader": "^2.2.0",
|
|
119
119
|
"qs": "^6.10.3",
|
|
120
120
|
"readline-sync": "^1.4.10",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ops/AuthenticateOps.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAwB,MAAM,WAAW,CAAC;AAqTzD;;;;;GAKG;AACH,wBAAsB,+BAA+B,CACnD,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB;AAmCD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,gBAAgB,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAsH1E","file":"AuthenticateOps.d.ts","sourcesContent":["import url from 'url';\nimport { createHash, randomBytes } from 'crypto';\nimport readlineSync from 'readline-sync';\nimport { encodeBase64Url } from '../api/utils/Base64';\nimport * as state from '../shared/State';\nimport * as globalConfig from '../storage/StaticStorage';\nimport { debugMessage, printMessage, verboseMessage } from './utils/Console';\nimport { getServerInfo, getServerVersionInfo } from '../api/ServerInfoApi';\nimport { step } from '../api/AuthenticateApi';\nimport { accessToken, authorize } from '../api/OAuth2OIDCApi';\nimport { getConnectionProfile } from './ConnectionProfileOps';\nimport { v4 } from 'uuid';\nimport { parseUrl } from '../api/utils/ApiUtils';\nimport { JwkRsa, createSignedJwtToken } from './JoseOps';\nimport { getServiceAccount } from './cloud/ServiceAccountOps';\n\nconst adminClientPassword = 'doesnotmatter';\nconst redirectUrlTemplate = '/platform/appAuthHelperRedirect.html';\n\nconst idmAdminScopes = 'openid fr:idm:* fr:idc:esv:*';\nconst serviceAccountScopes = 'fr:am:* fr:idm:* fr:idc:esv:*';\n\nlet adminClientId = 'idmAdminClient';\n\n/**\n * Helper function to get cookie name\n * @returns {String} cookie name\n */\nasync function determineCookieName() {\n try {\n const data = await getServerInfo();\n debugMessage(\n `AuthenticateOps.getCookieName: cookieName=${data.cookieName}`\n );\n return data.cookieName;\n } catch (error) {\n printMessage(`Error getting cookie name: ${error}`, 'error');\n debugMessage(error.stack);\n return null;\n }\n}\n\n/**\n * Helper function to determine if this is a setup mfa prompt in the ID Cloud tenant admin login journey\n * @param {Object} payload response from the previous authentication journey step\n * @returns {Object} an object indicating if 2fa is required and the original payload\n */\nfunction checkAndHandle2FA(payload) {\n // let skippable = false;\n if ('callbacks' in payload) {\n for (const element of payload.callbacks) {\n if (element.type === 'HiddenValueCallback') {\n if (element.input[0].value.includes('skip')) {\n // skippable = true;\n element.input[0].value = 'Skip';\n return {\n need2fa: true,\n payload,\n };\n }\n }\n if (element.type === 'NameCallback') {\n if (element.output[0].value.includes('code')) {\n // skippable = false;\n printMessage('2FA is enabled and required for this user...');\n const code = readlineSync.question(`${element.output[0].value}: `);\n element.input[0].value = code;\n return {\n need2fa: true,\n payload,\n };\n }\n }\n }\n // console.info(\"NO2FA\");\n return {\n need2fa: false,\n payload,\n };\n }\n // console.info(\"NO2FA\");\n return {\n need2fa: false,\n payload,\n };\n}\n\n/**\n * Helper function to set the default realm by deployment type\n * @param {string} deploymentType deployment type\n */\nfunction determineDefaultRealm(deploymentType: string) {\n if (\n !state.getRealm() ||\n state.getRealm() === globalConfig.DEFAULT_REALM_KEY\n ) {\n state.setRealm(globalConfig.DEPLOYMENT_TYPE_REALM_MAP[deploymentType]);\n }\n}\n\n/**\n * Helper function to determine the deployment type\n * @returns {Promise<string>} deployment type\n */\nasync function determineDeploymentType(): Promise<string> {\n const cookieValue = state.getCookieValue();\n // https://bugster.forgerock.org/jira/browse/FRAAS-13018\n // There is a chance that this will be blocked due to security concerns and thus is probably best not to keep active\n // if (!cookieValue && getUseBearerTokenForAmApis()) {\n // const token = await getTokenInfo();\n // cookieValue = token.sessionToken;\n // setCookieValue(cookieValue);\n // }\n\n // if we are using a service account, we know it's cloud\n if (state.getUseBearerTokenForAmApis())\n return globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;\n\n const fidcClientId = 'idmAdminClient';\n const forgeopsClientId = 'idm-admin-ui';\n\n const verifier = encodeBase64Url(randomBytes(32));\n const challenge = encodeBase64Url(\n createHash('sha256').update(verifier).digest()\n );\n const challengeMethod = 'S256';\n const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);\n\n const config = {\n maxRedirects: 0,\n headers: {\n [state.getCookieName()]: state.getCookieValue(),\n },\n };\n let bodyFormData = `redirect_uri=${redirectURL}&scope=${idmAdminScopes}&response_type=code&client_id=${fidcClientId}&csrf=${cookieValue}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;\n\n let deploymentType = globalConfig.CLASSIC_DEPLOYMENT_TYPE_KEY;\n try {\n await authorize(bodyFormData, config);\n } catch (e) {\n // debugMessage(e.response);\n if (\n e.response?.status === 302 &&\n e.response.headers?.location?.indexOf('code=') > -1\n ) {\n verboseMessage(`ForgeRock Identity Cloud`['brightCyan'] + ` detected.`);\n deploymentType = globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;\n } else {\n try {\n bodyFormData = `redirect_uri=${redirectURL}&scope=${idmAdminScopes}&response_type=code&client_id=${forgeopsClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;\n await authorize(bodyFormData, config);\n } catch (ex) {\n if (\n ex.response?.status === 302 &&\n ex.response.headers?.location?.indexOf('code=') > -1\n ) {\n adminClientId = forgeopsClientId;\n verboseMessage(`ForgeOps deployment`['brightCyan'] + ` detected.`);\n deploymentType = globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY;\n } else {\n verboseMessage(`Classic deployment`['brightCyan'] + ` detected.`);\n }\n }\n }\n }\n return deploymentType;\n}\n\n/**\n * Helper function to extract the semantic version string from a version info object\n * @param {Object} versionInfo version info object\n * @returns {String} semantic version\n */\nasync function getSemanticVersion(versionInfo) {\n if ('version' in versionInfo) {\n const versionString = versionInfo.version;\n const rx = /([\\d]\\.[\\d]\\.[\\d](\\.[\\d])*)/g;\n const version = versionString.match(rx);\n return version[0];\n }\n throw new Error('Cannot extract semantic version from version info object.');\n}\n\n/**\n * Helper function to authenticate and obtain and store session cookie\n * @returns {string} Session token or null\n */\nasync function authenticate(\n username: string,\n password: string\n): Promise<string> {\n const config = {\n headers: {\n 'X-OpenAM-Username': username,\n 'X-OpenAM-Password': password,\n },\n };\n const response1 = await step({}, config);\n const skip2FA = checkAndHandle2FA(response1);\n let response2 = {};\n if (skip2FA.need2fa) {\n response2 = await step(skip2FA.payload);\n } else {\n response2 = skip2FA.payload;\n }\n if ('tokenId' in response2) {\n return response2['tokenId'] as string;\n }\n return null;\n}\n\n/**\n * Helper function to obtain an oauth2 authorization code\n * @param {string} redirectURL oauth2 redirect uri\n * @param {string} codeChallenge PKCE code challenge\n * @param {string} codeChallengeMethod PKCE code challenge method\n * @returns {string} oauth2 authorization code or null\n */\nasync function getAuthCode(redirectURL, codeChallenge, codeChallengeMethod) {\n try {\n const bodyFormData = `redirect_uri=${redirectURL}&scope=${idmAdminScopes}&response_type=code&client_id=${adminClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${codeChallenge}&code_challenge_method=${codeChallengeMethod}`;\n const config = {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n maxRedirects: 0,\n };\n let response = undefined;\n try {\n response = await authorize(bodyFormData, config);\n } catch (error) {\n response = error.response;\n }\n if (response.status < 200 || response.status > 399) {\n printMessage('error getting auth code', 'error');\n printMessage(\n 'likely cause: mismatched parameters with OAuth client config',\n 'error'\n );\n return null;\n }\n const redirectLocationURL = response.headers?.location;\n const queryObject = url.parse(redirectLocationURL, true).query;\n if ('code' in queryObject) {\n return queryObject.code;\n }\n printMessage('auth code not found', 'error');\n return null;\n } catch (error) {\n printMessage(`error getting auth code - ${error.message}`, 'error');\n printMessage(error.response?.data, 'error');\n debugMessage(error.stack);\n return null;\n }\n}\n\n/**\n * Helper function to obtain oauth2 access token\n * @returns {Promise<string | null>} access token or null\n */\nasync function getAccessTokenForUser(): Promise<string | null> {\n debugMessage(`AuthenticateOps.getAccessTokenForUser: start`);\n try {\n const verifier = encodeBase64Url(randomBytes(32));\n const challenge = encodeBase64Url(\n createHash('sha256').update(verifier).digest()\n );\n const challengeMethod = 'S256';\n const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);\n const authCode = await getAuthCode(redirectURL, challenge, challengeMethod);\n if (authCode == null) {\n printMessage('error getting auth code', 'error');\n return null;\n }\n let response = null;\n if (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY) {\n const config = {\n auth: {\n username: adminClientId,\n password: adminClientPassword,\n },\n };\n const bodyFormData = `redirect_uri=${redirectURL}&grant_type=authorization_code&code=${authCode}&code_verifier=${verifier}`;\n response = await accessToken(bodyFormData, config);\n } else {\n const bodyFormData = `client_id=${adminClientId}&redirect_uri=${redirectURL}&grant_type=authorization_code&code=${authCode}&code_verifier=${verifier}`;\n response = await accessToken(bodyFormData);\n }\n if ('access_token' in response.data) {\n debugMessage(`AuthenticateOps.getAccessTokenForUser: end with token`);\n return response.data.access_token;\n }\n printMessage('No access token in response.', 'error');\n } catch (error) {\n debugMessage(`Error getting access token for user: ${error}`);\n debugMessage(error.response?.data);\n }\n debugMessage(`AuthenticateOps.getAccessTokenForUser: end without token`);\n return null;\n}\n\nfunction createPayload(serviceAccountId: string) {\n const u = parseUrl(state.getHost());\n const aud = `${u.origin}:${\n u.port ? u.port : u.protocol === 'https' ? '443' : '80'\n }${u.pathname}/oauth2/access_token`;\n\n // Cross platform way of setting JWT expiry time 3 minutes in the future, expressed as number of seconds since EPOCH\n const exp = Math.floor(new Date().getTime() / 1000 + 180);\n\n // A unique ID for the JWT which is required when requesting the openid scope\n const jti = v4();\n\n const iss = serviceAccountId;\n const sub = serviceAccountId;\n\n // Create the payload for our bearer token\n const payload = { iss, sub, aud, exp, jti };\n\n return payload;\n}\n\n/**\n * Get access token for service account\n * @param {string} serviceAccountId UUID of service account\n * @param {JwkRsa} jwk Java Wek Key\n * @returns {string | null} Access token or null\n */\nexport async function getAccessTokenForServiceAccount(\n serviceAccountId: string,\n jwk: JwkRsa\n): Promise<string | null> {\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: start`);\n const payload = createPayload(serviceAccountId);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: payload:`);\n debugMessage(payload);\n const jwt = await createSignedJwtToken(payload, jwk);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: jwt:`);\n debugMessage(jwt);\n const bodyFormData = `assertion=${jwt}&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=${serviceAccountScopes}`;\n const response = await accessToken(bodyFormData);\n if ('access_token' in response.data) {\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: token:`);\n debugMessage(response.data.access_token);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);\n return response.data.access_token;\n }\n debugMessage(\n `AuthenticateOps.getAccessTokenForServiceAccount: No access token in response.`\n );\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);\n return null;\n}\n\nasync function determineDeploymentTypeAndDefaultRealmAndVersion() {\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: start`\n );\n if (!state.getDeploymentType()) {\n state.setDeploymentType(await determineDeploymentType());\n }\n determineDefaultRealm(state.getDeploymentType());\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: realm=${state.getRealm()}, type=${state.getDeploymentType()}`\n );\n\n const versionInfo = await getServerVersionInfo();\n\n // https://github.com/rockcarver/frodo-cli/issues/109\n debugMessage(`Full version: ${versionInfo.fullVersion}`);\n\n const version = await getSemanticVersion(versionInfo);\n state.setAmVersion(version);\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: end`\n );\n}\n\nasync function getLoggedInSubject(): Promise<string> {\n let subjectString = `user ${state.getUsername()}`;\n if (state.getUseBearerTokenForAmApis()) {\n const name = (await getServiceAccount(state.getServiceAccountId())).name;\n subjectString = `service account ${name} [${state.getServiceAccountId()}]`;\n }\n return subjectString;\n}\n\n/**\n * Get tokens\n * @param {boolean} forceLoginAsUser true to force login as user even if a service account is available (default: false)\n * @returns {Promise<boolean>} true if tokens were successfully obtained, false otherwise\n */\nexport async function getTokens(forceLoginAsUser = false): Promise<boolean> {\n debugMessage(`AuthenticateOps.getTokens: start`);\n if (!state.getHost()) {\n printMessage(\n `No host specified and FRODO_HOST env variable not set!`,\n 'error'\n );\n return false;\n }\n try {\n // if username/password on cli are empty, try to read from connections.json\n if (\n state.getUsername() == null &&\n state.getPassword() == null &&\n !state.getServiceAccountId() &&\n !state.getServiceAccountJwk()\n ) {\n const conn = await getConnectionProfile();\n if (conn) {\n state.setHost(conn.tenant);\n state.setUsername(conn.username);\n state.setPassword(conn.password);\n state.setAuthenticationService(conn.authenticationService);\n state.setAuthenticationHeaderOverrides(\n conn.authenticationHeaderOverrides\n );\n state.setServiceAccountId(conn.svcacctId);\n state.setServiceAccountJwk(conn.svcacctJwk);\n } else {\n return false;\n }\n }\n // now that we have the full tenant URL we can lookup the cookie name\n state.setCookieName(await determineCookieName());\n\n // use service account to login?\n if (\n !forceLoginAsUser &&\n state.getServiceAccountId() &&\n state.getServiceAccountJwk()\n ) {\n debugMessage(\n `AuthenticateOps.getTokens: Authenticating with service account ${state.getServiceAccountId()}`\n );\n try {\n const token = await getAccessTokenForServiceAccount(\n state.getServiceAccountId(),\n state.getServiceAccountJwk()\n );\n state.setBearerToken(token);\n state.setUseBearerTokenForAmApis(true);\n await determineDeploymentTypeAndDefaultRealmAndVersion();\n } catch (saErr) {\n debugMessage(saErr.response?.data || saErr);\n throw new Error(\n `Service account login error: ${\n saErr.response?.data?.error_description ||\n saErr.response?.data?.message ||\n saErr\n }`\n );\n }\n }\n // use user account to login\n else if (state.getUsername() && state.getPassword()) {\n debugMessage(\n `AuthenticateOps.getTokens: Authenticating with user account ${state.getUsername()}`\n );\n const token = await authenticate(\n state.getUsername(),\n state.getPassword()\n );\n if (token) state.setCookieValue(token);\n await determineDeploymentTypeAndDefaultRealmAndVersion();\n if (\n state.getCookieValue() &&\n !state.getBearerToken() &&\n (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY ||\n state.getDeploymentType() ===\n globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY)\n ) {\n const accessToken = await getAccessTokenForUser();\n if (accessToken) state.setBearerToken(accessToken);\n }\n }\n // incomplete or no credentials\n else {\n printMessage(`Incomplete or no credentials!`, 'error');\n return false;\n }\n if (\n state.getCookieValue() ||\n (state.getUseBearerTokenForAmApis() && state.getBearerToken())\n ) {\n // https://github.com/rockcarver/frodo-cli/issues/102\n printMessage(\n `Connected to ${state.getHost()} [${\n state.getRealm() ? state.getRealm() : 'root'\n }] as ${await getLoggedInSubject()}`,\n 'info'\n );\n debugMessage(`AuthenticateOps.getTokens: end with tokens`);\n return true;\n }\n } catch (error) {\n // regular error\n printMessage(error.message, 'error');\n // axios error am api\n printMessage(error.response?.data?.message, 'error');\n // axios error am oauth2 api\n printMessage(error.response?.data?.error_description, 'error');\n // axios error data\n debugMessage(error.response?.data);\n // stack trace\n debugMessage(error.stack || new Error().stack);\n }\n debugMessage(`AuthenticateOps.getTokens: end without tokens`);\n return false;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ops/AuthenticateOps.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,EAAwB,MAAM,WAAW,CAAC;AA0TzD;;;;;GAKG;AACH,wBAAsB,+BAA+B,CACnD,gBAAgB,EAAE,MAAM,EACxB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB;AAmCD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,gBAAgB,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAsH1E","file":"AuthenticateOps.d.ts","sourcesContent":["import url from 'url';\nimport { createHash, randomBytes } from 'crypto';\nimport readlineSync from 'readline-sync';\nimport { encodeBase64Url } from '../api/utils/Base64';\nimport * as state from '../shared/State';\nimport * as globalConfig from '../storage/StaticStorage';\nimport { debugMessage, printMessage, verboseMessage } from './utils/Console';\nimport { getServerInfo, getServerVersionInfo } from '../api/ServerInfoApi';\nimport { step } from '../api/AuthenticateApi';\nimport { accessToken, authorize } from '../api/OAuth2OIDCApi';\nimport { getConnectionProfile } from './ConnectionProfileOps';\nimport { v4 } from 'uuid';\nimport { parseUrl } from '../api/utils/ApiUtils';\nimport { JwkRsa, createSignedJwtToken } from './JoseOps';\nimport { getServiceAccount } from './cloud/ServiceAccountOps';\n\nconst adminClientPassword = 'doesnotmatter';\nconst redirectUrlTemplate = '/platform/appAuthHelperRedirect.html';\n\nconst cloudIdmAdminScopes = 'openid fr:idm:* fr:idc:esv:*';\nconst forgeopsIdmAdminScopes = 'openid fr:idm:*';\nconst serviceAccountScopes = 'fr:am:* fr:idm:* fr:idc:esv:*';\n\nlet adminClientId = 'idmAdminClient';\n\n/**\n * Helper function to get cookie name\n * @returns {String} cookie name\n */\nasync function determineCookieName() {\n try {\n const data = await getServerInfo();\n debugMessage(\n `AuthenticateOps.getCookieName: cookieName=${data.cookieName}`\n );\n return data.cookieName;\n } catch (error) {\n printMessage(`Error getting cookie name: ${error}`, 'error');\n debugMessage(error.stack);\n return null;\n }\n}\n\n/**\n * Helper function to determine if this is a setup mfa prompt in the ID Cloud tenant admin login journey\n * @param {Object} payload response from the previous authentication journey step\n * @returns {Object} an object indicating if 2fa is required and the original payload\n */\nfunction checkAndHandle2FA(payload) {\n // let skippable = false;\n if ('callbacks' in payload) {\n for (const element of payload.callbacks) {\n if (element.type === 'HiddenValueCallback') {\n if (element.input[0].value.includes('skip')) {\n // skippable = true;\n element.input[0].value = 'Skip';\n return {\n need2fa: true,\n payload,\n };\n }\n }\n if (element.type === 'NameCallback') {\n if (element.output[0].value.includes('code')) {\n // skippable = false;\n printMessage('2FA is enabled and required for this user...');\n const code = readlineSync.question(`${element.output[0].value}: `);\n element.input[0].value = code;\n return {\n need2fa: true,\n payload,\n };\n }\n }\n }\n // console.info(\"NO2FA\");\n return {\n need2fa: false,\n payload,\n };\n }\n // console.info(\"NO2FA\");\n return {\n need2fa: false,\n payload,\n };\n}\n\n/**\n * Helper function to set the default realm by deployment type\n * @param {string} deploymentType deployment type\n */\nfunction determineDefaultRealm(deploymentType: string) {\n if (\n !state.getRealm() ||\n state.getRealm() === globalConfig.DEFAULT_REALM_KEY\n ) {\n state.setRealm(globalConfig.DEPLOYMENT_TYPE_REALM_MAP[deploymentType]);\n }\n}\n\n/**\n * Helper function to determine the deployment type\n * @returns {Promise<string>} deployment type\n */\nasync function determineDeploymentType(): Promise<string> {\n const cookieValue = state.getCookieValue();\n // https://bugster.forgerock.org/jira/browse/FRAAS-13018\n // There is a chance that this will be blocked due to security concerns and thus is probably best not to keep active\n // if (!cookieValue && getUseBearerTokenForAmApis()) {\n // const token = await getTokenInfo();\n // cookieValue = token.sessionToken;\n // setCookieValue(cookieValue);\n // }\n\n // if we are using a service account, we know it's cloud\n if (state.getUseBearerTokenForAmApis())\n return globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;\n\n const fidcClientId = 'idmAdminClient';\n const forgeopsClientId = 'idm-admin-ui';\n\n const verifier = encodeBase64Url(randomBytes(32));\n const challenge = encodeBase64Url(\n createHash('sha256').update(verifier).digest()\n );\n const challengeMethod = 'S256';\n const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);\n\n const config = {\n maxRedirects: 0,\n headers: {\n [state.getCookieName()]: state.getCookieValue(),\n },\n };\n let bodyFormData = `redirect_uri=${redirectURL}&scope=${cloudIdmAdminScopes}&response_type=code&client_id=${fidcClientId}&csrf=${cookieValue}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;\n\n let deploymentType = globalConfig.CLASSIC_DEPLOYMENT_TYPE_KEY;\n try {\n await authorize(bodyFormData, config);\n } catch (e) {\n // debugMessage(e.response);\n if (\n e.response?.status === 302 &&\n e.response.headers?.location?.indexOf('code=') > -1\n ) {\n verboseMessage(`ForgeRock Identity Cloud`['brightCyan'] + ` detected.`);\n deploymentType = globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;\n } else {\n try {\n bodyFormData = `redirect_uri=${redirectURL}&scope=${forgeopsIdmAdminScopes}&response_type=code&client_id=${forgeopsClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;\n await authorize(bodyFormData, config);\n } catch (ex) {\n if (\n ex.response?.status === 302 &&\n ex.response.headers?.location?.indexOf('code=') > -1\n ) {\n adminClientId = forgeopsClientId;\n verboseMessage(`ForgeOps deployment`['brightCyan'] + ` detected.`);\n deploymentType = globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY;\n } else {\n verboseMessage(`Classic deployment`['brightCyan'] + ` detected.`);\n }\n }\n }\n }\n return deploymentType;\n}\n\n/**\n * Helper function to extract the semantic version string from a version info object\n * @param {Object} versionInfo version info object\n * @returns {String} semantic version\n */\nasync function getSemanticVersion(versionInfo) {\n if ('version' in versionInfo) {\n const versionString = versionInfo.version;\n const rx = /([\\d]\\.[\\d]\\.[\\d](\\.[\\d])*)/g;\n const version = versionString.match(rx);\n return version[0];\n }\n throw new Error('Cannot extract semantic version from version info object.');\n}\n\n/**\n * Helper function to authenticate and obtain and store session cookie\n * @returns {string} Session token or null\n */\nasync function authenticate(\n username: string,\n password: string\n): Promise<string> {\n const config = {\n headers: {\n 'X-OpenAM-Username': username,\n 'X-OpenAM-Password': password,\n },\n };\n const response1 = await step({}, config);\n const skip2FA = checkAndHandle2FA(response1);\n let response2 = {};\n if (skip2FA.need2fa) {\n response2 = await step(skip2FA.payload);\n } else {\n response2 = skip2FA.payload;\n }\n if ('tokenId' in response2) {\n return response2['tokenId'] as string;\n }\n return null;\n}\n\n/**\n * Helper function to obtain an oauth2 authorization code\n * @param {string} redirectURL oauth2 redirect uri\n * @param {string} codeChallenge PKCE code challenge\n * @param {string} codeChallengeMethod PKCE code challenge method\n * @returns {string} oauth2 authorization code or null\n */\nasync function getAuthCode(redirectURL, codeChallenge, codeChallengeMethod) {\n try {\n const bodyFormData = `redirect_uri=${redirectURL}&scope=${\n state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY\n ? cloudIdmAdminScopes\n : forgeopsIdmAdminScopes\n }&response_type=code&client_id=${adminClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${codeChallenge}&code_challenge_method=${codeChallengeMethod}`;\n const config = {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n maxRedirects: 0,\n };\n let response = undefined;\n try {\n response = await authorize(bodyFormData, config);\n } catch (error) {\n response = error.response;\n }\n if (response.status < 200 || response.status > 399) {\n printMessage('error getting auth code', 'error');\n printMessage(\n 'likely cause: mismatched parameters with OAuth client config',\n 'error'\n );\n return null;\n }\n const redirectLocationURL = response.headers?.location;\n const queryObject = url.parse(redirectLocationURL, true).query;\n if ('code' in queryObject) {\n return queryObject.code;\n }\n printMessage('auth code not found', 'error');\n return null;\n } catch (error) {\n printMessage(`error getting auth code - ${error.message}`, 'error');\n printMessage(error.response?.data, 'error');\n debugMessage(error.stack);\n return null;\n }\n}\n\n/**\n * Helper function to obtain oauth2 access token\n * @returns {Promise<string | null>} access token or null\n */\nasync function getAccessTokenForUser(): Promise<string | null> {\n debugMessage(`AuthenticateOps.getAccessTokenForUser: start`);\n try {\n const verifier = encodeBase64Url(randomBytes(32));\n const challenge = encodeBase64Url(\n createHash('sha256').update(verifier).digest()\n );\n const challengeMethod = 'S256';\n const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);\n const authCode = await getAuthCode(redirectURL, challenge, challengeMethod);\n if (authCode == null) {\n printMessage('error getting auth code', 'error');\n return null;\n }\n let response = null;\n if (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY) {\n const config = {\n auth: {\n username: adminClientId,\n password: adminClientPassword,\n },\n };\n const bodyFormData = `redirect_uri=${redirectURL}&grant_type=authorization_code&code=${authCode}&code_verifier=${verifier}`;\n response = await accessToken(bodyFormData, config);\n } else {\n const bodyFormData = `client_id=${adminClientId}&redirect_uri=${redirectURL}&grant_type=authorization_code&code=${authCode}&code_verifier=${verifier}`;\n response = await accessToken(bodyFormData);\n }\n if ('access_token' in response.data) {\n debugMessage(`AuthenticateOps.getAccessTokenForUser: end with token`);\n return response.data.access_token;\n }\n printMessage('No access token in response.', 'error');\n } catch (error) {\n debugMessage(`Error getting access token for user: ${error}`);\n debugMessage(error.response?.data);\n }\n debugMessage(`AuthenticateOps.getAccessTokenForUser: end without token`);\n return null;\n}\n\nfunction createPayload(serviceAccountId: string) {\n const u = parseUrl(state.getHost());\n const aud = `${u.origin}:${\n u.port ? u.port : u.protocol === 'https' ? '443' : '80'\n }${u.pathname}/oauth2/access_token`;\n\n // Cross platform way of setting JWT expiry time 3 minutes in the future, expressed as number of seconds since EPOCH\n const exp = Math.floor(new Date().getTime() / 1000 + 180);\n\n // A unique ID for the JWT which is required when requesting the openid scope\n const jti = v4();\n\n const iss = serviceAccountId;\n const sub = serviceAccountId;\n\n // Create the payload for our bearer token\n const payload = { iss, sub, aud, exp, jti };\n\n return payload;\n}\n\n/**\n * Get access token for service account\n * @param {string} serviceAccountId UUID of service account\n * @param {JwkRsa} jwk Java Wek Key\n * @returns {string | null} Access token or null\n */\nexport async function getAccessTokenForServiceAccount(\n serviceAccountId: string,\n jwk: JwkRsa\n): Promise<string | null> {\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: start`);\n const payload = createPayload(serviceAccountId);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: payload:`);\n debugMessage(payload);\n const jwt = await createSignedJwtToken(payload, jwk);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: jwt:`);\n debugMessage(jwt);\n const bodyFormData = `assertion=${jwt}&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=${serviceAccountScopes}`;\n const response = await accessToken(bodyFormData);\n if ('access_token' in response.data) {\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: token:`);\n debugMessage(response.data.access_token);\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);\n return response.data.access_token;\n }\n debugMessage(\n `AuthenticateOps.getAccessTokenForServiceAccount: No access token in response.`\n );\n debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);\n return null;\n}\n\nasync function determineDeploymentTypeAndDefaultRealmAndVersion() {\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: start`\n );\n if (!state.getDeploymentType()) {\n state.setDeploymentType(await determineDeploymentType());\n }\n determineDefaultRealm(state.getDeploymentType());\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: realm=${state.getRealm()}, type=${state.getDeploymentType()}`\n );\n\n const versionInfo = await getServerVersionInfo();\n\n // https://github.com/rockcarver/frodo-cli/issues/109\n debugMessage(`Full version: ${versionInfo.fullVersion}`);\n\n const version = await getSemanticVersion(versionInfo);\n state.setAmVersion(version);\n debugMessage(\n `AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: end`\n );\n}\n\nasync function getLoggedInSubject(): Promise<string> {\n let subjectString = `user ${state.getUsername()}`;\n if (state.getUseBearerTokenForAmApis()) {\n const name = (await getServiceAccount(state.getServiceAccountId())).name;\n subjectString = `service account ${name} [${state.getServiceAccountId()}]`;\n }\n return subjectString;\n}\n\n/**\n * Get tokens\n * @param {boolean} forceLoginAsUser true to force login as user even if a service account is available (default: false)\n * @returns {Promise<boolean>} true if tokens were successfully obtained, false otherwise\n */\nexport async function getTokens(forceLoginAsUser = false): Promise<boolean> {\n debugMessage(`AuthenticateOps.getTokens: start`);\n if (!state.getHost()) {\n printMessage(\n `No host specified and FRODO_HOST env variable not set!`,\n 'error'\n );\n return false;\n }\n try {\n // if username/password on cli are empty, try to read from connections.json\n if (\n state.getUsername() == null &&\n state.getPassword() == null &&\n !state.getServiceAccountId() &&\n !state.getServiceAccountJwk()\n ) {\n const conn = await getConnectionProfile();\n if (conn) {\n state.setHost(conn.tenant);\n state.setUsername(conn.username);\n state.setPassword(conn.password);\n state.setAuthenticationService(conn.authenticationService);\n state.setAuthenticationHeaderOverrides(\n conn.authenticationHeaderOverrides\n );\n state.setServiceAccountId(conn.svcacctId);\n state.setServiceAccountJwk(conn.svcacctJwk);\n } else {\n return false;\n }\n }\n // now that we have the full tenant URL we can lookup the cookie name\n state.setCookieName(await determineCookieName());\n\n // use service account to login?\n if (\n !forceLoginAsUser &&\n state.getServiceAccountId() &&\n state.getServiceAccountJwk()\n ) {\n debugMessage(\n `AuthenticateOps.getTokens: Authenticating with service account ${state.getServiceAccountId()}`\n );\n try {\n const token = await getAccessTokenForServiceAccount(\n state.getServiceAccountId(),\n state.getServiceAccountJwk()\n );\n state.setBearerToken(token);\n state.setUseBearerTokenForAmApis(true);\n await determineDeploymentTypeAndDefaultRealmAndVersion();\n } catch (saErr) {\n debugMessage(saErr.response?.data || saErr);\n throw new Error(\n `Service account login error: ${\n saErr.response?.data?.error_description ||\n saErr.response?.data?.message ||\n saErr\n }`\n );\n }\n }\n // use user account to login\n else if (state.getUsername() && state.getPassword()) {\n debugMessage(\n `AuthenticateOps.getTokens: Authenticating with user account ${state.getUsername()}`\n );\n const token = await authenticate(\n state.getUsername(),\n state.getPassword()\n );\n if (token) state.setCookieValue(token);\n await determineDeploymentTypeAndDefaultRealmAndVersion();\n if (\n state.getCookieValue() &&\n !state.getBearerToken() &&\n (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY ||\n state.getDeploymentType() ===\n globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY)\n ) {\n const accessToken = await getAccessTokenForUser();\n if (accessToken) state.setBearerToken(accessToken);\n }\n }\n // incomplete or no credentials\n else {\n printMessage(`Incomplete or no credentials!`, 'error');\n return false;\n }\n if (\n state.getCookieValue() ||\n (state.getUseBearerTokenForAmApis() && state.getBearerToken())\n ) {\n // https://github.com/rockcarver/frodo-cli/issues/102\n printMessage(\n `Connected to ${state.getHost()} [${\n state.getRealm() ? state.getRealm() : 'root'\n }] as ${await getLoggedInSubject()}`,\n 'info'\n );\n debugMessage(`AuthenticateOps.getTokens: end with tokens`);\n return true;\n }\n } catch (error) {\n // regular error\n printMessage(error.message, 'error');\n // axios error am api\n printMessage(error.response?.data?.message, 'error');\n // axios error am oauth2 api\n printMessage(error.response?.data?.error_description, 'error');\n // axios error data\n debugMessage(error.response?.data);\n // stack trace\n debugMessage(error.stack || new Error().stack);\n }\n debugMessage(`AuthenticateOps.getTokens: end without tokens`);\n return false;\n}\n"]}
|