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
|
@@ -0,0 +1,341 @@
|
|
|
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.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {AdminMfaContextProvider} from "../../../../react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext";
|
|
16
|
+
import {defaultProps, mockDuoError} from "../../../../react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.data";
|
|
17
|
+
import {enableFetchMocks} from 'jest-fetch-mock';
|
|
18
|
+
import MfaFormService from './MfaFormService';
|
|
19
|
+
import {mockYubikeyError} from '../../../../react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.data';
|
|
20
|
+
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
jest.resetModules();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe("MfaFormService", () => {
|
|
26
|
+
let adminMfaContext, // The adminMfaContext to test
|
|
27
|
+
mfaFormService;
|
|
28
|
+
const translation = message => message;
|
|
29
|
+
const props = defaultProps(); // The props to pass
|
|
30
|
+
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
jest.resetAllMocks();
|
|
33
|
+
adminMfaContext = new AdminMfaContextProvider(props);
|
|
34
|
+
const setStateMock = state => adminMfaContext.state = Object.assign(adminMfaContext.state, state);
|
|
35
|
+
jest.spyOn(adminMfaContext, "setState").mockImplementation(setStateMock);
|
|
36
|
+
MfaFormService.killInstance();
|
|
37
|
+
mfaFormService = MfaFormService.getInstance(adminMfaContext, translation);
|
|
38
|
+
enableFetchMocks();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe("MfaFormService::getInstance", () => {
|
|
42
|
+
it("should be a singleton", () => {
|
|
43
|
+
expect.assertions(1);
|
|
44
|
+
expect(mfaFormService).toBeDefined();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it("should not create a new instance", () => {
|
|
48
|
+
const newInstance = MfaFormService.getInstance();
|
|
49
|
+
expect.assertions(1);
|
|
50
|
+
expect(mfaFormService).toEqual(newInstance);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
describe("MfaFormService::killInstance", () => {
|
|
56
|
+
it("should kill the instance and create a new one", () => {
|
|
57
|
+
MfaFormService.killInstance();
|
|
58
|
+
mfaFormService = MfaFormService.getInstance(null, null);
|
|
59
|
+
expect.assertions(1);
|
|
60
|
+
expect(mfaFormService).toEqual({"context": null, "translation": null});
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe("MfaFormService::validateYubikeyClientIdentifier", () => {
|
|
65
|
+
it("should return required message", () => {
|
|
66
|
+
const requiredMessage = "A client identifier is required.";
|
|
67
|
+
const result = mfaFormService.validateYubikeyClientIdentifier("");
|
|
68
|
+
expect.assertions(2);
|
|
69
|
+
expect(result).toEqual(requiredMessage);
|
|
70
|
+
expect(adminMfaContext.getErrors().yubikeyClientIdentifierError).toEqual(requiredMessage);
|
|
71
|
+
});
|
|
72
|
+
it("should return regex message", () => {
|
|
73
|
+
const errorMessage = "The client identifier should be an integer.";
|
|
74
|
+
//Letters are not allowed
|
|
75
|
+
let result = mfaFormService.validateYubikeyClientIdentifier("FFFF");
|
|
76
|
+
|
|
77
|
+
expect.assertions(4);
|
|
78
|
+
expect(result).toEqual(errorMessage);
|
|
79
|
+
//Max size 64
|
|
80
|
+
result = mfaFormService.validateYubikeyClientIdentifier("F".repeat(65));
|
|
81
|
+
expect(result).toEqual(errorMessage);
|
|
82
|
+
//No special characters
|
|
83
|
+
result = mfaFormService.validateYubikeyClientIdentifier("@@");
|
|
84
|
+
expect(result).toEqual(errorMessage);
|
|
85
|
+
expect(adminMfaContext.getErrors().yubikeyClientIdentifierError).toEqual(errorMessage);
|
|
86
|
+
});
|
|
87
|
+
it("should not return message", () => {
|
|
88
|
+
//Only numbers are allowed
|
|
89
|
+
const result = mfaFormService.validateYubikeyClientIdentifier("123456789");
|
|
90
|
+
expect.assertions(2);
|
|
91
|
+
expect(result).toEqual(null);
|
|
92
|
+
expect(adminMfaContext.getErrors().yubikeyClientIdentifierError).toEqual(null);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
describe("MfaFormService::validateYubikeySecretKey", () => {
|
|
97
|
+
it("should return required message", () => {
|
|
98
|
+
const requiredMessage = "A secret key is required.";
|
|
99
|
+
const result = mfaFormService.validateYubikeySecretKey("");
|
|
100
|
+
expect.assertions(2);
|
|
101
|
+
expect(result).toEqual(requiredMessage);
|
|
102
|
+
expect(adminMfaContext.getErrors().yubikeySecretKeyError).toEqual(requiredMessage);
|
|
103
|
+
});
|
|
104
|
+
it("should return regex message", () => {
|
|
105
|
+
const errorMessage = "The client identifier should be an integer.";
|
|
106
|
+
//only / = + characters are allowed
|
|
107
|
+
let result = mfaFormService.validateYubikeyClientIdentifier("FFFFF12345**");
|
|
108
|
+
expect.assertions(4);
|
|
109
|
+
expect(result).toEqual(errorMessage);
|
|
110
|
+
//Max size 128
|
|
111
|
+
result = mfaFormService.validateYubikeyClientIdentifier("F".repeat(129));
|
|
112
|
+
expect(result).toEqual(errorMessage);
|
|
113
|
+
//Min size 10
|
|
114
|
+
result = mfaFormService.validateYubikeyClientIdentifier("@".repeat(9));
|
|
115
|
+
expect(result).toEqual(errorMessage);
|
|
116
|
+
expect(adminMfaContext.getErrors().yubikeyClientIdentifierError).toEqual(errorMessage);
|
|
117
|
+
});
|
|
118
|
+
it("should not return message", () => {
|
|
119
|
+
//Only without sensitive letters and number and / = + are allowed
|
|
120
|
+
let result = mfaFormService.validateYubikeySecretKey("mk6lyijz2AIhX3D9eLIYAxv63Co=");
|
|
121
|
+
expect(result).toEqual(null);
|
|
122
|
+
result = mfaFormService.validateYubikeySecretKey("mk6lyijz2AIhX3D9eLIYAxv63Co+");
|
|
123
|
+
expect(result).toEqual(null);
|
|
124
|
+
result = mfaFormService.validateYubikeySecretKey("mk6lyijz2AIhX3D9eLIYAxv63Co/");
|
|
125
|
+
expect(result).toEqual(null);
|
|
126
|
+
expect(adminMfaContext.getErrors().yubikeySecretKeyError).toEqual(null);
|
|
127
|
+
expect.assertions(4);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe("MfaFormService::validateDuoHostname", () => {
|
|
132
|
+
it("should return required message", () => {
|
|
133
|
+
const requiredMessage = "A hostname is required.";
|
|
134
|
+
const result = mfaFormService.validateDuoHostname("");
|
|
135
|
+
expect(result).toEqual(requiredMessage);
|
|
136
|
+
expect(adminMfaContext.getErrors().duoHostnameError).toEqual(requiredMessage);
|
|
137
|
+
expect.assertions(2);
|
|
138
|
+
});
|
|
139
|
+
it("should return regex message", () => {
|
|
140
|
+
const errorMessage = "This is not a valid hostname.";
|
|
141
|
+
//hostname should start with 'api-'
|
|
142
|
+
let result = mfaFormService.validateDuoHostname("123456789-duosecurity.com");
|
|
143
|
+
expect(result).toEqual(errorMessage);
|
|
144
|
+
//hostname should include '-duosecurity.com'
|
|
145
|
+
result = mfaFormService.validateDuoHostname("api-123456789-passbolt.com");
|
|
146
|
+
expect(result).toEqual(errorMessage);
|
|
147
|
+
//hostname should not include special character
|
|
148
|
+
result = mfaFormService.validateDuoHostname("api-123456@89-duosecurity.com");
|
|
149
|
+
//hostname have uuid with max 16 characters
|
|
150
|
+
result = mfaFormService.validateDuoHostname("api-0123456789azertyu-duosecurity.com");
|
|
151
|
+
//hostname have uuid with min 8 characters
|
|
152
|
+
result = mfaFormService.validateDuoHostname("api-1L-duosecurity.com");
|
|
153
|
+
expect(result).toEqual(errorMessage);
|
|
154
|
+
expect(adminMfaContext.getErrors().duoHostnameError).toEqual(errorMessage);
|
|
155
|
+
expect.assertions(4);
|
|
156
|
+
});
|
|
157
|
+
it("should not return message", () => {
|
|
158
|
+
const result = mfaFormService.validateDuoHostname("api-634253af.duosecurity.com");
|
|
159
|
+
expect.assertions(2);
|
|
160
|
+
expect(result).toEqual(null);
|
|
161
|
+
expect(adminMfaContext.getErrors().duoHostnameError).toEqual(null);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
describe("MfaFormService::validateDuoIntegrationKey", () => {
|
|
166
|
+
it("should return required message", () => {
|
|
167
|
+
const requiredMessage = "An integration key is required.";
|
|
168
|
+
const result = mfaFormService.validateDuoIntegrationKey("");
|
|
169
|
+
expect.assertions(2);
|
|
170
|
+
expect(result).toEqual(requiredMessage);
|
|
171
|
+
expect(adminMfaContext.getErrors().duoIntegrationKeyError).toEqual(requiredMessage);
|
|
172
|
+
});
|
|
173
|
+
it("should return regex message", () => {
|
|
174
|
+
const errorMessage = "This is not a valid integration key.";
|
|
175
|
+
//Min size 64
|
|
176
|
+
let result = mfaFormService.validateDuoIntegrationKey("F".repeat(15));
|
|
177
|
+
expect(result).toEqual(errorMessage);
|
|
178
|
+
//Max size 64
|
|
179
|
+
result = mfaFormService.validateDuoIntegrationKey("F".repeat(33));
|
|
180
|
+
expect(result).toEqual(errorMessage);
|
|
181
|
+
//No special characters
|
|
182
|
+
result = mfaFormService.validateDuoIntegrationKey("@&'");
|
|
183
|
+
expect(result).toEqual(errorMessage);
|
|
184
|
+
expect(adminMfaContext.getErrors().duoIntegrationKeyError).toEqual(errorMessage);
|
|
185
|
+
expect.assertions(4);
|
|
186
|
+
});
|
|
187
|
+
it("should not return message", () => {
|
|
188
|
+
//only upper and lowercase letters with numbers
|
|
189
|
+
const result = mfaFormService.validateDuoIntegrationKey("0123456789AZERTY");
|
|
190
|
+
expect(result).toEqual(null);
|
|
191
|
+
expect(adminMfaContext.getErrors().duoIntegrationKeyError).toEqual(null);
|
|
192
|
+
expect.assertions(2);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
describe("MfaFormService::validateDuoSecretKey", () => {
|
|
197
|
+
it("should return required message", () => {
|
|
198
|
+
const requiredMessage = "A secret key is required.";
|
|
199
|
+
const result = mfaFormService.validateDuoSecretKey("");
|
|
200
|
+
expect(result).toEqual(requiredMessage);
|
|
201
|
+
expect(adminMfaContext.getErrors().duoSecretKeyError).toEqual(requiredMessage);
|
|
202
|
+
expect.assertions(2);
|
|
203
|
+
});
|
|
204
|
+
it("should return regex message", () => {
|
|
205
|
+
const errorMessage = "This is not a valid secret key.";
|
|
206
|
+
|
|
207
|
+
//Min size 32
|
|
208
|
+
let result = mfaFormService.validateDuoSecretKey("F".repeat(31));
|
|
209
|
+
expect(result).toEqual(errorMessage);
|
|
210
|
+
//Max size 129
|
|
211
|
+
result = mfaFormService.validateDuoSecretKey("F".repeat(129));
|
|
212
|
+
expect(result).toEqual(errorMessage);
|
|
213
|
+
//No special characters
|
|
214
|
+
result = mfaFormService.validateDuoSecretKey("@$ù=");
|
|
215
|
+
expect(result).toEqual(errorMessage);
|
|
216
|
+
expect(adminMfaContext.getErrors().duoSecretKeyError).toEqual(errorMessage);
|
|
217
|
+
expect.assertions(4);
|
|
218
|
+
});
|
|
219
|
+
it("should not return message", () => {
|
|
220
|
+
//only upper and lowercase letters with numbers
|
|
221
|
+
const result = mfaFormService.validateDuoSecretKey("aZ7".repeat(11));
|
|
222
|
+
expect(result).toEqual(null);
|
|
223
|
+
expect(adminMfaContext.getErrors().duoSecretKeyError).toEqual(null);
|
|
224
|
+
expect.assertions(2);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
describe("MfaFormService::validateDuoSalt", () => {
|
|
229
|
+
it("should return required message", () => {
|
|
230
|
+
const requiredMessage = "A salt is required.";
|
|
231
|
+
const result = mfaFormService.validateDuoSalt("");
|
|
232
|
+
expect(result).toEqual(requiredMessage);
|
|
233
|
+
expect(adminMfaContext.getErrors().duoSaltError).toEqual(requiredMessage);
|
|
234
|
+
expect.assertions(2);
|
|
235
|
+
});
|
|
236
|
+
it("should return regex message", () => {
|
|
237
|
+
const errorMessage = "The salt should be between 40 and 128 characters in length.";
|
|
238
|
+
|
|
239
|
+
//Min size 32
|
|
240
|
+
let result = mfaFormService.validateDuoSalt("F".repeat(39));
|
|
241
|
+
expect(result).toEqual(errorMessage);
|
|
242
|
+
//Max size 129
|
|
243
|
+
result = mfaFormService.validateDuoSalt("F".repeat(129));
|
|
244
|
+
expect(result).toEqual(errorMessage);
|
|
245
|
+
expect(adminMfaContext.getErrors().duoSaltError).toEqual(errorMessage);
|
|
246
|
+
expect.assertions(3);
|
|
247
|
+
});
|
|
248
|
+
it("should not return message", () => {
|
|
249
|
+
//Oall characters allowed
|
|
250
|
+
const result = mfaFormService.validateDuoSalt("aZ7@".repeat(10));
|
|
251
|
+
expect(result).toEqual(null);
|
|
252
|
+
expect(adminMfaContext.getErrors().duoSaltError).toEqual(null);
|
|
253
|
+
expect.assertions(2);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
describe("MfaFormService::validateDuoInputs", () => {
|
|
258
|
+
it("should not validate if duo is not selected", () => {
|
|
259
|
+
adminMfaContext.setSettings("duoToggle", false);
|
|
260
|
+
const result = mfaFormService.validateDuoInputs();
|
|
261
|
+
expect(result).toEqual({});
|
|
262
|
+
expect.assertions(1);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it("should validate if duo is selected", () => {
|
|
266
|
+
adminMfaContext.setSettings("duoToggle", true);
|
|
267
|
+
|
|
268
|
+
jest.spyOn(mfaFormService, "validateDuoHostname");
|
|
269
|
+
jest.spyOn(mfaFormService, "validateDuoIntegrationKey");
|
|
270
|
+
jest.spyOn(mfaFormService, "validateDuoSecretKey");
|
|
271
|
+
jest.spyOn(mfaFormService, "validateDuoSalt");
|
|
272
|
+
|
|
273
|
+
const result = mfaFormService.validateDuoInputs();
|
|
274
|
+
const settings = adminMfaContext.getSettings();
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
expect(mfaFormService.validateDuoHostname).toHaveBeenCalledWith(settings.duoHostname);
|
|
278
|
+
expect(mfaFormService.validateDuoIntegrationKey).toHaveBeenCalledWith(settings.duoIntegrationKey);
|
|
279
|
+
expect(mfaFormService.validateDuoSecretKey).toHaveBeenCalledWith(settings.duoSecretKey);
|
|
280
|
+
expect(mfaFormService.validateDuoSalt).toHaveBeenCalledWith(settings.duoSalt);
|
|
281
|
+
expect(result).toEqual(mockDuoError());
|
|
282
|
+
expect.assertions(5);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
describe("MfaFormService::validateYubikeyInputs", () => {
|
|
287
|
+
it("should not validate if yubikey is not selected", () => {
|
|
288
|
+
adminMfaContext.setSettings("yubikeyToggle", false);
|
|
289
|
+
|
|
290
|
+
const result = mfaFormService.validateYubikeyInputs();
|
|
291
|
+
|
|
292
|
+
expect(result).toEqual({});
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it("should validate if duo is selected", () => {
|
|
296
|
+
adminMfaContext.setSettings("yubikeyToggle", true);
|
|
297
|
+
|
|
298
|
+
jest.spyOn(mfaFormService, "validateYubikeyClientIdentifier");
|
|
299
|
+
jest.spyOn(mfaFormService, "validateYubikeySecretKey");
|
|
300
|
+
|
|
301
|
+
const result = mfaFormService.validateYubikeyInputs();
|
|
302
|
+
const settings = adminMfaContext.getSettings();
|
|
303
|
+
|
|
304
|
+
expect(mfaFormService.validateYubikeyClientIdentifier).toHaveBeenCalledWith(settings.yubikeyClientIdentifier);
|
|
305
|
+
expect(mfaFormService.validateYubikeySecretKey).toHaveBeenCalledWith(settings.yubikeySecretKey);
|
|
306
|
+
expect(result).toEqual(mockYubikeyError());
|
|
307
|
+
expect.assertions(3);
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
describe("MfaFormService::validate", () => {
|
|
312
|
+
it("should return false if there are some validation issues", async() => {
|
|
313
|
+
adminMfaContext.setSettings("yubikeyToggle", true);
|
|
314
|
+
adminMfaContext.setSettings("duoToggle", true);
|
|
315
|
+
|
|
316
|
+
jest.spyOn(mfaFormService, "validateYubikeyInputs");
|
|
317
|
+
jest.spyOn(mfaFormService, "validateDuoInputs");
|
|
318
|
+
|
|
319
|
+
const result = await mfaFormService.validate();
|
|
320
|
+
const errors = adminMfaContext.getErrors();
|
|
321
|
+
|
|
322
|
+
expect(result).toBeFalsy();
|
|
323
|
+
expect(mfaFormService.validateYubikeyInputs).toHaveBeenCalled();
|
|
324
|
+
expect(mfaFormService.validateDuoInputs).toHaveBeenCalled();
|
|
325
|
+
expect(errors).toEqual(Object.assign(mockYubikeyError(), mockDuoError()));
|
|
326
|
+
expect.assertions(4);
|
|
327
|
+
});
|
|
328
|
+
it("should return true if validation succeed", async() => {
|
|
329
|
+
jest.spyOn(mfaFormService, "validateYubikeyInputs");
|
|
330
|
+
jest.spyOn(mfaFormService, "validateDuoInputs");
|
|
331
|
+
|
|
332
|
+
const result = await mfaFormService.validate();
|
|
333
|
+
|
|
334
|
+
expect(result).toBeTruthy();
|
|
335
|
+
expect(mfaFormService.validateYubikeyInputs).toHaveBeenCalled();
|
|
336
|
+
expect(mfaFormService.validateDuoInputs).toHaveBeenCalled();
|
|
337
|
+
expect.assertions(3);
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
|
|
@@ -0,0 +1,92 @@
|
|
|
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.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import DomainUtil from '../../../../react-extension/lib/Domain/DomainUtil';
|
|
16
|
+
import MapObject from '../../../../react-extension/lib/Map/MapObject';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Model related to the Self Registration form settings
|
|
20
|
+
*/
|
|
21
|
+
class SelfRegistrationFormService {
|
|
22
|
+
/**
|
|
23
|
+
* Constructor
|
|
24
|
+
*
|
|
25
|
+
* @param {context} context
|
|
26
|
+
* @public
|
|
27
|
+
*/
|
|
28
|
+
constructor(translate) {
|
|
29
|
+
this.translate = translate;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
fields = new Map();
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Validate the form.
|
|
36
|
+
* @returns {Promise<boolean>}
|
|
37
|
+
*/
|
|
38
|
+
async validate(domains) {
|
|
39
|
+
this.fields = domains;
|
|
40
|
+
// Validate the form inputs.
|
|
41
|
+
const validation = this.validateInputs();
|
|
42
|
+
//Check if we have errors
|
|
43
|
+
return validation;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Validate inputs.
|
|
48
|
+
* @returns {Promise<void>}
|
|
49
|
+
*/
|
|
50
|
+
validateInputs() {
|
|
51
|
+
const errors = new Map();
|
|
52
|
+
this.fields.forEach((value, key) => {
|
|
53
|
+
this.validateInput(key, value, errors);
|
|
54
|
+
});
|
|
55
|
+
return errors;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Validate inputs.
|
|
60
|
+
* @params {string} The input name
|
|
61
|
+
* @params {string} The input value
|
|
62
|
+
* @returns {Promise<void>}
|
|
63
|
+
*/
|
|
64
|
+
async validateInput(key, value, errors) {
|
|
65
|
+
if (!value.length) {
|
|
66
|
+
errors.set(key, this.translate("A domain is required."));
|
|
67
|
+
} else {
|
|
68
|
+
try {
|
|
69
|
+
DomainUtil.checkDomainValidity(value);
|
|
70
|
+
} catch {
|
|
71
|
+
errors.set(key, this.translate("This should be a valid domain"));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//Avoid duplicate value
|
|
75
|
+
this.checkDuplicateValue(errors);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Check if we have a duplication.
|
|
80
|
+
* @returns {Promise<void>}
|
|
81
|
+
*/
|
|
82
|
+
checkDuplicateValue(inputErrors) {
|
|
83
|
+
this.fields.forEach((value, key) => {
|
|
84
|
+
const hasDuplicate = MapObject.listValues(this.fields).filter(domain => domain === value && domain !== "").length > 1;
|
|
85
|
+
if (hasDuplicate) {
|
|
86
|
+
inputErrors.set(key, this.translate("This domain already exist"));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export default SelfRegistrationFormService;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*import { userDirectoryContext } from '../../../../react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext';
|
|
3
|
+
* Passbolt ~ Open source password manager for teams
|
|
4
|
+
* Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
5
|
+
*
|
|
6
|
+
* Licensed under GNU Affero General Public License version 3 of the or any later version.
|
|
7
|
+
* For full copyright and license information, please see the LICENSE.txt
|
|
8
|
+
* Redistributions of files must retain the above copyright notice.
|
|
9
|
+
*
|
|
10
|
+
* @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
|
|
11
|
+
* @license https://opensource.org/licenses/AGPL-3.0 AGPL License
|
|
12
|
+
* @link https://www.passbolt.com Passbolt(tm)
|
|
13
|
+
* @since 3.8.3
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
import {enableFetchMocks} from 'jest-fetch-mock';
|
|
18
|
+
import {AdminSelfRegistrationContextProvider} from "../../../../react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext";
|
|
19
|
+
import {defaultProps} from '../../../../react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.data';
|
|
20
|
+
import SelfRegistrationFormService from './SelfRegistrationFormService';
|
|
21
|
+
import SelfRegistrationDomainsViewModel from '../../../models/selfRegistration/SelfRegistrationDomainsViewModel';
|
|
22
|
+
import MapObject from '../../../../react-extension/lib/Map/MapObject';
|
|
23
|
+
|
|
24
|
+
beforeEach(() => {
|
|
25
|
+
jest.resetModules();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
describe("SelfRegistrationFormService", () => {
|
|
29
|
+
let selfRegistrationContext, // The selfRegistrationContext to test
|
|
30
|
+
selfRegistrationFormService;
|
|
31
|
+
const translation = message => message;
|
|
32
|
+
const props = defaultProps(); // The props to pass
|
|
33
|
+
const uuid = "2bb8b096-06ce-4c9a-a627-ec30ce045a83";
|
|
34
|
+
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
jest.resetAllMocks();
|
|
37
|
+
selfRegistrationContext = new AdminSelfRegistrationContextProvider(props);
|
|
38
|
+
mockState(selfRegistrationContext);
|
|
39
|
+
selfRegistrationFormService = new SelfRegistrationFormService(translation);
|
|
40
|
+
enableFetchMocks();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
describe("UserDirectoryFormService::validateInput", () => {
|
|
45
|
+
it("should return required message", async() => {
|
|
46
|
+
expect.assertions(1);
|
|
47
|
+
const errors = new Map();
|
|
48
|
+
await selfRegistrationFormService.validateInput(uuid, "", errors);
|
|
49
|
+
expect(errors.get(uuid)).toEqual("A domain is required.");
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("should return a message to reject domain format", async() => {
|
|
53
|
+
expect.assertions(1);
|
|
54
|
+
const errors = new Map();
|
|
55
|
+
await selfRegistrationFormService.validateInput(uuid, "localhost", errors);
|
|
56
|
+
expect(errors.get(uuid)).toEqual("This should be a valid domain");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("should call checkDuplicateValue", async() => {
|
|
60
|
+
jest.spyOn(selfRegistrationFormService, "checkDuplicateValue");
|
|
61
|
+
const errors = new Map();
|
|
62
|
+
await selfRegistrationFormService.validateInput(uuid, "hello.world", errors);
|
|
63
|
+
expect.assertions(1);
|
|
64
|
+
expect(selfRegistrationFormService.checkDuplicateValue).toHaveBeenCalled();
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe("UserDirectoryFormService::checkDuplicateValue", () => {
|
|
69
|
+
it("should return a message which indicate that the domain already exist", async() => {
|
|
70
|
+
selfRegistrationFormService.fields = ["passbolt.com", "passbolt.com"];
|
|
71
|
+
expect.assertions(1);
|
|
72
|
+
const errors = new Map();
|
|
73
|
+
await selfRegistrationFormService.checkDuplicateValue(errors);
|
|
74
|
+
expect(MapObject.listValues(errors)).toEqual(["This domain already exist", "This domain already exist"]);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("should not return a message", async() => {
|
|
78
|
+
const domains = new SelfRegistrationDomainsViewModel(
|
|
79
|
+
{data: {"allowed_domains": ["passbolt.com"]}}
|
|
80
|
+
);
|
|
81
|
+
await selfRegistrationContext.setDomains(domains);
|
|
82
|
+
expect.assertions(1);
|
|
83
|
+
const errors = new Map();
|
|
84
|
+
await selfRegistrationFormService.checkDuplicateValue(errors);
|
|
85
|
+
expect(errors.size).toEqual(0);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
function mockState(adminSelfRegistrationContext) {
|
|
91
|
+
const setStateMock = state => {
|
|
92
|
+
let newState;
|
|
93
|
+
if (typeof state === 'function') {
|
|
94
|
+
newState = state(adminSelfRegistrationContext.state);
|
|
95
|
+
} else {
|
|
96
|
+
newState = state;
|
|
97
|
+
}
|
|
98
|
+
adminSelfRegistrationContext.state = Object.assign(adminSelfRegistrationContext.state, newState);
|
|
99
|
+
};
|
|
100
|
+
jest.spyOn(adminSelfRegistrationContext, "setState").mockImplementation(setStateMock);
|
|
101
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
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.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import XRegExp from 'xregexp';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Model related to the User Directory form settings
|
|
19
|
+
*/
|
|
20
|
+
class UserDirectoryFormService {
|
|
21
|
+
/**
|
|
22
|
+
* Constructor
|
|
23
|
+
*
|
|
24
|
+
* @param {context} context
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
constructor(context, translate) {
|
|
28
|
+
this.context = context;
|
|
29
|
+
this.translate = translate;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* getInstance for singleton pattern
|
|
34
|
+
* @param {context} context
|
|
35
|
+
* @public
|
|
36
|
+
*/
|
|
37
|
+
static getInstance(context, translate) {
|
|
38
|
+
if (!this.instance) {
|
|
39
|
+
this.instance = new UserDirectoryFormService(context, translate);
|
|
40
|
+
}
|
|
41
|
+
return this.instance;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* killInstance singleton
|
|
46
|
+
* @param {context} context
|
|
47
|
+
* @public
|
|
48
|
+
*/
|
|
49
|
+
static killInstance() {
|
|
50
|
+
this.instance = null;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Validate the form.
|
|
55
|
+
* @returns {Promise<boolean>}
|
|
56
|
+
*/
|
|
57
|
+
async validate() {
|
|
58
|
+
// Validate the form inputs.
|
|
59
|
+
const validation = {
|
|
60
|
+
...this.validateHostInput(),
|
|
61
|
+
...this.validatePortInput(),
|
|
62
|
+
...this.validateDomainInput()
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
await this.context.setErrors(validation);
|
|
66
|
+
//Check if we have errors
|
|
67
|
+
return Object.values(validation).filter(x => x).length === 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Validate the host input.
|
|
72
|
+
* @returns {Promise<void>}
|
|
73
|
+
*/
|
|
74
|
+
validateHostInput() {
|
|
75
|
+
const settings = this.context.getSettings();
|
|
76
|
+
let hostError = null;
|
|
77
|
+
const host = settings.host.trim();
|
|
78
|
+
if (!host.length) {
|
|
79
|
+
hostError = this.translate("A host is required.");
|
|
80
|
+
}
|
|
81
|
+
this.context.setError("hostError", hostError);
|
|
82
|
+
return {hostError};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Validate the port input.
|
|
87
|
+
* @returns {Promise<void>}
|
|
88
|
+
*/
|
|
89
|
+
validatePortInput() {
|
|
90
|
+
const settings = this.context.getSettings();
|
|
91
|
+
let portError = null;
|
|
92
|
+
const port = settings.port.trim();
|
|
93
|
+
if (!port.length) {
|
|
94
|
+
portError = this.translate("A port is required.");
|
|
95
|
+
} else if (!XRegExp("^[0-9]+").test(port)) {
|
|
96
|
+
portError = this.translate("Only numeric characters allowed.");
|
|
97
|
+
}
|
|
98
|
+
this.context.setError("portError", portError);
|
|
99
|
+
return {portError};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Validate the domain input.
|
|
104
|
+
* @returns {Promise<void>}
|
|
105
|
+
*/
|
|
106
|
+
validateDomainInput() {
|
|
107
|
+
const settings = this.context.getSettings();
|
|
108
|
+
let domainError = null;
|
|
109
|
+
const domain = settings.domain.trim();
|
|
110
|
+
if (!domain.length) {
|
|
111
|
+
domainError = this.translate("A domain name is required.");
|
|
112
|
+
}
|
|
113
|
+
this.context.setError("domainError", domainError);
|
|
114
|
+
return {domainError};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export default UserDirectoryFormService;
|