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,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) 2021 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) 2021 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
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
jest.resetModules();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
import {defaultAppContext, mockExtensionCall} from './SaveResource.test.data';
|
|
21
|
+
import {defaultProps} from '../ResourceCreatePage/ResourceCreatePage.test.data';
|
|
22
|
+
import SaveResourcePage from './SaveResource.test.page';
|
|
23
|
+
import {waitFor} from '@testing-library/react';
|
|
24
|
+
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
jest.resetModules();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe("See the Create Resource - save resource", () => {
|
|
30
|
+
let page; // The page to test against
|
|
31
|
+
const context = defaultAppContext(); // The applicative context
|
|
32
|
+
const props = defaultProps(); // The props to pass
|
|
33
|
+
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
jest.useFakeTimers();
|
|
36
|
+
mockExtensionCall(context);
|
|
37
|
+
page = new SaveResourcePage(context, props);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
afterEach(() => {
|
|
41
|
+
jest.clearAllTimers();
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("As a signed-in user creating a password on the quickaccess, I should get warn when I enter a pwned password and not be blocked", async() => {
|
|
45
|
+
expect.assertions(2);
|
|
46
|
+
|
|
47
|
+
await page.fillInputPassword('hello-world');
|
|
48
|
+
await waitFor(() => {});
|
|
49
|
+
// we expect a warning to inform about powned password
|
|
50
|
+
expect(page.pwnedWarningMessage.textContent).toEqual("The password is part of an exposed data breach.");
|
|
51
|
+
|
|
52
|
+
await page.fillInputPassword('unavailable');
|
|
53
|
+
await waitFor(() => {});
|
|
54
|
+
// we expect a warning to inform about a network issue
|
|
55
|
+
expect(page.pwnedWarningMessage.textContent).toEqual("The pwnedpasswords service is unavailable, your password might be part of an exposed data breach");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) 2021 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) 2021 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 React from "react";
|
|
16
|
+
import {render} from "@testing-library/react";
|
|
17
|
+
import {StaticRouter} from 'react-router-dom';
|
|
18
|
+
import MockTranslationProvider from '../../../react-extension/test/mock/components/Internationalisation/MockTranslationProvider';
|
|
19
|
+
import {fireEvent} from '@testing-library/react';
|
|
20
|
+
import SaveResource from "./SaveResource";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The SaveResource component represented as a page
|
|
24
|
+
*/
|
|
25
|
+
export default class SaveResourcePage {
|
|
26
|
+
/**
|
|
27
|
+
* Default constructor
|
|
28
|
+
* @param props Props to attach
|
|
29
|
+
*/
|
|
30
|
+
constructor(context, props) {
|
|
31
|
+
this._page = render(
|
|
32
|
+
<MockTranslationProvider>
|
|
33
|
+
<StaticRouter context={context}>
|
|
34
|
+
<SaveResource context={context} prepareResourceContext={props.prepareResourceContext} debug />
|
|
35
|
+
</StaticRouter>
|
|
36
|
+
</MockTranslationProvider>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Returns the password input element
|
|
42
|
+
*/
|
|
43
|
+
get password() {
|
|
44
|
+
return this._page.container.querySelector('#password');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Returns the pwned warning message
|
|
49
|
+
*/
|
|
50
|
+
get pwnedWarningMessage() {
|
|
51
|
+
return this._page.container.querySelector('.pwned-password.warning-message');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** fill the input password with data */
|
|
55
|
+
async fillInputPassword(data) {
|
|
56
|
+
const dataInputEvent = {target: {value: data}};
|
|
57
|
+
fireEvent.change(this.password, dataInputEvent);
|
|
58
|
+
jest.runAllTimers();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -9,6 +9,8 @@ import {withPrepareResourceContext} from "../../contexts/PrepareResourceContext"
|
|
|
9
9
|
import Icon from "../../../shared/components/Icons/Icon";
|
|
10
10
|
import Password from "../../../shared/components/Password/Password";
|
|
11
11
|
import PasswordComplexity from "../../../shared/components/PasswordComplexity/PasswordComplexity";
|
|
12
|
+
import debounce from 'debounce-promise';
|
|
13
|
+
import PownedService from "../../../shared/services/api/secrets/pownedService";
|
|
12
14
|
|
|
13
15
|
class ResourceCreatePage extends React.Component {
|
|
14
16
|
constructor(props) {
|
|
@@ -16,9 +18,12 @@ class ResourceCreatePage extends React.Component {
|
|
|
16
18
|
this.initEventHandlers();
|
|
17
19
|
this.state = this.getDefaultState();
|
|
18
20
|
this.createInputRef();
|
|
21
|
+
this.isPwndProcessingPromise = null;
|
|
22
|
+
this.evaluatePasswordIsInDictionaryDebounce = debounce(this.evaluatePasswordIsInDictionaryDebounce, 300);
|
|
19
23
|
}
|
|
20
24
|
|
|
21
25
|
async componentDidMount() {
|
|
26
|
+
this.pownedService = new PownedService(this.props.context.port);
|
|
22
27
|
await this.handlePreparedResource();
|
|
23
28
|
this.handleLastGeneratedPassword();
|
|
24
29
|
}
|
|
@@ -45,6 +50,8 @@ class ResourceCreatePage extends React.Component {
|
|
|
45
50
|
password: "",
|
|
46
51
|
passwordError: "",
|
|
47
52
|
passwordEntropy: null,
|
|
53
|
+
isPwnedServiceAvailable: true,
|
|
54
|
+
passwordInDictionary: false
|
|
48
55
|
};
|
|
49
56
|
}
|
|
50
57
|
|
|
@@ -201,6 +208,7 @@ class ResourceCreatePage extends React.Component {
|
|
|
201
208
|
*/
|
|
202
209
|
async handleFormSubmit(event) {
|
|
203
210
|
event.preventDefault();
|
|
211
|
+
|
|
204
212
|
this.setState({
|
|
205
213
|
processing: true,
|
|
206
214
|
error: "",
|
|
@@ -259,6 +267,17 @@ class ResourceCreatePage extends React.Component {
|
|
|
259
267
|
}
|
|
260
268
|
}
|
|
261
269
|
|
|
270
|
+
/**
|
|
271
|
+
* Evaluate to check if password is in a dictionary.
|
|
272
|
+
* @return {Promise}
|
|
273
|
+
*/
|
|
274
|
+
async evaluatePasswordIsInDictionaryDebounce() {
|
|
275
|
+
if (this.state.isPwnedServiceAvailable) {
|
|
276
|
+
const result = await this.pownedService.evaluateSecret(this.state.password);
|
|
277
|
+
this.setState({isPwnedServiceAvailable: result.isPwnedServiceAvailable, passwordInDictionary: result.inDictionary});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
262
281
|
formatValidationFieldError(fieldErrors) {
|
|
263
282
|
if (!fieldErrors) {
|
|
264
283
|
return "";
|
|
@@ -267,6 +286,10 @@ class ResourceCreatePage extends React.Component {
|
|
|
267
286
|
}
|
|
268
287
|
|
|
269
288
|
handlePasswordChange(event) {
|
|
289
|
+
if (event.target.value.length) {
|
|
290
|
+
this.isPwndProcessingPromise = this.evaluatePasswordIsInDictionaryDebounce();
|
|
291
|
+
}
|
|
292
|
+
|
|
270
293
|
this.loadPassword(event.target.value);
|
|
271
294
|
}
|
|
272
295
|
|
|
@@ -360,7 +383,10 @@ class ResourceCreatePage extends React.Component {
|
|
|
360
383
|
}
|
|
361
384
|
</div>
|
|
362
385
|
<div className={`input-password-wrapper input required ${this.state.passwordError ? "error" : ""}`}>
|
|
363
|
-
<label htmlFor="password"><Trans>Password</Trans
|
|
386
|
+
<label htmlFor="password"><Trans>Password</Trans>
|
|
387
|
+
{(this.state.passwordInDictionary || !this.state.isPwnedServiceAvailable) &&
|
|
388
|
+
<Icon name="exclamation"/>
|
|
389
|
+
}</label>
|
|
364
390
|
<div className="password-button-inline">
|
|
365
391
|
<Password name="password" value={this.state.password} preview={true} onChange={this.handlePasswordChange} disabled={this.state.processing}
|
|
366
392
|
autoComplete="new-password" placeholder={this.translate('Password')} id="password" inputRef={this.passwordInputRef}/>
|
|
@@ -381,6 +407,12 @@ class ResourceCreatePage extends React.Component {
|
|
|
381
407
|
{this.state.passwordError &&
|
|
382
408
|
<div className="error-message">{this.state.passwordError}</div>
|
|
383
409
|
}
|
|
410
|
+
{!this.state.isPwnedServiceAvailable &&
|
|
411
|
+
<div className="pwned-password warning-message"><Trans>The pwnedpasswords service is unavailable, your password might be part of an exposed data breach</Trans></div>
|
|
412
|
+
}
|
|
413
|
+
{this.state.passwordInDictionary &&
|
|
414
|
+
<div className="pwned-password warning-message"><Trans>The password is part of an exposed data breach.</Trans></div>
|
|
415
|
+
}
|
|
384
416
|
</div>
|
|
385
417
|
</div>
|
|
386
418
|
</div>
|
|
@@ -11,6 +11,7 @@ import {defaultAppContext, defaultProps} from "./ResourceCreatePage.test.data";
|
|
|
11
11
|
|
|
12
12
|
// Reset the modules before each test.
|
|
13
13
|
beforeEach(() => {
|
|
14
|
+
jest.useFakeTimers();
|
|
14
15
|
jest.resetModules();
|
|
15
16
|
});
|
|
16
17
|
|
|
@@ -18,6 +19,7 @@ beforeEach(() => {
|
|
|
18
19
|
afterEach(() => {
|
|
19
20
|
cleanup();
|
|
20
21
|
delete window.passbolt;
|
|
22
|
+
jest.clearAllTimers();
|
|
21
23
|
});
|
|
22
24
|
|
|
23
25
|
describe("ResourceCreatePage", () => {
|
|
@@ -148,10 +150,18 @@ describe("ResourceCreatePage", () => {
|
|
|
148
150
|
const createPasswordEventMockCallback = jest.fn();
|
|
149
151
|
const context = defaultAppContext();
|
|
150
152
|
const props = defaultProps();
|
|
153
|
+
const inputPasswordChange = async password => {
|
|
154
|
+
const passwordInput = component.container.querySelector('[name="password"]');
|
|
155
|
+
const passwordInputEvent = {target: {value: password}};
|
|
156
|
+
fireEvent.change(passwordInput, passwordInputEvent);
|
|
157
|
+
jest.runAllTimers();
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const pwnedWarningMessage = () => component.container.querySelector('.pwned-password.warning-message');
|
|
151
161
|
// Mock the passbolt messaging layer.
|
|
152
162
|
context.port = {
|
|
153
|
-
request: function(event) {
|
|
154
|
-
return new Promise(resolve => {
|
|
163
|
+
request: function(event, value) {
|
|
164
|
+
return new Promise((resolve, reject) => {
|
|
155
165
|
if (event === "passbolt.quickaccess.prepare-resource") {
|
|
156
166
|
resolve({
|
|
157
167
|
name: "Passbolt Browser Extension Test",
|
|
@@ -162,6 +172,14 @@ describe("ResourceCreatePage", () => {
|
|
|
162
172
|
resolve({
|
|
163
173
|
id: "newly-created-resource-id"
|
|
164
174
|
});
|
|
175
|
+
} else if (event === "passbolt.secrets.powned-password") {
|
|
176
|
+
if (value === "hello-world") {
|
|
177
|
+
resolve(3);
|
|
178
|
+
} else if (value === "unavailable") {
|
|
179
|
+
reject();
|
|
180
|
+
} else {
|
|
181
|
+
resolve(0);
|
|
182
|
+
}
|
|
165
183
|
}
|
|
166
184
|
});
|
|
167
185
|
}
|
|
@@ -175,6 +193,8 @@ describe("ResourceCreatePage", () => {
|
|
|
175
193
|
</MockTranslationProvider>
|
|
176
194
|
);
|
|
177
195
|
|
|
196
|
+
expect.assertions(4);
|
|
197
|
+
|
|
178
198
|
// Wait the passbolt.request executed in the ComponentDidMount is resolved.
|
|
179
199
|
await waitFor(() => {
|
|
180
200
|
if (props.prepareResourceContext.getLastGeneratedPassword.mock.calls.length === 0) {
|
|
@@ -186,9 +206,17 @@ describe("ResourceCreatePage", () => {
|
|
|
186
206
|
const usernameInput = component.container.querySelector('[name="username"]');
|
|
187
207
|
const usernameInputEvent = {target: {value: "test@passbolt.com"}};
|
|
188
208
|
fireEvent.change(usernameInput, usernameInputEvent);
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
209
|
+
|
|
210
|
+
await inputPasswordChange("P4ssb0lt");
|
|
211
|
+
expect(pwnedWarningMessage()).toBe(null);
|
|
212
|
+
//Powned password should raise a warning and not block submit
|
|
213
|
+
await inputPasswordChange("hello-world");
|
|
214
|
+
await waitFor(() => {});
|
|
215
|
+
expect(pwnedWarningMessage().textContent).toBe("The password is part of an exposed data breach.");
|
|
216
|
+
//Service for powned password unavailable should not block
|
|
217
|
+
await inputPasswordChange("unavailable");
|
|
218
|
+
await waitFor(() => {});
|
|
219
|
+
expect(pwnedWarningMessage().textContent).toBe("The pwnedpasswords service is unavailable, your password might be part of an exposed data breach");
|
|
192
220
|
|
|
193
221
|
// Submit the form.
|
|
194
222
|
const submitButton = component.container.querySelector('button[type="submit"]');
|
|
@@ -203,8 +231,9 @@ describe("ResourceCreatePage", () => {
|
|
|
203
231
|
uri: "https://passbolt-browser-extension/test",
|
|
204
232
|
username: "test@passbolt.com"
|
|
205
233
|
};
|
|
206
|
-
expect.
|
|
207
|
-
expect(createPasswordEventMockCallback).toHaveBeenCalledWith(resourceMeta, "P4ssb0lt");
|
|
234
|
+
expect(createPasswordEventMockCallback).toHaveBeenCalledWith(resourceMeta, "unavailable");
|
|
208
235
|
});
|
|
209
236
|
});
|
|
210
237
|
});
|
|
238
|
+
|
|
239
|
+
|
|
@@ -5,6 +5,7 @@ import {Trans, withTranslation} from "react-i18next";
|
|
|
5
5
|
import {withAppContext} from "../../contexts/AppContext";
|
|
6
6
|
import {withRouter} from "react-router-dom";
|
|
7
7
|
import Icon from "../../../shared/components/Icons/Icon";
|
|
8
|
+
import ClipBoard from '../../../shared/lib/Browser/clipBoard';
|
|
8
9
|
|
|
9
10
|
class ResourceViewPage extends React.Component {
|
|
10
11
|
constructor(props) {
|
|
@@ -81,7 +82,7 @@ class ResourceViewPage extends React.Component {
|
|
|
81
82
|
|
|
82
83
|
try {
|
|
83
84
|
this.setState({copyLoginState: 'processing'});
|
|
84
|
-
await
|
|
85
|
+
await ClipBoard.copy(this.state.resource.username, this.props.context.port);
|
|
85
86
|
this.setState({copyLoginState: 'done'});
|
|
86
87
|
setTimeout(() => {
|
|
87
88
|
this.setState({copyLoginState: 'default'});
|
|
@@ -130,7 +131,7 @@ class ResourceViewPage extends React.Component {
|
|
|
130
131
|
}
|
|
131
132
|
}
|
|
132
133
|
|
|
133
|
-
await
|
|
134
|
+
await ClipBoard.copy(password, this.props.context.port);
|
|
134
135
|
this.setState({copySecretState: 'done'});
|
|
135
136
|
setTimeout(() => {
|
|
136
137
|
this.setState({copySecretState: 'default'});
|
|
@@ -0,0 +1,150 @@
|
|
|
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.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}`, true);
|
|
86
|
+
} catch (e) {
|
|
87
|
+
console.error(e);
|
|
88
|
+
this.handleSpecificError(e);
|
|
89
|
+
throw e;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Handles error from the background page during SSO sign-in.
|
|
95
|
+
* @param {Error} e
|
|
96
|
+
*/
|
|
97
|
+
handleSpecificError(e) {
|
|
98
|
+
let errorToThrow = e;
|
|
99
|
+
switch (e.name) {
|
|
100
|
+
case 'InvalidMasterPasswordError': {
|
|
101
|
+
errorToThrow = new Error(this.props.t("The passphrase from the SSO kit doesn't match your private key: {{error}}", {error: e.message}));
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
case 'OutdatedSsoKitError': {
|
|
105
|
+
errorToThrow = new Error(this.props.t("The SSO kit is outdated and can't be used to decrypt your passphrase: {{error}}", {error: e.message}));
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
throw errorToThrow;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Render the component
|
|
115
|
+
* @returns {JSX}
|
|
116
|
+
*/
|
|
117
|
+
render() {
|
|
118
|
+
return (
|
|
119
|
+
<SsoContext.Provider value={this.state}>
|
|
120
|
+
{this.props.children}
|
|
121
|
+
</SsoContext.Provider>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
SsoContextProvider.propTypes = {
|
|
127
|
+
context: PropTypes.any, // The application context
|
|
128
|
+
children: PropTypes.any, // The children components
|
|
129
|
+
t: PropTypes.func, // The translation function
|
|
130
|
+
};
|
|
131
|
+
export default withAppContext(withTranslation('common')(SsoContextProvider));
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Resource Workspace Context Consumer HOC
|
|
135
|
+
* @param WrappedComponent
|
|
136
|
+
*/
|
|
137
|
+
export function withSso(WrappedComponent) {
|
|
138
|
+
return class withSso extends React.Component {
|
|
139
|
+
render() {
|
|
140
|
+
return (
|
|
141
|
+
<SsoContext.Consumer>
|
|
142
|
+
{
|
|
143
|
+
ssoContext => <WrappedComponent ssoContext={ssoContext} {...this.props} />
|
|
144
|
+
}
|
|
145
|
+
</SsoContext.Consumer>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
@@ -20,15 +20,18 @@ export default {
|
|
|
20
20
|
* Selectors to detect username inputs (input type text or not type with id or class or name contain user)
|
|
21
21
|
* The selector create-account-input is for ovh.com website
|
|
22
22
|
* The selector benutzerkennung is for german website
|
|
23
|
+
* The selector utilisateur is for french website
|
|
23
24
|
*/
|
|
24
25
|
USERNAME_FIELD_SELECTOR: `input[type='text' i][name*='user' i]:not([hidden]):not([disabled]),
|
|
25
26
|
input[type='text' i][name*='email' i]:not([hidden]):not([disabled]),
|
|
26
27
|
input[type='text' i][name*='login' i]:not([hidden]):not([disabled]),
|
|
27
28
|
input[type='text' i][name*='benutzerkennung' i]:not([hidden]):not([disabled]),
|
|
29
|
+
input[type='text' i][name*='utilisateur' i]:not([hidden]):not([disabled]),
|
|
28
30
|
input[type='text' i][id*='user' i]:not([hidden]):not([disabled]),
|
|
29
31
|
input[type='text' i][id*='email' i]:not([hidden]):not([disabled]),
|
|
30
32
|
input[type='text' i][id*='login' i]:not([hidden]):not([disabled]),
|
|
31
33
|
input[type='text' i][id*='benutzerkennung' i]:not([hidden]):not([disabled]),
|
|
34
|
+
input[type='text' i][id*='utilisateur' i]:not([hidden]):not([disabled]),
|
|
32
35
|
input[type='text' i][class*='user' i]:not([hidden]):not([disabled]),
|
|
33
36
|
input[type='text' i][class*='email' i]:not([hidden]):not([disabled]),
|
|
34
37
|
input[type='text' i][class*='create-account-input' i]:not([hidden]):not([disabled]),
|
|
@@ -42,10 +45,12 @@ export default {
|
|
|
42
45
|
input[name*='email' i]:not([type]):not([hidden]):not([disabled]),
|
|
43
46
|
input[name*='login' i]:not([type]):not([hidden]):not([disabled]),
|
|
44
47
|
input[name*='benutzerkennung' i]:not([type]):not([hidden]):not([disabled]),
|
|
48
|
+
input[name*='utilisateur' i]:not([type]):not([hidden]):not([disabled]),
|
|
45
49
|
input[id*='user' i]:not([type]):not([hidden]):not([disabled]),
|
|
46
50
|
input[id*='email' i]:not([type]):not([hidden]):not([disabled]),
|
|
47
51
|
input[id*='login' i]:not([type]):not([hidden]):not([disabled]),
|
|
48
52
|
input[id*='benutzerkennung' i]:not([type]):not([hidden]):not([disabled]),
|
|
53
|
+
input[id*='utilisateur' i]:not([type]):not([hidden]):not([disabled]),
|
|
49
54
|
input[class*='user' i]:not([type]):not([hidden]):not([disabled]),
|
|
50
55
|
input[class*='email' i]:not([type]):not([hidden]):not([disabled]),
|
|
51
56
|
input[class*='create-account-input' i]:not([type]):not([hidden]):not([disabled]),
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) 2020 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) 2020 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
|
+
/** user inputs max length */
|
|
16
|
+
export const USER_INPUT_MAX_LENGTH = 128;
|
|
17
|
+
/** Resource group name max length */
|
|
18
|
+
export const RESOURCE_GROUP_NAME_MAX_LENGTH = 50;
|
|
19
|
+
/** Resource name max length */
|
|
20
|
+
export const RESOURCE_NAME_MAX_LENGTH = 255;
|
|
21
|
+
/** Resource folder name max length */
|
|
22
|
+
export const RESOURCE_FOLDER_NAME_MAX_LENGTH = 256;
|
|
23
|
+
/** Resource name max length */
|
|
24
|
+
export const RESOURCE_TAG_MAX_LENGTH = 128;
|
|
25
|
+
/** Resource password max length */
|
|
26
|
+
export const RESOURCE_PASSWORD_MAX_LENGTH = 4096;
|
|
27
|
+
/** Resource description max length */
|
|
28
|
+
export const RESOURCE_DESCRIPTION_MAX_LENGTH = 10000;
|
|
29
|
+
/** Resource uri max length */
|
|
30
|
+
export const RESOURCE_URI_MAX_LENGTH = 1024;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) 2023 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) 2020 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
|
+
/**
|
|
16
|
+
* A utility class for copying text to the clipboard.
|
|
17
|
+
* @class ClipBoard
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
class ClipBoard {
|
|
21
|
+
/**
|
|
22
|
+
* Copies the given text to the clipboard.
|
|
23
|
+
* @static
|
|
24
|
+
* @param {string} text - The text to copy to the clipboard.
|
|
25
|
+
* @returns {Promise}
|
|
26
|
+
*/
|
|
27
|
+
static async copy(text, port) {
|
|
28
|
+
if (navigator.clipboard) {
|
|
29
|
+
try {
|
|
30
|
+
await navigator.clipboard.writeText(text);
|
|
31
|
+
} catch {
|
|
32
|
+
ClipBoard.copyWithBrowserExtension(text, port);
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
ClipBoard.copyWithBrowserExtension(text, port);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
static copyWithBrowserExtension(text, port) {
|
|
40
|
+
port.request("passbolt.clipboard.copy", text);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
export default ClipBoard;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Passbolt ~ Open source password manager for teams
|
|
3
|
+
* Copyright (c) 2023 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) 2020 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
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Unit tests on ClipBoard in regard of specifications
|
|
18
|
+
*/
|
|
19
|
+
import ClipBoard from './clipBoard';
|
|
20
|
+
|
|
21
|
+
describe('ClipBoard', () => {
|
|
22
|
+
const portMock = {
|
|
23
|
+
request: jest.fn()
|
|
24
|
+
};
|
|
25
|
+
const toCopy = "text";
|
|
26
|
+
describe('copy method', () => {
|
|
27
|
+
it('should call the navigator.clipboard.writeText method if it is available', async() => {
|
|
28
|
+
navigator.clipboard = {
|
|
29
|
+
writeText: jest.fn()
|
|
30
|
+
};
|
|
31
|
+
await ClipBoard.copy(toCopy, portMock);
|
|
32
|
+
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(toCopy);
|
|
33
|
+
expect(portMock.request).not.toHaveBeenCalled();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('should call the copyWithBrowserExtension method if the navigator.clipboard API is not available', async() => {
|
|
37
|
+
navigator.clipboard = null;
|
|
38
|
+
await ClipBoard.copy(toCopy, portMock);
|
|
39
|
+
expect(portMock.request).toHaveBeenCalledWith('passbolt.clipboard.copy', toCopy);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('should call the copyWithBrowserExtension method if the writeText method throws an error', async() => {
|
|
43
|
+
navigator.clipboard = {
|
|
44
|
+
writeText: jest.fn(() => {
|
|
45
|
+
throw new Error('Some error');
|
|
46
|
+
})
|
|
47
|
+
};
|
|
48
|
+
await ClipBoard.copy(toCopy, portMock);
|
|
49
|
+
expect(portMock.request).toHaveBeenCalledWith('passbolt.clipboard.copy', toCopy);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe('copyWithBrowserExtension: method', () => {
|
|
54
|
+
it('should call the request method of the port object with the correct arguments', () => {
|
|
55
|
+
ClipBoard.copyWithBrowserExtension(toCopy, portMock);
|
|
56
|
+
expect(portMock.request).toHaveBeenCalledWith('passbolt.clipboard.copy', toCopy);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
});
|