passbolt-styleguide 3.8.4 → 3.9.0-alpha2
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/build/css/help.min.css +3 -3
- package/build/css/public.min.css +3 -3
- package/build/css/themes/default/api_authentication.min.css +3 -3
- package/build/css/themes/default/api_cloud.min.css +3 -3
- package/build/css/themes/default/api_main.min.css +3 -3
- package/build/css/themes/default/api_reports.min.css +3 -3
- package/build/css/themes/default/api_webinstaller.min.css +3 -3
- package/build/css/themes/default/ext_app.min.css +3 -3
- package/build/css/themes/default/ext_authentication.min.css +3 -3
- package/build/css/themes/default/ext_external.min.css +2 -2
- package/build/css/themes/default/ext_in_form_cta.min.css +3 -3
- package/build/css/themes/default/ext_in_form_menu.min.css +3 -3
- package/build/css/themes/default/ext_quickaccess.min.css +3 -3
- package/build/css/themes/midgar/api_authentication.min.css +3 -3
- package/build/css/themes/midgar/api_main.min.css +3 -3
- package/build/css/themes/midgar/api_reports.min.css +3 -3
- package/build/css/themes/midgar/ext_app.min.css +3 -3
- package/build/css/themes/midgar/ext_authentication.min.css +3 -3
- package/build/css/themes/midgar/ext_in_form_cta.min.css +3 -3
- package/build/css/themes/midgar/ext_in_form_menu.min.css +3 -3
- package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
- package/build/css/themes/solarized_dark/api_authentication.min.css +1 -1
- package/build/css/themes/solarized_dark/api_main.min.css +1 -1
- package/build/css/themes/solarized_dark/api_reports.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_app.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_authentication.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_in_form_cta.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_in_form_menu.min.css +1 -1
- package/build/css/themes/solarized_dark/ext_quickaccess.min.css +1 -1
- package/build/css/themes/solarized_light/api_authentication.min.css +1 -1
- package/build/css/themes/solarized_light/api_main.min.css +1 -1
- package/build/css/themes/solarized_light/api_reports.min.css +1 -1
- package/build/css/themes/solarized_light/ext_app.min.css +1 -1
- package/build/css/themes/solarized_light/ext_authentication.min.css +1 -1
- package/build/css/themes/solarized_light/ext_in_form_cta.min.css +1 -1
- package/build/css/themes/solarized_light/ext_in_form_menu.min.css +1 -1
- package/build/css/themes/solarized_light/ext_quickaccess.min.css +1 -1
- package/build/js/dist/api-account-recovery.js +1 -1
- package/build/js/dist/api-app.js +1 -1
- package/build/js/dist/api-app.js.LICENSE.txt +75 -5
- package/build/js/dist/api-feedback.js +2 -0
- package/build/js/dist/api-feedback.js.LICENSE.txt +45 -0
- package/build/js/dist/api-recover.js +1 -1
- package/build/js/dist/api-setup.js +1 -1
- package/build/js/dist/api-triage.js +1 -1
- package/build/js/dist/api-vendors.js +1 -1
- package/build/js/dist/api-vendors.js.LICENSE.txt +19 -9
- package/build/js/dist/src/locales/de-DE/common.json +995 -0
- package/build/js/dist/src/locales/en-UK/common.json +1061 -0
- package/build/js/dist/src/locales/es-ES/common.json +995 -0
- package/build/js/dist/src/locales/fr-FR/common.json +995 -0
- package/build/js/dist/src/locales/ja-JP/common.json +980 -0
- package/build/js/dist/src/locales/lt-LT/common.json +1025 -0
- package/build/js/dist/src/locales/nl-NL/common.json +995 -0
- package/build/js/dist/src/locales/pl-PL/common.json +1025 -0
- package/build/js/dist/src/locales/sv-SE/common.json +995 -0
- package/package.json +18 -1
- package/src/img/controls/attention.svg +1 -0
- package/src/locales/en-UK/common.json +80 -16
- package/src/react-extension/ApiApp.js +17 -5
- package/src/react-extension/ApiFeedback.entry.js +24 -0
- package/src/react-extension/ExtApp.js +12 -5
- package/src/react-extension/ExtAuthenticationLogin.js +17 -15
- package/src/react-extension/ExtAuthenticationLogin.test.stories.js +59 -0
- package/src/react-extension/ExtBootstrapApp.js +1 -0
- package/src/react-extension/components/Administration/AdministrationWorkspace.js +24 -0
- package/src/react-extension/components/Administration/AdministrationWorkspace.test.data.js +3 -3
- package/src/react-extension/components/Administration/AdministrationWorkspace.test.js +13 -1
- package/src/react-extension/components/Administration/AdministrationWorkspace.test.page.js +7 -0
- package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.js +101 -0
- package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.data.js +23 -0
- package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.stories.js +27 -0
- package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.js +1 -1
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +78 -2
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.data.js +3 -1
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.js +60 -0
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.page.js +23 -4
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationInternationalisationActions/DisplayAdministrationInternationalisationActions.js +125 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationMfaActions/DisplayAdministrationMfaActions.js +131 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSelfRegistrationActions/DisplayAdministrationSelfRegistrationActions.js +103 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSsoActions/DisplayAdministrationSsoActions.js +91 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSubscriptionActions/DisplayAdministrationSubscriptionActions.js +85 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationUserDirectoryActions/DisplayAdministrationUserDirectoryActions.js +228 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.js +4 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.test.js +9 -0
- package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +3 -3
- package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.data.js +14 -0
- package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.page.js +0 -17
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.js +18 -115
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.data.js +11 -13
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.js +38 -43
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.page.js +47 -10
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.stories.js +10 -43
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.js +82 -367
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.data.js +128 -42
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.js +75 -121
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.page.js +46 -16
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +18 -14
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.js +103 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.js +53 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.page.js +81 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.stories.js +34 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.js +125 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.data.js +63 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.js +54 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.page.js +88 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.stories.js +35 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.js +381 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.data.js +69 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.js +332 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.page.js +247 -0
- package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.stories.js +72 -0
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +19 -19
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.data.js +1717 -1729
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +11 -3
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.page.js +4 -1
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.js +41 -140
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.data.js +15 -3
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.js +22 -49
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.page.js +19 -11
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.stories.js +9 -3
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +5 -6
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.data.js +1717 -1728
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +11 -3
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.page.js +4 -1
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +362 -835
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.data.js +427 -418
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.js +134 -175
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.page.js +108 -11
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +17 -25
- package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.js +4 -2
- package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.js +3 -3
- package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.test.js +1 -1
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.js +32 -7
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.data.js +0 -3
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.js +145 -1
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.page.js +52 -1
- package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.stories.js +15 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.js +340 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.data.js +56 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.js +223 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.page.js +235 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.stories.js +55 -0
- package/src/react-extension/components/Administration/ManageSsoSettings/SsoProviders.data.js +34 -0
- package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.js +12 -3
- package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.test.js +27 -0
- package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.test.page.js +8 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.js +197 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.data.js +37 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.js +187 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.page.js +120 -0
- package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.stories.js +31 -0
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.js +9 -5
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.data.js +4 -0
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.js +11 -42
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.page.js +1 -0
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.js +9 -5
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.data.js +4 -0
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.js +16 -2
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.page.js +17 -1
- package/src/react-extension/components/AuthenticationLogin/Login/Login.js +159 -61
- package/src/react-extension/components/AuthenticationLogin/Login/Login.test.data.js +14 -11
- package/src/react-extension/components/AuthenticationLogin/Login/Login.test.js +79 -0
- package/src/react-extension/components/AuthenticationLogin/Login/Login.test.page.js +16 -0
- package/src/react-extension/components/AuthenticationLogin/OrchestrateLogin/OrchestrateLoginBoxMain.js +2 -0
- package/src/react-extension/components/AuthenticationSetup/SetupAuthentication/SetupAuthentication.js +4 -0
- package/src/react-extension/components/Common/Error/ApiError/ApiError.js +119 -0
- package/src/react-extension/components/Common/Error/ApiError/ApiError.test.js +43 -0
- package/src/react-extension/components/Common/Error/ApiError/ApiError.test.page.js +108 -0
- package/src/react-extension/components/Common/Error/ApiError/ApiError.test.stories.js +39 -0
- package/src/react-extension/components/Common/Inputs/Autocomplete/Autocomplete.test.js +12 -0
- package/src/react-extension/components/Common/Inputs/Autocomplete/AutocompleteItem.js +2 -2
- package/src/react-extension/components/Common/Legacy/HandleLegacyAppjs.js +1 -1
- package/src/react-extension/components/Common/Navigation/Header/Logo.js +13 -1
- package/src/react-extension/components/Resource/CreateResource/CreateResource.js +103 -30
- package/src/react-extension/components/Resource/CreateResource/CreateResource.test.js +44 -10
- package/src/react-extension/components/Resource/CreateResource/CreateResource.test.page.js +35 -7
- package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +3 -3
- package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesListContextualMenu.js +6 -5
- package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.js +5 -4
- package/src/react-extension/components/Resource/EditResource/EditResource.js +95 -23
- package/src/react-extension/components/Resource/EditResource/EditResource.test.js +45 -13
- package/src/react-extension/components/Resource/EditResource/EditResource.test.page.js +35 -2
- package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetails.js +2 -1
- package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.js +3 -2
- package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +23 -2
- package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.js +8 -0
- package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.page.js +26 -2
- package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +22 -1
- package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.js +8 -0
- package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.page.js +25 -2
- package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetails.js +2 -1
- package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.js +2 -1
- package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.js +14 -1
- package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.js +8 -0
- package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.page.js +12 -0
- package/src/react-extension/components/User/CreateUser/CreateUser.js +42 -3
- package/src/react-extension/components/User/CreateUser/CreateUser.test.js +16 -0
- package/src/react-extension/components/User/CreateUser/CreateUser.test.page.js +26 -0
- package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.js +2 -1
- package/src/react-extension/components/User/DisplayUsersContextualMenu/DisplayUsersContextualMenu.js +5 -5
- package/src/react-extension/components/User/EditUser/EditUser.js +29 -2
- package/src/react-extension/components/User/EditUser/EditUser.test.js +12 -0
- package/src/react-extension/components/User/EditUser/EditUser.test.page.js +26 -0
- package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.js +2 -1
- package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.test.data.js +1332 -1331
- package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.js +2 -1
- package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.js +19 -1
- package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.js +9 -0
- package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.page.js +12 -0
- package/src/react-extension/components/UserGroup/DisplayUserGroupDetails/DisplayUserGroupDetails.js +2 -1
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.js +16 -1
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.js +8 -0
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.page.js +26 -1
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +1 -1
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +6 -4
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.data.js +4 -1
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.js +21 -11
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.page.js +10 -1
- package/src/react-extension/contexts/AdminSmtpSettingsContext.js +2 -0
- package/src/react-extension/contexts/AdminSmtpSettingsContext.test.data.js +13 -0
- package/src/react-extension/contexts/AdminSmtpSettingsContext.test.js +3 -1
- package/src/react-extension/contexts/AdminSsoContext.js +558 -0
- package/src/react-extension/contexts/AdminSsoContext.test.data.js +51 -0
- package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.js +194 -0
- package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.test.js +111 -0
- package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.js +265 -0
- package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.test.js +178 -0
- package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.js +453 -0
- package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.test.js +218 -0
- package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.js +168 -0
- package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.test.js +73 -0
- package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.js +353 -0
- package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.test.js +220 -0
- package/src/react-extension/contexts/AdministrationWorkspaceContext.js +17 -178
- package/src/react-extension/contexts/AdministrationWorkspaceContext.test.js +0 -26
- package/src/react-extension/contexts/ApiAppContext.test.data.js +4 -2
- package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.js +54 -4
- package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.data.js +10 -1
- package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.js +92 -14
- package/src/react-extension/contexts/Authentication/AuthenticationSetupContext.js +1 -0
- package/src/react-extension/contexts/NavigationContext.js +34 -0
- package/src/react-extension/contexts/SsoContext.js +151 -0
- package/src/react-extension/contexts/SsoContext.test.data.js +36 -0
- package/src/react-extension/contexts/SsoContext.test.js +104 -0
- package/src/react-extension/lib/Domain/DomainUtil.js +70 -0
- package/src/react-extension/lib/Domain/DomainUtil.test.js +129 -0
- package/src/react-extension/lib/Domain/Domains.js +6113 -0
- package/src/react-extension/lib/Error/InputValidator.js +24 -0
- package/src/react-extension/lib/Map/DynamicRef.js +49 -0
- package/src/react-extension/lib/Map/DynamicRef.test.js +56 -0
- package/src/react-extension/lib/Map/MapObject.js +48 -0
- package/src/react-extension/lib/Map/MapObject.test.js +43 -0
- package/src/react-quickaccess/ExtQuickAccess.js +7 -4
- package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.js +3 -1
- package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.data.js +4 -0
- package/src/react-quickaccess/components/LoginPage/LoginPage.js +115 -4
- package/src/react-quickaccess/components/LoginPage/LoginPage.test.data.js +10 -0
- package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +30 -3
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.js +33 -1
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.data.js +25 -0
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.js +60 -0
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.page.js +60 -0
- package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.js +33 -1
- package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.js +36 -7
- package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.js +3 -2
- package/src/react-quickaccess/contexts/SsoContext.js +150 -0
- package/src/react-web-integration/lib/InForm/InFormFieldSelector.js +5 -0
- package/src/shared/constants/inputs.const.js +30 -0
- package/src/shared/lib/Browser/clipBoard.js +45 -0
- package/src/shared/lib/Browser/clipBoard.test.js +59 -0
- package/src/shared/models/Mfa/Duo.js +36 -0
- package/src/shared/models/Mfa/Duo.test.js +59 -0
- package/src/shared/models/Mfa/MfaDTO.js +51 -0
- package/src/shared/models/Mfa/MfaDTO.test.js +48 -0
- package/src/shared/models/Mfa/MfaEnumeration.js +17 -0
- package/src/shared/models/Mfa/MfaModel.js +48 -0
- package/src/shared/models/Mfa/MfaModel.test.js +37 -0
- package/src/shared/models/Mfa/Yubikey.js +35 -0
- package/src/shared/models/Mfa/Yubikey.test.js +47 -0
- package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.js +55 -0
- package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.test.js +37 -0
- package/src/shared/models/selfRegistration/SelfRegistrationDto.js +42 -0
- package/src/shared/models/selfRegistration/SelfRegistrationDto.test.js +48 -0
- package/src/shared/models/selfRegistration/SelfRegistrationEnumeration.js +17 -0
- package/src/shared/models/subscription/SubscriptionDto.js +34 -0
- package/src/shared/models/subscription/SubscriptionDto.test.js +31 -0
- package/src/shared/models/subscription/SubscriptionModel.js +33 -0
- package/src/shared/models/subscription/SubscriptionModel.test.js +48 -0
- package/src/shared/models/user/UserModel.js +37 -0
- package/src/shared/models/userDirectory/UserDirectoryDTO.js +57 -0
- package/src/shared/models/userDirectory/UserDirectoryDTO.test.js +40 -0
- package/src/shared/models/userDirectory/UserDirectoryEnum.js +22 -0
- package/src/shared/models/userDirectory/UserDirectoryModel.js +64 -0
- package/src/shared/models/userDirectory/UserDirectoryModel.test.js +37 -0
- package/src/shared/services/actions/subscription/SubscriptionActionService.js +69 -0
- package/src/shared/services/actions/subscription/SubscriptionActionService.test.js +73 -0
- package/src/shared/services/api/Internationalisation/InternationalisationService.js +46 -0
- package/src/shared/services/api/Mfa/MfaService.js +54 -0
- package/src/shared/services/{accountRecovery → api/accountRecovery}/ApiAppAccountRecoveryUserService.js +2 -2
- package/src/shared/services/{accountRecovery → api/accountRecovery}/ExtAppAccountRecoveryUserService.js +0 -0
- package/src/shared/services/api/secrets/pownedService.js +64 -0
- package/src/shared/services/api/secrets/pownedService.test.js +63 -0
- package/src/shared/services/api/selfRegistration/selfRegistrationService.js +64 -0
- package/src/shared/services/api/user/UserService.js +45 -0
- package/src/shared/services/api/userDirectory/UserDirectoryService.js +108 -0
- package/src/shared/services/forms/Mfa/MfaFormService.js +195 -0
- package/src/shared/services/forms/Mfa/MfaFormService.test.js +341 -0
- package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.js +92 -0
- package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.test.js +101 -0
- package/src/shared/services/forms/userDirectory/UserDirectoryFormService.js +118 -0
- package/src/shared/services/forms/userDirectory/UserDirectoryFormService.test.js +128 -0
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.js +0 -205
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.data.js +0 -37
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.js +0 -197
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.page.js +0 -133
|
@@ -45,7 +45,8 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
45
45
|
mockComponentSetState(contextProvider);
|
|
46
46
|
|
|
47
47
|
expect.assertions(2);
|
|
48
|
-
await contextProvider.
|
|
48
|
+
await contextProvider.componentDidMount();
|
|
49
|
+
|
|
49
50
|
expect(props.context.port.requestListeners["passbolt.auth.verify-server-key"]).toHaveBeenCalled();
|
|
50
51
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGN_IN);
|
|
51
52
|
});
|
|
@@ -56,7 +57,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
56
57
|
mockComponentSetState(contextProvider);
|
|
57
58
|
|
|
58
59
|
expect.assertions(4);
|
|
59
|
-
await contextProvider.
|
|
60
|
+
await contextProvider.componentDidMount();
|
|
60
61
|
expect(props.context.port.requestListeners["passbolt.auth.verify-server-key"]).toHaveBeenCalled();
|
|
61
62
|
expect(props.context.port.requestListeners["passbolt.auth.get-server-key"]).toHaveBeenCalled();
|
|
62
63
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.ACCEPT_NEW_SERVER_KEY);
|
|
@@ -70,7 +71,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
70
71
|
mockComponentSetState(contextProvider);
|
|
71
72
|
|
|
72
73
|
expect.assertions(3);
|
|
73
|
-
await contextProvider.
|
|
74
|
+
await contextProvider.componentDidMount();
|
|
74
75
|
expect(props.context.port.requestListeners["passbolt.auth.verify-server-key"]).toHaveBeenCalled();
|
|
75
76
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.UNEXPECTED_ERROR);
|
|
76
77
|
expect(contextProvider.state.error.message).toEqual("Unexpected error");
|
|
@@ -84,7 +85,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
84
85
|
mockComponentSetState(contextProvider);
|
|
85
86
|
|
|
86
87
|
expect.assertions(3);
|
|
87
|
-
await contextProvider.
|
|
88
|
+
await contextProvider.componentDidMount();
|
|
88
89
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.ACCEPT_NEW_SERVER_KEY);
|
|
89
90
|
await contextProvider.acceptNewServerKey();
|
|
90
91
|
expect(props.context.port.requestListeners["passbolt.auth.replace-server-key"]).toHaveBeenCalled();
|
|
@@ -98,7 +99,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
98
99
|
mockComponentSetState(contextProvider);
|
|
99
100
|
|
|
100
101
|
expect.assertions(4);
|
|
101
|
-
await contextProvider.
|
|
102
|
+
await contextProvider.componentDidMount();
|
|
102
103
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.ACCEPT_NEW_SERVER_KEY);
|
|
103
104
|
await contextProvider.acceptNewServerKey();
|
|
104
105
|
expect(props.context.port.requestListeners["passbolt.auth.replace-server-key"]).toHaveBeenCalled();
|
|
@@ -114,7 +115,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
114
115
|
mockComponentSetState(contextProvider);
|
|
115
116
|
|
|
116
117
|
expect.assertions(2);
|
|
117
|
-
await contextProvider.
|
|
118
|
+
await contextProvider.componentDidMount();
|
|
118
119
|
await contextProvider.checkPassphrase("passphrase");
|
|
119
120
|
expect(props.context.port.requestListeners["passbolt.auth.verify-passphrase"]).toHaveBeenCalledWith("passphrase", undefined);
|
|
120
121
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGN_IN);
|
|
@@ -127,7 +128,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
127
128
|
mockComponentSetState(contextProvider);
|
|
128
129
|
|
|
129
130
|
expect.assertions(3);
|
|
130
|
-
await contextProvider.
|
|
131
|
+
await contextProvider.componentDidMount();
|
|
131
132
|
try {
|
|
132
133
|
await contextProvider.checkPassphrase("passphrase");
|
|
133
134
|
expect(false).toBeTruthy();
|
|
@@ -145,7 +146,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
145
146
|
mockComponentSetState(contextProvider);
|
|
146
147
|
|
|
147
148
|
expect.assertions(3);
|
|
148
|
-
await contextProvider.
|
|
149
|
+
await contextProvider.componentDidMount();
|
|
149
150
|
await contextProvider.checkPassphrase("passphrase");
|
|
150
151
|
expect(props.context.port.requestListeners["passbolt.auth.verify-passphrase"]).toHaveBeenCalledWith("passphrase", undefined);
|
|
151
152
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.UNEXPECTED_ERROR);
|
|
@@ -160,7 +161,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
160
161
|
mockComponentSetState(contextProvider);
|
|
161
162
|
|
|
162
163
|
expect.assertions(2);
|
|
163
|
-
await contextProvider.
|
|
164
|
+
await contextProvider.componentDidMount();
|
|
164
165
|
await contextProvider.signIn("passphrase");
|
|
165
166
|
expect(props.context.port.requestListeners["passbolt.auth.login"]).toHaveBeenCalledWith("passphrase", false, undefined);
|
|
166
167
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGNING_IN);
|
|
@@ -173,7 +174,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
173
174
|
mockComponentSetState(contextProvider);
|
|
174
175
|
|
|
175
176
|
expect.assertions(2);
|
|
176
|
-
await contextProvider.
|
|
177
|
+
await contextProvider.componentDidMount();
|
|
177
178
|
await contextProvider.signIn("passphrase");
|
|
178
179
|
expect(props.context.port.requestListeners["passbolt.auth.login"]).toHaveBeenCalledWith("passphrase", false, undefined);
|
|
179
180
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGN_IN_ERROR);
|
|
@@ -187,7 +188,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
187
188
|
mockComponentSetState(contextProvider);
|
|
188
189
|
|
|
189
190
|
expect.assertions(1);
|
|
190
|
-
await contextProvider.
|
|
191
|
+
await contextProvider.componentDidMount();
|
|
191
192
|
await contextProvider.needHelpCredentialsLost();
|
|
192
193
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.INITIATE_ACCOUNT_RECOVERY);
|
|
193
194
|
});
|
|
@@ -198,7 +199,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
198
199
|
mockComponentSetState(contextProvider);
|
|
199
200
|
|
|
200
201
|
expect.assertions(1);
|
|
201
|
-
await contextProvider.
|
|
202
|
+
await contextProvider.componentDidMount();
|
|
202
203
|
await contextProvider.needHelpCredentialsLost();
|
|
203
204
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.HELP_CREDENTIALS_LOST);
|
|
204
205
|
});
|
|
@@ -211,7 +212,7 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
211
212
|
mockComponentSetState(contextProvider);
|
|
212
213
|
|
|
213
214
|
expect.assertions(2);
|
|
214
|
-
await contextProvider.
|
|
215
|
+
await contextProvider.componentDidMount();
|
|
215
216
|
await contextProvider.requestHelpCredentialsLost();
|
|
216
217
|
expect(props.context.port.requestListeners["passbolt.auth.request-help-credentials-lost"]).toHaveBeenCalled();
|
|
217
218
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.CHECK_MAILBOX);
|
|
@@ -224,11 +225,88 @@ describe("AuthenticationLoginContextProvider", () => {
|
|
|
224
225
|
mockComponentSetState(contextProvider);
|
|
225
226
|
|
|
226
227
|
expect.assertions(3);
|
|
227
|
-
await contextProvider.
|
|
228
|
+
await contextProvider.componentDidMount();
|
|
228
229
|
await contextProvider.requestHelpCredentialsLost();
|
|
229
230
|
expect(props.context.port.requestListeners["passbolt.auth.request-help-credentials-lost"]).toHaveBeenCalled();
|
|
230
231
|
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.UNEXPECTED_ERROR);
|
|
231
232
|
expect(contextProvider.state.error.message).toEqual("Unexpected error");
|
|
232
233
|
});
|
|
233
234
|
});
|
|
235
|
+
|
|
236
|
+
describe("AuthenticationLoginContextProvider::handleSsoSignIn", () => {
|
|
237
|
+
it("When the user initiates an SSO sign-in, the context should call the sso context to handle the sign-in", async() => {
|
|
238
|
+
const props = defaultProps({
|
|
239
|
+
ssoContext: {
|
|
240
|
+
runSignInProcess: jest.fn(() => {})
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
const contextProvider = new AuthenticationLoginContextProvider(props);
|
|
244
|
+
mockComponentSetState(contextProvider);
|
|
245
|
+
|
|
246
|
+
await contextProvider.componentDidMount();
|
|
247
|
+
|
|
248
|
+
expect.assertions(1);
|
|
249
|
+
await contextProvider.handleSsoSignIn();
|
|
250
|
+
expect(props.ssoContext.runSignInProcess).toHaveBeenCalledTimes(1);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
it("After a successful SSO sign-in the machine state should be SIGNING_IN", async() => {
|
|
254
|
+
const props = defaultProps({
|
|
255
|
+
ssoContext: {
|
|
256
|
+
runSignInProcess: jest.fn(() => {})
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
const contextProvider = new AuthenticationLoginContextProvider(props);
|
|
260
|
+
mockComponentSetState(contextProvider);
|
|
261
|
+
|
|
262
|
+
await contextProvider.componentDidMount();
|
|
263
|
+
|
|
264
|
+
expect.assertions(1);
|
|
265
|
+
await contextProvider.handleSsoSignIn();
|
|
266
|
+
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGNING_IN);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
it("When the user fails to sign-in for an unexpected reason, the machine state should be on UNEXPECTED_ERROR", async() => {
|
|
270
|
+
const error = new Error("This is an unexpected error");
|
|
271
|
+
const props = defaultProps({
|
|
272
|
+
ssoContext: {
|
|
273
|
+
runSignInProcess: jest.fn(() => { throw error; })
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
const contextProvider = new AuthenticationLoginContextProvider(props);
|
|
277
|
+
mockComponentSetState(contextProvider);
|
|
278
|
+
|
|
279
|
+
await contextProvider.componentDidMount();
|
|
280
|
+
|
|
281
|
+
expect.assertions(2);
|
|
282
|
+
await contextProvider.handleSsoSignIn();
|
|
283
|
+
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.UNEXPECTED_ERROR);
|
|
284
|
+
expect(contextProvider.state.error.message).toEqual(error.message);
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it("When the user closes the popup, the state should remain on SIGN_IN and the error should be thrown back", async() => {
|
|
288
|
+
const error = new Error("The user closed the pop-up");
|
|
289
|
+
error.name = "UserClosedSsoPopUpError";
|
|
290
|
+
|
|
291
|
+
const props = defaultProps({
|
|
292
|
+
ssoContext: {
|
|
293
|
+
runSignInProcess: jest.fn(() => { throw error; })
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
const contextProvider = new AuthenticationLoginContextProvider(props);
|
|
298
|
+
mockComponentSetState(contextProvider);
|
|
299
|
+
await contextProvider.componentDidMount();
|
|
300
|
+
|
|
301
|
+
expect.assertions(2);
|
|
302
|
+
|
|
303
|
+
try {
|
|
304
|
+
await contextProvider.handleSsoSignIn();
|
|
305
|
+
} catch (e) {
|
|
306
|
+
expect(e).toStrictEqual(error);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGN_IN);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
234
312
|
});
|
|
@@ -23,6 +23,8 @@ export const NavigationContext = React.createContext({
|
|
|
23
23
|
// Administration
|
|
24
24
|
onGoToAdministrationRequested: () => {
|
|
25
25
|
}, // Whenever the users wants to navigate to the administration workspace
|
|
26
|
+
onGoToAdministrationSelfRegistrationRequested: () => {
|
|
27
|
+
}, // Whenever the users wants to navigate to the administration workspace self registration
|
|
26
28
|
onGoToAdministrationMfaRequested: () => {
|
|
27
29
|
}, // Whenever the users wants to navigate to the administration workspace mfa
|
|
28
30
|
onGoToAdministrationUsersDirectoryRequested: () => {
|
|
@@ -37,6 +39,8 @@ export const NavigationContext = React.createContext({
|
|
|
37
39
|
}, // Whenever the users wants to navigate to the administration workspace account recovery
|
|
38
40
|
onGoToAdministrationSmtpSettingsRequested: () => {
|
|
39
41
|
}, // Whenever the users wants to navigate to the administration workspace SMTP settings
|
|
42
|
+
onGoToAdministrationSsoRequested: () => {
|
|
43
|
+
}, // Whenever the user wants to navigate to the administration workspace sso
|
|
40
44
|
// Passwords
|
|
41
45
|
onGoToPasswordsRequested: () => {
|
|
42
46
|
}, // Whenever the user wants to navigate to the passwords workspace
|
|
@@ -93,6 +97,8 @@ class NavigationContextProvider extends React.Component {
|
|
|
93
97
|
onGoToAdministrationInternationalizationRequested: this.onGoToAdministrationInternationalizationRequested.bind(this), // Whenever the user wants to navigate to the administration workspace internationalization
|
|
94
98
|
onGoToAdministrationAccountRecoveryRequested: this.onGoToAdministrationAccountRecoveryRequested.bind(this), // Whenever the user wants to navigate to the administration workspace account recovery
|
|
95
99
|
onGoToAdministrationSmtpSettingsRequested: this.onGoToAdministrationSmtpSettingsRequested.bind(this), // Whenever the users wants to navigate to the administration workspace SMTP settings
|
|
100
|
+
onGoToAdministrationSelfRegistrationRequested: this.onGoToAdministrationSelfRegistrationRequested.bind(this), //Whenever the users wants to navigate to the administration workspace self registration settings
|
|
101
|
+
onGoToAdministrationSsoRequested: this.onGoToAdministrationSsoRequested.bind(this), // Whenever the user wants to navigate to the administration workspace sso
|
|
96
102
|
// Passwords
|
|
97
103
|
onGoToPasswordsRequested: this.onGoToPasswordsRequested.bind(this), // Whenever the user wants to navigate to the passwords workspace
|
|
98
104
|
// Users
|
|
@@ -151,6 +157,8 @@ class NavigationContextProvider extends React.Component {
|
|
|
151
157
|
pathname = "/app/administration/users-directory";
|
|
152
158
|
} else if (this.isSmtpSettingsEnable) {
|
|
153
159
|
pathname = "/app/administration/smtp-settings";
|
|
160
|
+
} else if (this.isSelfRegistrationEnable) {
|
|
161
|
+
pathname = "/app/administration/self-registation";
|
|
154
162
|
}
|
|
155
163
|
await this.goTo("api", pathname);
|
|
156
164
|
}
|
|
@@ -163,6 +171,15 @@ class NavigationContextProvider extends React.Component {
|
|
|
163
171
|
await this.goTo("api", "/app/administration/mfa");
|
|
164
172
|
}
|
|
165
173
|
|
|
174
|
+
/**
|
|
175
|
+
* Whenever the user wants to navigate to the administration workspace selft registration.
|
|
176
|
+
* @returns {Promise<void>}
|
|
177
|
+
*/
|
|
178
|
+
async onGoToAdministrationSelfRegistrationRequested() {
|
|
179
|
+
await this.goTo("api", "/app/administration/self-registration");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
|
|
166
183
|
/**
|
|
167
184
|
* Whenever the user wants to navigate to the administration workspace users directory.
|
|
168
185
|
* @returns {Promise<void>}
|
|
@@ -211,6 +228,14 @@ class NavigationContextProvider extends React.Component {
|
|
|
211
228
|
await this.goTo("browser-extension", "/app/administration/account-recovery");
|
|
212
229
|
}
|
|
213
230
|
|
|
231
|
+
/**
|
|
232
|
+
* Whenever the user wants to navigate to the administration workspace sso.
|
|
233
|
+
* @returns {Promise<void>}
|
|
234
|
+
*/
|
|
235
|
+
async onGoToAdministrationSsoRequested() {
|
|
236
|
+
await this.goTo("browser-extension", "/app/administration/sso");
|
|
237
|
+
}
|
|
238
|
+
|
|
214
239
|
/**
|
|
215
240
|
* Returns true if the user has the MFA capability
|
|
216
241
|
* @returns {boolean}
|
|
@@ -238,6 +263,15 @@ class NavigationContextProvider extends React.Component {
|
|
|
238
263
|
return siteSettings && siteSettings.canIUse('smtpSettings');
|
|
239
264
|
}
|
|
240
265
|
|
|
266
|
+
/**
|
|
267
|
+
* Returns true if the user has the self registration enabled
|
|
268
|
+
* @returns {boolean}
|
|
269
|
+
*/
|
|
270
|
+
get isSelfRegistrationEnable() {
|
|
271
|
+
const siteSettings = this.props.context.siteSettings;
|
|
272
|
+
return siteSettings && siteSettings.canIUse('selfRegistration');
|
|
273
|
+
}
|
|
274
|
+
|
|
241
275
|
/*
|
|
242
276
|
* =============================================================
|
|
243
277
|
* Passwords navigation
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
4
|
+
*
|
|
5
|
+
* Licensed under GNU Affero General Public License version 3 of the or any later version.
|
|
6
|
+
* For full copyright and license information, please see the LICENSE.txt
|
|
7
|
+
* Redistributions of files must retain the above copyright notice.
|
|
8
|
+
*
|
|
9
|
+
* @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
10
|
+
* @license https://opensource.org/licenses/AGPL-3.0 AGPL License
|
|
11
|
+
* @link https://www.passbolt.com Passbolt(tm)
|
|
12
|
+
* @since 3.9.0
|
|
13
|
+
*/
|
|
14
|
+
import React from "react";
|
|
15
|
+
import PropTypes from "prop-types";
|
|
16
|
+
import {withAppContext} from "./AppContext";
|
|
17
|
+
import {withTranslation} from "react-i18next";
|
|
18
|
+
|
|
19
|
+
export const SsoContext = React.createContext({
|
|
20
|
+
loadSsoConfiguration: () => {}, // Load the current sso configuration and store it in the state
|
|
21
|
+
getProvider: () => {}, // Return the current sso configuration from the context state
|
|
22
|
+
hasUserAnSsoKit: () => {}, // Returns true if the current user has an SSO kit built locally
|
|
23
|
+
runSignInProcess: () => {}, // Launches the SSO process with the configured provider
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The related context provider
|
|
28
|
+
*/
|
|
29
|
+
export class SsoContextProvider extends React.Component {
|
|
30
|
+
/**
|
|
31
|
+
* Default constructor
|
|
32
|
+
* @param props The component props
|
|
33
|
+
*/
|
|
34
|
+
constructor(props) {
|
|
35
|
+
super(props);
|
|
36
|
+
this.state = this.defaultState;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Returns the default component state
|
|
41
|
+
*/
|
|
42
|
+
get defaultState() {
|
|
43
|
+
this.handleSpecificError = this.handleSpecificError.bind(this);
|
|
44
|
+
return {
|
|
45
|
+
ssoLocalConfiguredProvider: null, // the provider configured for the local SSO kit if any, null otherwise
|
|
46
|
+
loadSsoConfiguration: this.loadSsoConfiguration.bind(this), // Load the current sso configuration and store it in the state
|
|
47
|
+
getProvider: this.getProvider.bind(this), // Return the current sso provider configured
|
|
48
|
+
hasUserAnSsoKit: this.hasUserAnSsoKit.bind(this), // Returns true if the current user has an SSO kit built locally
|
|
49
|
+
runSignInProcess: this.runSignInProcess.bind(this), // Launches the SSO process with the configured provider
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Find the sso configuration
|
|
55
|
+
* @return {Promise<void>}
|
|
56
|
+
*/
|
|
57
|
+
async loadSsoConfiguration() {
|
|
58
|
+
const ssoLocalConfiguredProvider = await this.props.context.port.request("passbolt.sso.get-local-configured-provider");
|
|
59
|
+
this.setState({ssoLocalConfiguredProvider});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Get the current sso provider configured.
|
|
64
|
+
* @returns {string}
|
|
65
|
+
*/
|
|
66
|
+
getProvider() {
|
|
67
|
+
return this.state.ssoLocalConfiguredProvider;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Returns true if the current user has an SSO kit built locally
|
|
72
|
+
* @returns {boolean}
|
|
73
|
+
*/
|
|
74
|
+
hasUserAnSsoKit() {
|
|
75
|
+
return Boolean(this.state.ssoLocalConfiguredProvider);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Launches the SSO process with the configured provider
|
|
80
|
+
* @returns {Promise<void>}
|
|
81
|
+
*/
|
|
82
|
+
async runSignInProcess() {
|
|
83
|
+
try {
|
|
84
|
+
const provider = this.getProvider();
|
|
85
|
+
await this.props.context.port.request(`passbolt.sso.sign-in-with-${provider}`);
|
|
86
|
+
await this.props.context.port.request('passbolt.auth.post-login-redirect');
|
|
87
|
+
} catch (e) {
|
|
88
|
+
console.error(e);
|
|
89
|
+
this.handleSpecificError(e);
|
|
90
|
+
throw e;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Handles error from the background page during SSO sign-in.
|
|
96
|
+
* @param {Error} e
|
|
97
|
+
*/
|
|
98
|
+
handleSpecificError(e) {
|
|
99
|
+
let errorToThrow = e;
|
|
100
|
+
switch (e.name) {
|
|
101
|
+
case 'InvalidMasterPasswordError': {
|
|
102
|
+
errorToThrow = new Error(this.props.t("The passphrase from the SSO kit doesn't match your private key: {{error}}", {error: e.message}));
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case 'OutdatedSsoKitError': {
|
|
106
|
+
errorToThrow = new Error(this.props.t("The SSO kit is outdated and can't be used to decrypt your passphrase: {{error}}", {error: e.message}));
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
throw errorToThrow;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Render the component
|
|
116
|
+
* @returns {JSX}
|
|
117
|
+
*/
|
|
118
|
+
render() {
|
|
119
|
+
return (
|
|
120
|
+
<SsoContext.Provider value={this.state}>
|
|
121
|
+
{this.props.children}
|
|
122
|
+
</SsoContext.Provider>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
SsoContextProvider.propTypes = {
|
|
128
|
+
context: PropTypes.any, // The application context
|
|
129
|
+
children: PropTypes.any, // The children components
|
|
130
|
+
t: PropTypes.func, // The translation function
|
|
131
|
+
};
|
|
132
|
+
export default withAppContext(withTranslation('common')(SsoContextProvider));
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Resource Workspace Context Consumer HOC
|
|
136
|
+
* @param WrappedComponent
|
|
137
|
+
*/
|
|
138
|
+
export function withSso(WrappedComponent) {
|
|
139
|
+
return class withSso extends React.Component {
|
|
140
|
+
render() {
|
|
141
|
+
return (
|
|
142
|
+
<SsoContext.Consumer>
|
|
143
|
+
{
|
|
144
|
+
ssoContext => <WrappedComponent ssoContext={ssoContext} {...this.props} />
|
|
145
|
+
}
|
|
146
|
+
</SsoContext.Consumer>
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
4
|
+
*
|
|
5
|
+
* Licensed under GNU Affero General Public License version 3 of the or any later version.
|
|
6
|
+
* For full copyright and license information, please see the LICENSE.txt
|
|
7
|
+
* Redistributions of files must retain the above copyright notice.
|
|
8
|
+
*
|
|
9
|
+
* @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
10
|
+
* @license https://opensource.org/licenses/AGPL-3.0 AGPL License
|
|
11
|
+
* @link https://www.passbolt.com Passbolt(tm)
|
|
12
|
+
* @since 3.9.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {defaultAppContext} from "./ExtAppContext.test.data";
|
|
16
|
+
import MockPort from "../test/mock/MockPort";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Default context
|
|
20
|
+
* @param {Object} data The props to override
|
|
21
|
+
* @param {string} providerId the sso provider id configured
|
|
22
|
+
* @returns {object}
|
|
23
|
+
*/
|
|
24
|
+
export function defaultProps(data = {}, providerId = null) {
|
|
25
|
+
const port = new MockPort();
|
|
26
|
+
port.addRequestListener("passbolt.sso.get-local-configured-provider", jest.fn(() => Promise.resolve(providerId)));
|
|
27
|
+
port.addRequestListener("passbolt.sso.sign-in-with-azure", jest.fn(() => Promise.resolve()));
|
|
28
|
+
port.addRequestListener("passbolt.auth.post-login-redirect", jest.fn(() => Promise.resolve()));
|
|
29
|
+
|
|
30
|
+
const defaultAuthenticationLoginAppContext = {
|
|
31
|
+
context: {
|
|
32
|
+
port: port,
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
return Object.assign(defaultAppContext(defaultAuthenticationLoginAppContext), data);
|
|
36
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
4
|
+
*
|
|
5
|
+
* Licensed under GNU Affero General Public License version 3 of the or any later version.
|
|
6
|
+
* For full copyright and license information, please see the LICENSE.txt
|
|
7
|
+
* Redistributions of files must retain the above copyright notice.
|
|
8
|
+
*
|
|
9
|
+
* @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
10
|
+
* @license https://opensource.org/licenses/AGPL-3.0 AGPL License
|
|
11
|
+
* @link https://www.passbolt.com Passbolt(tm)
|
|
12
|
+
* @since 3.9.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import each from "jest-each";
|
|
16
|
+
import mockComponentSetState from "../test/mock/components/React/mockSetState";
|
|
17
|
+
import {SsoContextProvider} from "./SsoContext";
|
|
18
|
+
import {defaultProps} from "./SsoContext.test.data";
|
|
19
|
+
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
jest.resetModules();
|
|
22
|
+
jest.clearAllMocks();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe("SsoContextProvider", () => {
|
|
26
|
+
each([
|
|
27
|
+
{name: "provider is Azure", providerId: "azure"},
|
|
28
|
+
{name: "no provider available", providerId: null},
|
|
29
|
+
]).describe(`SsoContextProvider configuration handling`, scenario => {
|
|
30
|
+
it(`SsoContextProvider::loadSsoConfiguration: Should call for the background page to retrieve the SSO provider data and set it on its state: ${scenario.name}`, async() => {
|
|
31
|
+
const props = defaultProps(null, scenario.providerId);
|
|
32
|
+
const contextProvider = new SsoContextProvider(props);
|
|
33
|
+
mockComponentSetState(contextProvider);
|
|
34
|
+
|
|
35
|
+
expect.assertions(2);
|
|
36
|
+
|
|
37
|
+
await contextProvider.loadSsoConfiguration();
|
|
38
|
+
|
|
39
|
+
expect(props.context.port.requestListeners["passbolt.sso.get-local-configured-provider"]).toHaveBeenCalled();
|
|
40
|
+
expect(contextProvider.state.ssoLocalConfiguredProvider).toEqual(scenario.providerId);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it(`SsoContextProvider::getProvider: Should return the SSO provider id: ${scenario.name}`, async() => {
|
|
44
|
+
const props = defaultProps(null, scenario.providerId);
|
|
45
|
+
const contextProvider = new SsoContextProvider(props);
|
|
46
|
+
mockComponentSetState(contextProvider);
|
|
47
|
+
|
|
48
|
+
expect.assertions(1);
|
|
49
|
+
|
|
50
|
+
await contextProvider.loadSsoConfiguration();
|
|
51
|
+
|
|
52
|
+
expect(contextProvider.getProvider()).toEqual(scenario.providerId);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it(`SsoContextProvider::hasUserAnSsoKit: Should return true when an SSO provider is available false otherwise: ${scenario.name}`, async() => {
|
|
56
|
+
const props = defaultProps(null, scenario.providerId);
|
|
57
|
+
const contextProvider = new SsoContextProvider(props);
|
|
58
|
+
mockComponentSetState(contextProvider);
|
|
59
|
+
|
|
60
|
+
expect.assertions(1);
|
|
61
|
+
|
|
62
|
+
await contextProvider.loadSsoConfiguration();
|
|
63
|
+
|
|
64
|
+
expect(contextProvider.hasUserAnSsoKit()).toEqual(Boolean(scenario.providerId));
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe("SsoContextProvider::runSignInProcess", () => {
|
|
69
|
+
it("Should call for the background page to delegate the Sign in process", async() => {
|
|
70
|
+
const props = defaultProps(null, "azure");
|
|
71
|
+
const contextProvider = new SsoContextProvider(props);
|
|
72
|
+
mockComponentSetState(contextProvider);
|
|
73
|
+
|
|
74
|
+
expect.assertions(2);
|
|
75
|
+
|
|
76
|
+
await contextProvider.loadSsoConfiguration();
|
|
77
|
+
await contextProvider.runSignInProcess();
|
|
78
|
+
|
|
79
|
+
expect(props.context.port.requestListeners["passbolt.sso.sign-in-with-azure"]).toHaveBeenCalledTimes(1);
|
|
80
|
+
expect(props.context.port.requestListeners["passbolt.auth.post-login-redirect"]).toHaveBeenCalledTimes(1);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("Should throw an error when something wrong happens during sign-in", async() => {
|
|
84
|
+
const error = new Error("An unexpected error occured");
|
|
85
|
+
const props = defaultProps(null, "azure");
|
|
86
|
+
props.context.port.addRequestListener("passbolt.sso.sign-in-with-azure", jest.fn(() => Promise.reject(error)));
|
|
87
|
+
const contextProvider = new SsoContextProvider(props);
|
|
88
|
+
mockComponentSetState(contextProvider);
|
|
89
|
+
|
|
90
|
+
expect.assertions(3);
|
|
91
|
+
|
|
92
|
+
await contextProvider.loadSsoConfiguration();
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
await contextProvider.runSignInProcess();
|
|
96
|
+
} catch (e) {
|
|
97
|
+
expect(e).toStrictEqual(error);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
expect(props.context.port.requestListeners["passbolt.sso.sign-in-with-azure"]).toHaveBeenCalledTimes(1);
|
|
101
|
+
expect(props.context.port.requestListeners["passbolt.auth.post-login-redirect"]).not.toHaveBeenCalled();
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
4
|
+
*
|
|
5
|
+
* Licensed under GNU Affero General Public License version 3 of the or any later version.
|
|
6
|
+
* For full copyright and license information, please see the LICENSE.txt
|
|
7
|
+
* Redistributions of files must retain the above copyright notice.
|
|
8
|
+
*
|
|
9
|
+
* @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
10
|
+
* @license https://opensource.org/licenses/AGPL-3.0 AGPL License
|
|
11
|
+
* @link https://www.passbolt.com Passbolt(tm)
|
|
12
|
+
* @since 3.8.3
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import XRegExp from 'xregexp';
|
|
16
|
+
import {nonProfessionalDomains} from './Domains';
|
|
17
|
+
|
|
18
|
+
const HOSTNAMEREGEX = "(?:[_\\p{L}0-9][-_\\p{L}0-9]*\\.)*(?:[\\p{L}0-9][-\\p{L}0-9]{0,62})\\.(?:(?:[a-z]{2}\\.)?[a-z]{2,})";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The DomainUtil which will interact with domains
|
|
22
|
+
*/
|
|
23
|
+
class DomainUtil {
|
|
24
|
+
/**
|
|
25
|
+
* Extract domain for email address
|
|
26
|
+
* @param {string} domain
|
|
27
|
+
* @returns {String}
|
|
28
|
+
*/
|
|
29
|
+
static extractDomainFromEmail(email) {
|
|
30
|
+
const regex = XRegExp(`(?<=@)${HOSTNAMEREGEX}`);
|
|
31
|
+
const match = XRegExp.match(email, regex);
|
|
32
|
+
return match || "";
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Check if the domain is a profesionnal
|
|
37
|
+
* @param {string} domain
|
|
38
|
+
* @returns {Boolean}
|
|
39
|
+
*/
|
|
40
|
+
static isProfessional(domain) {
|
|
41
|
+
return !nonProfessionalDomains.includes(domain);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Check the domain through regex and URL validation
|
|
46
|
+
* @param {string} domain
|
|
47
|
+
* @returns {Void}
|
|
48
|
+
*/
|
|
49
|
+
static checkDomainValidity(domain) {
|
|
50
|
+
const regex = XRegExp(`^${HOSTNAMEREGEX}$`);
|
|
51
|
+
if (!regex.test(domain)) {
|
|
52
|
+
throw new Error(
|
|
53
|
+
"Cannot parse domain. The domain does not match the pattern."
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
// we had https to avoid issue for validation
|
|
58
|
+
const url = new URL(`https://${domain}`);
|
|
59
|
+
if (!url.host) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
"Cannot parse domain. The domain does not match the pattern."
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
} catch (error) {
|
|
65
|
+
throw new Error("Cannot parse domain. The domain is not valid.");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export default DomainUtil;
|