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,749 @@
|
|
|
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
|
+
import PropTypes from "prop-types";
|
|
17
|
+
import AppContext from "../../../contexts/AppContext";
|
|
18
|
+
import {withDialog} from "../../../contexts/DialogContext";
|
|
19
|
+
import QRCode from 'qrcode';
|
|
20
|
+
import {sha512} from "../../../lib/Crypto/sha512";
|
|
21
|
+
import {Trans, withTranslation} from "react-i18next";
|
|
22
|
+
import {withUserSettings} from "../../../contexts/UserSettingsContext";
|
|
23
|
+
import Icon from "../../Common/Icons/Icon";
|
|
24
|
+
import ShowErrorDetails from "../../Common/Error/ShowErrorDetails/ShowErrorDetails";
|
|
25
|
+
import AnimatedFeedback from "../../Common/Icons/AnimatedFeedback";
|
|
26
|
+
|
|
27
|
+
// Ref. http://blog.qr4.nl/page/QR-Code-Data-Capacity.aspx
|
|
28
|
+
const QRCODE_VERSION = 27;
|
|
29
|
+
const QRCODE_ERROR_CORRECTION = 'L';
|
|
30
|
+
const QRCODE_MAXSLICE = 1465;
|
|
31
|
+
const QRCODE_MARGIN = 4;
|
|
32
|
+
const QRCCODE_PROTOCOL_VERSION = 1;
|
|
33
|
+
const QRCODE_WIDTH = 325;
|
|
34
|
+
|
|
35
|
+
const FETCH_INTERVAL = 333; //in ms
|
|
36
|
+
const MAX_UINT8 = 255;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* This component displays the user profile information
|
|
40
|
+
*/
|
|
41
|
+
class TransferToMobile extends React.Component {
|
|
42
|
+
/**
|
|
43
|
+
* Default constructor
|
|
44
|
+
* @param props Component props
|
|
45
|
+
*/
|
|
46
|
+
constructor(props) {
|
|
47
|
+
super(props);
|
|
48
|
+
this.state = this.defaultState;
|
|
49
|
+
this.timeout = undefined;
|
|
50
|
+
this.request = 0;
|
|
51
|
+
this.bindHandlers();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Returns the component default state
|
|
56
|
+
*/
|
|
57
|
+
get defaultState() {
|
|
58
|
+
return {
|
|
59
|
+
step: 'start',
|
|
60
|
+
page: 0,
|
|
61
|
+
processing: false,
|
|
62
|
+
qrCodes: undefined, // QR code cache
|
|
63
|
+
debug: true,
|
|
64
|
+
error: undefined,
|
|
65
|
+
showErrorDetails: false,
|
|
66
|
+
transferDto: undefined
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Returns the current user
|
|
72
|
+
*/
|
|
73
|
+
get user() {
|
|
74
|
+
return this.context.loggedInUser;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Get the translate function
|
|
79
|
+
* @returns {function(...[*]=)}
|
|
80
|
+
*/
|
|
81
|
+
get translate() {
|
|
82
|
+
return this.props.t;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Get current domain
|
|
87
|
+
* @returns {string}
|
|
88
|
+
*/
|
|
89
|
+
get domain() {
|
|
90
|
+
return this.context.userSettings.getTrustedDomain();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Binds the component handlers
|
|
95
|
+
*/
|
|
96
|
+
bindHandlers() {
|
|
97
|
+
this.handleClickStart = this.handleClickStart.bind(this);
|
|
98
|
+
this.handleClickCancel = this.handleClickCancel.bind(this);
|
|
99
|
+
this.handleClickDone = this.handleClickDone.bind(this);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Whenever the user wants to start the transfer
|
|
104
|
+
*/
|
|
105
|
+
async handleClickStart() {
|
|
106
|
+
try {
|
|
107
|
+
await this.toggleProcessing();
|
|
108
|
+
await this.createTransfer();
|
|
109
|
+
await this.toggleProcessing();
|
|
110
|
+
} catch (error) {
|
|
111
|
+
// Could be that the user canceled or couldn't remember the passphrase
|
|
112
|
+
if (error.name === "UserAbortsOperationError") {
|
|
113
|
+
return this.handleTransferCancel();
|
|
114
|
+
} else {
|
|
115
|
+
return this.handleTransferError(error);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Build first QR code
|
|
122
|
+
* @param {object} transferDto
|
|
123
|
+
* @param {int} totalPages
|
|
124
|
+
* @param {string} hash
|
|
125
|
+
* @returns {Promise<string>} image data
|
|
126
|
+
*/
|
|
127
|
+
async buildFirstQrCode(transferDto, totalPages, hash) {
|
|
128
|
+
// sanity checks
|
|
129
|
+
if (!transferDto) {
|
|
130
|
+
throw new Error(this.translate('Server response is empty.'));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (transferDto.total_pages !== totalPages || transferDto.hash !== hash) {
|
|
134
|
+
const error = new Error(this.translate('Server response does not match initial request.'));
|
|
135
|
+
error.data = {transferDto: transferDto, totalPages, hash};
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (!transferDto.authentication_token || !transferDto.authentication_token.token) {
|
|
140
|
+
throw new Error(this.translate('Authentication token is missing from server response.'));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const str = this.getTransferMetadataDataAsString(transferDto);
|
|
144
|
+
const slices = this.stringToSlices(str, 0);
|
|
145
|
+
if (!slices || slices.length === 0) {
|
|
146
|
+
throw new Error(this.translate('Sorry, it is not possible to proceed. The first QR code is empty.'));
|
|
147
|
+
}
|
|
148
|
+
if (slices.length > 1) {
|
|
149
|
+
throw new Error(this.translate('Sorry, it is not possible to proceed. The first QR code is too big.'));
|
|
150
|
+
}
|
|
151
|
+
return await this.getQrCode(slices[0]);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/*
|
|
155
|
+
*
|
|
156
|
+
* Data prep
|
|
157
|
+
*
|
|
158
|
+
*/
|
|
159
|
+
/**
|
|
160
|
+
* Get first QR code data
|
|
161
|
+
*
|
|
162
|
+
* @param {object} transferDto
|
|
163
|
+
* @returns {string}
|
|
164
|
+
*/
|
|
165
|
+
getTransferMetadataDataAsString(transferDto) {
|
|
166
|
+
return JSON.stringify({
|
|
167
|
+
transfer_id: transferDto.id,
|
|
168
|
+
user_id: this.user.id,
|
|
169
|
+
domain: this.domain,
|
|
170
|
+
total_pages: transferDto.total_pages,
|
|
171
|
+
hash: transferDto.hash,
|
|
172
|
+
authentication_token: transferDto.authentication_token.token
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Getter for bulk of the data to transfer
|
|
178
|
+
*
|
|
179
|
+
* @returns {Promise<string>} base64 encoded JSON string with
|
|
180
|
+
* {user: uuid, fingerprint: string, armored_key: openpgp secret armored key block}
|
|
181
|
+
*/
|
|
182
|
+
async getTransferDataAsString() {
|
|
183
|
+
const fingerprint = await this.getFingerprint();
|
|
184
|
+
const privateKey = await this.getPrivateKey();
|
|
185
|
+
return JSON.stringify({user_id: this.user.id, fingerprint, armored_key: privateKey});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Get the transfer data hash
|
|
190
|
+
* Will be send to the server so that the client can double check the data integrity
|
|
191
|
+
* at the end of the transfer process
|
|
192
|
+
*
|
|
193
|
+
* @param {string} message
|
|
194
|
+
* @throws {Error} if message is empty or not a string
|
|
195
|
+
* @returns {Promise<string>}
|
|
196
|
+
*/
|
|
197
|
+
async getTransferHash(message) {
|
|
198
|
+
return await sha512(message);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/*
|
|
202
|
+
*
|
|
203
|
+
* QR Code generation
|
|
204
|
+
*
|
|
205
|
+
*/
|
|
206
|
+
/**
|
|
207
|
+
* Build QR codes
|
|
208
|
+
* Get the raw data, slices it according to desired QR code size, build QR codes as images
|
|
209
|
+
* @returns {Promise<[]>}
|
|
210
|
+
*/
|
|
211
|
+
async buildQrCodes(rawData) {
|
|
212
|
+
const slices = this.stringToSlices(rawData, 1);
|
|
213
|
+
const qrCodes = [];
|
|
214
|
+
for (let i = 0; i < slices.length; i++) {
|
|
215
|
+
const qrCode = await this.getQrCode(slices[i]);
|
|
216
|
+
qrCodes.push(qrCode);
|
|
217
|
+
}
|
|
218
|
+
return qrCodes;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* String to slice
|
|
223
|
+
*
|
|
224
|
+
* @param {string} data
|
|
225
|
+
* @param {int} startPage
|
|
226
|
+
* @returns {array} array of strings sliced to fit on the defined QR CODE size
|
|
227
|
+
*/
|
|
228
|
+
stringToSlices(data, startPage) {
|
|
229
|
+
const slices = [];
|
|
230
|
+
|
|
231
|
+
/*
|
|
232
|
+
* 2 reserved byte for page number, max page number 255
|
|
233
|
+
* 1 reserved byte for protocol version
|
|
234
|
+
*/
|
|
235
|
+
const sliceSize = QRCODE_MAXSLICE - (2 + 1);
|
|
236
|
+
const sliceNeeded = Math.ceil(data.length / sliceSize);
|
|
237
|
+
|
|
238
|
+
if (sliceNeeded > MAX_UINT8) {
|
|
239
|
+
throw new Error('Cannot transfer the data, the private key is too big.');
|
|
240
|
+
}
|
|
241
|
+
if (typeof startPage === 'undefined') {
|
|
242
|
+
startPage = 0;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
for (let i = 0; i < sliceNeeded; i++) {
|
|
246
|
+
const pageCounter = startPage + i;
|
|
247
|
+
|
|
248
|
+
/*
|
|
249
|
+
* Header - Version and page
|
|
250
|
+
* UInt8 => Hex string => Unicode value of the individual characters
|
|
251
|
+
* 255 => "ff" => 70 70
|
|
252
|
+
*
|
|
253
|
+
* Unfortunately we we cannot send these numbers as bytes.
|
|
254
|
+
* This sub optimal encoding is due to compatibility issues with iOS QR Code scanning library
|
|
255
|
+
*/
|
|
256
|
+
const version = (QRCCODE_PROTOCOL_VERSION.toString(16));
|
|
257
|
+
const page = (pageCounter.toString(16)).padStart(2, '0');
|
|
258
|
+
const uint8Header = new Uint8ClampedArray([
|
|
259
|
+
version.charCodeAt(0), page.charCodeAt(0), page.charCodeAt(1)
|
|
260
|
+
]);
|
|
261
|
+
|
|
262
|
+
/*
|
|
263
|
+
* Data
|
|
264
|
+
* Similar encoding, but since data is just ASCII chars, one less step
|
|
265
|
+
* "F" => 102
|
|
266
|
+
*/
|
|
267
|
+
const start = (i === 0) ? 0 : (i * sliceSize);
|
|
268
|
+
let end = (i === 0) ? (sliceSize) : (sliceSize * (i + 1));
|
|
269
|
+
end = (end > data.length) ? data.length : end;
|
|
270
|
+
const slicedData = data.slice(start, end);
|
|
271
|
+
const uint8Data = this.str2bytes(slicedData);
|
|
272
|
+
|
|
273
|
+
// together
|
|
274
|
+
slices[i] = Uint8ClampedArray.from([...uint8Header, ...uint8Data]);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return slices;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Convert a 8bit encoded string into Uint8ClampedArray
|
|
282
|
+
* @param {string} str
|
|
283
|
+
* @returns {Uint8ClampedArray}
|
|
284
|
+
*/
|
|
285
|
+
str2bytes(str) {
|
|
286
|
+
const buffer = new Uint8ClampedArray(str.length);
|
|
287
|
+
for (let i = 0, strLen = str.length; i < strLen; i++) {
|
|
288
|
+
buffer[i] = str.charCodeAt(i);
|
|
289
|
+
}
|
|
290
|
+
return buffer;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Populates the component with data
|
|
295
|
+
* @param {Uint8ClampedArray} content
|
|
296
|
+
* @returns {Promise<string>} image data
|
|
297
|
+
*/
|
|
298
|
+
async getQrCode(content) {
|
|
299
|
+
try {
|
|
300
|
+
return await QRCode.toDataURL([{
|
|
301
|
+
data: content,
|
|
302
|
+
mode: 'byte'
|
|
303
|
+
}], {
|
|
304
|
+
version: QRCODE_VERSION,
|
|
305
|
+
errorCorrectionLevel: QRCODE_ERROR_CORRECTION,
|
|
306
|
+
type: 'image/jpeg',
|
|
307
|
+
quality: 1,
|
|
308
|
+
margin: QRCODE_MARGIN,
|
|
309
|
+
});
|
|
310
|
+
} catch (error) {
|
|
311
|
+
this.handleError(error);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/*
|
|
316
|
+
*
|
|
317
|
+
* API CALLS
|
|
318
|
+
*
|
|
319
|
+
*/
|
|
320
|
+
/**
|
|
321
|
+
* Fetch the user key id
|
|
322
|
+
*/
|
|
323
|
+
async getPrivateKey() {
|
|
324
|
+
return await this.context.port.request('passbolt.keyring.get-private-key');
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Find a user gpg key
|
|
329
|
+
*
|
|
330
|
+
* @throws {Error} if fingerprint is not available
|
|
331
|
+
* @returns {Promise<String>} fingerprint
|
|
332
|
+
*/
|
|
333
|
+
async getFingerprint() {
|
|
334
|
+
const key = await this.context.port.request('passbolt.keyring.get-public-key-info-by-user', this.user.id);
|
|
335
|
+
if (!key || !key.fingerprint) {
|
|
336
|
+
throw new Error('The user fingerprint is not set.');
|
|
337
|
+
}
|
|
338
|
+
return key.fingerprint;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/*
|
|
342
|
+
*
|
|
343
|
+
* Transfer state machine
|
|
344
|
+
*
|
|
345
|
+
*/
|
|
346
|
+
/**
|
|
347
|
+
* Initiate the exchange by creating a transfer entity server side
|
|
348
|
+
* This will allow the clients to coordinate the transfer
|
|
349
|
+
*
|
|
350
|
+
* @returns {Promise<void>}
|
|
351
|
+
*/
|
|
352
|
+
async createTransfer() {
|
|
353
|
+
const rawString = await this.getTransferDataAsString();
|
|
354
|
+
const hash = await this.getTransferHash(rawString);
|
|
355
|
+
const qrCodes = await this.buildQrCodes(rawString);
|
|
356
|
+
const totalPages = qrCodes.length + 1; // +1 for the first QR code with hash and auth token
|
|
357
|
+
|
|
358
|
+
try {
|
|
359
|
+
const data = {total_pages: totalPages, hash: hash};
|
|
360
|
+
const transferDto = await this.context.port.request('passbolt.mobile.transfer.create', data);
|
|
361
|
+
const firstQrCode = await this.buildFirstQrCode(transferDto, totalPages, hash);
|
|
362
|
+
qrCodes.unshift(firstQrCode);
|
|
363
|
+
this.setState({qrCodes, step: 'in progress', page: 0, transferDto}, () => {
|
|
364
|
+
this.setInterval();
|
|
365
|
+
});
|
|
366
|
+
} catch (error) {
|
|
367
|
+
this.handleError(error);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Get some update
|
|
373
|
+
*
|
|
374
|
+
* @returns {Promise<void>}
|
|
375
|
+
*/
|
|
376
|
+
async getUpdatedTransfer() {
|
|
377
|
+
let transferDto;
|
|
378
|
+
try {
|
|
379
|
+
this.request = 1;
|
|
380
|
+
transferDto = await this.context.port.request('passbolt.mobile.transfer.get', this.state.transferDto.id);
|
|
381
|
+
this.request = 0;
|
|
382
|
+
} catch (error) {
|
|
383
|
+
// if there is an error, consider the transfer cancelled
|
|
384
|
+
await this.handleTransferError(error);
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
if (transferDto) {
|
|
389
|
+
switch (transferDto.status) {
|
|
390
|
+
case 'start':
|
|
391
|
+
// update QR code only if the page changed
|
|
392
|
+
break;
|
|
393
|
+
case 'in progress':
|
|
394
|
+
if (transferDto.current_page !== this.state.page) {
|
|
395
|
+
await this.handleTransferUpdated(transferDto);
|
|
396
|
+
}
|
|
397
|
+
break;
|
|
398
|
+
case 'complete':
|
|
399
|
+
await this.handleTransferComplete();
|
|
400
|
+
break;
|
|
401
|
+
case 'error':
|
|
402
|
+
await this.handleTransferError();
|
|
403
|
+
break;
|
|
404
|
+
case 'cancel':
|
|
405
|
+
await this.handleTransferCancelled();
|
|
406
|
+
break;
|
|
407
|
+
default:
|
|
408
|
+
await this.handleTransferError(new Error('Unsupported status'));
|
|
409
|
+
break;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Handle when the transfer was updated
|
|
416
|
+
* Turn pages, etc.
|
|
417
|
+
*
|
|
418
|
+
* @param transferDto
|
|
419
|
+
* @returns {Promise<void>}
|
|
420
|
+
*/
|
|
421
|
+
async handleTransferUpdated(transferDto) {
|
|
422
|
+
this.setState({transferDto, step: 'in progress', page: transferDto.current_page});
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Tell the server that the transfer is cancelled browser extension side
|
|
427
|
+
* This allows the other client to also give up.
|
|
428
|
+
*
|
|
429
|
+
* @returns {Promise<void>}
|
|
430
|
+
*/
|
|
431
|
+
async handleTransferCancel() {
|
|
432
|
+
await this.toggleProcessing();
|
|
433
|
+
this.clearInterval();
|
|
434
|
+
try {
|
|
435
|
+
// cancel server side if we had the time to create a transfer entity there
|
|
436
|
+
if (this.state.transferDto && this.state.transferDto !== 'cancel') {
|
|
437
|
+
const transferDto = {id: this.state.transferDto.id, status: 'cancel'};
|
|
438
|
+
await this.context.port.request('passbolt.mobile.transfer.update', transferDto);
|
|
439
|
+
}
|
|
440
|
+
} catch (error) {
|
|
441
|
+
// not much to recover from
|
|
442
|
+
console.error(error);
|
|
443
|
+
}
|
|
444
|
+
this.setState(this.defaultState);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Tell the server that the transfer is cancelled mobile side
|
|
449
|
+
*
|
|
450
|
+
* @returns {Promise<void>}
|
|
451
|
+
*/
|
|
452
|
+
async handleTransferCancelled() {
|
|
453
|
+
this.clearInterval();
|
|
454
|
+
const cancelState = this.defaultState;
|
|
455
|
+
cancelState.step = 'cancel';
|
|
456
|
+
this.setState(cancelState);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/**
|
|
460
|
+
* When the transfer is over
|
|
461
|
+
* @returns {Promise<void>}
|
|
462
|
+
*/
|
|
463
|
+
async handleTransferComplete() {
|
|
464
|
+
this.clearInterval();
|
|
465
|
+
const completeState = this.defaultState;
|
|
466
|
+
completeState.step = 'complete';
|
|
467
|
+
this.setState(completeState);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* When the transfer is reporting an issue
|
|
472
|
+
* @returns {Promise<void>}
|
|
473
|
+
*/
|
|
474
|
+
async handleTransferError(error) {
|
|
475
|
+
this.clearInterval();
|
|
476
|
+
if (!error) {
|
|
477
|
+
const msg = this.translate('The transfer was cancelled because the other client returned an error.');
|
|
478
|
+
error = new Error(msg);
|
|
479
|
+
}
|
|
480
|
+
this.handleError(error);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/*
|
|
484
|
+
*
|
|
485
|
+
* Update polling
|
|
486
|
+
*
|
|
487
|
+
*/
|
|
488
|
+
/**
|
|
489
|
+
* componentWillUnmount
|
|
490
|
+
* This method is called when a component is being removed from the DOM
|
|
491
|
+
*/
|
|
492
|
+
componentWillUnmount() {
|
|
493
|
+
this.clearInterval();
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* Add an interval to fetch transfer update
|
|
498
|
+
*/
|
|
499
|
+
setInterval() {
|
|
500
|
+
this.timeout = window.setInterval(() => {
|
|
501
|
+
// throttle requests so that there is only one pending at a given time
|
|
502
|
+
if (this.request === 0) {
|
|
503
|
+
this.getUpdatedTransfer();
|
|
504
|
+
}
|
|
505
|
+
}, FETCH_INTERVAL);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Remove the interval fetching the last transfer update
|
|
510
|
+
*/
|
|
511
|
+
clearInterval() {
|
|
512
|
+
if (this.timeout) {
|
|
513
|
+
window.clearInterval(this.timeout);
|
|
514
|
+
this.timeout = null;
|
|
515
|
+
}
|
|
516
|
+
this.request = 0;
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/*
|
|
520
|
+
*
|
|
521
|
+
* UI related events
|
|
522
|
+
*
|
|
523
|
+
*/
|
|
524
|
+
/**
|
|
525
|
+
* What happens when the user clicks cancel
|
|
526
|
+
*
|
|
527
|
+
* @returns {Promise<void>}
|
|
528
|
+
*/
|
|
529
|
+
async handleClickCancel() {
|
|
530
|
+
this.handleTransferCancel();
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* When the transfer is over and one wants to restart
|
|
535
|
+
* @returns {Promise<void>}
|
|
536
|
+
*/
|
|
537
|
+
async handleClickDone() {
|
|
538
|
+
this.clearInterval();
|
|
539
|
+
this.setState(this.defaultState);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Toggle processing state
|
|
544
|
+
* @returns {Promise<void>}
|
|
545
|
+
*/
|
|
546
|
+
async toggleProcessing() {
|
|
547
|
+
const prev = this.state.processing;
|
|
548
|
+
return new Promise(resolve => {
|
|
549
|
+
this.setState({processing: !prev}, resolve());
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/*
|
|
554
|
+
*
|
|
555
|
+
* JSX Helpers
|
|
556
|
+
*
|
|
557
|
+
*/
|
|
558
|
+
/**
|
|
559
|
+
* Handle error to display the error info and retry
|
|
560
|
+
* @param {Error} error
|
|
561
|
+
*/
|
|
562
|
+
handleError(error) {
|
|
563
|
+
console.error(error);
|
|
564
|
+
this.setState({step: 'error', error});
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Return the current QR code src (inline image)
|
|
569
|
+
* @returns {string|*}
|
|
570
|
+
*/
|
|
571
|
+
getCurrentQrCodeSrc() {
|
|
572
|
+
if (typeof this.state.qrCodes[this.state.page] === 'undefined') {
|
|
573
|
+
// TODO display something...
|
|
574
|
+
return '';
|
|
575
|
+
}
|
|
576
|
+
return this.state.qrCodes[this.state.page];
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* Render
|
|
581
|
+
* @returns {JSX.Element}
|
|
582
|
+
*/
|
|
583
|
+
render() {
|
|
584
|
+
const processingClassName = this.state.processing ? 'processing' : '';
|
|
585
|
+
return (
|
|
586
|
+
<div className="grid grid-responsive-12 profile-mobile-transfer">
|
|
587
|
+
<div className="row">
|
|
588
|
+
{this.state.step === 'start' &&
|
|
589
|
+
<div className="mobile-transfer-step-start">
|
|
590
|
+
<div className="profile col6">
|
|
591
|
+
<h3><Trans>Welcome to the mobile account transfer!</Trans></h3>
|
|
592
|
+
<div className="mobile-transfer-bg">
|
|
593
|
+
<div className="visually-hidden">An illustration showing the different steps.</div>
|
|
594
|
+
</div>
|
|
595
|
+
<p className="font-dim">
|
|
596
|
+
<Trans>Click start once the mobile application is installed and opened on your phone and you are ready to scan QR codes.</Trans>
|
|
597
|
+
</p>
|
|
598
|
+
<div className="submit-wrapper">
|
|
599
|
+
<a className={`button primary big ${processingClassName}`} role="button" onClick={this.handleClickStart}>
|
|
600
|
+
<Trans>Start</Trans>
|
|
601
|
+
</a>
|
|
602
|
+
</div>
|
|
603
|
+
</div>
|
|
604
|
+
<div className="avatar col4 push1 last">
|
|
605
|
+
<h3><Trans>Get started in 5 easy steps</Trans></h3>
|
|
606
|
+
<p><Trans>1. Install the application from the store.</Trans></p>
|
|
607
|
+
<p><Trans>2. Open the application on your phone.</Trans></p>
|
|
608
|
+
<p><strong><Trans>3. Click start, here, in your browser.</Trans></strong></p>
|
|
609
|
+
<p><Trans>4. Scan the QR codes with your phone.</Trans></p>
|
|
610
|
+
<p><Trans>5. And you are done!</Trans></p>
|
|
611
|
+
<a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
|
|
612
|
+
<Icon name="life-ring"/>
|
|
613
|
+
<span><Trans>Read the documentation</Trans></span>
|
|
614
|
+
</a>
|
|
615
|
+
</div>
|
|
616
|
+
</div>
|
|
617
|
+
}
|
|
618
|
+
{this.state.step === 'in progress' &&
|
|
619
|
+
<div className="mobile-transfer-step-in-progress">
|
|
620
|
+
<div className="profile col6">
|
|
621
|
+
<h3><Trans>Transfer in progress...</Trans></h3>
|
|
622
|
+
<img id="qr-canvas" style={{width: `${QRCODE_WIDTH}px`, height: `${QRCODE_WIDTH}px`, marginBottom: '1em'}} src={this.getCurrentQrCodeSrc()}/>
|
|
623
|
+
<a className={`button cancel ${processingClassName}`} role="button" onClick={this.handleClickCancel}>
|
|
624
|
+
<Trans>Cancel</Trans>
|
|
625
|
+
</a>
|
|
626
|
+
</div>
|
|
627
|
+
<div className="avatar col4 push1 last">
|
|
628
|
+
<h3><Trans>Get started in 5 easy steps</Trans></h3>
|
|
629
|
+
<p><Trans>1. Install the application from the store.</Trans></p>
|
|
630
|
+
<p><Trans>2. Open the application on your phone.</Trans></p>
|
|
631
|
+
<p><Trans>3. Click start, here, in your browser.</Trans></p>
|
|
632
|
+
<p><Trans><strong>4. Scan the QR codes with your phone.</strong></Trans></p>
|
|
633
|
+
<p><Trans>5. And you are done!</Trans></p>
|
|
634
|
+
<a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
|
|
635
|
+
<Icon name="life-ring"/>
|
|
636
|
+
<span><Trans>Read the documentation</Trans></span>
|
|
637
|
+
</a>
|
|
638
|
+
</div>
|
|
639
|
+
</div>
|
|
640
|
+
}
|
|
641
|
+
{this.state.step === 'complete' &&
|
|
642
|
+
<div className="mobile-transfer-step-complete">
|
|
643
|
+
<div className="profile col6">
|
|
644
|
+
<h3><Trans>Transfer complete!</Trans></h3>
|
|
645
|
+
<div className="feedback-card">
|
|
646
|
+
<AnimatedFeedback name='success' />
|
|
647
|
+
<div className="additional-information">
|
|
648
|
+
<p>
|
|
649
|
+
<Trans>You are now ready to continue the setup on your phone.</Trans>
|
|
650
|
+
<Trans>You can restart this process if you want to configure another phone.</Trans>
|
|
651
|
+
</p>
|
|
652
|
+
<p>
|
|
653
|
+
<a className={`button primary ${processingClassName}`} role="button" onClick={this.handleClickDone}>
|
|
654
|
+
<Trans>Configure another phone</Trans>
|
|
655
|
+
</a>
|
|
656
|
+
</p>
|
|
657
|
+
</div>
|
|
658
|
+
</div>
|
|
659
|
+
</div>
|
|
660
|
+
<div className="avatar col4 push1 last">
|
|
661
|
+
<h3><Trans>Get started in 5 easy steps</Trans></h3>
|
|
662
|
+
<p><Trans>1. Install the application from the store.</Trans></p>
|
|
663
|
+
<p><Trans>2. Open the application on your phone.</Trans></p>
|
|
664
|
+
<p><Trans>3. Click start, here, in your browser.</Trans></p>
|
|
665
|
+
<p><Trans>4. Scan the QR codes with your phone.</Trans></p>
|
|
666
|
+
<p><Trans><strong>5. And you are done!</strong></Trans></p>
|
|
667
|
+
<a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
|
|
668
|
+
<Icon name="life-ring"/>
|
|
669
|
+
<span><Trans>Read the documentation</Trans></span>
|
|
670
|
+
</a>
|
|
671
|
+
</div>
|
|
672
|
+
</div>
|
|
673
|
+
}
|
|
674
|
+
{this.state.step === 'cancel' &&
|
|
675
|
+
<div className="mobile-transfer-step-error">
|
|
676
|
+
<div className="profile col6">
|
|
677
|
+
<h3><Trans>The operation was cancelled.</Trans></h3>
|
|
678
|
+
<div className="feedback-card">
|
|
679
|
+
<AnimatedFeedback name='error' />
|
|
680
|
+
<div className="additional-information">
|
|
681
|
+
<p>
|
|
682
|
+
<Trans>If there was an issue during the transfer, either the operation was cancelled on the mobile side,
|
|
683
|
+
or the authentication token expired.</Trans>
|
|
684
|
+
<Trans>Please try again later or contact your administrator.</Trans>
|
|
685
|
+
</p>
|
|
686
|
+
<p>
|
|
687
|
+
<a className={`button primary ${processingClassName}`} role="button" onClick={this.handleClickStart}>
|
|
688
|
+
<Trans>Restart</Trans>
|
|
689
|
+
</a>
|
|
690
|
+
</p>
|
|
691
|
+
</div>
|
|
692
|
+
</div>
|
|
693
|
+
</div>
|
|
694
|
+
<div className="avatar col4 push1 last">
|
|
695
|
+
<h3><Trans>Need some help?</Trans></h3>
|
|
696
|
+
<p><Trans>Contact your administrator with details about what went wrong.</Trans></p>
|
|
697
|
+
<p><Trans>Alternatively you can also get in touch with support on community forum or via the paid support channels.</Trans></p>
|
|
698
|
+
<a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
|
|
699
|
+
<Icon name="life-ring"/>
|
|
700
|
+
<span><Trans>Help site</Trans></span>
|
|
701
|
+
</a>
|
|
702
|
+
</div>
|
|
703
|
+
</div>
|
|
704
|
+
}
|
|
705
|
+
{this.state.step === 'error' &&
|
|
706
|
+
<div className="mobile-transfer-step-error">
|
|
707
|
+
<div className="profile col6">
|
|
708
|
+
<h3><Trans>Oops, something went wrong</Trans></h3>
|
|
709
|
+
<div className="feedback-card">
|
|
710
|
+
<AnimatedFeedback name='error' />
|
|
711
|
+
<div className="additional-information">
|
|
712
|
+
<p>
|
|
713
|
+
<Trans>There was an issue during the transfer. Please try again later or contact your administrator.</Trans>
|
|
714
|
+
</p>
|
|
715
|
+
<p>
|
|
716
|
+
<a className={`button primary ${processingClassName}`} role="button" onClick={this.handleClickStart}>
|
|
717
|
+
<Trans>Restart</Trans>
|
|
718
|
+
</a>
|
|
719
|
+
</p>
|
|
720
|
+
</div>
|
|
721
|
+
</div>
|
|
722
|
+
<ShowErrorDetails error={this.state.error} />
|
|
723
|
+
</div>
|
|
724
|
+
<div className="avatar col4 push1 last">
|
|
725
|
+
<h3><Trans>Need some help?</Trans></h3>
|
|
726
|
+
<p><Trans>Contact your administrator with the error details.</Trans></p>
|
|
727
|
+
<p><Trans>Alternatively you can also get in touch with support on community forum or via the paid support channels.</Trans></p>
|
|
728
|
+
<a className="button" href="https://help.passbolt.com/" target="_blank" rel="noopener noreferrer">
|
|
729
|
+
<Icon name="life-ring"/>
|
|
730
|
+
<span><Trans>Help site</Trans></span>
|
|
731
|
+
</a>
|
|
732
|
+
</div>
|
|
733
|
+
</div>
|
|
734
|
+
}
|
|
735
|
+
</div>
|
|
736
|
+
</div>
|
|
737
|
+
);
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
TransferToMobile.contextType = AppContext;
|
|
742
|
+
TransferToMobile.propTypes = {
|
|
743
|
+
dialogContext: PropTypes.object, // The dialog context
|
|
744
|
+
userSettingsContext: PropTypes.object, // The user settings context
|
|
745
|
+
t: PropTypes.func, // The translation function
|
|
746
|
+
i18n: PropTypes.any // The i18n context translation
|
|
747
|
+
};
|
|
748
|
+
|
|
749
|
+
export default withDialog(withUserSettings(withTranslation('common')(TransferToMobile)));
|