@rockcarver/frodo-cli 0.18.2-7 → 0.18.2-9
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 +12 -1
- package/esm/app.js +2 -2
- package/esm/app.js.map +1 -1
- package/esm/cli/_template/something-delete.js +7 -4
- package/esm/cli/_template/something-delete.js.map +1 -1
- package/esm/cli/_template/something-describe.js +7 -4
- package/esm/cli/_template/something-describe.js.map +1 -1
- package/esm/cli/_template/something-else-delete.js +7 -4
- package/esm/cli/_template/something-else-delete.js.map +1 -1
- package/esm/cli/_template/something-else-describe.js +7 -4
- package/esm/cli/_template/something-else-describe.js.map +1 -1
- package/esm/cli/_template/something-else-export.js +7 -4
- package/esm/cli/_template/something-else-export.js.map +1 -1
- package/esm/cli/_template/something-else-import.js +7 -4
- package/esm/cli/_template/something-else-import.js.map +1 -1
- package/esm/cli/_template/something-else-list.js +7 -4
- package/esm/cli/_template/something-else-list.js.map +1 -1
- package/esm/cli/_template/something-else.js.map +1 -1
- package/esm/cli/_template/something-export.js +7 -4
- package/esm/cli/_template/something-export.js.map +1 -1
- package/esm/cli/_template/something-import.js +7 -4
- package/esm/cli/_template/something-import.js.map +1 -1
- package/esm/cli/_template/something-list.js +7 -4
- package/esm/cli/_template/something-list.js.map +1 -1
- package/esm/cli/_template/something-other-delete.js +7 -4
- package/esm/cli/_template/something-other-delete.js.map +1 -1
- package/esm/cli/_template/something-other-describe.js +7 -4
- package/esm/cli/_template/something-other-describe.js.map +1 -1
- package/esm/cli/_template/something-other-export.js +7 -4
- package/esm/cli/_template/something-other-export.js.map +1 -1
- package/esm/cli/_template/something-other-import.js +7 -4
- package/esm/cli/_template/something-other-import.js.map +1 -1
- package/esm/cli/_template/something-other-list.js +7 -4
- package/esm/cli/_template/something-other-list.js.map +1 -1
- package/esm/cli/_template/something-other.js.map +1 -1
- package/esm/cli/_template/something.js +0 -2
- package/esm/cli/_template/something.js.map +1 -1
- package/esm/cli/admin/admin-add-autoid-static-user-mapping.js +5 -3
- package/esm/cli/admin/admin-add-autoid-static-user-mapping.js.map +1 -1
- package/esm/cli/admin/admin-create-oauth2-client-with-admin-privileges.js +7 -11
- package/esm/cli/admin/admin-create-oauth2-client-with-admin-privileges.js.map +1 -1
- package/esm/cli/admin/admin-get-access-token.js +5 -3
- package/esm/cli/admin/admin-get-access-token.js.map +1 -1
- package/esm/cli/admin/admin-grant-oauth2-client-admin-privileges.js +5 -3
- package/esm/cli/admin/admin-grant-oauth2-client-admin-privileges.js.map +1 -1
- package/esm/cli/admin/admin-hide-generic-extension-attributes.js +5 -3
- package/esm/cli/admin/admin-hide-generic-extension-attributes.js.map +1 -1
- package/esm/cli/admin/admin-list-oauth2-clients-with-admin-privileges.js +5 -3
- package/esm/cli/admin/admin-list-oauth2-clients-with-admin-privileges.js.map +1 -1
- package/esm/cli/admin/admin-list-oauth2-clients-with-custom-privileges.js +5 -3
- package/esm/cli/admin/admin-list-oauth2-clients-with-custom-privileges.js.map +1 -1
- package/esm/cli/admin/admin-list-static-user-mappings.js +5 -3
- package/esm/cli/admin/admin-list-static-user-mappings.js.map +1 -1
- package/esm/cli/admin/admin-remove-static-user-mapping.js +5 -3
- package/esm/cli/admin/admin-remove-static-user-mapping.js.map +1 -1
- package/esm/cli/admin/admin-repair-org-model.js +5 -3
- package/esm/cli/admin/admin-repair-org-model.js.map +1 -1
- package/esm/cli/admin/admin-revoke-oauth2-client-admin-privileges.js +5 -3
- package/esm/cli/admin/admin-revoke-oauth2-client-admin-privileges.js.map +1 -1
- package/esm/cli/admin/admin-show-generic-extension-attributes.js +5 -3
- package/esm/cli/admin/admin-show-generic-extension-attributes.js.map +1 -1
- package/esm/cli/admin/admin.js +0 -2
- package/esm/cli/admin/admin.js.map +1 -1
- package/esm/cli/agent/agent-delete.js +9 -7
- package/esm/cli/agent/agent-delete.js.map +1 -1
- package/esm/cli/agent/agent-describe.js +7 -4
- package/esm/cli/agent/agent-describe.js.map +1 -1
- package/esm/cli/agent/agent-export.js +11 -6
- package/esm/cli/agent/agent-export.js.map +1 -1
- package/esm/cli/agent/agent-gateway-delete.js +9 -7
- package/esm/cli/agent/agent-gateway-delete.js.map +1 -1
- package/esm/cli/agent/agent-gateway-describe.js +7 -4
- package/esm/cli/agent/agent-gateway-describe.js.map +1 -1
- package/esm/cli/agent/agent-gateway-export.js +11 -6
- package/esm/cli/agent/agent-gateway-export.js.map +1 -1
- package/esm/cli/agent/agent-gateway-import.js +13 -7
- package/esm/cli/agent/agent-gateway-import.js.map +1 -1
- package/esm/cli/agent/agent-gateway-list.js +5 -3
- package/esm/cli/agent/agent-gateway-list.js.map +1 -1
- package/esm/cli/agent/agent-gateway.js.map +1 -1
- package/esm/cli/agent/agent-import.js +13 -7
- package/esm/cli/agent/agent-import.js.map +1 -1
- package/esm/cli/agent/agent-java-delete.js +9 -7
- package/esm/cli/agent/agent-java-delete.js.map +1 -1
- package/esm/cli/agent/agent-java-describe.js +7 -4
- package/esm/cli/agent/agent-java-describe.js.map +1 -1
- package/esm/cli/agent/agent-java-export.js +11 -6
- package/esm/cli/agent/agent-java-export.js.map +1 -1
- package/esm/cli/agent/agent-java-import.js +13 -7
- package/esm/cli/agent/agent-java-import.js.map +1 -1
- package/esm/cli/agent/agent-java-list.js +5 -3
- package/esm/cli/agent/agent-java-list.js.map +1 -1
- package/esm/cli/agent/agent-java.js.map +1 -1
- package/esm/cli/agent/agent-list.js +5 -3
- package/esm/cli/agent/agent-list.js.map +1 -1
- package/esm/cli/agent/agent-web-delete.js +9 -7
- package/esm/cli/agent/agent-web-delete.js.map +1 -1
- package/esm/cli/agent/agent-web-describe.js +7 -4
- package/esm/cli/agent/agent-web-describe.js.map +1 -1
- package/esm/cli/agent/agent-web-export.js +11 -6
- package/esm/cli/agent/agent-web-export.js.map +1 -1
- package/esm/cli/agent/agent-web-import.js +13 -7
- package/esm/cli/agent/agent-web-import.js.map +1 -1
- package/esm/cli/agent/agent-web-list.js +5 -3
- package/esm/cli/agent/agent-web-list.js.map +1 -1
- package/esm/cli/agent/agent-web.js.map +1 -1
- package/esm/cli/agent/agent.js +0 -2
- package/esm/cli/agent/agent.js.map +1 -1
- package/esm/cli/app/app-delete.js +7 -4
- package/esm/cli/app/app-delete.js.map +1 -1
- package/esm/cli/app/app-describe.js +7 -4
- package/esm/cli/app/app-describe.js.map +1 -1
- package/esm/cli/app/app-export.js +11 -6
- package/esm/cli/app/app-export.js.map +1 -1
- package/esm/cli/app/app-import.js +9 -5
- package/esm/cli/app/app-import.js.map +1 -1
- package/esm/cli/app/app-list.js +5 -3
- package/esm/cli/app/app-list.js.map +1 -1
- package/esm/cli/app/app.js +8 -5
- package/esm/cli/app/app.js.map +1 -1
- package/esm/cli/cmd_common.js +2 -1
- package/esm/cli/cmd_common.js.map +1 -1
- package/esm/cli/conn/conn-add.js +5 -5
- package/esm/cli/conn/conn-add.js.map +1 -1
- package/esm/cli/conn/conn-delete.js +5 -2
- package/esm/cli/conn/conn-delete.js.map +1 -1
- package/esm/cli/conn/conn-describe.js +5 -2
- package/esm/cli/conn/conn-describe.js.map +1 -1
- package/esm/cli/conn/conn-list.js +7 -3
- package/esm/cli/conn/conn-list.js.map +1 -1
- package/esm/cli/conn/conn.js +2 -3
- package/esm/cli/conn/conn.js.map +1 -1
- package/esm/cli/email/email-template-export.js +13 -12
- package/esm/cli/email/email-template-export.js.map +1 -1
- package/esm/cli/email/email-template-import.js +15 -14
- package/esm/cli/email/email-template-import.js.map +1 -1
- package/esm/cli/email/email-template-list.js +7 -7
- package/esm/cli/email/email-template-list.js.map +1 -1
- package/esm/cli/email/email-template.js.map +1 -1
- package/esm/cli/email/email.js +0 -2
- package/esm/cli/email/email.js.map +1 -1
- package/esm/cli/esv/esv-apply.js +9 -11
- package/esm/cli/esv/esv-apply.js.map +1 -1
- package/esm/cli/esv/esv-secret-create.js +5 -3
- package/esm/cli/esv/esv-secret-create.js.map +1 -1
- package/esm/cli/esv/esv-secret-delete.js +9 -5
- package/esm/cli/esv/esv-secret-delete.js.map +1 -1
- package/esm/cli/esv/esv-secret-describe.js +5 -3
- package/esm/cli/esv/esv-secret-describe.js.map +1 -1
- package/esm/cli/esv/esv-secret-export.js +7 -4
- package/esm/cli/esv/esv-secret-export.js.map +1 -1
- package/esm/cli/esv/esv-secret-import.js +7 -4
- package/esm/cli/esv/esv-secret-import.js.map +1 -1
- package/esm/cli/esv/esv-secret-list.js +5 -3
- package/esm/cli/esv/esv-secret-list.js.map +1 -1
- package/esm/cli/esv/esv-secret-set.js +5 -3
- package/esm/cli/esv/esv-secret-set.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-activate.js +7 -4
- package/esm/cli/esv/esv-secret-version-activate.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-create.js +5 -3
- package/esm/cli/esv/esv-secret-version-create.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-deactivate.js +7 -4
- package/esm/cli/esv/esv-secret-version-deactivate.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-delete.js +7 -4
- package/esm/cli/esv/esv-secret-version-delete.js.map +1 -1
- package/esm/cli/esv/esv-secret-version-list.js +5 -3
- package/esm/cli/esv/esv-secret-version-list.js.map +1 -1
- package/esm/cli/esv/esv-secret-version.js.map +1 -1
- package/esm/cli/esv/esv-secret.js +4 -1
- package/esm/cli/esv/esv-secret.js.map +1 -1
- package/esm/cli/esv/esv-variable-create.js +5 -3
- package/esm/cli/esv/esv-variable-create.js.map +1 -1
- package/esm/cli/esv/esv-variable-delete.js +9 -5
- package/esm/cli/esv/esv-variable-delete.js.map +1 -1
- package/esm/cli/esv/esv-variable-describe.js +5 -3
- package/esm/cli/esv/esv-variable-describe.js.map +1 -1
- package/esm/cli/esv/esv-variable-export.js +7 -4
- package/esm/cli/esv/esv-variable-export.js.map +1 -1
- package/esm/cli/esv/esv-variable-import.js +7 -4
- package/esm/cli/esv/esv-variable-import.js.map +1 -1
- package/esm/cli/esv/esv-variable-list.js +5 -3
- package/esm/cli/esv/esv-variable-list.js.map +1 -1
- package/esm/cli/esv/esv-variable-set.js +7 -4
- package/esm/cli/esv/esv-variable-set.js.map +1 -1
- package/esm/cli/esv/esv-variable.js +4 -1
- package/esm/cli/esv/esv-variable.js.map +1 -1
- package/esm/cli/esv/esv.js +0 -2
- package/esm/cli/esv/esv.js.map +1 -1
- package/esm/cli/idm/idm-count.js +5 -3
- package/esm/cli/idm/idm-count.js.map +1 -1
- package/esm/cli/idm/idm-export.js +11 -6
- package/esm/cli/idm/idm-export.js.map +1 -1
- package/esm/cli/idm/idm-import.js +11 -6
- package/esm/cli/idm/idm-import.js.map +1 -1
- package/esm/cli/idm/idm-list.js +7 -4
- package/esm/cli/idm/idm-list.js.map +1 -1
- package/esm/cli/idm/idm.js +2 -3
- package/esm/cli/idm/idm.js.map +1 -1
- package/esm/cli/idp/idp-export.js +11 -6
- package/esm/cli/idp/idp-export.js.map +1 -1
- package/esm/cli/idp/idp-import.js +13 -7
- package/esm/cli/idp/idp-import.js.map +1 -1
- package/esm/cli/idp/idp-list.js +7 -4
- package/esm/cli/idp/idp-list.js.map +1 -1
- package/esm/cli/idp/idp.js +0 -2
- package/esm/cli/idp/idp.js.map +1 -1
- package/esm/cli/info/info.js +0 -5
- package/esm/cli/info/info.js.map +1 -1
- package/esm/cli/journey/journey-delete.e2e.test_.js.map +1 -1
- package/esm/cli/journey/journey-delete.js +9 -5
- package/esm/cli/journey/journey-delete.js.map +1 -1
- package/esm/cli/journey/journey-describe.js +31 -28
- package/esm/cli/journey/journey-describe.js.map +1 -1
- package/esm/cli/journey/journey-disable.js +9 -6
- package/esm/cli/journey/journey-disable.js.map +1 -1
- package/esm/cli/journey/journey-enable.js +9 -6
- package/esm/cli/journey/journey-enable.js.map +1 -1
- package/esm/cli/journey/journey-export.js +11 -6
- package/esm/cli/journey/journey-export.js.map +1 -1
- package/esm/cli/journey/journey-import.js +13 -7
- package/esm/cli/journey/journey-import.js.map +1 -1
- package/esm/cli/journey/journey-list.e2e.test_.js.map +1 -1
- package/esm/cli/journey/journey-list.js +5 -3
- package/esm/cli/journey/journey-list.js.map +1 -1
- package/esm/cli/journey/journey-prune.js +5 -5
- package/esm/cli/journey/journey-prune.js.map +1 -1
- package/esm/cli/journey/journey.js +0 -2
- package/esm/cli/journey/journey.js.map +1 -1
- package/esm/cli/logging/logs-fetch.js +2 -11
- package/esm/cli/logging/logs-fetch.js.map +1 -1
- package/esm/cli/logging/logs-list.js +0 -5
- package/esm/cli/logging/logs-list.js.map +1 -1
- package/esm/cli/logging/logs-tail.js +0 -4
- package/esm/cli/logging/logs-tail.js.map +1 -1
- package/esm/cli/logging/logs.js +2 -4
- package/esm/cli/logging/logs.js.map +1 -1
- package/esm/cli/realm/realm-add-custom-domain.js +5 -3
- package/esm/cli/realm/realm-add-custom-domain.js.map +1 -1
- package/esm/cli/realm/realm-describe.js +5 -3
- package/esm/cli/realm/realm-describe.js.map +1 -1
- package/esm/cli/realm/realm-list.js +5 -3
- package/esm/cli/realm/realm-list.js.map +1 -1
- package/esm/cli/realm/realm-remove-custom-domain.js +5 -3
- package/esm/cli/realm/realm-remove-custom-domain.js.map +1 -1
- package/esm/cli/realm/realm.js +5 -4
- package/esm/cli/realm/realm.js.map +1 -1
- package/esm/cli/saml/saml-cot-export.js +11 -6
- package/esm/cli/saml/saml-cot-export.js.map +1 -1
- package/esm/cli/saml/saml-cot-import.js +13 -7
- package/esm/cli/saml/saml-cot-import.js.map +1 -1
- package/esm/cli/saml/saml-cot-list.js +5 -3
- package/esm/cli/saml/saml-cot-list.js.map +1 -1
- package/esm/cli/saml/saml-cot.js.map +1 -1
- package/esm/cli/saml/saml-delete.js +11 -6
- package/esm/cli/saml/saml-delete.js.map +1 -1
- package/esm/cli/saml/saml-describe.js +5 -3
- package/esm/cli/saml/saml-describe.js.map +1 -1
- package/esm/cli/saml/saml-export.js +13 -7
- package/esm/cli/saml/saml-export.js.map +1 -1
- package/esm/cli/saml/saml-import.js +13 -7
- package/esm/cli/saml/saml-import.js.map +1 -1
- package/esm/cli/saml/saml-list.js +5 -3
- package/esm/cli/saml/saml-list.js.map +1 -1
- package/esm/cli/saml/saml-metadata-export.js +7 -4
- package/esm/cli/saml/saml-metadata-export.js.map +1 -1
- package/esm/cli/saml/saml-metadata.js.map +1 -1
- package/esm/cli/saml/saml.js +0 -2
- package/esm/cli/saml/saml.js.map +1 -1
- package/esm/cli/script/script-delete.js +7 -4
- package/esm/cli/script/script-delete.js.map +1 -1
- package/esm/cli/script/script-describe.js +7 -4
- package/esm/cli/script/script-describe.js.map +1 -1
- package/esm/cli/script/script-export.js +15 -8
- package/esm/cli/script/script-export.js.map +1 -1
- package/esm/cli/script/script-import.js +7 -4
- package/esm/cli/script/script-import.js.map +1 -1
- package/esm/cli/script/script-list.js +5 -3
- package/esm/cli/script/script-list.js.map +1 -1
- package/esm/cli/script/script.js +6 -4
- package/esm/cli/script/script.js.map +1 -1
- package/esm/cli/service/service-delete.js +0 -1
- package/esm/cli/service/service-delete.js.map +1 -1
- package/esm/cli/service/service-export.js +11 -6
- package/esm/cli/service/service-export.js.map +1 -1
- package/esm/cli/service/service-import.js +13 -6
- package/esm/cli/service/service-import.js.map +1 -1
- package/esm/cli/service/service-list.js +0 -1
- package/esm/cli/service/service-list.js.map +1 -1
- package/esm/cli/service/service.js +0 -2
- package/esm/cli/service/service.js.map +1 -1
- package/esm/cli/theme/theme-delete.e2e.test_.js.map +1 -1
- package/esm/cli/theme/theme-delete.js +16 -14
- package/esm/cli/theme/theme-delete.js.map +1 -1
- package/esm/cli/theme/theme-export.js +17 -15
- package/esm/cli/theme/theme-export.js.map +1 -1
- package/esm/cli/theme/theme-import.js +19 -17
- package/esm/cli/theme/theme-import.js.map +1 -1
- package/esm/cli/theme/theme-list.e2e.test_.js.map +1 -1
- package/esm/cli/theme/theme-list.js +7 -7
- package/esm/cli/theme/theme-list.js.map +1 -1
- package/esm/cli/theme/theme.js +0 -2
- package/esm/cli/theme/theme.js.map +1 -1
- package/esm/ops/AgentOps.js +48 -126
- package/esm/ops/AgentOps.js.map +1 -1
- package/esm/ops/CirclesOfTrustOps.js +2 -2
- package/esm/ops/CirclesOfTrustOps.js.map +1 -1
- package/esm/ops/EmailTemplateOps.js +270 -6
- package/esm/ops/EmailTemplateOps.js.map +1 -1
- package/esm/ops/IdpOps.js +2 -2
- package/esm/ops/IdpOps.js.map +1 -1
- package/esm/ops/JourneyOps.js +96 -152
- package/esm/ops/JourneyOps.js.map +1 -1
- package/esm/ops/NodeOps.js +6 -12
- package/esm/ops/NodeOps.js.map +1 -1
- package/esm/ops/Saml2Ops.js +25 -78
- package/esm/ops/Saml2Ops.js.map +1 -1
- package/esm/ops/Saml2Ops.test_.js.map +1 -1
- package/esm/ops/ScriptOps.js +3 -3
- package/esm/ops/ScriptOps.js.map +1 -1
- package/esm/ops/ServiceOps.js +10 -31
- package/esm/ops/ServiceOps.js.map +1 -1
- package/esm/ops/ThemeOps.js +331 -2
- package/esm/ops/ThemeOps.js.map +1 -1
- package/esm/ops/utils/Wordwrap.js.map +1 -1
- package/esm/storage/StaticStorage.js.map +1 -1
- package/esm/utils/Config.js +0 -9
- package/esm/utils/Config.js.map +1 -1
- package/esm/utils/Console.js +32 -79
- package/esm/utils/Console.js.map +1 -1
- package/esm/utils/ExportImportUtils.js +46 -0
- package/esm/utils/ExportImportUtils.js.map +1 -0
- package/esm/utils/Version.js +6 -24
- package/esm/utils/Version.js.map +1 -1
- package/package.json +18 -17
package/esm/ops/Saml2Ops.js
CHANGED
|
@@ -25,81 +25,74 @@ const {
|
|
|
25
25
|
saveToFile,
|
|
26
26
|
validateImport
|
|
27
27
|
} = ExportImportUtils;
|
|
28
|
+
|
|
28
29
|
/**
|
|
29
30
|
* Get a one-line description of the saml2 provider object
|
|
30
31
|
* @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe
|
|
31
32
|
* @returns {string} a one-line description
|
|
32
33
|
*/
|
|
33
|
-
|
|
34
34
|
export function getOneLineDescription(saml2ProviderObj) {
|
|
35
35
|
const roles = [];
|
|
36
|
-
|
|
37
36
|
for (const [key, value] of Object.entries(roleMap)) {
|
|
38
37
|
if (saml2ProviderObj[key]) {
|
|
39
38
|
roles.push(value);
|
|
40
39
|
}
|
|
41
40
|
}
|
|
42
|
-
|
|
43
41
|
const description = `[${saml2ProviderObj.entityId['brightCyan']}]${' (' + saml2ProviderObj.entityLocation}${roles.length ? ' ' + roles.join(', ') + ')' : ')'}`;
|
|
44
42
|
return description;
|
|
45
43
|
}
|
|
44
|
+
|
|
46
45
|
/**
|
|
47
46
|
* Get markdown table header
|
|
48
47
|
* @returns {string} markdown table header
|
|
49
48
|
*/
|
|
50
|
-
|
|
51
49
|
export function getTableHeaderMd() {
|
|
52
50
|
let markdown = '';
|
|
53
51
|
markdown += '| Entity Id | Location | Role(s) |\n';
|
|
54
52
|
markdown += '| --------- | -------- | ------- |';
|
|
55
53
|
return markdown;
|
|
56
54
|
}
|
|
55
|
+
|
|
57
56
|
/**
|
|
58
57
|
* Get a table-row of the saml2 provider in markdown
|
|
59
58
|
* @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe
|
|
60
59
|
* @returns {string} a table-row of the saml2 provider in markdown
|
|
61
60
|
*/
|
|
62
|
-
|
|
63
61
|
export function getTableRowMd(saml2ProviderObj) {
|
|
64
62
|
const roles = [];
|
|
65
|
-
|
|
66
63
|
for (const [key, value] of Object.entries(roleMap)) {
|
|
67
64
|
if (saml2ProviderObj[key]) {
|
|
68
65
|
roles.push(value);
|
|
69
66
|
}
|
|
70
67
|
}
|
|
71
|
-
|
|
72
68
|
const row = `| ${saml2ProviderObj.entityId} | ${saml2ProviderObj.entityLocation} | ${roles.length ? roles.join(', ') : ''} |`;
|
|
73
69
|
return row;
|
|
74
70
|
}
|
|
71
|
+
|
|
75
72
|
/**
|
|
76
73
|
* List entity providers
|
|
77
74
|
* @param {boolean} long Long list format with details
|
|
78
75
|
*/
|
|
79
|
-
|
|
80
76
|
export async function listSaml2Providers(long = false) {
|
|
81
77
|
const providerList = await getSaml2ProviderStubs();
|
|
82
78
|
providerList.sort((a, b) => a._id.localeCompare(b._id));
|
|
83
|
-
|
|
84
79
|
if (!long) {
|
|
85
80
|
for (const provider of providerList) {
|
|
86
81
|
printMessage(`${provider.entityId}`, 'data');
|
|
87
82
|
}
|
|
88
83
|
} else {
|
|
89
84
|
const table = createTable(['Entity Id'['brightCyan'], 'Location'['brightCyan'], 'Role(s)'['brightCyan']]);
|
|
90
|
-
|
|
91
85
|
for (const provider of providerList) {
|
|
92
86
|
table.push([provider.entityId, provider.location, provider.roles.map(role => roleMap[role]).join(', ')]);
|
|
93
87
|
}
|
|
94
|
-
|
|
95
88
|
printMessage(table.toString());
|
|
96
89
|
}
|
|
97
90
|
}
|
|
91
|
+
|
|
98
92
|
/**
|
|
99
93
|
* Describe an entity provider's configuration
|
|
100
94
|
* @param {String} entityId Provider entity id
|
|
101
95
|
*/
|
|
102
|
-
|
|
103
96
|
export async function describeSaml2Provider(entityId) {
|
|
104
97
|
try {
|
|
105
98
|
const stub = await getSaml2ProviderStub(entityId);
|
|
@@ -121,21 +114,18 @@ export async function describeSaml2Provider(entityId) {
|
|
|
121
114
|
printMessage(error.message, 'error');
|
|
122
115
|
}
|
|
123
116
|
}
|
|
117
|
+
|
|
124
118
|
/**
|
|
125
119
|
* Export provider metadata to file
|
|
126
120
|
* @param {String} entityId Provider entity id
|
|
127
121
|
* @param {String} file Optional filename
|
|
128
122
|
*/
|
|
129
|
-
|
|
130
123
|
export async function exportSaml2MetadataToFile(entityId, file = null) {
|
|
131
124
|
let fileName = file;
|
|
132
|
-
|
|
133
125
|
if (!fileName) {
|
|
134
126
|
fileName = getTypedFilename(entityId, 'metadata', 'xml');
|
|
135
127
|
}
|
|
136
|
-
|
|
137
128
|
createProgressBar(1, `Exporting metadata for: ${entityId}`);
|
|
138
|
-
|
|
139
129
|
try {
|
|
140
130
|
updateProgressBar(`Writing file ${fileName}`);
|
|
141
131
|
const metaData = await getProviderMetadata(entityId);
|
|
@@ -146,20 +136,18 @@ export async function exportSaml2MetadataToFile(entityId, file = null) {
|
|
|
146
136
|
printMessage(error, 'error');
|
|
147
137
|
}
|
|
148
138
|
}
|
|
139
|
+
|
|
149
140
|
/**
|
|
150
141
|
* Export a single entity provider to file
|
|
151
142
|
* @param {String} entityId Provider entity id
|
|
152
143
|
* @param {String} file Optional filename
|
|
153
144
|
*/
|
|
154
|
-
|
|
155
145
|
export async function exportSaml2ProviderToFile(entityId, file = null) {
|
|
156
146
|
debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: start [entityId=${entityId}, file=${file}]`);
|
|
157
147
|
let fileName = file;
|
|
158
|
-
|
|
159
148
|
if (!fileName) {
|
|
160
149
|
fileName = getTypedFilename(entityId, 'saml');
|
|
161
150
|
}
|
|
162
|
-
|
|
163
151
|
try {
|
|
164
152
|
createProgressBar(1, `Exporting provider ${entityId}`);
|
|
165
153
|
const fileData = await exportSaml2Provider(entityId);
|
|
@@ -169,70 +157,60 @@ export async function exportSaml2ProviderToFile(entityId, file = null) {
|
|
|
169
157
|
stopProgressBar(`${err}`);
|
|
170
158
|
printMessage(err, 'error');
|
|
171
159
|
}
|
|
172
|
-
|
|
173
160
|
debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: end [entityId=${entityId}, file=${fileName}]`);
|
|
174
161
|
}
|
|
162
|
+
|
|
175
163
|
/**
|
|
176
164
|
* Export all entity providers to one file
|
|
177
165
|
* @param {String} file Optional filename
|
|
178
166
|
*/
|
|
179
|
-
|
|
180
167
|
export async function exportSaml2ProvidersToFile(file = null) {
|
|
181
168
|
debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: start [file=${file}]`);
|
|
182
169
|
let fileName = file;
|
|
183
|
-
|
|
184
170
|
if (!fileName) {
|
|
185
171
|
fileName = getTypedFilename(`all${getRealmString()}Providers`, 'saml');
|
|
186
172
|
}
|
|
187
|
-
|
|
188
173
|
try {
|
|
189
174
|
const exportData = await exportSaml2Providers();
|
|
190
175
|
saveJsonToFile(exportData, fileName);
|
|
191
176
|
} catch (error) {
|
|
192
177
|
var _error$response;
|
|
193
|
-
|
|
194
178
|
printMessage(error.message, 'error');
|
|
195
179
|
printMessage(`exportSaml2ProvidersToFile: ${(_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.status}`, 'error');
|
|
196
180
|
}
|
|
197
|
-
|
|
198
181
|
debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: end [file=${file}]`);
|
|
199
182
|
}
|
|
183
|
+
|
|
200
184
|
/**
|
|
201
185
|
* Export all entity providers to individual files
|
|
202
186
|
*/
|
|
203
|
-
|
|
204
187
|
export async function exportSaml2ProvidersToFiles() {
|
|
205
188
|
const stubs = await getSaml2ProviderStubs();
|
|
206
|
-
|
|
207
189
|
if (stubs.length > 0) {
|
|
208
190
|
createProgressBar(stubs.length, 'Exporting providers');
|
|
209
|
-
|
|
210
191
|
for (const stub of stubs) {
|
|
211
192
|
updateProgressBar(`Exporting provider ${stub.entityId}`);
|
|
212
193
|
const fileName = getTypedFilename(stub.entityId, 'saml');
|
|
213
194
|
const fileData = await exportSaml2Provider(stub.entityId);
|
|
214
195
|
saveJsonToFile(fileData, fileName);
|
|
215
196
|
}
|
|
216
|
-
|
|
217
197
|
stopProgressBar(`${stubs.length} providers exported.`);
|
|
218
198
|
} else {
|
|
219
199
|
printMessage('No entity providers found.', 'info');
|
|
220
200
|
}
|
|
221
201
|
}
|
|
202
|
+
|
|
222
203
|
/**
|
|
223
204
|
* Import a SAML entity provider by entity id from file
|
|
224
205
|
* @param {String} entityId Provider entity id
|
|
225
206
|
* @param {String} file Import file name
|
|
226
207
|
*/
|
|
227
|
-
|
|
228
208
|
export async function importSaml2ProviderFromFile(entityId, file) {
|
|
229
209
|
fs.readFile(file, 'utf8', async (err, data) => {
|
|
230
210
|
if (err) throw err;
|
|
231
211
|
const fileData = JSON.parse(data);
|
|
232
|
-
|
|
233
212
|
if (validateImport(fileData.meta)) {
|
|
234
213
|
showSpinner(`Importing ${entityId}...`);
|
|
235
|
-
|
|
236
214
|
try {
|
|
237
215
|
await importSaml2Provider(entityId, fileData);
|
|
238
216
|
stopSpinner(`Imported ${entityId}.`);
|
|
@@ -244,21 +222,19 @@ export async function importSaml2ProviderFromFile(entityId, file) {
|
|
|
244
222
|
}
|
|
245
223
|
});
|
|
246
224
|
}
|
|
225
|
+
|
|
247
226
|
/**
|
|
248
227
|
* Import a SAML entity provider by entity id from file
|
|
249
228
|
* @param {String} file Import file name
|
|
250
229
|
*/
|
|
251
|
-
|
|
252
230
|
export async function importFirstSaml2ProviderFromFile(file) {
|
|
253
231
|
fs.readFile(file, 'utf8', async (err, data) => {
|
|
254
232
|
if (err) throw err;
|
|
255
|
-
const fileData = JSON.parse(data);
|
|
256
|
-
|
|
233
|
+
const fileData = JSON.parse(data);
|
|
234
|
+
// pick the first provider and run with it
|
|
257
235
|
const entityId = Object.keys(fileData.saml.remote)[0] || Object.keys(fileData.saml.hosted)[0];
|
|
258
|
-
|
|
259
236
|
if (validateImport(fileData.meta)) {
|
|
260
237
|
showSpinner(`Importing ${entityId}...`);
|
|
261
|
-
|
|
262
238
|
try {
|
|
263
239
|
await importSaml2Provider(entityId, fileData);
|
|
264
240
|
stopSpinner(`Imported ${entityId}.`);
|
|
@@ -270,16 +246,15 @@ export async function importFirstSaml2ProviderFromFile(file) {
|
|
|
270
246
|
}
|
|
271
247
|
});
|
|
272
248
|
}
|
|
249
|
+
|
|
273
250
|
/**
|
|
274
251
|
* Import all SAML entity providers from file
|
|
275
252
|
* @param {String} file Import file name
|
|
276
253
|
*/
|
|
277
|
-
|
|
278
254
|
export async function importSaml2ProvidersFromFile(file) {
|
|
279
255
|
fs.readFile(file, 'utf8', async (err, data) => {
|
|
280
256
|
if (err) throw err;
|
|
281
257
|
const fileData = JSON.parse(data);
|
|
282
|
-
|
|
283
258
|
if (validateImport(fileData.meta)) {
|
|
284
259
|
await importSaml2Providers(fileData);
|
|
285
260
|
} else {
|
|
@@ -287,10 +262,10 @@ export async function importSaml2ProvidersFromFile(file) {
|
|
|
287
262
|
}
|
|
288
263
|
});
|
|
289
264
|
}
|
|
265
|
+
|
|
290
266
|
/**
|
|
291
267
|
* Import all SAML entity providers from all *.saml.json files in the current directory
|
|
292
268
|
*/
|
|
293
|
-
|
|
294
269
|
export async function importSaml2ProvidersFromFiles() {
|
|
295
270
|
const names = fs.readdirSync('.');
|
|
296
271
|
const jsonFiles = names.filter(name => name.toLowerCase().endsWith('.saml.json'));
|
|
@@ -301,11 +276,9 @@ export async function importSaml2ProvidersFromFiles() {
|
|
|
301
276
|
warnings: 0,
|
|
302
277
|
failures: 0
|
|
303
278
|
};
|
|
304
|
-
|
|
305
279
|
for (const file of jsonFiles) {
|
|
306
280
|
const data = fs.readFileSync(file, 'utf8');
|
|
307
281
|
const fileData = JSON.parse(data);
|
|
308
|
-
|
|
309
282
|
if (validateImport(fileData.meta)) {
|
|
310
283
|
const myStatus = await importSaml2Providers(fileData);
|
|
311
284
|
totalStatus.total += myStatus.total;
|
|
@@ -317,37 +290,32 @@ export async function importSaml2ProvidersFromFiles() {
|
|
|
317
290
|
printMessage(`Validation of ${file} failed!`, 'error');
|
|
318
291
|
}
|
|
319
292
|
}
|
|
320
|
-
|
|
321
293
|
stopProgressBar(`Imported ${totalStatus.successes} of ${totalStatus.total} provider(s) from ${jsonFiles.length} file(s).`);
|
|
322
294
|
}
|
|
295
|
+
|
|
323
296
|
/**
|
|
324
297
|
* List entity providers
|
|
325
298
|
*/
|
|
326
|
-
|
|
327
299
|
export async function listRawSaml2Providers() {
|
|
328
300
|
const providerList = (await getRawProviders()).result;
|
|
329
301
|
providerList.sort((a, b) => a._id.localeCompare(b._id));
|
|
330
|
-
|
|
331
302
|
for (const provider of providerList) {
|
|
332
303
|
printMessage(`${provider._id}`, 'data');
|
|
333
304
|
}
|
|
334
305
|
}
|
|
306
|
+
|
|
335
307
|
/**
|
|
336
308
|
* Exports a RAW SAML entity, which means the raw xml is included.
|
|
337
309
|
* @param {string} entityId Reference to the entity for export
|
|
338
310
|
* @param {string} file Optional filename for the exported file
|
|
339
311
|
*/
|
|
340
|
-
|
|
341
312
|
export async function exportRawSaml2ProviderToFile(entityId, file = null) {
|
|
342
313
|
printMessage(`Exporting raw SAML entity provider ${entityId}`, 'info');
|
|
343
314
|
let fileName = file;
|
|
344
|
-
|
|
345
315
|
if (!file) {
|
|
346
316
|
fileName = getTypedFilename(`${entityId}`, 'raw.saml');
|
|
347
317
|
}
|
|
348
|
-
|
|
349
318
|
createProgressBar(1, `Exporting raw entity provider: ${entityId}`);
|
|
350
|
-
|
|
351
319
|
try {
|
|
352
320
|
const rawData = await getRawProvider(entityId);
|
|
353
321
|
updateProgressBar(`Writing file ${fileName}`);
|
|
@@ -355,47 +323,41 @@ export async function exportRawSaml2ProviderToFile(entityId, file = null) {
|
|
|
355
323
|
stopProgressBar(`Exported raw entity provider ${entityId} to ${fileName}.`);
|
|
356
324
|
} catch (error) {
|
|
357
325
|
var _error$response2;
|
|
358
|
-
|
|
359
326
|
stopProgressBar(`Error exporting raw entity ${entityId}: ${error.message}`);
|
|
360
327
|
printMessage((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data, 'error');
|
|
361
328
|
}
|
|
362
329
|
}
|
|
330
|
+
|
|
363
331
|
/**
|
|
364
332
|
* Export all entity providers raw to one file
|
|
365
333
|
* @param {String} file Optional filename
|
|
366
334
|
*/
|
|
367
|
-
|
|
368
335
|
export async function exportRawSaml2ProvidersToFile(file = null) {
|
|
369
336
|
let fileName = file;
|
|
370
|
-
|
|
371
337
|
if (!fileName) {
|
|
372
338
|
fileName = getTypedFilename(`all${getRealmString()}ProvidersRaw`, 'raw.saml');
|
|
373
339
|
}
|
|
374
|
-
|
|
375
340
|
try {
|
|
376
341
|
const samlApplicationList = (await getRawProviders()).result;
|
|
377
342
|
saveToFile('application', samlApplicationList, '_id', fileName);
|
|
378
343
|
printMessage(`All RAW saml entity providers exported to: ${fileName}`, 'info');
|
|
379
344
|
} catch (error) {
|
|
380
345
|
var _error$response3;
|
|
381
|
-
|
|
382
346
|
printMessage(error.message, 'error');
|
|
383
347
|
printMessage(`exportRawSaml2ProvidersToFile: ${(_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : _error$response3.status}`, 'error');
|
|
384
348
|
}
|
|
385
349
|
}
|
|
350
|
+
|
|
386
351
|
/**
|
|
387
352
|
* Export all entity providers to individual files
|
|
388
353
|
*/
|
|
389
|
-
|
|
390
354
|
export async function exportRawSaml2ProvidersToFiles() {
|
|
391
355
|
const samlApplicationList = (await getRawProviders()).result;
|
|
392
356
|
let hasError = false;
|
|
393
357
|
createProgressBar(samlApplicationList.length, 'Exporting RAW providers');
|
|
394
358
|
let exportedAmount = 0;
|
|
395
|
-
|
|
396
359
|
for (const item of samlApplicationList) {
|
|
397
360
|
updateProgressBar(`Exporting provider ${item.entityId}`);
|
|
398
|
-
|
|
399
361
|
try {
|
|
400
362
|
const samlApplicationData = await getRawProvider(item._id);
|
|
401
363
|
const fileName = getTypedFilename(`${item._id}${getRealmString()}ProviderRaw`, 'raw.saml');
|
|
@@ -406,38 +368,33 @@ export async function exportRawSaml2ProvidersToFiles() {
|
|
|
406
368
|
printMessage(`Unable to export: ${item._id}`, 'error');
|
|
407
369
|
}
|
|
408
370
|
}
|
|
409
|
-
|
|
410
371
|
stopProgressBar(`${exportedAmount} providers exported.`);
|
|
411
|
-
|
|
412
372
|
if (!hasError) {
|
|
413
373
|
printMessage('All entities exported.', 'info');
|
|
414
374
|
} else {
|
|
415
375
|
printMessage('All other entities exported.', 'info');
|
|
416
376
|
}
|
|
417
377
|
}
|
|
378
|
+
|
|
418
379
|
/**
|
|
419
380
|
* Imports a raw SAML export file (containing one entity).
|
|
420
381
|
* @param {string} file The import file
|
|
421
382
|
*/
|
|
422
|
-
|
|
423
|
-
|
|
383
|
+
export async function importRawSaml2ProviderFromFile(
|
|
384
|
+
// entityId: string,
|
|
424
385
|
file) {
|
|
425
386
|
printMessage(`Importing SAML Entity ${file}...`, 'info');
|
|
426
|
-
|
|
427
387
|
if (file.indexOf('.raw.saml.json') > -1) {
|
|
428
388
|
const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
429
|
-
|
|
430
389
|
if (validateImport(samlEntityData.meta)) {
|
|
431
390
|
for (const id in samlEntityData.application) {
|
|
432
391
|
// remove the "_rev" data before PUT
|
|
433
392
|
delete samlEntityData.application[id]._rev;
|
|
434
|
-
|
|
435
393
|
try {
|
|
436
394
|
await putRawProvider(id, samlEntityData.application[id]);
|
|
437
395
|
} catch (error) {
|
|
438
396
|
printMessage(`Unable to import: ${id}`, 'error');
|
|
439
397
|
}
|
|
440
|
-
|
|
441
398
|
printMessage(`Imported ${id}`, 'info');
|
|
442
399
|
}
|
|
443
400
|
} else {
|
|
@@ -445,28 +402,24 @@ file) {
|
|
|
445
402
|
}
|
|
446
403
|
}
|
|
447
404
|
}
|
|
405
|
+
|
|
448
406
|
/**
|
|
449
407
|
* Import first raw SAML entity provider from file
|
|
450
408
|
* @param {String} file Import file name
|
|
451
409
|
*/
|
|
452
|
-
|
|
453
410
|
export async function importFirstRawSaml2ProviderFromFile(file) {
|
|
454
411
|
printMessage(`Importing SAML Entity ${file}...`, 'info');
|
|
455
|
-
|
|
456
412
|
if (file.indexOf('.raw.saml.json') > -1) {
|
|
457
413
|
const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
458
|
-
|
|
459
414
|
if (validateImport(samlEntityData.meta)) {
|
|
460
415
|
for (const id in samlEntityData.application) {
|
|
461
416
|
// remove the "_rev" data before PUT
|
|
462
417
|
delete samlEntityData.application[id]._rev;
|
|
463
|
-
|
|
464
418
|
try {
|
|
465
419
|
await putRawProvider(id, samlEntityData.application[id]);
|
|
466
420
|
} catch (error) {
|
|
467
421
|
printMessage(`Unable to import: ${id}`, 'error');
|
|
468
422
|
}
|
|
469
|
-
|
|
470
423
|
printMessage(`Imported ${id}`, 'info');
|
|
471
424
|
return;
|
|
472
425
|
}
|
|
@@ -475,26 +428,23 @@ export async function importFirstRawSaml2ProviderFromFile(file) {
|
|
|
475
428
|
}
|
|
476
429
|
}
|
|
477
430
|
}
|
|
431
|
+
|
|
478
432
|
/**
|
|
479
433
|
* Imports the RAW provider info from a single file.
|
|
480
434
|
* @param file Import file name
|
|
481
435
|
*/
|
|
482
|
-
|
|
483
436
|
export async function importRawSaml2ProvidersFromFile(file) {
|
|
484
437
|
fs.readFile(file, 'utf8', async function (err, data) {
|
|
485
438
|
if (err) throw err;
|
|
486
439
|
const samlEntityData = JSON.parse(data);
|
|
487
440
|
let amountOfEntities = 0;
|
|
488
|
-
|
|
489
441
|
for (const id in samlEntityData.application) {
|
|
490
442
|
if (id.length) {
|
|
491
443
|
amountOfEntities++;
|
|
492
444
|
}
|
|
493
445
|
}
|
|
494
|
-
|
|
495
446
|
if (validateImport(samlEntityData.meta)) {
|
|
496
447
|
createProgressBar(amountOfEntities, 'Importing providers...');
|
|
497
|
-
|
|
498
448
|
for (const id in samlEntityData.application) {
|
|
499
449
|
// remove the "_rev" data before PUT
|
|
500
450
|
delete samlEntityData.application[id]._rev;
|
|
@@ -505,30 +455,27 @@ export async function importRawSaml2ProvidersFromFile(file) {
|
|
|
505
455
|
});
|
|
506
456
|
updateProgressBar(`Imported ${id}...`);
|
|
507
457
|
}
|
|
508
|
-
|
|
509
458
|
stopProgressBar(`Import done`);
|
|
510
459
|
} else {
|
|
511
460
|
printMessage('Import validation failed...', 'error');
|
|
512
461
|
}
|
|
513
462
|
});
|
|
514
463
|
}
|
|
464
|
+
|
|
515
465
|
/**
|
|
516
466
|
* Whenever the SAML RAW file were exported using the exportRAW functionality this function
|
|
517
467
|
* is used to read them back in. Only files with the .samlRaw.json extension will be imported.
|
|
518
468
|
* @param {string} directory The directory from which to import the files
|
|
519
469
|
*/
|
|
520
|
-
|
|
521
470
|
export async function importRawSaml2ProvidersFromFiles(directory) {
|
|
522
471
|
const files = fs.readdirSync(directory);
|
|
523
472
|
const filesToImport = files.filter(file => file.indexOf('.samlRaw.json') > -1);
|
|
524
|
-
|
|
525
473
|
if (filesToImport.length > 0) {
|
|
526
474
|
createProgressBar(filesToImport.length, 'Importing providers...');
|
|
527
475
|
filesToImport.forEach(async file => {
|
|
528
476
|
const filePathAbsolute = path.join(directory, file);
|
|
529
477
|
filesToImport.push(file);
|
|
530
478
|
const samlEntityData = JSON.parse(fs.readFileSync(filePathAbsolute, 'utf8'));
|
|
531
|
-
|
|
532
479
|
if (validateImport(samlEntityData.meta)) {
|
|
533
480
|
for (const id in samlEntityData.application) {
|
|
534
481
|
// remove the "_rev" data before PUT
|
package/esm/ops/Saml2Ops.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Saml2Ops.js","names":["fs","path","Saml2","ExportImportUtils","createObjectTable","createProgressBar","createTable","debugMessage","printMessage","showSpinner","stopProgressBar","stopSpinner","updateProgressBar","roleMap","exportSaml2Provider","exportSaml2Providers","getSaml2ProviderStubs","getProviderByLocationAndId","getProviderMetadata","getProviderMetadataUrl","getSaml2ProviderStub","getRawProviders","getRawProvider","importSaml2Provider","importSaml2Providers","putRawProvider","getTypedFilename","saveJsonToFile","saveTextToFile","getRealmString","saveToFile","validateImport","getOneLineDescription","saml2ProviderObj","roles","key","value","Object","entries","push","description","entityId","entityLocation","length","join","getTableHeaderMd","markdown","getTableRowMd","row","listSaml2Providers","long","providerList","sort","a","b","_id","localeCompare","provider","table","location","map","role","toString","describeSaml2Provider","stub","id","rawProviderData","_rev","metadataUrl","error","message","exportSaml2MetadataToFile","file","fileName","metaData","brightCyan","exportSaml2ProviderToFile","fileData","err","exportSaml2ProvidersToFile","exportData","response","status","exportSaml2ProvidersToFiles","stubs","importSaml2ProviderFromFile","readFile","data","JSON","parse","meta","importFirstSaml2ProviderFromFile","keys","saml","remote","hosted","importSaml2ProvidersFromFile","importSaml2ProvidersFromFiles","names","readdirSync","jsonFiles","filter","name","toLowerCase","endsWith","totalStatus","total","successes","warnings","failures","readFileSync","myStatus","listRawSaml2Providers","result","exportRawSaml2ProviderToFile","rawData","stringify","exportRawSaml2ProvidersToFile","samlApplicationList","exportRawSaml2ProvidersToFiles","hasError","exportedAmount","item","samlApplicationData","importRawSaml2ProviderFromFile","indexOf","samlEntityData","application","importFirstRawSaml2ProviderFromFile","importRawSaml2ProvidersFromFile","amountOfEntities","then","importRawSaml2ProvidersFromFiles","directory","files","filesToImport","forEach","filePathAbsolute"],"sources":["ops/Saml2Ops.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { Saml2ProviderSkeleton } from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport { Saml2, ExportImportUtils } from '@rockcarver/frodo-lib';\nimport {\n MultiOpStatusInterface,\n Saml2ExportInterface,\n} from '@rockcarver/frodo-lib/types/ops/OpsTypes';\nimport {\n createObjectTable,\n createProgressBar,\n createTable,\n debugMessage,\n printMessage,\n showSpinner,\n stopProgressBar,\n stopSpinner,\n updateProgressBar,\n} from '../utils/Console';\n\nconst {\n roleMap,\n exportSaml2Provider,\n exportSaml2Providers,\n getSaml2ProviderStubs,\n getProviderByLocationAndId,\n getProviderMetadata,\n getProviderMetadataUrl,\n getSaml2ProviderStub,\n getRawProviders,\n getRawProvider,\n importSaml2Provider,\n importSaml2Providers,\n putRawProvider,\n} = Saml2;\nconst {\n getTypedFilename,\n saveJsonToFile,\n saveTextToFile,\n getRealmString,\n saveToFile,\n validateImport,\n} = ExportImportUtils;\n\n/**\n * Get a one-line description of the saml2 provider object\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n saml2ProviderObj: Saml2ProviderSkeleton\n): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const description = `[${saml2ProviderObj.entityId['brightCyan']}]${\n ' (' + saml2ProviderObj.entityLocation\n }${roles.length ? ' ' + roles.join(', ') + ')' : ')'}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Entity Id | Location | Role(s) |\\n';\n markdown += '| --------- | -------- | ------- |';\n return markdown;\n}\n\n/**\n * Get a table-row of the saml2 provider in markdown\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a table-row of the saml2 provider in markdown\n */\nexport function getTableRowMd(saml2ProviderObj: Saml2ProviderSkeleton): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const row = `| ${saml2ProviderObj.entityId} | ${\n saml2ProviderObj.entityLocation\n } | ${roles.length ? roles.join(', ') : ''} |`;\n return row;\n}\n\n/**\n * List entity providers\n * @param {boolean} long Long list format with details\n */\nexport async function listSaml2Providers(long = false) {\n const providerList = await getSaml2ProviderStubs();\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n if (!long) {\n for (const provider of providerList) {\n printMessage(`${provider.entityId}`, 'data');\n }\n } else {\n const table = createTable([\n 'Entity Id'['brightCyan'],\n 'Location'['brightCyan'],\n 'Role(s)'['brightCyan'],\n ]);\n for (const provider of providerList) {\n table.push([\n provider.entityId,\n provider.location,\n provider.roles.map((role) => roleMap[role]).join(', '),\n ]);\n }\n printMessage(table.toString());\n }\n}\n\n/**\n * Describe an entity provider's configuration\n * @param {String} entityId Provider entity id\n */\nexport async function describeSaml2Provider(entityId) {\n try {\n const stub = await getSaml2ProviderStub(entityId);\n printMessage(stub);\n const { location } = stub;\n const id = stub._id;\n const roles = stub.roles.map((role: string) => roleMap[role]).join(', ');\n const rawProviderData = await getProviderByLocationAndId(location, id);\n delete rawProviderData._id;\n delete rawProviderData._rev;\n rawProviderData.location = location;\n rawProviderData.roles = roles;\n rawProviderData.metadataUrl = getProviderMetadataUrl(entityId);\n const table = createObjectTable(rawProviderData);\n printMessage(table.toString());\n } catch (error) {\n printMessage(error.message, 'error');\n }\n}\n\n/**\n * Export provider metadata to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2MetadataToFile(entityId, file = null) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'metadata', 'xml');\n }\n createProgressBar(1, `Exporting metadata for: ${entityId}`);\n try {\n updateProgressBar(`Writing file ${fileName}`);\n const metaData = await getProviderMetadata(entityId);\n saveTextToFile(metaData, fileName);\n stopProgressBar(\n `Exported ${entityId.brightCyan} metadata to ${fileName.brightCyan}.`\n );\n } catch (error) {\n stopProgressBar(`${error}`);\n printMessage(error, 'error');\n }\n}\n\n/**\n * Export a single entity provider to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProviderToFile(entityId, file = null) {\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: start [entityId=${entityId}, file=${file}]`\n );\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'saml');\n }\n try {\n createProgressBar(1, `Exporting provider ${entityId}`);\n const fileData = await exportSaml2Provider(entityId);\n saveJsonToFile(fileData, fileName);\n stopProgressBar(\n `Exported ${entityId.brightCyan} to ${fileName.brightCyan}.`\n );\n } catch (err) {\n stopProgressBar(`${err}`);\n printMessage(err, 'error');\n }\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: end [entityId=${entityId}, file=${fileName}]`\n );\n}\n\n/**\n * Export all entity providers to one file\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProvidersToFile(file = null) {\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: start [file=${file}]`);\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Providers`, 'saml');\n }\n try {\n const exportData = await exportSaml2Providers();\n saveJsonToFile(exportData, fileName);\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: end [file=${file}]`);\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportSaml2ProvidersToFiles() {\n const stubs = await getSaml2ProviderStubs();\n if (stubs.length > 0) {\n createProgressBar(stubs.length, 'Exporting providers');\n for (const stub of stubs) {\n updateProgressBar(`Exporting provider ${stub.entityId}`);\n const fileName = getTypedFilename(stub.entityId, 'saml');\n const fileData = await exportSaml2Provider(stub.entityId);\n saveJsonToFile(fileData, fileName);\n }\n stopProgressBar(`${stubs.length} providers exported.`);\n } else {\n printMessage('No entity providers found.', 'info');\n }\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} entityId Provider entity id\n * @param {String} file Import file name\n */\nexport async function importSaml2ProviderFromFile(\n entityId: string,\n file: string\n) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n stopSpinner(`Imported ${entityId}.`);\n } catch (error) {\n stopSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} file Import file name\n */\nexport async function importFirstSaml2ProviderFromFile(file: string) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data) as Saml2ExportInterface;\n // pick the first provider and run with it\n const entityId =\n Object.keys(fileData.saml.remote)[0] ||\n Object.keys(fileData.saml.hosted)[0];\n if (validateImport(fileData.meta)) {\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n stopSpinner(`Imported ${entityId}.`);\n } catch (error) {\n stopSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import all SAML entity providers from file\n * @param {String} file Import file name\n */\nexport async function importSaml2ProvidersFromFile(file: string) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n await importSaml2Providers(fileData);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import all SAML entity providers from all *.saml.json files in the current directory\n */\nexport async function importSaml2ProvidersFromFiles() {\n const names = fs.readdirSync('.');\n const jsonFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.saml.json')\n );\n createProgressBar(jsonFiles.length, 'Importing providers...');\n const totalStatus: MultiOpStatusInterface = {\n total: 0,\n successes: 0,\n warnings: 0,\n failures: 0,\n };\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n const myStatus = await importSaml2Providers(fileData);\n totalStatus.total += myStatus.total;\n totalStatus.successes += myStatus.successes;\n totalStatus.warnings += myStatus.warnings;\n totalStatus.failures += myStatus.failures;\n updateProgressBar(\n `Imported ${myStatus.successes}/${myStatus.total} provider(s) from ${file}.`\n );\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressBar(\n `Imported ${totalStatus.successes} of ${totalStatus.total} provider(s) from ${jsonFiles.length} file(s).`\n );\n}\n\n/**\n * List entity providers\n */\nexport async function listRawSaml2Providers() {\n const providerList = (await getRawProviders()).result;\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n for (const provider of providerList) {\n printMessage(`${provider._id}`, 'data');\n }\n}\n\n/**\n * Exports a RAW SAML entity, which means the raw xml is included.\n * @param {string} entityId Reference to the entity for export\n * @param {string} file Optional filename for the exported file\n */\nexport async function exportRawSaml2ProviderToFile(entityId, file = null) {\n printMessage(`Exporting raw SAML entity provider ${entityId}`, 'info');\n let fileName = file;\n if (!file) {\n fileName = getTypedFilename(`${entityId}`, 'raw.saml');\n }\n createProgressBar(1, `Exporting raw entity provider: ${entityId}`);\n try {\n const rawData = await getRawProvider(entityId);\n updateProgressBar(`Writing file ${fileName}`);\n saveTextToFile(JSON.stringify(rawData, null, 2), fileName);\n stopProgressBar(`Exported raw entity provider ${entityId} to ${fileName}.`);\n } catch (error) {\n stopProgressBar(`Error exporting raw entity ${entityId}: ${error.message}`);\n printMessage(error.response?.data, 'error');\n }\n}\n\n/**\n * Export all entity providers raw to one file\n * @param {String} file Optional filename\n */\nexport async function exportRawSaml2ProvidersToFile(file = null) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(\n `all${getRealmString()}ProvidersRaw`,\n 'raw.saml'\n );\n }\n try {\n const samlApplicationList = (await getRawProviders()).result;\n\n saveToFile('application', samlApplicationList, '_id', fileName);\n printMessage(\n `All RAW saml entity providers exported to: ${fileName}`,\n 'info'\n );\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportRawSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportRawSaml2ProvidersToFiles() {\n const samlApplicationList = (await getRawProviders()).result;\n let hasError = false;\n createProgressBar(samlApplicationList.length, 'Exporting RAW providers');\n let exportedAmount = 0;\n for (const item of samlApplicationList) {\n updateProgressBar(`Exporting provider ${item.entityId}`);\n try {\n const samlApplicationData = await getRawProvider(item._id);\n const fileName = getTypedFilename(\n `${item._id}${getRealmString()}ProviderRaw`,\n 'raw.saml'\n );\n saveToFile('application', [samlApplicationData], '_id', fileName);\n exportedAmount++;\n } catch (error) {\n hasError = true;\n printMessage(`Unable to export: ${item._id}`, 'error');\n }\n }\n stopProgressBar(`${exportedAmount} providers exported.`);\n if (!hasError) {\n printMessage('All entities exported.', 'info');\n } else {\n printMessage('All other entities exported.', 'info');\n }\n}\n\n/**\n * Imports a raw SAML export file (containing one entity).\n * @param {string} file The import file\n */\nexport async function importRawSaml2ProviderFromFile(\n // entityId: string,\n file: string\n) {\n printMessage(`Importing SAML Entity ${file}...`, 'info');\n if (file.indexOf('.raw.saml.json') > -1) {\n const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n try {\n await putRawProvider(id, samlEntityData.application[id]);\n } catch (error) {\n printMessage(`Unable to import: ${id}`, 'error');\n }\n printMessage(`Imported ${id}`, 'info');\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n }\n}\n\n/**\n * Import first raw SAML entity provider from file\n * @param {String} file Import file name\n */\nexport async function importFirstRawSaml2ProviderFromFile(file) {\n printMessage(`Importing SAML Entity ${file}...`, 'info');\n if (file.indexOf('.raw.saml.json') > -1) {\n const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n try {\n await putRawProvider(id, samlEntityData.application[id]);\n } catch (error) {\n printMessage(`Unable to import: ${id}`, 'error');\n }\n printMessage(`Imported ${id}`, 'info');\n return;\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n }\n}\n\n/**\n * Imports the RAW provider info from a single file.\n * @param file Import file name\n */\nexport async function importRawSaml2ProvidersFromFile(file: string) {\n fs.readFile(file, 'utf8', async function (err, data) {\n if (err) throw err;\n const samlEntityData = JSON.parse(data);\n let amountOfEntities = 0;\n for (const id in samlEntityData.application) {\n if (id.length) {\n amountOfEntities++;\n }\n }\n if (validateImport(samlEntityData.meta)) {\n createProgressBar(amountOfEntities, 'Importing providers...');\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n await putRawProvider(id, samlEntityData.application[id]).then(\n (result) => {\n if (result === null) {\n printMessage(`Import validation failed for ${id}`, 'error');\n }\n }\n );\n updateProgressBar(`Imported ${id}...`);\n }\n stopProgressBar(`Import done`);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Whenever the SAML RAW file were exported using the exportRAW functionality this function\n * is used to read them back in. Only files with the .samlRaw.json extension will be imported.\n * @param {string} directory The directory from which to import the files\n */\nexport async function importRawSaml2ProvidersFromFiles(directory) {\n const files = fs.readdirSync(directory);\n const filesToImport = files.filter(\n (file) => file.indexOf('.samlRaw.json') > -1\n );\n\n if (filesToImport.length > 0) {\n createProgressBar(filesToImport.length, 'Importing providers...');\n filesToImport.forEach(async (file) => {\n const filePathAbsolute = path.join(directory, file);\n filesToImport.push(file);\n const samlEntityData = JSON.parse(\n fs.readFileSync(filePathAbsolute, 'utf8')\n );\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n await putRawProvider(id, samlEntityData.application[id]).then(\n (result) => {\n if (result === null) {\n printMessage(`Import validation failed for ${id}`, 'error');\n }\n }\n );\n updateProgressBar(`Imported ${id}...`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n stopProgressBar(`Import done`);\n } else {\n printMessage(\n 'Import failed, no files to import. (check extension to be .samlRaw.json)',\n 'warn'\n );\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Saml2Ops.js","names":["fs","path","Saml2","ExportImportUtils","createObjectTable","createProgressBar","createTable","debugMessage","printMessage","showSpinner","stopProgressBar","stopSpinner","updateProgressBar","roleMap","exportSaml2Provider","exportSaml2Providers","getSaml2ProviderStubs","getProviderByLocationAndId","getProviderMetadata","getProviderMetadataUrl","getSaml2ProviderStub","getRawProviders","getRawProvider","importSaml2Provider","importSaml2Providers","putRawProvider","getTypedFilename","saveJsonToFile","saveTextToFile","getRealmString","saveToFile","validateImport","getOneLineDescription","saml2ProviderObj","roles","key","value","Object","entries","push","description","entityId","entityLocation","length","join","getTableHeaderMd","markdown","getTableRowMd","row","listSaml2Providers","long","providerList","sort","a","b","_id","localeCompare","provider","table","location","map","role","toString","describeSaml2Provider","stub","id","rawProviderData","_rev","metadataUrl","error","message","exportSaml2MetadataToFile","file","fileName","metaData","brightCyan","exportSaml2ProviderToFile","fileData","err","exportSaml2ProvidersToFile","exportData","response","status","exportSaml2ProvidersToFiles","stubs","importSaml2ProviderFromFile","readFile","data","JSON","parse","meta","importFirstSaml2ProviderFromFile","keys","saml","remote","hosted","importSaml2ProvidersFromFile","importSaml2ProvidersFromFiles","names","readdirSync","jsonFiles","filter","name","toLowerCase","endsWith","totalStatus","total","successes","warnings","failures","readFileSync","myStatus","listRawSaml2Providers","result","exportRawSaml2ProviderToFile","rawData","stringify","exportRawSaml2ProvidersToFile","samlApplicationList","exportRawSaml2ProvidersToFiles","hasError","exportedAmount","item","samlApplicationData","importRawSaml2ProviderFromFile","indexOf","samlEntityData","application","importFirstRawSaml2ProviderFromFile","importRawSaml2ProvidersFromFile","amountOfEntities","then","importRawSaml2ProvidersFromFiles","directory","files","filesToImport","forEach","filePathAbsolute"],"sources":["ops/Saml2Ops.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { Saml2ProviderSkeleton } from '@rockcarver/frodo-lib/types/api/ApiTypes';\nimport { Saml2, ExportImportUtils } from '@rockcarver/frodo-lib';\nimport {\n MultiOpStatusInterface,\n Saml2ExportInterface,\n} from '@rockcarver/frodo-lib/types/ops/OpsTypes';\nimport {\n createObjectTable,\n createProgressBar,\n createTable,\n debugMessage,\n printMessage,\n showSpinner,\n stopProgressBar,\n stopSpinner,\n updateProgressBar,\n} from '../utils/Console';\n\nconst {\n roleMap,\n exportSaml2Provider,\n exportSaml2Providers,\n getSaml2ProviderStubs,\n getProviderByLocationAndId,\n getProviderMetadata,\n getProviderMetadataUrl,\n getSaml2ProviderStub,\n getRawProviders,\n getRawProvider,\n importSaml2Provider,\n importSaml2Providers,\n putRawProvider,\n} = Saml2;\nconst {\n getTypedFilename,\n saveJsonToFile,\n saveTextToFile,\n getRealmString,\n saveToFile,\n validateImport,\n} = ExportImportUtils;\n\n/**\n * Get a one-line description of the saml2 provider object\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a one-line description\n */\nexport function getOneLineDescription(\n saml2ProviderObj: Saml2ProviderSkeleton\n): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const description = `[${saml2ProviderObj.entityId['brightCyan']}]${\n ' (' + saml2ProviderObj.entityLocation\n }${roles.length ? ' ' + roles.join(', ') + ')' : ')'}`;\n return description;\n}\n\n/**\n * Get markdown table header\n * @returns {string} markdown table header\n */\nexport function getTableHeaderMd(): string {\n let markdown = '';\n markdown += '| Entity Id | Location | Role(s) |\\n';\n markdown += '| --------- | -------- | ------- |';\n return markdown;\n}\n\n/**\n * Get a table-row of the saml2 provider in markdown\n * @param {Saml2ProviderSkeleton} saml2ProviderObj saml2 provider object to describe\n * @returns {string} a table-row of the saml2 provider in markdown\n */\nexport function getTableRowMd(saml2ProviderObj: Saml2ProviderSkeleton): string {\n const roles: string[] = [];\n for (const [key, value] of Object.entries(roleMap)) {\n if (saml2ProviderObj[key]) {\n roles.push(value);\n }\n }\n const row = `| ${saml2ProviderObj.entityId} | ${\n saml2ProviderObj.entityLocation\n } | ${roles.length ? roles.join(', ') : ''} |`;\n return row;\n}\n\n/**\n * List entity providers\n * @param {boolean} long Long list format with details\n */\nexport async function listSaml2Providers(long = false) {\n const providerList = await getSaml2ProviderStubs();\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n if (!long) {\n for (const provider of providerList) {\n printMessage(`${provider.entityId}`, 'data');\n }\n } else {\n const table = createTable([\n 'Entity Id'['brightCyan'],\n 'Location'['brightCyan'],\n 'Role(s)'['brightCyan'],\n ]);\n for (const provider of providerList) {\n table.push([\n provider.entityId,\n provider.location,\n provider.roles.map((role) => roleMap[role]).join(', '),\n ]);\n }\n printMessage(table.toString());\n }\n}\n\n/**\n * Describe an entity provider's configuration\n * @param {String} entityId Provider entity id\n */\nexport async function describeSaml2Provider(entityId) {\n try {\n const stub = await getSaml2ProviderStub(entityId);\n printMessage(stub);\n const { location } = stub;\n const id = stub._id;\n const roles = stub.roles.map((role: string) => roleMap[role]).join(', ');\n const rawProviderData = await getProviderByLocationAndId(location, id);\n delete rawProviderData._id;\n delete rawProviderData._rev;\n rawProviderData.location = location;\n rawProviderData.roles = roles;\n rawProviderData.metadataUrl = getProviderMetadataUrl(entityId);\n const table = createObjectTable(rawProviderData);\n printMessage(table.toString());\n } catch (error) {\n printMessage(error.message, 'error');\n }\n}\n\n/**\n * Export provider metadata to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2MetadataToFile(entityId, file = null) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'metadata', 'xml');\n }\n createProgressBar(1, `Exporting metadata for: ${entityId}`);\n try {\n updateProgressBar(`Writing file ${fileName}`);\n const metaData = await getProviderMetadata(entityId);\n saveTextToFile(metaData, fileName);\n stopProgressBar(\n `Exported ${entityId.brightCyan} metadata to ${fileName.brightCyan}.`\n );\n } catch (error) {\n stopProgressBar(`${error}`);\n printMessage(error, 'error');\n }\n}\n\n/**\n * Export a single entity provider to file\n * @param {String} entityId Provider entity id\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProviderToFile(entityId, file = null) {\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: start [entityId=${entityId}, file=${file}]`\n );\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(entityId, 'saml');\n }\n try {\n createProgressBar(1, `Exporting provider ${entityId}`);\n const fileData = await exportSaml2Provider(entityId);\n saveJsonToFile(fileData, fileName);\n stopProgressBar(\n `Exported ${entityId.brightCyan} to ${fileName.brightCyan}.`\n );\n } catch (err) {\n stopProgressBar(`${err}`);\n printMessage(err, 'error');\n }\n debugMessage(\n `cli.Saml2Ops.exportSaml2ProviderToFile: end [entityId=${entityId}, file=${fileName}]`\n );\n}\n\n/**\n * Export all entity providers to one file\n * @param {String} file Optional filename\n */\nexport async function exportSaml2ProvidersToFile(file = null) {\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: start [file=${file}]`);\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(`all${getRealmString()}Providers`, 'saml');\n }\n try {\n const exportData = await exportSaml2Providers();\n saveJsonToFile(exportData, fileName);\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n debugMessage(`cli.Saml2Ops.exportSaml2ProviderToFile: end [file=${file}]`);\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportSaml2ProvidersToFiles() {\n const stubs = await getSaml2ProviderStubs();\n if (stubs.length > 0) {\n createProgressBar(stubs.length, 'Exporting providers');\n for (const stub of stubs) {\n updateProgressBar(`Exporting provider ${stub.entityId}`);\n const fileName = getTypedFilename(stub.entityId, 'saml');\n const fileData = await exportSaml2Provider(stub.entityId);\n saveJsonToFile(fileData, fileName);\n }\n stopProgressBar(`${stubs.length} providers exported.`);\n } else {\n printMessage('No entity providers found.', 'info');\n }\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} entityId Provider entity id\n * @param {String} file Import file name\n */\nexport async function importSaml2ProviderFromFile(\n entityId: string,\n file: string\n) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n stopSpinner(`Imported ${entityId}.`);\n } catch (error) {\n stopSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import a SAML entity provider by entity id from file\n * @param {String} file Import file name\n */\nexport async function importFirstSaml2ProviderFromFile(file: string) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data) as Saml2ExportInterface;\n // pick the first provider and run with it\n const entityId =\n Object.keys(fileData.saml.remote)[0] ||\n Object.keys(fileData.saml.hosted)[0];\n if (validateImport(fileData.meta)) {\n showSpinner(`Importing ${entityId}...`);\n try {\n await importSaml2Provider(entityId, fileData);\n stopSpinner(`Imported ${entityId}.`);\n } catch (error) {\n stopSpinner(`Error importing ${entityId}: ${error.message}`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import all SAML entity providers from file\n * @param {String} file Import file name\n */\nexport async function importSaml2ProvidersFromFile(file: string) {\n fs.readFile(file, 'utf8', async (err, data) => {\n if (err) throw err;\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n await importSaml2Providers(fileData);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Import all SAML entity providers from all *.saml.json files in the current directory\n */\nexport async function importSaml2ProvidersFromFiles() {\n const names = fs.readdirSync('.');\n const jsonFiles = names.filter((name) =>\n name.toLowerCase().endsWith('.saml.json')\n );\n createProgressBar(jsonFiles.length, 'Importing providers...');\n const totalStatus: MultiOpStatusInterface = {\n total: 0,\n successes: 0,\n warnings: 0,\n failures: 0,\n };\n for (const file of jsonFiles) {\n const data = fs.readFileSync(file, 'utf8');\n const fileData = JSON.parse(data);\n if (validateImport(fileData.meta)) {\n const myStatus = await importSaml2Providers(fileData);\n totalStatus.total += myStatus.total;\n totalStatus.successes += myStatus.successes;\n totalStatus.warnings += myStatus.warnings;\n totalStatus.failures += myStatus.failures;\n updateProgressBar(\n `Imported ${myStatus.successes}/${myStatus.total} provider(s) from ${file}.`\n );\n } else {\n printMessage(`Validation of ${file} failed!`, 'error');\n }\n }\n stopProgressBar(\n `Imported ${totalStatus.successes} of ${totalStatus.total} provider(s) from ${jsonFiles.length} file(s).`\n );\n}\n\n/**\n * List entity providers\n */\nexport async function listRawSaml2Providers() {\n const providerList = (await getRawProviders()).result;\n providerList.sort((a, b) => a._id.localeCompare(b._id));\n for (const provider of providerList) {\n printMessage(`${provider._id}`, 'data');\n }\n}\n\n/**\n * Exports a RAW SAML entity, which means the raw xml is included.\n * @param {string} entityId Reference to the entity for export\n * @param {string} file Optional filename for the exported file\n */\nexport async function exportRawSaml2ProviderToFile(entityId, file = null) {\n printMessage(`Exporting raw SAML entity provider ${entityId}`, 'info');\n let fileName = file;\n if (!file) {\n fileName = getTypedFilename(`${entityId}`, 'raw.saml');\n }\n createProgressBar(1, `Exporting raw entity provider: ${entityId}`);\n try {\n const rawData = await getRawProvider(entityId);\n updateProgressBar(`Writing file ${fileName}`);\n saveTextToFile(JSON.stringify(rawData, null, 2), fileName);\n stopProgressBar(`Exported raw entity provider ${entityId} to ${fileName}.`);\n } catch (error) {\n stopProgressBar(`Error exporting raw entity ${entityId}: ${error.message}`);\n printMessage(error.response?.data, 'error');\n }\n}\n\n/**\n * Export all entity providers raw to one file\n * @param {String} file Optional filename\n */\nexport async function exportRawSaml2ProvidersToFile(file = null) {\n let fileName = file;\n if (!fileName) {\n fileName = getTypedFilename(\n `all${getRealmString()}ProvidersRaw`,\n 'raw.saml'\n );\n }\n try {\n const samlApplicationList = (await getRawProviders()).result;\n\n saveToFile('application', samlApplicationList, '_id', fileName);\n printMessage(\n `All RAW saml entity providers exported to: ${fileName}`,\n 'info'\n );\n } catch (error) {\n printMessage(error.message, 'error');\n printMessage(\n `exportRawSaml2ProvidersToFile: ${error.response?.status}`,\n 'error'\n );\n }\n}\n\n/**\n * Export all entity providers to individual files\n */\nexport async function exportRawSaml2ProvidersToFiles() {\n const samlApplicationList = (await getRawProviders()).result;\n let hasError = false;\n createProgressBar(samlApplicationList.length, 'Exporting RAW providers');\n let exportedAmount = 0;\n for (const item of samlApplicationList) {\n updateProgressBar(`Exporting provider ${item.entityId}`);\n try {\n const samlApplicationData = await getRawProvider(item._id);\n const fileName = getTypedFilename(\n `${item._id}${getRealmString()}ProviderRaw`,\n 'raw.saml'\n );\n saveToFile('application', [samlApplicationData], '_id', fileName);\n exportedAmount++;\n } catch (error) {\n hasError = true;\n printMessage(`Unable to export: ${item._id}`, 'error');\n }\n }\n stopProgressBar(`${exportedAmount} providers exported.`);\n if (!hasError) {\n printMessage('All entities exported.', 'info');\n } else {\n printMessage('All other entities exported.', 'info');\n }\n}\n\n/**\n * Imports a raw SAML export file (containing one entity).\n * @param {string} file The import file\n */\nexport async function importRawSaml2ProviderFromFile(\n // entityId: string,\n file: string\n) {\n printMessage(`Importing SAML Entity ${file}...`, 'info');\n if (file.indexOf('.raw.saml.json') > -1) {\n const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n try {\n await putRawProvider(id, samlEntityData.application[id]);\n } catch (error) {\n printMessage(`Unable to import: ${id}`, 'error');\n }\n printMessage(`Imported ${id}`, 'info');\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n }\n}\n\n/**\n * Import first raw SAML entity provider from file\n * @param {String} file Import file name\n */\nexport async function importFirstRawSaml2ProviderFromFile(file) {\n printMessage(`Importing SAML Entity ${file}...`, 'info');\n if (file.indexOf('.raw.saml.json') > -1) {\n const samlEntityData = JSON.parse(fs.readFileSync(file, 'utf8'));\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n try {\n await putRawProvider(id, samlEntityData.application[id]);\n } catch (error) {\n printMessage(`Unable to import: ${id}`, 'error');\n }\n printMessage(`Imported ${id}`, 'info');\n return;\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n }\n}\n\n/**\n * Imports the RAW provider info from a single file.\n * @param file Import file name\n */\nexport async function importRawSaml2ProvidersFromFile(file: string) {\n fs.readFile(file, 'utf8', async function (err, data) {\n if (err) throw err;\n const samlEntityData = JSON.parse(data);\n let amountOfEntities = 0;\n for (const id in samlEntityData.application) {\n if (id.length) {\n amountOfEntities++;\n }\n }\n if (validateImport(samlEntityData.meta)) {\n createProgressBar(amountOfEntities, 'Importing providers...');\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n await putRawProvider(id, samlEntityData.application[id]).then(\n (result) => {\n if (result === null) {\n printMessage(`Import validation failed for ${id}`, 'error');\n }\n }\n );\n updateProgressBar(`Imported ${id}...`);\n }\n stopProgressBar(`Import done`);\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n}\n\n/**\n * Whenever the SAML RAW file were exported using the exportRAW functionality this function\n * is used to read them back in. Only files with the .samlRaw.json extension will be imported.\n * @param {string} directory The directory from which to import the files\n */\nexport async function importRawSaml2ProvidersFromFiles(directory) {\n const files = fs.readdirSync(directory);\n const filesToImport = files.filter(\n (file) => file.indexOf('.samlRaw.json') > -1\n );\n\n if (filesToImport.length > 0) {\n createProgressBar(filesToImport.length, 'Importing providers...');\n filesToImport.forEach(async (file) => {\n const filePathAbsolute = path.join(directory, file);\n filesToImport.push(file);\n const samlEntityData = JSON.parse(\n fs.readFileSync(filePathAbsolute, 'utf8')\n );\n if (validateImport(samlEntityData.meta)) {\n for (const id in samlEntityData.application) {\n // remove the \"_rev\" data before PUT\n delete samlEntityData.application[id]._rev;\n await putRawProvider(id, samlEntityData.application[id]).then(\n (result) => {\n if (result === null) {\n printMessage(`Import validation failed for ${id}`, 'error');\n }\n }\n );\n updateProgressBar(`Imported ${id}...`);\n }\n } else {\n printMessage('Import validation failed...', 'error');\n }\n });\n stopProgressBar(`Import done`);\n } else {\n printMessage(\n 'Import failed, no files to import. (check extension to be .samlRaw.json)',\n 'warn'\n );\n }\n}\n"],"mappings":"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"}
|