passbolt-styleguide 3.3.3 → 3.4.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 +4 -4
- package/build/css/public.min.css +5 -6
- package/build/css/themes/default/api_authentication.min.css +3 -3
- package/build/css/themes/default/api_cloud.min.css +3 -7
- package/build/css/themes/default/api_main.min.css +4 -9
- package/build/css/themes/default/api_reports.min.css +4 -9
- package/build/css/themes/default/api_webinstaller.min.css +4 -9
- package/build/css/themes/default/ext_app.min.css +4 -9
- package/build/css/themes/default/ext_authentication.min.css +3 -3
- package/build/css/themes/default/ext_external.min.css +3 -3
- package/build/css/themes/default/ext_in_form_cta.min.css +9 -0
- package/build/css/themes/default/ext_in_form_menu.min.css +9 -0
- package/build/css/themes/default/ext_quickaccess.min.css +3 -3
- package/build/css/themes/midgar/api_authentication.min.css +9 -0
- package/build/css/themes/midgar/api_main.min.css +4 -9
- package/build/css/themes/midgar/api_reports.min.css +4 -9
- package/build/css/themes/midgar/ext_app.min.css +4 -9
- package/build/css/themes/midgar/ext_authentication.min.css +3 -3
- package/build/css/themes/midgar/ext_in_form_cta.min.css +9 -0
- package/build/css/themes/midgar/ext_in_form_menu.min.css +9 -0
- package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
- package/build/js/dist/api-app.js +1 -1
- package/build/js/dist/api-app.js.LICENSE.txt +5 -5
- package/build/js/dist/api-recover.js +1 -1
- package/build/js/dist/api-recover.js.LICENSE.txt +0 -28
- package/build/js/dist/api-setup.js +1 -1
- package/build/js/dist/api-setup.js.LICENSE.txt +0 -15
- package/build/js/dist/api-triage.js +1 -1
- package/build/js/dist/api-triage.js.LICENSE.txt +0 -14
- package/build/js/dist/api-vendors.js +1 -1
- package/build/js/dist/api-vendors.js.LICENSE.txt +146 -84
- package/package.json +31 -26
- package/src/img/controls/chevron-down_blue.svg +3 -0
- package/src/img/diagrams/functional_overview.png +0 -0
- package/src/img/diagrams/functional_overview.svg +4 -0
- package/src/img/diagrams/howitworks.svg +2797 -0
- package/src/img/diagrams/mobile-transfer.svg +296 -0
- package/src/img/diagrams/sequence_diagram_form_authenticate.png +0 -0
- package/src/img/diagrams/sequence_diagram_gpg_authenticate.png +0 -0
- package/src/img/diagrams/totp.svg +251 -0
- package/src/img/illustrations/pin_passbolt.gif +0 -0
- package/src/img/illustrations/wave-pin_my_extension.svg +1 -0
- package/src/img/logo/icon-32-badge-1.png +0 -0
- package/src/img/logo/icon-32-badge-2.png +0 -0
- package/src/img/logo/icon-32-badge-3.png +0 -0
- package/src/img/logo/icon-32-badge-4.png +0 -0
- package/src/img/logo/icon-32-badge-5+.png +0 -0
- package/src/img/logo/icon-32-badge-5.png +0 -0
- package/src/img/logo/icon-32-signout.png +0 -0
- package/src/img/logo/icon-badge-1.svg +1 -0
- package/src/img/logo/icon-badge-2.svg +1 -0
- package/src/img/logo/icon-badge-3.svg +1 -0
- package/src/img/logo/icon-badge-4.svg +1 -0
- package/src/img/logo/icon-badge-5+.svg +1 -0
- package/src/img/logo/icon-badge-5.svg +1 -0
- package/src/img/logo/icon-inactive.svg +1 -0
- package/src/img/logo/icon-without-badge.svg +1 -0
- package/src/img/third_party/ChromeWebStore_black.svg +1 -0
- package/src/img/third_party/ChromeWebStore_white.svg +1 -0
- package/src/img/third_party/edge-addon-black.svg +1 -0
- package/src/img/third_party/edge-addon-white.svg +1 -0
- package/src/locales/de-DE/common.json +820 -0
- package/src/locales/en-UK/common.json +86 -20
- package/src/locales/fr/common.json +750 -0
- package/src/locales/fr-FR/common.json +92 -22
- package/src/locales/sv-SE/common.json +820 -0
- package/src/react-extension/ExtApp.js +16 -10
- package/src/react-extension/ExtBootstrapApp.js +1 -0
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +2 -2
- package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.js +2 -2
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.js +1 -1
- package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.test.js +1 -1
- package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +22 -8
- package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.data.js +3 -0
- package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.js +10 -8
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.js +21 -19
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.page.js +6 -6
- package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +0 -1
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +1 -1
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +1 -1
- package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +5 -8
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.js +20 -38
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.data.js +4 -1
- package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.js +4 -4
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +1 -1
- package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +1 -1
- package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.js +2 -3
- package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.stories.js +5 -9
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +34 -32
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.js +1 -1
- package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +0 -3
- package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.js +1 -1
- package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.test.page.js +2 -2
- package/src/react-extension/components/Authentication/AskForAuthenticationHelp/AskForAuthenticationHelp.js +1 -1
- package/src/react-extension/components/Authentication/AskForAuthenticationHelp/AskForAuthenticationHelp.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/CheckMailBox/CheckMailBox.js +2 -2
- package/src/react-extension/components/Authentication/CheckMailBox/CheckMailBox.test.js +1 -1
- package/src/react-extension/components/Authentication/CheckMailBox/CheckMailbox.test.stories.js +12 -14
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.js +2 -1
- package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/ChooseSecurityToken/ChooseSecurityToken.js +1 -2
- package/src/react-extension/components/Authentication/ChooseSecurityToken/ChooseSecurityToken.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.js +9 -19
- package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/DisplayExpiredTokenError/DisplayExpiredTokenError.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/DisplayRequireInvitationError/DisplayRequireInvitationError.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/DisplayUnexpectedError/DisplayUnexpectedError.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.js +1 -1
- package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/EnterNameForm/EnterNameForm.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/EnterUsernameForm/EnterUsernameForm.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/HandleSessionExpired/HandleSessionExpired.test.data.js +14 -0
- package/src/react-extension/components/Authentication/HandleSessionExpired/HandleSessionExpired.test.js +65 -0
- package/src/react-extension/components/Authentication/HandleSessionExpired/HandleSessionExpired.test.page.js +38 -0
- package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.js +15 -6
- package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.test.js +27 -0
- package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.test.stories.js +12 -15
- package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.js +107 -0
- package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.test.data.js +11 -0
- package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.test.js +65 -0
- package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.test.page.js +73 -0
- package/src/react-extension/components/Authentication/IntroduceSetupExtension/IntroduceSetupExtension.test.stories.js +34 -0
- package/src/react-extension/components/Authentication/NotifyExpiredSession/NotifyExpiredSession.test.stories.js +8 -11
- package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.js +1 -1
- package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.test.stories.js +12 -15
- package/src/react-extension/components/AuthenticationLogin/DisplayLoginError/DisplayLoginError.test.stories.js +12 -15
- package/src/react-extension/components/AuthenticationLogin/DisplayLoginInProgress/DisplayLoginProgress.test.stories.js +12 -15
- package/src/react-extension/components/AuthenticationLogin/Login/Login.js +3 -1
- package/src/react-extension/components/AuthenticationLogin/Login/Login.test.stories.js +12 -15
- package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.js +2 -1
- package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.test.js +1 -1
- package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.test.stories.js +5 -11
- package/src/react-extension/components/AuthenticationRecover/RecoverAuthentication/RecoverAuthentication.js +5 -1
- package/src/react-extension/components/AuthenticationSetup/SetupAuthentication/SetupAuthentication.js +4 -0
- package/src/react-extension/components/Common/ActionFeedback/DisplayActionFeedbacks.test.data.js +0 -2
- package/src/react-extension/components/Common/ActionFeedback/DisplayActionFeedbacks.test.js +4 -5
- package/src/react-extension/components/Common/ActionFeedback/DisplayActionFeedbacks.test.page.js +0 -1
- package/src/react-extension/components/Common/Avatar/UserAvatar.js +2 -1
- package/src/react-extension/components/Common/Error/ShowErrorDetails/ShowErrorDetails.js +126 -0
- package/src/react-extension/components/Common/Icons/AnimatedFeedback.js +58 -0
- package/src/react-extension/components/Common/Icons/Icon.js +16 -0
- package/src/react-extension/components/Common/Icons/Icon.test.stories.js +78 -0
- package/src/react-extension/components/Common/Inputs/FormSubmitButton/FormSubmitButton.js +4 -0
- package/src/react-extension/components/Common/Loading/LoadingSpinner/LoadingSpinner.js +2 -1
- package/src/react-extension/components/Common/Menu/DisplayMainMenu.js +2 -4
- package/src/react-extension/components/Common/Navigation/Search/SearchBar.js +1 -1
- package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.js +1 -1
- package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.test.js +1 -1
- package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.test.stories.js +34 -0
- package/src/react-extension/components/Common/Tab/Tab.js +65 -0
- package/src/react-extension/components/Common/Tab/Tabs.js +87 -0
- package/src/react-extension/components/Resource/CreateResource/CreateResource.js +85 -66
- package/src/react-extension/components/Resource/CreateResource/CreateResource.test.data.js +80 -1
- package/src/react-extension/components/Resource/CreateResource/CreateResource.test.js +18 -39
- package/src/react-extension/components/Resource/CreateResource/CreateResource.test.page.js +27 -8
- package/src/react-extension/components/Resource/CreateResource/CreateResource.test.stories.js +70 -4
- package/src/react-extension/components/Resource/DeleteResource/DeleteResource.js +1 -1
- package/src/react-extension/components/Resource/DisplayResourcesList/DisplayDragResource.js +68 -0
- package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +20 -47
- package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.test.page.js +4 -1
- package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.js +2 -2
- package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.test.data.js +1 -7
- package/src/react-extension/components/Resource/EditResource/EditResource.js +93 -68
- package/src/react-extension/components/Resource/EditResource/EditResource.test.data.js +80 -1
- package/src/react-extension/components/Resource/EditResource/EditResource.test.js +10 -39
- package/src/react-extension/components/Resource/EditResource/EditResource.test.page.js +26 -11
- package/src/react-extension/components/Resource/ExportResources/ExportResources.js +1 -1
- package/src/react-extension/components/Resource/ExportResources/ExportResources.test.stories.js +5 -11
- package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.js +10 -12
- package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.test.stories.js +5 -11
- package/src/react-extension/components/Resource/FilterResourcesByBreadcrumb/FilterResourcesByBreadcrumb.js +4 -4
- package/src/react-extension/components/Resource/FilterResourcesByBreadcrumb/FilterResourcesByBreadcrumb.test.stories.js +0 -1
- package/src/react-extension/components/Resource/FilterResourcesByFolders/DisplayDragFolderItem.js +109 -0
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.js +41 -193
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.data.js +10 -5
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.js +9 -12
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.page.js +6 -2
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.stories.js +0 -1
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.js +83 -58
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.test.data.js +52 -59
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.test.js +25 -20
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItem.test.page.js +11 -5
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItemContextualMenu.js +1 -1
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByRootFolderContextualMenu.js +7 -2
- package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByRootFolderContextualMenu.test.js +3 -7
- package/src/react-extension/components/Resource/FilterResourcesByGroups/FilterResourcesByGroups.js +1 -1
- package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.js +1 -1
- package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.test.page.js +1 -1
- package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.test.stories.js +0 -1
- package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.js +1 -1
- package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.data.js +47 -0
- package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.js +34 -3
- package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.page.js +46 -9
- package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.stories.js +0 -1
- package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTagsList.js +124 -4
- package/src/react-extension/components/Resource/FilterResourcesByText/FilterResourcesByText.test.stories.js +0 -2
- package/src/react-extension/components/Resource/ImportResources/ImportResources.js +6 -5
- package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.js +10 -12
- package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.test.stories.js +5 -11
- package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.js +3 -3
- package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.test.js +3 -3
- package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.test.stories.js +5 -11
- package/src/react-extension/components/ResourceComment/AddResourceComment/AddResourceComment.js +1 -1
- package/src/react-extension/components/ResourceComment/AddResourceComment/AddResourceComment.test.page.object.js +1 -1
- package/src/react-extension/components/ResourceComment/AddResourceComment/AddResourceComment.test.stories.js +8 -14
- package/src/react-extension/components/ResourceComment/ConfirmResourceCommentDeletion/ConfirmResourceCommentDeletion.test.stories.js +5 -11
- package/src/react-extension/components/ResourceComment/DisplayResourceCommentList/DisplayResourceCommentList.test.stories.js +8 -14
- package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.js +9 -8
- package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.test.page.js +1 -1
- package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.test.stories.js +8 -15
- package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsActivity.test.stories.js +0 -1
- package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsDescription.js +1 -1
- package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsDescription.test.stories.js +0 -1
- package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.test.js +1 -1
- package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.test.stories.js +0 -1
- package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +2 -2
- package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.page.js +1 -1
- package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.stories.js +0 -3
- package/src/react-extension/components/ResourceFolder/DefineResourceFolderMoveStrategy/DefineResourceFolderMoveStrategy.test.stories.js +0 -6
- package/src/react-extension/components/ResourceFolder/DeleteResourceFolder/DeleteResourceFolder.test.stories.js +0 -5
- package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +1 -1
- package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.page.js +1 -1
- package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.stories.js +0 -7
- package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsActivity.test.stories.js +0 -2
- package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsInformation.test.stories.js +0 -2
- package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsPermissions.test.stories.js +0 -2
- package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePassphraseGenerator.js +150 -0
- package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePassphraseGenerator.test.stories.js +30 -0
- package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePasswordGenerator.js +191 -0
- package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePasswordGenerator.test.stories.js +73 -0
- package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.js +296 -0
- package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.test.stories.js +112 -0
- package/src/react-extension/components/ResourceTag/DeleteResourceTag/DeleteResourceTag.test.stories.js +0 -2
- package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.js +1 -1
- package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.page.js +1 -1
- package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.stories.js +0 -4
- package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTags.js +2 -2
- package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTags.test.page.js +1 -1
- package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTagsItemViewer.js +5 -1
- package/src/react-extension/components/Share/ShareDialog.test.page.js +1 -1
- package/src/react-extension/components/Share/ShareDialog.test.stories.js +12 -10
- package/src/react-extension/components/User/ConfirmDisableUserMFA/ConfirmDisableUserMFA.test.stories.js +5 -9
- package/src/react-extension/components/User/CreateUser/CreateUser.js +4 -4
- package/src/react-extension/components/User/CreateUser/CreateUser.test.page.js +3 -3
- package/src/react-extension/components/User/CreateUser/CreateUser.test.stories.js +3 -1
- package/src/react-extension/components/User/DeleteUser/DeleteUser.test.stories.js +5 -8
- package/src/react-extension/components/User/DeleteUser/DeleteUserWithConflicts.test.stories.js +5 -8
- package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.js +2 -2
- package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.test.page.js +1 -1
- package/src/react-extension/components/User/DisplayUsers/DisplayUsers.js +35 -2
- package/src/react-extension/components/User/DisplayUsers/DisplayUsers.test.data.js +2 -1
- package/src/react-extension/components/User/DisplayUsers/DisplayUsers.test.js +6 -0
- package/src/react-extension/components/User/DisplayUsers/DisplayUsers.test.page.js +19 -6
- package/src/react-extension/components/User/EditUser/EditUser.js +3 -3
- package/src/react-extension/components/User/EditUser/EditUser.test.page.js +2 -2
- package/src/react-extension/components/User/EditUser/EditUser.test.stories.js +3 -1
- package/src/react-extension/components/User/FilterUsersByBreadcrumb/FilterUsersByBreadcrumb.js +2 -2
- package/src/react-extension/components/User/FilterUsersByBreadcrumb/FilterUsersByBreadcrumb.test.js +1 -1
- package/src/react-extension/components/User/FilterUsersByBreadcrumb/FilterUsersByBreadcrumb.test.stories.js +5 -8
- package/src/react-extension/components/User/FilterUsersByGroups/FilterUsersByGroup.js +1 -1
- package/src/react-extension/components/User/FilterUsersByShortcut/FilterUsersByShortcut.js +1 -1
- package/src/react-extension/components/User/FilterUsersByShortcut/FilterUsersByShortcut.test.stories.js +0 -1
- package/src/react-extension/components/User/FilterUsersByText/FilterUsersByText.test.stories.js +0 -2
- package/src/react-extension/components/UserDetails/DisplayUserDetailsGroups/DisplayUserDetailsGroups.test.stories.js +8 -11
- package/src/react-extension/components/UserDetails/DisplayUserDetailsInformation/DisplayUserDetailsInformation.test.stories.js +8 -11
- package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.test.stories.js +8 -12
- package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.js +1 -1
- package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.page.js +2 -2
- package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.stories.js +5 -8
- package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroup.test.stories.js +5 -8
- package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroupWithConflicts.test.stories.js +5 -8
- package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsInformation/DisplayUserGroupDetailsInformation.test.stories.js +8 -11
- package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembers.test.stories.js +8 -11
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.js +11 -3
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.data.js +7 -0
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.page.js +1 -1
- package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.stories.js +12 -8
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +92 -21
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.test.data.js +6 -0
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.test.js +2 -2
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.test.page.js +1 -1
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/DisplayChangePassphraseIntroduction.js +12 -10
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/DownloadRecoveryKit.js +4 -10
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +65 -25
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.data.js +6 -0
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.js +1 -1
- package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.page.js +1 -1
- package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.js +14 -13
- package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.test.stories.js +5 -8
- package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.js +21 -6
- package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.test.stories.js +5 -8
- package/src/react-extension/components/UserSetting/DisplayUserProfile/DisplayUserProfile.js +1 -1
- package/src/react-extension/components/UserSetting/DisplayUserProfile/DisplayUserProfile.test.stories.js +5 -8
- package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspace/DisplayUserSettingsWorkspace.js +13 -1
- package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspaceBreadcrumb/DisplayUserSettingsWorkspaceBreadcrumb.js +2 -1
- package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspaceBreadcrumb/DisplayUserSettingsWorkspaceBreadcrumb.test.stories.js +5 -8
- package/src/react-extension/components/UserSetting/DisplayUserTheme/DisplayUserTheme.test.stories.js +5 -8
- package/src/react-extension/components/UserSetting/EditUserProfile/EditUserProfile.js +3 -3
- package/src/react-extension/components/UserSetting/EditUserProfile/EditUserProfile.test.stories.js +5 -8
- package/src/react-extension/components/UserSetting/NavigateIntoUserSettingsWorkspace/NavigateIntoUserSettingsWorkspace.js +26 -4
- package/src/react-extension/components/UserSetting/NavigateIntoUserSettingsWorkspace/NavigateIntoUserSettingsWorkspace.test.stories.js +7 -10
- package/src/react-extension/components/UserSetting/TransferToMobile/TransferToMobile.js +749 -0
- package/src/react-extension/components/UserSetting/TransferToMobile/TransferToMobile.test.data.js +32 -0
- package/src/react-extension/components/UserSetting/TransferToMobile/TransferToMobile.test.js +60 -0
- package/src/react-extension/components/UserSetting/TransferToMobile/TransferToMobile.test.page.js +110 -0
- package/src/react-extension/components/UserSetting/UploadUserProfileAvatar/UploadUserProfileAvatar.js +3 -2
- package/src/react-extension/components/UserSetting/UploadUserProfileAvatar/UploadUserProfileAvatar.test.stories.js +5 -8
- package/src/react-extension/contexts/AdministrationWorkspaceContext.js +2 -2
- package/src/react-extension/contexts/ApiAppContext.js +1 -1
- package/src/react-extension/contexts/ApiRecoverContext.js +1 -1
- package/src/react-extension/contexts/ApiSetupContext.js +1 -1
- package/src/react-extension/contexts/AuthenticationContext.js +21 -2
- package/src/react-extension/contexts/AuthenticationContext.test.js +40 -0
- package/src/react-extension/contexts/DragContext.js +122 -0
- package/src/react-extension/contexts/DragContext.test.js +53 -0
- package/src/react-extension/contexts/NavigationContext.js +11 -0
- package/src/react-extension/contexts/ResourcePasswordGeneratorContext.js +144 -0
- package/src/react-extension/contexts/ResourceWorkspaceContext.js +5 -4
- package/src/react-extension/contexts/ResourceWorkspaceContext.test.data.js +0 -1
- package/src/react-extension/contexts/ResourceWorkspaceContext.test.page.js +0 -1
- package/src/react-extension/contexts/UserWorkspaceContext.js +31 -4
- package/src/react-extension/contexts/UserWorkspaceContext.test.data.js +17 -287
- package/src/react-extension/lib/Crypto/sha512.js +17 -0
- package/src/react-extension/test/fixture/Settings/siteSettings.js +6 -0
- package/src/react-extension/test/mock/components/Internationalisation/MockTranslationProvider.js +42 -7
- package/src/react-quickaccess/ExtQuickAccess.js +75 -28
- package/src/react-quickaccess/components/AnimatedSwitch/AnimatedSwitch.js +22 -5
- package/src/react-quickaccess/components/ExtensionSetup/SetupExtensionInProgress/SetupExtensionInProgress.js +41 -0
- package/src/react-quickaccess/components/ExtensionSetup/SetupExtensionInProgress/SetupExtensionInProgressPage.test.stories.js +23 -0
- package/src/react-quickaccess/components/FilterResourcesByFavoritePage/FilterResourcesByFavoritePage.js +8 -4
- package/src/react-quickaccess/components/FilterResourcesByFavoritePage/FilterResourcesByFavoritePage.test.stories.js +7 -7
- package/src/react-quickaccess/components/FilterResourcesByGroupPage/FilterResourcesByGroupPage.js +10 -6
- package/src/react-quickaccess/components/FilterResourcesByGroupPage/FilterResourcesByGroupPage.test.stories.js +9 -5
- package/src/react-quickaccess/components/FilterResourcesByItemsIOwnPage/FilterResourcesByItemsIOwnPage.js +10 -7
- package/src/react-quickaccess/components/FilterResourcesByItemsIOwnPage/FilterResourcesByItemsIOwnPage.test.stories.js +7 -7
- package/src/react-quickaccess/components/FilterResourcesByRecentlyModifiedPage/FilterResourcesByRecentlyModifiedPage.js +10 -7
- package/src/react-quickaccess/components/FilterResourcesByRecentlyModifiedPage/FilterResourcesByRecentlyModifiedPage.test.stories.js +7 -7
- package/src/react-quickaccess/components/FilterResourcesBySharedWithMePage/FilterResourcesBySharedWithMePage.js +10 -7
- package/src/react-quickaccess/components/FilterResourcesBySharedWithMePage/FilterResourcesBySharedWithMePage.test.stories.js +7 -7
- package/src/react-quickaccess/components/FilterResourcesByTagPage/FilterResourcesByTagPage.js +10 -7
- package/src/react-quickaccess/components/FilterResourcesByTagPage/FilterResourcesByTagPage.test.stories.js +9 -5
- package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePassphraseGenerator.js +150 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePassphraseGenerator.test.data.js +20 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePassphraseGenerator.test.js +67 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePassphraseGenerator.test.page.js +109 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.js +189 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.test.data.js +40 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.test.js +67 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.test.page.js +121 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.js +304 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.data.js +102 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.js +76 -0
- package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.page.js +158 -0
- package/src/react-quickaccess/components/Header/Header.js +10 -8
- package/src/react-quickaccess/components/Header/Header.test.stories.js +4 -7
- package/src/react-quickaccess/components/HomePage/HomePage.js +40 -11
- package/src/react-quickaccess/components/HomePage/HomePage.test.stories.js +14 -10
- package/src/react-quickaccess/components/HomePage/canSuggestUrl.js +8 -3
- package/src/react-quickaccess/components/HomePage/canSuggestUrl.test.js +6 -0
- package/src/react-quickaccess/components/LoginPage/LoginPage.js +58 -18
- package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +4 -6
- package/src/react-quickaccess/components/ManageQuickAccessMode/ManageQuickAccessMode.js +103 -0
- package/src/react-quickaccess/components/MoreFiltersPage/MoreFiltersPage.js +2 -2
- package/src/react-quickaccess/components/MoreFiltersPage/MoreFiltersPage.test.stories.js +4 -6
- package/src/react-quickaccess/components/PassphraseDialog/PassphraseDialog.js +5 -3
- package/src/react-quickaccess/components/PassphraseDialog/PassphraseDialog.test.stories.js +6 -6
- package/src/react-quickaccess/components/PrivateRoute/PrivateRoute.js +1 -0
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.js +234 -0
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.data.js +28 -0
- package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.stories.js +44 -0
- package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.js +166 -39
- package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.data.js +108 -2
- package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.js +28 -25
- package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.stories.js +6 -6
- package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.js +6 -3
- package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.test.stories.js +5 -3
- package/src/react-quickaccess/components/Search/Search.js +13 -1
- package/src/react-quickaccess/components/Search/Search.test.stories.js +4 -6
- package/src/react-quickaccess/contexts/PrepareResourceContext.js +221 -0
- package/src/react-web-integration/AuthLogin/AuthLogin.js +72 -0
- package/src/react-web-integration/Autofill/Autofill.js +331 -0
- package/src/react-web-integration/BrowserIntegrationBootstrap.js +64 -0
- package/src/react-web-integration/Events/Quickaccess/QuickAccessEvent.js +24 -0
- package/src/react-web-integration/ExtInFormCallToAction.js +56 -0
- package/src/react-web-integration/ExtInFormMenu.js +70 -0
- package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.js +161 -0
- package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.data.js +39 -0
- package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.js +48 -0
- package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.page.js +42 -0
- package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.stories.js +91 -0
- package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenu.js +360 -0
- package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenu.test.stories.js +198 -0
- package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenuItem.js +103 -0
- package/src/react-web-integration/contexts/AppContext.js +39 -0
- package/src/react-web-integration/lib/Dom/DomUtils.js +94 -0
- package/src/react-web-integration/lib/InForm/InFormCallToActionField.js +263 -0
- package/src/react-web-integration/lib/InForm/InFormCredentialsFormField.js +118 -0
- package/src/react-web-integration/lib/InForm/InFormFieldSelector.js +77 -0
- package/src/react-web-integration/lib/InForm/InFormManager.js +253 -0
- package/src/react-web-integration/lib/InForm/InformManager.test.data.js +46 -0
- package/src/react-web-integration/lib/InForm/InformManager.test.js +82 -0
- package/src/react-web-integration/lib/InForm/InformManager.test.page.js +116 -0
- package/src/react-web-integration/lib/InForm/InformMenuField.js +182 -0
- package/src/shared/components/Internationalisation/TranslationProvider.js +145 -0
- package/src/shared/lib/Browser/detectBrowserName.js +2 -1
- package/src/shared/lib/Secret/SecretComplexity.js +2 -2
- package/src/shared/lib/SecretGenerator/PassphraseGenerator.js +112 -0
- package/src/shared/lib/SecretGenerator/PassphraseGenerator.test.js +48 -0
- package/src/shared/lib/SecretGenerator/PassphraseGeneratorWords.js +7789 -0
- package/src/shared/lib/SecretGenerator/PasswordGenerator.js +103 -0
- package/src/shared/lib/SecretGenerator/SecretGenerator.js +45 -0
- package/src/shared/lib/SecretGenerator/SecretGeneratorComplexity.js +190 -0
- package/src/shared/lib/SecretGenerator/SecretGeneratorComplexity.test.js +95 -0
- package/src/shared/lib/Settings/SiteSettings.js +8 -0
- package/src/shared/lib/apiClient/apiClient.test.js +1 -1
- package/.babelrc +0 -11
- package/.editorconfig +0 -13
- package/.eslintrc.json +0 -197
- package/.gitlab-ci.yml +0 -28
- package/.jest.config.json +0 -6
- package/.jest.setup.js +0 -8
- package/.jest.transform.js +0 -7
- package/.storybook/main.js +0 -15
- package/.storybook/preview-body.html +0 -5
- package/.storybook/preview.js +0 -6
- package/Gruntfile.js +0 -199
- package/build/css/themes/default/ext_config_debug.min.css +0 -13
- package/build/css/themes/default/ext_legacy.min.css +0 -13
- package/build/css/themes/midgar/ext_legacy.min.css +0 -13
- package/crowdin.yml +0 -4
- package/docker-compose-dev.yml +0 -10
- package/jest.config.json +0 -6
- package/src/img/controls/colorpicker/marker.png +0 -0
- package/src/img/controls/colorpicker/mask.png +0 -0
- package/src/img/controls/colorpicker/wheel.png +0 -0
- package/src/img/controls/overlay-opacity-50.png +0 -0
- package/src/img/third_party/ChromeWebStore_black.png +0 -0
- package/src/img/third_party/ChromeWebStore_white.png +0 -0
- package/src/js/accordion.js +0 -10
- package/src/js/autocomplete.js +0 -241
- package/src/js/autocomplete.min.js +0 -3
- package/src/js/bootstrap-scrollspy.js +0 -172
- package/src/js/chosen.jquery.js +0 -1356
- package/src/js/colorpicker.js +0 -32
- package/src/js/download.js +0 -128
- package/src/js/farbtastic.js +0 -345
- package/src/js/swiper.min.js +0 -18
- package/src/react-quickaccess/components/Internationalisation/TranslationProvider.js +0 -151
- package/storybook-static/favicon.ico +0 -0
- package/storybook-static/iframe.html +0 -133
- package/storybook-static/index.html +0 -47
- package/storybook-static/main.2d01924b12554c6c15af.bundle.js +0 -1
- package/storybook-static/main.b0c44c8759149ccf4f67.bundle.js +0 -3
- package/storybook-static/main.b0c44c8759149ccf4f67.bundle.js.LICENSE.txt +0 -153
- package/storybook-static/main.b0c44c8759149ccf4f67.bundle.js.map +0 -1
- package/storybook-static/runtime~main.6a9b04192e3176eff72a.bundle.js +0 -1
- package/storybook-static/runtime~main.b0c44c8759149ccf4f67.bundle.js +0 -2
- package/storybook-static/runtime~main.b0c44c8759149ccf4f67.bundle.js.map +0 -1
- package/storybook-static/static/media/chosen-sprite.6768c197.png +0 -0
- package/storybook-static/static/media/chosen-sprite@2x.a0b7f3f1.png +0 -0
- package/storybook-static/static/media/dot_black.a2c44078.svg +0 -6
- package/storybook-static/static/media/dot_red.7b34541d.svg +0 -6
- package/storybook-static/static/media/dot_white.f60f7331.svg +0 -6
- package/storybook-static/static/media/fontawesome-webfont.1e59d233.ttf +0 -0
- package/storybook-static/static/media/fontawesome-webfont.20fd1704.woff2 +0 -0
- package/storybook-static/static/media/fontawesome-webfont.8b43027f.eot +0 -0
- package/storybook-static/static/media/fontawesome-webfont.c1e38fd9.svg +0 -2671
- package/storybook-static/static/media/fontawesome-webfont.f691f37e.woff +0 -0
- package/storybook-static/static/media/infinite-bar.f5327dc3.gif +0 -0
- package/storybook-static/static/media/loading_dark.ea474c7f.svg +0 -21
- package/storybook-static/static/media/loading_light.061977b5.svg +0 -15
- package/storybook-static/static/media/logo.e2b062a5.svg +0 -1
- package/storybook-static/static/media/logo_white.cb32e694.svg +0 -1
- package/storybook-static/static/media/opensans-bold.a6b4768c.woff +0 -0
- package/storybook-static/static/media/opensans-regular.7812bd0b.woff +0 -0
- package/storybook-static/static/media/passphrase_intro.37a1ba4e.png +0 -0
- package/storybook-static/vendors~main.4abf29e4f956d5befb41.bundle.js +0 -2
- package/storybook-static/vendors~main.4abf29e4f956d5befb41.bundle.js.LICENSE.txt +0 -105
- package/storybook-static/vendors~main.b0c44c8759149ccf4f67.bundle.js +0 -3
- package/storybook-static/vendors~main.b0c44c8759149ccf4f67.bundle.js.LICENSE.txt +0 -145
- package/storybook-static/vendors~main.b0c44c8759149ccf4f67.bundle.js.map +0 -1
- package/webpack-api.config.js +0 -83
- package/webpack-ext.config.js +0 -84
|
@@ -0,0 +1,39 @@
|
|
|
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.3.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import React from "react";
|
|
16
|
+
|
|
17
|
+
const AppContext = React.createContext({
|
|
18
|
+
context: null,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* App Context Consumer HOC
|
|
23
|
+
* @param WrappedComponent
|
|
24
|
+
*/
|
|
25
|
+
export function withAppContext(WrappedComponent) {
|
|
26
|
+
return class withAppContext extends React.Component {
|
|
27
|
+
render() {
|
|
28
|
+
return (
|
|
29
|
+
<AppContext.Consumer>
|
|
30
|
+
{
|
|
31
|
+
AppContext => <WrappedComponent context={AppContext} {...this.props} />
|
|
32
|
+
}
|
|
33
|
+
</AppContext.Consumer>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default AppContext;
|
|
@@ -0,0 +1,94 @@
|
|
|
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.3.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Some DOM utils
|
|
17
|
+
*/
|
|
18
|
+
class DomUtils {
|
|
19
|
+
|
|
20
|
+
static getAccessibleAndSameDomainIframes() {
|
|
21
|
+
return Array.prototype.filter.call( document.querySelectorAll("iframe"), iframe => {
|
|
22
|
+
const contentDocument = DomUtils.getAccessedIframeContentDocument(iframe);
|
|
23
|
+
return contentDocument && DomUtils.isRequestInitiatedFromSameOrigin(window.location.href, contentDocument.location.href);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Returns an accessible iframe document in the page
|
|
29
|
+
* @param {DomElement} iframe found on the page
|
|
30
|
+
* @return {DomElement} iframe document
|
|
31
|
+
*/
|
|
32
|
+
static getAccessedIframeContentDocument(iframe) {
|
|
33
|
+
let iframeContentDocument = null;
|
|
34
|
+
try {
|
|
35
|
+
iframeContentDocument = iframe.contentDocument;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error(error);
|
|
38
|
+
}
|
|
39
|
+
return iframeContentDocument;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Check the requested document, top document and an iframe form is initiated from same domain.
|
|
45
|
+
*
|
|
46
|
+
* @param {string} requestedUrl The requested document url
|
|
47
|
+
* @param {string} documentUrl The current active document url
|
|
48
|
+
* @return {Boolean} true
|
|
49
|
+
*/
|
|
50
|
+
static isRequestInitiatedFromSameOrigin(requestedUrl, documentUrl) {
|
|
51
|
+
// requestedUrl - from quickaccess
|
|
52
|
+
const parsedRequestedUrl = new URL(requestedUrl);
|
|
53
|
+
// Request initiated document origin
|
|
54
|
+
const requestedOrigin = parsedRequestedUrl.origin;
|
|
55
|
+
// documentUrl - from current active page
|
|
56
|
+
const parsedDocumentUrl = new URL(documentUrl);
|
|
57
|
+
// Top level document/an iframe document origin
|
|
58
|
+
const documentOrigin = parsedDocumentUrl.origin;
|
|
59
|
+
|
|
60
|
+
// Requested document and top/iframe document origin is same
|
|
61
|
+
return requestedOrigin === documentOrigin;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Returns the first scrollable parent of the given node
|
|
66
|
+
* @param node A Dom node
|
|
67
|
+
*/
|
|
68
|
+
static getScrollParent(node) {
|
|
69
|
+
const regex = /(auto|scroll)/;
|
|
70
|
+
|
|
71
|
+
const style = (node, prop) =>
|
|
72
|
+
getComputedStyle(node, null).getPropertyValue(prop);
|
|
73
|
+
|
|
74
|
+
const isScrollable = (node) =>
|
|
75
|
+
regex.test(
|
|
76
|
+
style(node, "overflow") +
|
|
77
|
+
style(node, "overflow-y") +
|
|
78
|
+
style(node, "overflow-x"));
|
|
79
|
+
|
|
80
|
+
const scrollParent = node => {
|
|
81
|
+
if (!node || node===document.body) {
|
|
82
|
+
return window;
|
|
83
|
+
} else if (isScrollable(node)) {
|
|
84
|
+
return node;
|
|
85
|
+
} else {
|
|
86
|
+
return scrollParent(node.parentNode)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return scrollParent(node);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default DomUtils;
|
|
@@ -0,0 +1,263 @@
|
|
|
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.3.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import {v4 as uuidv4} from "uuid";
|
|
16
|
+
import DomUtils from "../Dom/DomUtils";
|
|
17
|
+
import browser from "webextension-polyfill";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* An InFormCallToActionField is represented by a DOM element identified as an username field and to which
|
|
21
|
+
* in-form call-to-action and/or menu can be attached
|
|
22
|
+
*/
|
|
23
|
+
class InFormCallToActionField {
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Retrieve all the DOM elements which can be an in-form username fields
|
|
27
|
+
*/
|
|
28
|
+
static findAll(selector) {
|
|
29
|
+
const domFields = Array.from(document.querySelectorAll(selector));
|
|
30
|
+
const iframesFields = InFormCallToActionField.findAllInIframes(selector);
|
|
31
|
+
return domFields.concat(iframesFields);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Retrieve all the iframes elements which can be an in-form username fields
|
|
36
|
+
* @return {*}
|
|
37
|
+
*/
|
|
38
|
+
static findAllInIframes(selector) {
|
|
39
|
+
const iframes = DomUtils.getAccessibleAndSameDomainIframes();
|
|
40
|
+
const queryMapper = iframe => Array.from(iframe.contentDocument.querySelectorAll(selector));
|
|
41
|
+
return iframes
|
|
42
|
+
.map(queryMapper)
|
|
43
|
+
.flat();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Default constructor
|
|
48
|
+
* @param field The DOM element
|
|
49
|
+
* @param fieldType The type of field
|
|
50
|
+
*/
|
|
51
|
+
constructor(field, fieldType) {
|
|
52
|
+
/** The field to which the in-form is attached */
|
|
53
|
+
this.field = field;
|
|
54
|
+
/** Type of the field ("username" or "password") */
|
|
55
|
+
this.fieldType = fieldType;
|
|
56
|
+
/** An unique identifier for the iframe */
|
|
57
|
+
this.iframeId = uuidv4();
|
|
58
|
+
/** The scrollable field parent */
|
|
59
|
+
this.scrollableFieldParent = null;
|
|
60
|
+
/** Flag telling if the user is mousing over the call-to-action (iframe) */
|
|
61
|
+
this.isCallToActionMousingOver = false;
|
|
62
|
+
/** In-form call-to-action click watcher */
|
|
63
|
+
this.callToActionClickWatcher = null;
|
|
64
|
+
/** In-form call-to-action click listener callback */
|
|
65
|
+
this.callToActionClickCallback = null;
|
|
66
|
+
|
|
67
|
+
this.bindCallbacks();
|
|
68
|
+
this.handleInsertionEvent();
|
|
69
|
+
this.handleRemoveEvent();
|
|
70
|
+
this.handleScrollEvent();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Binds methods callbacks
|
|
75
|
+
*/
|
|
76
|
+
bindCallbacks() {
|
|
77
|
+
this.insertInformCallToActionIframe = this.insertInformCallToActionIframe.bind(this);
|
|
78
|
+
this.removeInFormCallToActionWhenMouseOut = this.removeInFormCallToActionWhenMouseOut.bind(this);
|
|
79
|
+
this.removeInFormCallToAction = this.removeInFormCallToAction.bind(this);
|
|
80
|
+
this.removeCallToActionIframe = this.removeCallToActionIframe.bind(this);
|
|
81
|
+
this.destroy = this.destroy.bind(this);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Handle a callback after on click on the in-form-call-to-action
|
|
86
|
+
* @param callback
|
|
87
|
+
*/
|
|
88
|
+
onClick(callback) {
|
|
89
|
+
this.callToActionClickCallback = callback;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** CALL-TO-ACTION INSERTION */
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Whenever the call-to-action must be inserted
|
|
96
|
+
*/
|
|
97
|
+
handleInsertionEvent() {
|
|
98
|
+
if (document.activeElement === this.field) {
|
|
99
|
+
this.insertInformCallToActionIframe();
|
|
100
|
+
}
|
|
101
|
+
this.field.addEventListener("mouseover", this.insertInformCallToActionIframe);
|
|
102
|
+
this.field.addEventListener("focus", this.insertInformCallToActionIframe);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Insert an in-form call-to-action iframe
|
|
107
|
+
*/
|
|
108
|
+
insertInformCallToActionIframe() {
|
|
109
|
+
const iframes = document.querySelectorAll('iframe');
|
|
110
|
+
// Use of Array prototype some method cause NodeList is not an array !
|
|
111
|
+
const iframeId = this.iframeId;
|
|
112
|
+
const isIframeAlreadyInserted = Array.prototype.some.call(iframes, iframe => iframe.id === iframeId);
|
|
113
|
+
if (!isIframeAlreadyInserted) {
|
|
114
|
+
const iframe = this.createCallToActionIframe();
|
|
115
|
+
this.handleCallToActionClicked(iframe);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Create an iframe dedicated to the call-to-action
|
|
121
|
+
* @return {HTMLIFrameElement} The created iframe
|
|
122
|
+
*/
|
|
123
|
+
createCallToActionIframe() {
|
|
124
|
+
const iframe = document.createElement('iframe');
|
|
125
|
+
document.body.appendChild(iframe);
|
|
126
|
+
const browserExtensionUrl = browser.runtime.getURL("/");
|
|
127
|
+
const {top, left} = this.calculateFieldPosition();
|
|
128
|
+
iframe.id = this.iframeId;
|
|
129
|
+
iframe.style.position = "fixed";
|
|
130
|
+
iframe.style.top = top + 'px'
|
|
131
|
+
iframe.style.left = left + 'px';
|
|
132
|
+
iframe.style.border = 0;
|
|
133
|
+
iframe.style.width = '18px';
|
|
134
|
+
iframe.style.height = '18px';
|
|
135
|
+
iframe.style.zIndex = "1000"; // For you Yahoo with love
|
|
136
|
+
iframe.contentWindow.location = `${browserExtensionUrl}data/passbolt-iframe-in-form-call-to-action.html?passbolt=passbolt-iframe-in-form-call-to-action`;
|
|
137
|
+
return iframe;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Calculates the position on the screen of the DOM field
|
|
142
|
+
* @return {{top: number, left: number}}
|
|
143
|
+
*/
|
|
144
|
+
calculateFieldPosition() {
|
|
145
|
+
let x = 0;
|
|
146
|
+
let y = 0;
|
|
147
|
+
let currentElement = this.field;
|
|
148
|
+
const {height, width} = this.field.getBoundingClientRect();
|
|
149
|
+
const {top: topBody, left: leftBody} = document.documentElement.getBoundingClientRect();
|
|
150
|
+
// We loop to calculate the cumulated position of the field
|
|
151
|
+
// from its ancestors and itself differential offset / scroll position
|
|
152
|
+
while(currentElement && !isNaN(currentElement.offsetLeft) && !isNaN(currentElement.offsetTop)) {
|
|
153
|
+
x += currentElement.offsetLeft - currentElement.scrollLeft;
|
|
154
|
+
y += currentElement.offsetTop - currentElement.scrollTop;
|
|
155
|
+
currentElement = currentElement.offsetParent;
|
|
156
|
+
}
|
|
157
|
+
// Then we add the body offset (notably in case of window scroll) + some local adjustments (margin / vertical aligment )
|
|
158
|
+
x = x + leftBody + width - 25;
|
|
159
|
+
y = y + topBody + Math.floor(height / 2) - 9; // Calculate the middle position of the input, 9 is the half of the iframe height
|
|
160
|
+
return {top: y, left: x};
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Whenever the user clicked on the call-to-action iframe
|
|
166
|
+
* @param iframe The call-to-action iframe
|
|
167
|
+
*/
|
|
168
|
+
handleCallToActionClicked(iframe) {
|
|
169
|
+
/* In case of click on iframe, the field lose the focus. Since it loses the focus, the iframe is removed.
|
|
170
|
+
* And so the call-to-action. So, we need to restore the focus on the input. In case, it did not have
|
|
171
|
+
* previously the focus, no matter since a click on the call-to-action should be a way to focus on the input
|
|
172
|
+
*/
|
|
173
|
+
this.callToActionClickWatcher = setInterval(() => {
|
|
174
|
+
// Check if a click has been applied on some iframe
|
|
175
|
+
const elem = document.activeElement;
|
|
176
|
+
if (elem && elem.tagName == 'IFRAME' && elem.id === this.iframeId) {
|
|
177
|
+
this.field.focus();
|
|
178
|
+
this.callToActionClickCallback();
|
|
179
|
+
clearInterval(this.callToActionClickWatcher);
|
|
180
|
+
}
|
|
181
|
+
}, 100);
|
|
182
|
+
/* We need to know which iframe the user click on. We cannot add a listener on iframe
|
|
183
|
+
* since there are from different domains (target page vs extension pagemods)
|
|
184
|
+
*/
|
|
185
|
+
iframe.addEventListener('mouseover', () => this.isCallToActionMousingOver = true);
|
|
186
|
+
iframe.addEventListener('mouseout', () => this.isCallToActionMousingOver = false);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** CALL-TO-ACTION REMOVE */
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Whenever the call-to-action must be removed
|
|
193
|
+
*/
|
|
194
|
+
handleRemoveEvent() {
|
|
195
|
+
this.field.addEventListener("mouseout", this.removeInFormCallToActionWhenMouseOut);
|
|
196
|
+
this.field.addEventListener("blur", this.removeInFormCallToAction);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Removes the in-form call-to-action iframe from the username or password field
|
|
201
|
+
*/
|
|
202
|
+
removeInFormCallToAction() {
|
|
203
|
+
const isIframeMouseOver = this.isCallToActionMousingOver;
|
|
204
|
+
const isActiveElementAnAuthenticationField = document.activeElement === this.field;
|
|
205
|
+
if (!isIframeMouseOver && !isActiveElementAnAuthenticationField) {
|
|
206
|
+
this.removeCallToActionIframe();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Removes the call-to-action iframe from the username or password field when one moused out
|
|
212
|
+
* @param event The mouse-out event
|
|
213
|
+
*/
|
|
214
|
+
removeInFormCallToActionWhenMouseOut(event) {
|
|
215
|
+
const isNotCallToActionIframe = event.relatedTarget && event.relatedTarget.id !== this.iframeId;
|
|
216
|
+
const isActiveElementAnAuthenticationField = document.activeElement === this.field;
|
|
217
|
+
if (isNotCallToActionIframe && !isActiveElementAnAuthenticationField) {
|
|
218
|
+
this.removeCallToActionIframe();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Remove the call-to-action (iframe)
|
|
224
|
+
*/
|
|
225
|
+
removeCallToActionIframe() {
|
|
226
|
+
const iframes = document.querySelectorAll('iframe');
|
|
227
|
+
iframes.forEach(iframe => {
|
|
228
|
+
const identifierToMatch = this.iframeId;
|
|
229
|
+
if (iframe.id === identifierToMatch) {
|
|
230
|
+
iframe.parentNode.removeChild(iframe);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** SCROLL REPOSITION */
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Whenever the user scrolls the page
|
|
239
|
+
*/
|
|
240
|
+
handleScrollEvent() {
|
|
241
|
+
// Remove the call-to-action
|
|
242
|
+
this.scrollableFieldParent = DomUtils.getScrollParent(this.field);
|
|
243
|
+
this.scrollableFieldParent.addEventListener('scroll', this.removeCallToActionIframe);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/** DESTROY */
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Remove all listener and iframe to clean the page and avoid issue on extension update
|
|
250
|
+
*/
|
|
251
|
+
destroy() {
|
|
252
|
+
this.field.removeEventListener("mouseover", this.insertInformCallToActionIframe);
|
|
253
|
+
this.field.removeEventListener("focus", this.insertInformCallToActionIframe);
|
|
254
|
+
this.field.removeEventListener("mouseout", this.removeInFormCallToActionWhenMouseOut);
|
|
255
|
+
this.field.removeEventListener("blur", this.removeInFormCallToAction);
|
|
256
|
+
this.scrollableFieldParent.removeEventListener('scroll', this.removeCallToActionIframe);
|
|
257
|
+
this.removeCallToActionIframe();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export default InFormCallToActionField;
|
|
262
|
+
|
|
263
|
+
|
|
@@ -0,0 +1,118 @@
|
|
|
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.3.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import InFormCallToActionField from "./InFormCallToActionField";
|
|
16
|
+
import DomUtils from "../Dom/DomUtils";
|
|
17
|
+
import {v4 as uuidv4} from "uuid";
|
|
18
|
+
|
|
19
|
+
/** Button submit selector */
|
|
20
|
+
const SUBMIT_BUTTON_SELECTOR = "button[type='submit'], input[type='submit']";
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* An InFormCredentialsFormField is represented by a DOM element identified as credentials form DOM element which once filled
|
|
24
|
+
* can be auto-saved by Passbolt
|
|
25
|
+
*/
|
|
26
|
+
class InFormCredentialsFormField {
|
|
27
|
+
/**
|
|
28
|
+
* Retrieve all the DOM elements which can be an credentials form fields
|
|
29
|
+
*/
|
|
30
|
+
static findAll() {
|
|
31
|
+
const domFields = Array.from(document.querySelectorAll('form'));
|
|
32
|
+
const iframesFields = InFormCallToActionField.findAllInIframes();
|
|
33
|
+
return domFields.concat(iframesFields);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Retrieve all the iframes elements which can be an credential form field
|
|
38
|
+
* @return {*}
|
|
39
|
+
*/
|
|
40
|
+
static findAllInIframes() {
|
|
41
|
+
const iframes = DomUtils.getAccessibleAndSameDomainIframes();
|
|
42
|
+
const queryMapper = iframe => Array.from(iframe.contentDocument.querySelectorAll('form'));
|
|
43
|
+
return iframes
|
|
44
|
+
.map(queryMapper)
|
|
45
|
+
.flat();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Default constructor
|
|
50
|
+
* @param field The DOM field which represents the field
|
|
51
|
+
* @param usernameField The username DOM field into the form
|
|
52
|
+
* @param passwordField The password DOM field into the form
|
|
53
|
+
*/
|
|
54
|
+
constructor(field, usernameField, passwordField) {
|
|
55
|
+
/** The field to which the in-form is attached */
|
|
56
|
+
this.field = field;
|
|
57
|
+
/** The username field attached to the form */
|
|
58
|
+
this.usernameField = usernameField;
|
|
59
|
+
/** The password field attached to the form */
|
|
60
|
+
this.passwordField = passwordField;
|
|
61
|
+
/** Flag telling whether the form submission has already been performed (and avoid twice autosave call) */
|
|
62
|
+
this.hasAlreadySubmitted = false;
|
|
63
|
+
|
|
64
|
+
this.bindCallbacks();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Returns the submit button (if exists)
|
|
69
|
+
*/
|
|
70
|
+
get submitButton() {
|
|
71
|
+
return this.field.querySelector(SUBMIT_BUTTON_SELECTOR);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Binds methods callbacks
|
|
76
|
+
*/
|
|
77
|
+
bindCallbacks() {
|
|
78
|
+
this.handleAutoSaveEvent = this.handleAutoSaveEvent.bind(this);
|
|
79
|
+
this.autosave = this.autosave.bind(this);
|
|
80
|
+
this.destroy = this.destroy.bind(this);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Whenever one must propose auto-save on the current credentials form
|
|
85
|
+
* @param callback Callback when the auto-save should be performed
|
|
86
|
+
*/
|
|
87
|
+
handleAutoSaveEvent() {
|
|
88
|
+
this.field.addEventListener('submit', this.autosave);
|
|
89
|
+
this.submitButton?.addEventListener('click', this.autosave);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Autosave current credentials in the page */
|
|
93
|
+
autosave() {
|
|
94
|
+
const areFieldsFilled = Boolean(this.usernameField?.value?.trim()) && Boolean(this.passwordField?.value?.trim());
|
|
95
|
+
if (!this.hasAlreadySubmitted && areFieldsFilled) {
|
|
96
|
+
this.hasAlreadySubmitted = true;
|
|
97
|
+
port.emit('passbolt.web-integration.autosave', {
|
|
98
|
+
name: document.title,
|
|
99
|
+
username: this.usernameField.value,
|
|
100
|
+
password: this.passwordField.value,
|
|
101
|
+
url: document.URL
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** DESTROY */
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Remove all listener to clean the page and avoid issue on extension update
|
|
110
|
+
*/
|
|
111
|
+
destroy() {
|
|
112
|
+
this.field.removeEventListener('submit', this.autosave);
|
|
113
|
+
this.submitButton?.removeEventListener("click", this.autosave);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export default InFormCredentialsFormField;
|
|
@@ -0,0 +1,77 @@
|
|
|
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.3.0
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* All the possible in-form fields DOM selectors
|
|
17
|
+
*/
|
|
18
|
+
export default {
|
|
19
|
+
/** Selectors to detect username inputs (input type text or not type with id or class or name contain user) */
|
|
20
|
+
USERNAME_FIELD_SELECTOR: `input[type='text'][name*='user']:not([hidden]):not([disabled]),
|
|
21
|
+
input[type='text'][name*='email']:not([hidden]):not([disabled]),
|
|
22
|
+
input[type='text'][id*='user']:not([hidden]):not([disabled]),
|
|
23
|
+
input[type='text'][id*='email']:not([hidden]):not([disabled]),
|
|
24
|
+
input[type='text'][class*='user']:not([hidden]):not([disabled]),
|
|
25
|
+
input[type='text'][class*='email']:not([hidden]):not([disabled]),
|
|
26
|
+
input[type='text'][autocomplete*='user']:not([hidden]):not([disabled]),
|
|
27
|
+
input[type='text'][autocomplete*='email']:not([hidden]):not([disabled]),
|
|
28
|
+
input[type='Text'][name*='user']:not([hidden]):not([disabled]),
|
|
29
|
+
input[type='Text'][name*='email']:not([hidden]):not([disabled]),
|
|
30
|
+
input[type='Text'][id*='user']:not([hidden]):not([disabled]),
|
|
31
|
+
input[type='Text'][id*='email']:not([hidden]):not([disabled]),
|
|
32
|
+
input[type='Text'][class*='user']:not([hidden]):not([disabled]),
|
|
33
|
+
input[type='Text'][class*='email']:not([hidden]):not([disabled]),
|
|
34
|
+
input[type='Text'][autocomplete*='user']:not([hidden]):not([disabled]),
|
|
35
|
+
input[type='Text'][autocomplete*='email']:not([hidden]):not([disabled]),
|
|
36
|
+
input[type='TEXT'][name*='user']:not([hidden]):not([disabled]),
|
|
37
|
+
input[type='TEXT'][name*='email']:not([hidden]):not([disabled]),
|
|
38
|
+
input[type='TEXT'][id*='user']:not([hidden]):not([disabled]),
|
|
39
|
+
input[type='TEXT'][id*='email']:not([hidden]):not([disabled]),
|
|
40
|
+
input[type='TEXT'][class*='user']:not([hidden]):not([disabled]),
|
|
41
|
+
input[type='TEXT'][class*='email']:not([hidden]):not([disabled]),
|
|
42
|
+
input[type='TEXT'][autocomplete*='user']:not([hidden]):not([disabled]),
|
|
43
|
+
input[type='TEXT'][autocomplete*='email']:not([hidden]):not([disabled]),
|
|
44
|
+
input[type='email']:not([hidden]):not([disabled]),
|
|
45
|
+
input[type='Email']:not([hidden]):not([disabled]),
|
|
46
|
+
input[type='EMAIL']:not([hidden]):not([disabled]),
|
|
47
|
+
input[name*='user']:not([type]):not([hidden]):not([disabled]),
|
|
48
|
+
input[name*='email']:not([type]):not([hidden]):not([disabled]),
|
|
49
|
+
input[id*='user']:not([type]):not([hidden]):not([disabled]),
|
|
50
|
+
input[id*='email']:not([type]):not([hidden]):not([disabled]),
|
|
51
|
+
input[class*='user']:not([type]):not([hidden]):not([disabled]),
|
|
52
|
+
input[class*='email']:not([type]):not([hidden]):not([disabled])
|
|
53
|
+
input[autocomplete*='user']:not([type]):not([hidden]):not([disabled]),
|
|
54
|
+
input[autocomplete*='email']:not([type]):not([hidden]):not([disabled])`,
|
|
55
|
+
/** Selectors to detect password inputs (input type password or type text with id or class or name contain password) */
|
|
56
|
+
PASSWORD_FIELD_SELECTOR: `input[type='password']:not([hidden]):not([disabled]),
|
|
57
|
+
input[type='Password']:not([hidden]):not([disabled]),
|
|
58
|
+
input[type='PASSWORD']:not([hidden]):not([disabled]),
|
|
59
|
+
input[type='text'][name*='password']:not([hidden]):not([disabled]),
|
|
60
|
+
input[type='text'][id*='password']:not([hidden]):not([disabled]),
|
|
61
|
+
input[type='text'][class*='password']:not([hidden]):not([disabled]),
|
|
62
|
+
input[type='Text'][name*='password']:not([hidden]):not([disabled]),
|
|
63
|
+
input[type='Text'][id*='password']:not([hidden]):not([disabled]),
|
|
64
|
+
input[type='Text'][class*='password']:not([hidden]):not([disabled]),
|
|
65
|
+
input[type='TEXT'][name*='password']:not([hidden]):not([disabled]),
|
|
66
|
+
input[type='TEXT'][id*='password']:not([hidden]):not([disabled]),
|
|
67
|
+
input[type='TEXT'][class*='password']:not([hidden]):not([disabled])
|
|
68
|
+
input[type='text'][name*='Password']:not([hidden]):not([disabled]),
|
|
69
|
+
input[type='text'][id*='Password']:not([hidden]):not([disabled]),
|
|
70
|
+
input[type='text'][class*='Password']:not([hidden]):not([disabled]),
|
|
71
|
+
input[type='Text'][name*='Password']:not([hidden]):not([disabled]),
|
|
72
|
+
input[type='Text'][id*='Password']:not([hidden]):not([disabled]),
|
|
73
|
+
input[type='Text'][class*='Password']:not([hidden]):not([disabled]),
|
|
74
|
+
input[type='TEXT'][name*='Password']:not([hidden]):not([disabled]),
|
|
75
|
+
input[type='TEXT'][id*='Password']:not([hidden]):not([disabled]),
|
|
76
|
+
input[type='TEXT'][class*='Password']:not([hidden]):not([disabled])`
|
|
77
|
+
}
|