passbolt-styleguide 3.6.2 → 3.7.0-alpha1

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.
Files changed (431) hide show
  1. package/README.md +9 -6
  2. package/build/css/help.min.css +3 -7
  3. package/build/css/public.min.css +3 -16
  4. package/build/css/themes/default/api_authentication.min.css +3 -3
  5. package/build/css/themes/default/api_cloud.min.css +3 -3
  6. package/build/css/themes/default/api_main.min.css +3 -12
  7. package/build/css/themes/default/api_reports.min.css +3 -12
  8. package/build/css/themes/default/api_webinstaller.min.css +3 -12
  9. package/build/css/themes/default/ext_app.min.css +3 -12
  10. package/build/css/themes/default/ext_authentication.min.css +3 -3
  11. package/build/css/themes/default/ext_external.min.css +2 -2
  12. package/build/css/themes/default/ext_in_form_cta.min.css +3 -3
  13. package/build/css/themes/default/ext_in_form_menu.min.css +3 -3
  14. package/build/css/themes/default/ext_quickaccess.min.css +3 -3
  15. package/build/css/themes/midgar/api_authentication.min.css +3 -3
  16. package/build/css/themes/midgar/api_main.min.css +3 -12
  17. package/build/css/themes/midgar/api_reports.min.css +3 -12
  18. package/build/css/themes/midgar/ext_app.min.css +3 -12
  19. package/build/css/themes/midgar/ext_authentication.min.css +3 -3
  20. package/build/css/themes/midgar/ext_in_form_cta.min.css +3 -3
  21. package/build/css/themes/midgar/ext_in_form_menu.min.css +3 -3
  22. package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
  23. package/build/js/dist/api-account-recovery.js +1 -1
  24. package/build/js/dist/api-app.js +1 -1
  25. package/build/js/dist/api-app.js.LICENSE.txt +25 -1
  26. package/build/js/dist/api-recover.js +1 -1
  27. package/build/js/dist/api-setup.js +1 -1
  28. package/build/js/dist/api-triage.js +1 -1
  29. package/build/js/dist/api-vendors.js +1 -1
  30. package/build/js/dist/api-vendors.js.LICENSE.txt +43 -7
  31. package/i18next-parser.config.js +22 -0
  32. package/package.json +8 -5
  33. package/src/img/og/og_image.png +0 -0
  34. package/src/locales/de-DE/common.json +308 -173
  35. package/src/locales/en-UK/common.json +155 -175
  36. package/src/locales/es-ES/common.json +955 -0
  37. package/src/locales/fr-FR/common.json +308 -174
  38. package/src/locales/ja-JP/common.json +292 -172
  39. package/src/locales/lt-LT/common.json +985 -0
  40. package/src/locales/nl-NL/common.json +329 -194
  41. package/src/locales/pl-PL/common.json +337 -172
  42. package/src/locales/sv-SE/common.json +307 -172
  43. package/src/public-website-sign-in/PublicWebsiteSignInBootstrap.js +25 -0
  44. package/src/public-website-sign-in/lib/SignIn/SignInManager.js +85 -0
  45. package/src/public-website-sign-in/lib/SignIn/SignInManager.test.data.js +45 -0
  46. package/src/public-website-sign-in/lib/SignIn/SignInManager.test.js +59 -0
  47. package/src/public-website-sign-in/lib/SignIn/SignInManager.test.page.js +67 -0
  48. package/src/react-extension/ExtBootstrapAccountRecovery.js +17 -0
  49. package/src/react-extension/ExtBootstrapApp.js +17 -0
  50. package/src/react-extension/ExtBootstrapLogin.js +17 -0
  51. package/src/react-extension/ExtBootstrapRecover.js +17 -0
  52. package/src/react-extension/ExtBootstrapSetup.js +17 -0
  53. package/src/react-extension/components/AccountRecovery/AccountRecoveryInviteUserSettingPreferenceDialog/AccountRecoveryInviteUserSettingPreferenceDialog.test.stories.js +1 -1
  54. package/src/react-extension/components/AccountRecovery/HandleAccountRecoveryUserSettingsRoute/HandleAccountRecoveryUserSettingsRoute.js +1 -9
  55. package/src/react-extension/components/AccountRecovery/HandleReviewAccountRecoveryRequestWorkflow/HandleReviewAccountRecoveryRequestWorkflow.js +1 -9
  56. package/src/react-extension/components/AccountRecovery/ManageAccountRecoveryUserSettings/ManageAccountRecoveryUserSettings.js +1 -1
  57. package/src/react-extension/components/AccountRecovery/ManageAccountRecoveryUserSettings/ManageAccountRecoveryUserSettings.test.stories.js +1 -1
  58. package/src/react-extension/components/AccountRecovery/ReviewAccountRecoveryRequest/ReviewAccountRecoveryRequest.js +1 -1
  59. package/src/react-extension/components/AccountRecovery/ReviewAccountRecoveryRequest/ReviewAccountRecoveryRequest.test.stories.js +1 -1
  60. package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.js +6 -3
  61. package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.test.data.js +10 -7
  62. package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.test.stories.js +1 -1
  63. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +2 -15
  64. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationAccountRecoveryAction/DisplayAdministrationAccountRecoveryActions.js +2 -12
  65. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.js +2 -11
  66. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.js +1 -1
  67. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.test.js +1 -1
  68. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +1 -9
  69. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.stories.js +1 -1
  70. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.js +1 -9
  71. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.page.js +1 -1
  72. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.stories.js +12 -6
  73. package/src/react-extension/components/Administration/DisplayLoadingDialog/DisplayLoadingDialog.js +2 -11
  74. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.js +6 -6
  75. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +1 -1
  76. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +25 -1
  77. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +1 -1
  78. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +1 -1
  79. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.stories.js +1 -1
  80. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +25 -1
  81. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +1 -1
  82. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.stories.js +1 -1
  83. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.js +12 -2
  84. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.js +1 -1
  85. package/src/react-extension/components/Administration/DisplayTestUserDirectoryAdministration/DisplayTestUserDirectoryAdministration.test.stories.js +1 -1
  86. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +24 -24
  87. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +1 -1
  88. package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.js +1 -1
  89. package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.test.stories.js +1 -1
  90. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.js +6 -3
  91. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.test.data.js +20 -5
  92. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.test.stories.js +1 -1
  93. package/src/react-extension/components/Administration/ProvideAccountRecoveryOrganizationKey/ProvideAccountRecoveryOrganizationKey.js +1 -11
  94. package/src/react-extension/components/Administration/ProvideAccountRecoveryOrganizationKey/ProvideAccountRecoveryOrganizationKey.test.stories.js +1 -1
  95. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/DownloadOrganizationKey.js +1 -9
  96. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/DownloadOrganizationKey.test.stories.js +1 -1
  97. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.js +90 -46
  98. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.test.js +61 -17
  99. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/ImportOrganizationKey.js +1 -1
  100. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.js +1 -9
  101. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.test.page.js +14 -0
  102. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.test.stories.js +1 -1
  103. package/src/react-extension/components/Announcement/AnnouncementWrapper/AnnouncementWrapper.js +3 -2
  104. package/src/react-extension/components/Announcement/HandleSubscriptionAnnouncement/DisplayExpiredSubscriptionAnnouncement.js +3 -3
  105. package/src/react-extension/components/Announcement/HandleSubscriptionAnnouncement/DisplayGoingToExpireSubscriptionAnnouncement.js +3 -2
  106. package/src/react-extension/components/Announcement/HandleSubscriptionAnnouncement/DisplayInvalidSubscriptionAnnouncement.js +3 -3
  107. package/src/react-extension/components/Authentication/AskForAuthenticationHelpCredentialLost/AskForAuthenticationHelpCredentialLost.js +2 -2
  108. package/src/react-extension/components/Authentication/AskForAuthenticationHelpCredentialLost/AskForAuthenticationHelpCredentialLost.test.stories.js +1 -1
  109. package/src/react-extension/components/Authentication/CheckAccountRecoveryEmail/CheckAccountRecoveryEmail.js +2 -2
  110. package/src/react-extension/components/Authentication/CheckAccountRecoveryEmail/CheckAccountRecoveryEmail.test.stories.js +1 -1
  111. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailBox.js +2 -12
  112. package/src/react-extension/components/Authentication/CheckMailBox/CheckMailbox.test.stories.js +1 -1
  113. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.js +88 -41
  114. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.stories.js +1 -1
  115. package/src/react-extension/components/Authentication/ChooseAccountRecoveryPreference/ChooseAccountRecoveryPreference.js +2 -2
  116. package/src/react-extension/components/Authentication/ChooseAccountRecoveryPreference/ChooseAccountRecoveryPreference.test.stories.js +11 -1
  117. package/src/react-extension/components/Authentication/ChooseSecurityToken/ChooseSecurityToken.js +2 -2
  118. package/src/react-extension/components/Authentication/ChooseSecurityToken/ChooseSecurityToken.test.stories.js +1 -1
  119. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.js +24 -14
  120. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.js +2 -2
  121. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.stories.js +1 -1
  122. package/src/react-extension/components/Authentication/DisplayAlreadyLoggedInError/DisplayAlreadyLoggedInError.js +2 -2
  123. package/src/react-extension/components/Authentication/DisplayAlreadyLoggedInError/DisplayAlreadyLoggedInError.test.stories.js +1 -1
  124. package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.js +2 -2
  125. package/src/react-extension/components/Authentication/DisplayBrowserNotSupported/DisplayBrowserNotSupported.test.stories.js +1 -1
  126. package/src/react-extension/components/Authentication/DisplayExpiredTokenError/DisplayExpiredTokenError.js +2 -2
  127. package/src/react-extension/components/Authentication/DisplayExpiredTokenError/DisplayExpiredTokenError.test.stories.js +1 -1
  128. package/src/react-extension/components/Authentication/DisplayRequireInvitationError/DisplayRequireInvitationError.js +2 -2
  129. package/src/react-extension/components/Authentication/DisplayRequireInvitationError/DisplayRequireInvitationError.test.stories.js +1 -1
  130. package/src/react-extension/components/Authentication/DisplayUnexpectedError/DisplayUnexpectedError.js +3 -3
  131. package/src/react-extension/components/Authentication/DisplayUnexpectedError/DisplayUnexpectedError.test.stories.js +1 -1
  132. package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.js +2 -2
  133. package/src/react-extension/components/Authentication/DownloadRecoveryKit/DownloadRecoveryKit.test.stories.js +1 -1
  134. package/src/react-extension/components/Authentication/EnterNameForm/EnterNameForm.js +6 -6
  135. package/src/react-extension/components/Authentication/EnterNameForm/EnterNameForm.test.stories.js +1 -1
  136. package/src/react-extension/components/Authentication/EnterUsernameForm/EnterUsernameForm.js +1 -1
  137. package/src/react-extension/components/Authentication/EnterUsernameForm/EnterUsernameForm.test.stories.js +1 -1
  138. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.js +34 -7
  139. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.data.js +2 -1
  140. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.js +20 -1
  141. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.page.js +4 -0
  142. package/src/react-extension/components/Authentication/ImportGpgKey/ImportGpgKey.test.stories.js +1 -1
  143. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.js +2 -2
  144. package/src/react-extension/components/Authentication/InstallExtension/InstallExtension.test.stories.js +4 -1
  145. package/src/react-extension/components/Authentication/IntroduceExtension/IntroduceExtension.js +2 -2
  146. package/src/react-extension/components/Authentication/IntroduceExtension/IntroduceExtension.test.stories.js +1 -1
  147. package/src/react-extension/components/Authentication/NotifyExpiredSession/NotifyExpiredSession.js +1 -9
  148. package/src/react-extension/components/Authentication/NotifyExpiredSession/NotifyExpiredSession.test.stories.js +1 -1
  149. package/src/react-extension/components/Authentication/RequestAccountRecovery/RequestAccountRecovery.js +2 -2
  150. package/src/react-extension/components/Authentication/RequestAccountRecovery/RequestAccountRecovery.test.stories.js +6 -1
  151. package/src/react-extension/components/AuthenticationAccountRecovery/DisplayExpiredTokenError/DisplayExpiredTokenError.js +2 -2
  152. package/src/react-extension/components/AuthenticationAccountRecovery/DisplayExpiredTokenError/DisplayExpiredTokenError.test.stories.js +1 -1
  153. package/src/react-extension/components/AuthenticationAccountRecovery/DisplayRestartFromScratchError/DisplayRestartFromScratchError.js +2 -2
  154. package/src/react-extension/components/AuthenticationAccountRecovery/DisplayRestartFromScratchError/DisplayRestartFromScratchError.test.stories.js +1 -1
  155. package/src/react-extension/components/AuthenticationAccountRecovery/OrchestrateAccountRecovery/OrchestrateAccountRecovery.js +2 -2
  156. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.js +2 -2
  157. package/src/react-extension/components/AuthenticationLogin/AcceptLoginServerKeyChange/AcceptLoginServerKeyChange.test.stories.js +1 -1
  158. package/src/react-extension/components/AuthenticationLogin/Login/Login.js +1 -9
  159. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.stories.js +1 -1
  160. package/src/react-extension/components/AuthenticationLogin/OrchestrateLogin/OrchestrateLoginBoxFooter.js +2 -2
  161. package/src/react-extension/components/AuthenticationLogin/OrchestrateLogin/OrchestrateLoginBoxMain.js +2 -2
  162. package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.js +1 -1
  163. package/src/react-extension/components/AuthenticationPassphrase/InputPassphrase/InputPassphrase.test.stories.js +1 -1
  164. package/src/react-extension/components/AuthenticationRecover/RecoverAuthentication/RecoverAuthentication.js +3 -2
  165. package/src/react-extension/components/AuthenticationSetup/SetupAuthentication/SetupAuthentication.js +3 -3
  166. package/src/react-extension/components/Common/ActionFeedback/DisplayActionFeedbacks.test.stories.js +1 -1
  167. package/src/react-extension/components/Common/ActionFeedback/ShareActionFeedback.js +2 -2
  168. package/src/react-extension/components/Common/Autocomplete/Autocomplete.js +8 -2
  169. package/src/react-extension/components/Common/Avatar/UserAvatar.test.data.js +6 -4
  170. package/src/react-extension/components/Common/Avatar/UserAvatar.test.stories.js +3 -2
  171. package/src/react-extension/components/Common/Button/Button.test.stories.js +5 -5
  172. package/src/react-extension/components/Common/Checkbox/Checkbox.test.stories.js +1 -1
  173. package/src/react-extension/components/Common/ContextualMenu/ContextualMenu.test.stories.js +1 -1
  174. package/src/react-extension/components/Common/ContextualMenu/ContextualMenuWrapper.js +10 -8
  175. package/src/react-extension/components/Common/Dialog/DialogCloseButton/DialogCloseButton.js +2 -1
  176. package/src/react-extension/components/Common/Dialog/DialogWrapper/DialogFooter.test.stories.js +2 -2
  177. package/src/react-extension/components/Common/Dialog/DialogWrapper/DialogWrapper.js +2 -2
  178. package/src/react-extension/components/Common/Dialog/DialogWrapper/DialogWrapper.test.stories.js +1 -1
  179. package/src/react-extension/components/Common/DragInfo/DragInfo.test.stories.js +10 -8
  180. package/src/react-extension/components/Common/Error/NotifyError/NotifyError.js +3 -11
  181. package/src/react-extension/components/Common/Error/NotifyError/NotifyError.test.stories.js +6 -1
  182. package/src/react-extension/components/Common/Footer/Footer.js +3 -13
  183. package/src/react-extension/components/Common/Inputs/Autocomplete/Autocomplete.js +16 -7
  184. package/src/react-extension/components/Common/Inputs/Autocomplete/AutocompleteItemLoading.js +4 -0
  185. package/src/react-extension/components/Common/Inputs/FormSubmitButton/FormCancelButton.js +3 -12
  186. package/src/react-extension/components/Common/Inputs/FormSubmitButton/FormSubmitButton.js +2 -2
  187. package/src/react-extension/components/Common/Internationalisation/TranslationProvider.js +0 -1
  188. package/src/react-extension/components/Common/Link/Link.test.stories.js +1 -1
  189. package/src/react-extension/components/Common/Loading/LoadingBar/LoadingBar.test.stories.js +1 -1
  190. package/src/react-extension/components/Common/Loading/LoadingSpinner/LoadingSpinner.test.stories.js +1 -1
  191. package/src/react-extension/components/Common/Menu/DisplayMainMenu.js +2 -11
  192. package/src/react-extension/components/Common/Navigation/Search/SearchBar.js +7 -7
  193. package/src/react-extension/components/Common/Navigation/Search/SearchBar.test.stories.js +1 -1
  194. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.js +2 -11
  195. package/src/react-extension/components/Common/Progress/DisplayProgress/DisplayProgress.test.stories.js +1 -1
  196. package/src/react-extension/components/Common/RadioButton/RadioButton.test.stories.js +1 -1
  197. package/src/react-extension/components/Common/Select/Select.js +44 -12
  198. package/src/react-extension/components/Common/Select/Select.test.stories.js +1 -1
  199. package/src/react-extension/components/Common/Text/Text.test.stories.js +1 -1
  200. package/src/react-extension/components/Common/TextField/TextField.test.stories.js +1 -1
  201. package/src/react-extension/components/Common/Toggle/Toggle.test.stories.js +1 -1
  202. package/src/react-extension/components/Common/Tooltip/Tooltip.test.stories.js +2 -2
  203. package/src/react-extension/components/Internationalisation/ChangeLocale/ChangeLocale.test.page.js +1 -1
  204. package/src/react-extension/components/Resource/CreateResource/CreateResource.js +9 -9
  205. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.stories.js +1 -1
  206. package/src/react-extension/components/Resource/DeleteResource/DeleteResource.js +3 -3
  207. package/src/react-extension/components/Resource/DeleteResource/DeleteResource.test.page.js +1 -1
  208. package/src/react-extension/components/Resource/DeleteResource/DeleteResource.test.stories.js +1 -1
  209. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +4 -4
  210. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.test.stories.js +1 -1
  211. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspace.js +1 -9
  212. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMainMenu.js +8 -17
  213. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMainMenu.test.js +2 -2
  214. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMainMenu.test.stories.js +1 -1
  215. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.js +6 -6
  216. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.test.stories.js +1 -1
  217. package/src/react-extension/components/Resource/EditResource/EditResource.js +8 -8
  218. package/src/react-extension/components/Resource/EditResource/EditResource.test.stories.js +1 -1
  219. package/src/react-extension/components/Resource/ExportResources/ExportResources.js +9 -10
  220. package/src/react-extension/components/Resource/ExportResources/ExportResources.test.stories.js +1 -1
  221. package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.js +1 -1
  222. package/src/react-extension/components/Resource/ExportResources/ExportResourcesCredentials.test.stories.js +1 -1
  223. package/src/react-extension/components/Resource/FilterResourcesByBreadcrumb/FilterResourcesByBreadcrumb.test.stories.js +1 -1
  224. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.js +2 -11
  225. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFolders.test.stories.js +1 -1
  226. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByFoldersItemContextualMenu.js +2 -11
  227. package/src/react-extension/components/Resource/FilterResourcesByFolders/FilterResourcesByRootFolderContextualMenu.js +2 -11
  228. package/src/react-extension/components/Resource/FilterResourcesByGroups/FilterResourcesByGroups.js +2 -11
  229. package/src/react-extension/components/Resource/FilterResourcesByGroups/FilterResourcesByGroups.test.stories.js +1 -1
  230. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.js +4 -13
  231. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.test.js +1 -1
  232. package/src/react-extension/components/Resource/FilterResourcesByShortcuts/FilterResourcesByShortcuts.test.stories.js +1 -1
  233. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.js +1 -1
  234. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTags.test.stories.js +1 -1
  235. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTagsContextualMenu.js +2 -11
  236. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTagsList.js +2 -11
  237. package/src/react-extension/components/Resource/FilterResourcesByTags/FilterResourcesByTagsListContextualMenu.js +3 -12
  238. package/src/react-extension/components/Resource/FilterResourcesByText/FilterResourcesByText.test.stories.js +1 -1
  239. package/src/react-extension/components/Resource/ImportResources/ImportResources.test.stories.js +1 -1
  240. package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.js +1 -1
  241. package/src/react-extension/components/Resource/ImportResources/ImportResourcesKeyUnlock.test.stories.js +1 -1
  242. package/src/react-extension/components/Resource/ImportResources/ImportResourcesResult.test.stories.js +1 -1
  243. package/src/react-extension/components/ResourceComment/AddResourceComment/AddResourceComment.test.stories.js +5 -3
  244. package/src/react-extension/components/ResourceComment/ConfirmResourceCommentDeletion/ConfirmResourceCommentDeletion.js +1 -1
  245. package/src/react-extension/components/ResourceComment/ConfirmResourceCommentDeletion/ConfirmResourceCommentDeletion.test.stories.js +1 -1
  246. package/src/react-extension/components/ResourceComment/DeleteResourceComment/DeleteComment.js +2 -1
  247. package/src/react-extension/components/ResourceComment/DisplayResourceCommentList/DisplayResourceCommentList.js +1 -9
  248. package/src/react-extension/components/ResourceComment/DisplayResourceCommentList/DisplayResourceCommentList.test.stories.js +5 -3
  249. package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.js +2 -2
  250. package/src/react-extension/components/ResourceDescription/EditResourceDescription/EditResourceDescription.test.stories.js +5 -3
  251. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetails.js +3 -3
  252. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsActivity.test.stories.js +2 -2
  253. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsComment.js +2 -11
  254. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsDescription.js +2 -10
  255. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsDescription.test.stories.js +1 -1
  256. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.js +1 -1
  257. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.test.data.js +1 -1
  258. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsPermission.js +2 -10
  259. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.js +3 -12
  260. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsTag.test.stories.js +1 -1
  261. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +1 -1
  262. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.stories.js +1 -1
  263. package/src/react-extension/components/ResourceFolder/DefineResourceFolderMoveStrategy/DefineResourceFolderMoveStrategy.test.stories.js +1 -1
  264. package/src/react-extension/components/ResourceFolder/DeleteResourceFolder/DeleteResourceFolder.js +1 -1
  265. package/src/react-extension/components/ResourceFolder/DeleteResourceFolder/DeleteResourceFolder.test.stories.js +1 -1
  266. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +1 -1
  267. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.stories.js +1 -1
  268. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetails.js +1 -1
  269. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsActivity.test.stories.js +1 -1
  270. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsInformation.js +1 -9
  271. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsInformation.test.stories.js +1 -1
  272. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetailsPermissions.test.stories.js +1 -1
  273. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePassphraseGenerator.js +10 -7
  274. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePassphraseGenerator.test.stories.js +1 -1
  275. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePasswordGenerator.js +12 -9
  276. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/ConfigurePasswordGenerator.test.stories.js +1 -1
  277. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.js +10 -7
  278. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.test.stories.js +1 -1
  279. package/src/react-extension/components/ResourceTag/DeleteResourceTag/DeleteResourceTag.js +2 -2
  280. package/src/react-extension/components/ResourceTag/DeleteResourceTag/DeleteResourceTag.test.stories.js +1 -1
  281. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.js +1 -1
  282. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.stories.js +1 -1
  283. package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTags.js +2 -2
  284. package/src/react-extension/components/ResourceTag/EditResourceTags/EditResourceTagsItemViewer.js +2 -11
  285. package/src/react-extension/components/Share/ShareDialog.js +124 -22
  286. package/src/react-extension/components/Share/ShareDialog.test.data.js +25 -1
  287. package/src/react-extension/components/Share/ShareDialog.test.js +87 -36
  288. package/src/react-extension/components/Share/ShareDialog.test.page.js +1 -1
  289. package/src/react-extension/components/Share/ShareDialog.test.stories.js +1 -1
  290. package/src/react-extension/components/Share/SharePermissionDeleteButton.js +2 -1
  291. package/src/react-extension/components/Share/SharePermissionItem.js +56 -0
  292. package/src/react-extension/components/Share/ShareVariesDetails.js +2 -11
  293. package/src/react-extension/components/User/ConfirmDisableUserMFA/ConfirmDisableUserMFA.js +1 -1
  294. package/src/react-extension/components/User/ConfirmDisableUserMFA/ConfirmDisableUserMFA.test.stories.js +1 -1
  295. package/src/react-extension/components/User/CreateUser/CreateUser.js +9 -9
  296. package/src/react-extension/components/User/CreateUser/CreateUser.test.stories.js +1 -1
  297. package/src/react-extension/components/User/DeleteUser/DeleteUser.js +1 -1
  298. package/src/react-extension/components/User/DeleteUser/DeleteUser.test.stories.js +1 -1
  299. package/src/react-extension/components/User/DeleteUser/DeleteUserWithConflicts.js +3 -3
  300. package/src/react-extension/components/User/DeleteUser/DeleteUserWithConflicts.test.stories.js +1 -1
  301. package/src/react-extension/components/User/DisplayExpiredAccountRecovery/DisplayExpiredAccountRecovery.js +1 -9
  302. package/src/react-extension/components/User/DisplayExpiredAccountRecovery/DisplayExpiredAccountRecovery.test.stories.js +1 -1
  303. package/src/react-extension/components/User/DisplayUserBadgeMenu/DisplayUserBadgeMenu.js +8 -17
  304. package/src/react-extension/components/User/DisplayUserBadgeMenu/DisplayUserBadgeMenu.test.stories.js +1 -1
  305. package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.js +3 -3
  306. package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.test.stories.js +1 -1
  307. package/src/react-extension/components/User/DisplayUserWorkspaceMainActions/DisplayUserWorkspaceMainActions.js +8 -17
  308. package/src/react-extension/components/User/DisplayUserWorkspaceMainActions/DisplayUserWorkspaceMainActions.test.js +4 -4
  309. package/src/react-extension/components/User/DisplayUsers/DisplayUsers.js +1 -1
  310. package/src/react-extension/components/User/DisplayUsers/DisplayUsers.test.stories.js +1 -1
  311. package/src/react-extension/components/User/DisplayUsersContextualMenu/DisplayUsersContextualMenu.test.stories.js +1 -1
  312. package/src/react-extension/components/User/EditUser/EditUser.js +9 -9
  313. package/src/react-extension/components/User/EditUser/EditUser.test.stories.js +1 -1
  314. package/src/react-extension/components/User/FilterUsersByBreadcrumb/FilterUsersByBreadcrumb.test.stories.js +1 -1
  315. package/src/react-extension/components/User/FilterUsersByGroups/DisplayGroupContextualMenu.js +2 -11
  316. package/src/react-extension/components/User/FilterUsersByGroups/FilterUsersByGroup.test.stories.js +1 -1
  317. package/src/react-extension/components/User/FilterUsersByGroups/FilterUsersByGroupContextualMenu.js +2 -11
  318. package/src/react-extension/components/User/FilterUsersByShortcut/FilterUsersByShortcut.js +3 -12
  319. package/src/react-extension/components/User/FilterUsersByShortcut/FilterUsersByShortcut.test.stories.js +1 -1
  320. package/src/react-extension/components/User/FilterUsersByText/FilterUsersByText.js +1 -9
  321. package/src/react-extension/components/User/FilterUsersByText/FilterUsersByText.test.stories.js +1 -1
  322. package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.js +3 -3
  323. package/src/react-extension/components/UserDetails/DisplayUserDetailsAccountRecovery/DisplayUserDetailsAccountRecovery.js +1 -9
  324. package/src/react-extension/components/UserDetails/DisplayUserDetailsAccountRecovery/DisplayUserDetailsAccountRecovery.test.data.js +1 -1
  325. package/src/react-extension/components/UserDetails/DisplayUserDetailsAccountRecovery/DisplayUserDetailsAccountRecovery.test.stories.js +1 -1
  326. package/src/react-extension/components/UserDetails/DisplayUserDetailsActivity/DisplayUserDetailsActivity.js +1 -9
  327. package/src/react-extension/components/UserDetails/DisplayUserDetailsActivity/DisplayUserDetailsActivity.test.stories.js +1 -1
  328. package/src/react-extension/components/UserDetails/DisplayUserDetailsGroups/DisplayUserDetailsGroups.test.stories.js +1 -1
  329. package/src/react-extension/components/UserDetails/DisplayUserDetailsInformation/DisplayUserDetailsInformation.js +1 -1
  330. package/src/react-extension/components/UserDetails/DisplayUserDetailsInformation/DisplayUserDetailsInformation.test.stories.js +22 -83
  331. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.js +8 -1
  332. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.test.data.js +20 -2
  333. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.test.js +25 -1
  334. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.test.stories.js +28 -26
  335. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.js +85 -57
  336. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.js +21 -6
  337. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.stories.js +1 -1
  338. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroup.js +1 -1
  339. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroup.test.stories.js +1 -1
  340. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroupWithConflicts.js +2 -2
  341. package/src/react-extension/components/UserGroup/DeleteUserGroup/DeleteUserGroupWithConflicts.test.stories.js +1 -1
  342. package/src/react-extension/components/UserGroup/DisplayUserGroupDetails/DisplayUserGroupDetails.js +1 -1
  343. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsInformation/DisplayUserGroupDetailsInformation.test.stories.js +1 -1
  344. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembers.js +4 -13
  345. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembers.test.stories.js +1 -1
  346. package/src/react-extension/components/UserGroup/DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembersGroupMember.js +1 -9
  347. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.js +132 -151
  348. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.js +8 -1
  349. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.page.js +37 -14
  350. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.stories.js +5 -2
  351. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroupItem.js +209 -0
  352. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +1 -1
  353. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/DisplayChangePassphraseIntroduction.js +2 -3
  354. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/DownloadRecoveryKit.js +2 -2
  355. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +25 -12
  356. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.js +5 -1
  357. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.page.js +7 -0
  358. package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.js +2 -10
  359. package/src/react-extension/components/UserSetting/ChangeUserSecurityToken/ChangeUserSecurityToken.test.stories.js +1 -1
  360. package/src/react-extension/components/UserSetting/DisplayUserAccountRecovery/DisplayAccountRecoveryUserSettings.js +1 -1
  361. package/src/react-extension/components/UserSetting/DisplayUserAccountRecovery/DisplayAccountRecoveryUserSettings.test.stories.js +1 -1
  362. package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.js +9 -2
  363. package/src/react-extension/components/UserSetting/DisplayUserGpgInformation/DisplayUserGpgInformation.test.stories.js +58 -35
  364. package/src/react-extension/components/UserSetting/DisplayUserProfile/DisplayUserProfile.js +1 -1
  365. package/src/react-extension/components/UserSetting/DisplayUserProfile/DisplayUserProfile.test.stories.js +1 -1
  366. package/src/react-extension/components/UserSetting/DisplayUserSettingWorkspaceActions/DisplayUserSettingWorkspaceActions.js +2 -11
  367. package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspaceBreadcrumb/DisplayUserSettingsWorkspaceBreadcrumb.js +2 -2
  368. package/src/react-extension/components/UserSetting/DisplayUserSettingsWorkspaceBreadcrumb/DisplayUserSettingsWorkspaceBreadcrumb.test.stories.js +1 -1
  369. package/src/react-extension/components/UserSetting/DisplayUserTheme/DisplayUserTheme.js +1 -9
  370. package/src/react-extension/components/UserSetting/DisplayUserTheme/DisplayUserTheme.test.stories.js +1 -1
  371. package/src/react-extension/components/UserSetting/EditUserProfile/EditUserProfile.js +8 -8
  372. package/src/react-extension/components/UserSetting/EditUserProfile/EditUserProfile.test.stories.js +1 -1
  373. package/src/react-extension/components/UserSetting/NavigateIntoUserSettingsWorkspace/NavigateIntoUserSettingsWorkspace.js +4 -13
  374. package/src/react-extension/components/UserSetting/NavigateIntoUserSettingsWorkspace/NavigateIntoUserSettingsWorkspace.test.stories.js +1 -1
  375. package/src/react-extension/components/UserSetting/UploadUserProfileAvatar/UploadUserProfileAvatar.test.stories.js +1 -1
  376. package/src/react-extension/contexts/Authentication/AuthenticationRecoverContext.js +14 -1
  377. package/src/react-extension/test/fixture/Settings/siteSettings.js +20 -14
  378. package/src/react-extension/test/mock/components/Internationalisation/MockTranslationProvider.js +8 -1
  379. package/src/react-quickaccess/ExtQuickAccess.js +23 -9
  380. package/src/react-quickaccess/components/AnimatedSwitch/AnimatedSwitch.js +0 -1
  381. package/src/react-quickaccess/components/ExtensionSetup/SetupExtensionInProgress/SetupExtensionInProgress.js +2 -5
  382. package/src/react-quickaccess/components/ExtensionSetup/SetupExtensionInProgress/SetupExtensionInProgressPage.test.stories.js +1 -1
  383. package/src/react-quickaccess/components/FilterResourcesByFavoritePage/FilterResourcesByFavoritePage.js +2 -2
  384. package/src/react-quickaccess/components/FilterResourcesByFavoritePage/FilterResourcesByFavoritePage.test.stories.js +1 -1
  385. package/src/react-quickaccess/components/FilterResourcesByGroupPage/FilterResourcesByGroupPage.js +1 -1
  386. package/src/react-quickaccess/components/FilterResourcesByGroupPage/FilterResourcesByGroupPage.test.stories.js +1 -1
  387. package/src/react-quickaccess/components/FilterResourcesByItemsIOwnPage/FilterResourcesByItemsIOwnPage.js +1 -1
  388. package/src/react-quickaccess/components/FilterResourcesByItemsIOwnPage/FilterResourcesByItemsIOwnPage.test.stories.js +1 -1
  389. package/src/react-quickaccess/components/FilterResourcesByRecentlyModifiedPage/FilterResourcesByRecentlyModifiedPage.js +1 -1
  390. package/src/react-quickaccess/components/FilterResourcesByRecentlyModifiedPage/FilterResourcesByRecentlyModifiedPage.test.stories.js +1 -1
  391. package/src/react-quickaccess/components/FilterResourcesBySharedWithMePage/FilterResourcesBySharedWithMePage.js +1 -1
  392. package/src/react-quickaccess/components/FilterResourcesBySharedWithMePage/FilterResourcesBySharedWithMePage.test.stories.js +1 -1
  393. package/src/react-quickaccess/components/FilterResourcesByTagPage/FilterResourcesByTagPage.js +1 -1
  394. package/src/react-quickaccess/components/FilterResourcesByTagPage/FilterResourcesByTagPage.test.stories.js +1 -1
  395. package/src/react-quickaccess/components/GeneratePasswordPage/ConfigurePasswordGenerator.js +2 -3
  396. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.js +3 -3
  397. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.stories.js +1 -1
  398. package/src/react-quickaccess/components/Header/Header.test.stories.js +1 -1
  399. package/src/react-quickaccess/components/HomePage/HomePage.js +0 -8
  400. package/src/react-quickaccess/components/HomePage/HomePage.test.stories.js +1 -1
  401. package/src/react-quickaccess/components/LoginPage/LoginPage.js +1 -9
  402. package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +1 -1
  403. package/src/react-quickaccess/components/MoreFiltersPage/MoreFiltersPage.js +1 -1
  404. package/src/react-quickaccess/components/MoreFiltersPage/MoreFiltersPage.test.stories.js +1 -1
  405. package/src/react-quickaccess/components/PassphraseDialog/PassphraseDialog.js +5 -5
  406. package/src/react-quickaccess/components/PassphraseDialog/PassphraseDialog.test.stories.js +1 -1
  407. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.js +1 -1
  408. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.stories.js +1 -1
  409. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.js +4 -4
  410. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.stories.js +1 -1
  411. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.js +3 -3
  412. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.test.stories.js +1 -1
  413. package/src/react-quickaccess/components/Search/Search.js +5 -5
  414. package/src/react-quickaccess/components/Search/Search.test.stories.js +1 -1
  415. package/src/react-web-integration/BrowserIntegrationBootstrap.js +0 -17
  416. package/src/react-web-integration/components/AskInFormMenuDisplay/AskInFormMenuDisplay.test.stories.js +1 -1
  417. package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenu.js +2 -2
  418. package/src/react-web-integration/components/DisplayInFormMenu/DisplayInFormMenu.test.stories.js +1 -1
  419. package/src/react-web-integration/lib/InForm/InFormFieldSelector.js +11 -1
  420. package/src/react-web-integration/lib/InForm/InformManager.test.data.js +60 -0
  421. package/src/react-web-integration/lib/InForm/InformManager.test.js +151 -6
  422. package/src/react-web-integration/lib/InForm/InformManager.test.page.js +39 -0
  423. package/src/shared/components/Icons/Icon.test.stories.js +1 -1
  424. package/src/shared/components/Password/Password.js +2 -1
  425. package/src/shared/components/Password/Password.test.page.js +4 -1
  426. package/src/shared/components/Password/Password.test.stories.js +1 -1
  427. package/src/shared/components/PasswordComplexity/PasswordComplexity.js +2 -2
  428. package/src/shared/components/PasswordComplexity/PasswordComplexity.test.stories.js +5 -5
  429. package/src/stories/assets/intro/hero.png +0 -0
  430. package/src/stories/assets/intro/intro.css +47 -0
  431. package/test/jest.setup.js +2 -0
@@ -102,12 +102,12 @@ class DisplayUserDirectoryAdministration extends React.Component {
102
102
  }
103
103
 
104
104
  async componentDidMount() {
105
- document.addEventListener('click', this.handleUserDirectoryClickEvent);
105
+ document.addEventListener('click', this.handleUserDirectoryClickEvent, {capture: true});
106
106
  this.findAllUserDirectorySettings();
107
107
  }
108
108
 
109
109
  componentWillUnmount() {
110
- document.removeEventListener('click', this.handleUserDirectoryClickEvent);
110
+ document.removeEventListener('click', this.handleUserDirectoryClickEvent, {capture: true});
111
111
  }
112
112
 
113
113
  /**
@@ -768,7 +768,7 @@ class DisplayUserDirectoryAdministration extends React.Component {
768
768
  </div>
769
769
  </div>
770
770
  </div>
771
- <div className="input text required ad openldap">
771
+ <div className={`input text required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
772
772
  <label><Trans>Server url</Trans></label>
773
773
  <div className={`input text singleline connection_info ad openldap ${this.state.hasFieldFocus ? "no-focus" : ""}`}>
774
774
  <input id="server-input" type="text" className="required host ad openldap form-element" name="host"
@@ -791,20 +791,20 @@ class DisplayUserDirectoryAdministration extends React.Component {
791
791
  }
792
792
  </div>
793
793
  <div className="singleline clearfix">
794
- <div className="input text first-field ad openldap">
794
+ <div className={`input text first-field ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
795
795
  <label><Trans>Username</Trans></label>
796
796
  <input id="username-input" type="text" className="fluid form-element" name="username"
797
- value={this.state.username} onChange={this.handleInputChange} placeholder={this.translate("username")}
797
+ value={this.state.username} onChange={this.handleInputChange} placeholder={this.translate("Username")}
798
798
  disabled={this.hasAllInputDisabled()}/>
799
799
  </div>
800
- <div className="input text last-field ad openldap">
800
+ <div className={`input text last-field ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
801
801
  <label><Trans>Password</Trans></label>
802
802
  <input id="password-input" className="fluid form-element" name="password"
803
- value={this.state.password} onChange={this.handleInputChange} placeholder={this.translate("password")} type="password"
803
+ value={this.state.password} onChange={this.handleInputChange} placeholder={this.translate("Password")} type="password"
804
804
  disabled={this.hasAllInputDisabled()}/>
805
805
  </div>
806
806
  </div>
807
- <div className="input text required ad openldap">
807
+ <div className={`input text required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
808
808
  <label><Trans>Domain</Trans></label>
809
809
  <input id="domain-name-input" type="text" name="domain" value={this.state.domain}
810
810
  onChange={this.handleInputChange} className="required fluid form-element" onKeyUp={this.handleDomainInputKeyUp}
@@ -813,7 +813,7 @@ class DisplayUserDirectoryAdministration extends React.Component {
813
813
  <div id="domain-name-input-feedback" className="error-message">{this.state.domainError}</div>
814
814
  }
815
815
  </div>
816
- <div className="input text ad openldap">
816
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
817
817
  <label><Trans>Base DN</Trans></label>
818
818
  <input id="base-dn-input" type="text" name="baseDn" value={this.state.baseDn}
819
819
  onChange={this.handleInputChange} className="fluid form-element" placeholder="OU=OrgUsers,DC=mydomain,DC=local"
@@ -834,25 +834,25 @@ class DisplayUserDirectoryAdministration extends React.Component {
834
834
  </a>
835
835
  </h4>
836
836
  <div className="accordion-content">
837
- <div className="input text ad openldap">
837
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
838
838
  <label><Trans>Group path</Trans></label>
839
839
  <input id="group-path-input" type="text" name="groupPath" value={this.state.groupPath}
840
- onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.translate("Group Path")}
840
+ onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.translate("Group path")}
841
841
  disabled={this.hasAllInputDisabled()}/>
842
842
  <div className="help-message">
843
843
  <Trans>Group path is used in addition to the base DN while searching groups.</Trans> <Trans>Leave empty if users and groups are in the same DN.</Trans>
844
844
  </div>
845
845
  </div>
846
- <div className="input text ad openldap">
846
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
847
847
  <label><Trans>User path</Trans></label>
848
848
  <input id="user-path-input" type="text" name="userPath" value={this.state.userPath}
849
- onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.translate("User Path")}
849
+ onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.translate("User path")}
850
850
  disabled={this.hasAllInputDisabled()}/>
851
851
  <div className="help-message"><Trans>User path is used in addition to base DN while searching users.</Trans></div>
852
852
  </div>
853
853
  {this.isOpenLdapChecked() &&
854
854
  <div>
855
- <div className="input text openldap">
855
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
856
856
  <label><Trans>Group object class</Trans></label>
857
857
  <input id="group-object-class-input" type="text" name="groupObjectClass"
858
858
  value={this.state.groupObjectClass} onChange={this.handleInputChange} className="required fluid"
@@ -861,7 +861,7 @@ class DisplayUserDirectoryAdministration extends React.Component {
861
861
  <Trans>For Openldap only. Defines which group object to use.</Trans> (<Trans>Default</Trans>: posixGroup)
862
862
  </div>
863
863
  </div>
864
- <div className="input text openldap">
864
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
865
865
  <label><Trans>User object class</Trans></label>
866
866
  <input id="user-object-class-input" type="text" name="userObjectClass"
867
867
  value={this.state.userObjectClass} onChange={this.handleInputChange} className="required fluid form-element"
@@ -869,7 +869,7 @@ class DisplayUserDirectoryAdministration extends React.Component {
869
869
  <div className="help-message"><Trans>For Openldap only. Defines which user object to use.</Trans> (<Trans>Default</Trans>: inetOrgPerson)
870
870
  </div>
871
871
  </div>
872
- <div className="input text openldap">
872
+ <div className={`input text openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
873
873
  <label><Trans>Use email prefix / suffix?</Trans></label>
874
874
  <div className="input toggle-switch openldap form-element">
875
875
  <input type="checkbox" className="toggle-switch-checkbox checkbox" name="useEmailPrefix"
@@ -885,16 +885,16 @@ class DisplayUserDirectoryAdministration extends React.Component {
885
885
  </div>
886
886
  {this.isUseEmailPrefixChecked() &&
887
887
  <div className="singleline clearfix" id="use-email-prefix-suffix-options">
888
- <div className="input text first-field openldap">
888
+ <div className={`input text first-field openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
889
889
  <label><Trans>Email prefix</Trans></label>
890
890
  <input id="email-prefix-input" type="text" name="emailPrefix" checked={this.state.emailPrefix}
891
- onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.translate("username")}
891
+ onChange={this.handleInputChange} className="required fluid form-element" placeholder={this.translate("Username")}
892
892
  disabled={this.hasAllInputDisabled()}/>
893
893
  <div className="help-message">
894
894
  <Trans>The attribute you would like to use for the first part of the email (usually username).</Trans>
895
895
  </div>
896
896
  </div>
897
- <div className="input text last-field openldap">
897
+ <div className={`input text last-field openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
898
898
  <label><Trans>Email suffix</Trans></label>
899
899
  <input id="email-suffix-input" type="text" name="emailSuffix" value={this.state.emailSuffix}
900
900
  onChange={this.handleInputChange} className="required form-element"
@@ -919,7 +919,7 @@ class DisplayUserDirectoryAdministration extends React.Component {
919
919
  </a>
920
920
  </h4>
921
921
  <div className="accordion-content">
922
- <div className="select-wrapper input required ad openldap">
922
+ <div className={`select-wrapper input required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
923
923
  <label><Trans>Default admin</Trans></label>
924
924
  <Select items={this.getUsersAllowedToBeDefaultAdmin()}
925
925
  id="default-user-select"
@@ -932,7 +932,7 @@ class DisplayUserDirectoryAdministration extends React.Component {
932
932
  <Trans>The default admin user is the user that will perform the operations for the the directory.</Trans>
933
933
  </div>
934
934
  </div>
935
- <div className="select-wrapper input required ad openldap">
935
+ <div className={`select-wrapper input required ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
936
936
  <label><Trans>Default group admin</Trans></label>
937
937
  <Select items={this.getUsersAllowedToBeDefaultGroupAdmin()}
938
938
  id="default-group-admin-user-select"
@@ -945,7 +945,7 @@ class DisplayUserDirectoryAdministration extends React.Component {
945
945
  <Trans>The default group manager is the user that will be the group manager of newly created groups.</Trans>
946
946
  </div>
947
947
  </div>
948
- <div className="input text ad openldap">
948
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
949
949
  <label><Trans>Groups parent group</Trans></label>
950
950
  <input id="groups-parent-group-input" type="text" name="groupsParentGroup"
951
951
  value={this.state.groupsParentGroup} onChange={this.handleInputChange} className="fluid form-element" placeholder={this.translate("Group name")}
@@ -954,7 +954,7 @@ class DisplayUserDirectoryAdministration extends React.Component {
954
954
  <Trans>Synchronize only the groups which are members of this group.</Trans>
955
955
  </div>
956
956
  </div>
957
- <div className="input text ad openldap">
957
+ <div className={`input text ad openldap ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
958
958
  <label><Trans>Users parent group</Trans></label>
959
959
  <input id="users-parent-group-input" type="text" name="usersParentGroup"
960
960
  value={this.state.usersParentGroup} onChange={this.handleInputChange} className="fluid form-element" placeholder={this.translate("Group name")}
@@ -964,7 +964,7 @@ class DisplayUserDirectoryAdministration extends React.Component {
964
964
  </div>
965
965
  </div>
966
966
  {this.isActiveDirectoryChecked() &&
967
- <div className="input text clearfix ad">
967
+ <div className={`input text clearfix ad ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
968
968
  <label><Trans>Enabled users only</Trans></label>
969
969
  <div className="input toggle-switch ad form-element">
970
970
  <input type="checkbox" className="toggle-switch-checkbox checkbox" name="enabledUsersOnly"
@@ -5,7 +5,7 @@ import {mockUserDirectorySettings, mockUsers} from "./DisplayUserDirectoryAdmini
5
5
 
6
6
 
7
7
  export default {
8
- title: 'Passbolt/Administration/DisplayUserDirectoryAdministration',
8
+ title: 'Passbolt Component/Administration/DisplayUserDirectoryAdministration',
9
9
  component: DisplayUserDirectoryAdministration
10
10
  };
11
11
 
@@ -299,7 +299,7 @@ class EditSubscriptionKey extends Component {
299
299
  className="edit-subscription-dialog">
300
300
  <form onSubmit={this.handleFormSubmit} noValidate>
301
301
  <div className="form-content">
302
- <div className={`input textarea required ${this.state.keyError ? "error" : ""}`}>
302
+ <div className={`input textarea required ${this.state.keyError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
303
303
  <label htmlFor="edit-tag-form-name"><Trans>Subscription key</Trans></label>
304
304
  <textarea id="edit-subscription-form-key" name="key" value={this.state.key}
305
305
  onKeyUp={this.handleKeyInputKeyUp} onChange={this.handleInputChange}
@@ -17,7 +17,7 @@ import EditSubscriptionKey from "./EditSubscriptionKey";
17
17
  import {defaultProps} from "./EditSubscriptionKey.test.data";
18
18
 
19
19
  export default {
20
- title: 'Passbolt/Administration/EditSubscriptionKey',
20
+ title: 'Passbolt Component/Administration/EditSubscriptionKey',
21
21
  component: EditSubscriptionKey
22
22
  };
23
23
 
@@ -218,8 +218,11 @@ class ManageAccountRecoveryAdministrationSettings extends React.Component {
218
218
  * @return {string}
219
219
  */
220
220
  formatDateTimeAgo(date) {
221
- if (date === 'Never') {
222
- return date;
221
+ if (date === null) {
222
+ return "n/a";
223
+ }
224
+ if (date === 'Infinity') {
225
+ return this.translate("Never");
223
226
  }
224
227
  const dateTime = DateTime.fromISO(date);
225
228
  const duration = dateTime.diffNow().toMillis();
@@ -248,7 +251,7 @@ class ManageAccountRecoveryAdministrationSettings extends React.Component {
248
251
  if (!user_ids) {
249
252
  return null;
250
253
  }
251
- return user_ids.map((user, id) => <Fragment key={id}>{user.name}&lt;{user.email}&gt;<br/></Fragment>);
254
+ return user_ids.map((user, id) => <Fragment key={id}>{user.name} &lt;{user.email}&gt;<br/></Fragment>);
252
255
  }
253
256
 
254
257
  /**
@@ -46,12 +46,23 @@ export function hasChangedPolicyProps(props = {}) {
46
46
  policyChanges: {
47
47
  policy: "mandatory",
48
48
  publicKey: "new-public-key"
49
- }
49
+ },
50
+ getKeyInfo: () => defaultKeyInfo
50
51
  }
51
52
  };
52
53
  return defaultProps(Object.assign(_props, props));
53
54
  }
54
55
 
56
+ const defaultKeyInfo = {
57
+ user_ids: [{name: "Test Test", email: "test@passbolt.com"}],
58
+ armored_key: "new-public-key",
59
+ fingerprint: "848E95CC7493129AD862583129B81CA8936023DD",
60
+ algorithm: "RSA",
61
+ length: "4096",
62
+ created: "2022-05-01T13:11:08+00:00",
63
+ expires: "2024-05-01T13:11:08+00:00",
64
+ };
65
+
55
66
  /**
56
67
  * Disabled policy props.
57
68
  * @param {Object} props The props to override
@@ -63,7 +74,8 @@ export function disabledPolicyPropsWithOrganisationKey(props = {}) {
63
74
  policyChanges: {
64
75
  policy: "disabled",
65
76
  publicKey: "new-public-key"
66
- }
77
+ },
78
+ getKeyInfo: () => defaultKeyInfo
67
79
  }
68
80
  };
69
81
  return defaultProps(Object.assign(_props, props));
@@ -80,7 +92,8 @@ export function mandatoryPolicyPropsWithOrganisationKey(props = {}) {
80
92
  policyChanges: {
81
93
  policy: "mandatory",
82
94
  publicKey: "new-public-key"
83
- }
95
+ },
96
+ getKeyInfo: () => defaultKeyInfo
84
97
  }
85
98
  };
86
99
  return defaultProps(Object.assign(_props, props));
@@ -97,7 +110,8 @@ export function optInPolicyPropsWithOrganisationKey(props = {}) {
97
110
  policyChanges: {
98
111
  policy: "opt-in",
99
112
  publicKey: "new-public-key"
100
- }
113
+ },
114
+ getKeyInfo: () => defaultKeyInfo
101
115
  }
102
116
  };
103
117
  return defaultProps(Object.assign(_props, props));
@@ -114,7 +128,8 @@ export function optOutPolicyPropsWithOrganisationKey(props = {}) {
114
128
  policyChanges: {
115
129
  policy: "opt-out",
116
130
  publicKey: "new-public-key"
117
- }
131
+ },
132
+ getKeyInfo: () => defaultKeyInfo
118
133
  }
119
134
  };
120
135
  return defaultProps(Object.assign(_props, props));
@@ -22,7 +22,7 @@ import {
22
22
  } from "./ManageAccountRecoveryAdministrationSettings.test.data";
23
23
 
24
24
  export default {
25
- title: 'Passbolt/Administration/ManageAccountRecoveryAdministrationSettings',
25
+ title: 'Passbolt Component/Administration/ManageAccountRecoveryAdministrationSettings',
26
26
  component: ManageAccountRecoveryAdministrationSettings
27
27
  };
28
28
 
@@ -368,16 +368,6 @@ class ProvideAccountRecoveryOrganizationKey extends React.Component {
368
368
  * @returns {JSX}
369
369
  */
370
370
  render() {
371
- /*
372
- * The parser can't find the translation for passwordStrength.label
373
- * To fix that we can use it in comment
374
- * this.translate("n/a")
375
- * this.translate("very weak")
376
- * this.translate("weak")
377
- * this.translate("fair")
378
- * this.translate("strong")
379
- * this.translate("very strong")
380
- */
381
371
  return (
382
372
  <DialogWrapper
383
373
  title={this.translate("Organization Recovery Key")}
@@ -391,7 +381,7 @@ class ProvideAccountRecoveryOrganizationKey extends React.Component {
391
381
  <textarea id="organization-recover-form-key" name="key" value={this.state.key}
392
382
  onKeyUp={this.handleKeyInputKeyUp} onChange={this.handleInputChange}
393
383
  disabled={this.hasAllInputDisabled()} ref={this.keyInputRef} className="required"
394
- placeholder='Paste the OpenPGP Private key here' required="required" autoComplete="off" autoFocus={true}/>
384
+ placeholder={this.translate('Paste the OpenPGP Private key here')} required="required" autoComplete="off" autoFocus={true}/>
395
385
  </div>
396
386
  <div className="input file">
397
387
  <input
@@ -19,7 +19,7 @@ import userSettingsFixture from "../../../test/fixture/Settings/userSettings";
19
19
  import UserSettings from "../../../../shared/lib/Settings/UserSettings";
20
20
 
21
21
  export default {
22
- title: 'Passbolt/Administration/ProvideAccountRecoveryOrganizationKey',
22
+ title: 'Passbolt Component/Administration/ProvideAccountRecoveryOrganizationKey',
23
23
  component: ProvideAccountRecoveryOrganizationKey
24
24
  };
25
25
 
@@ -55,14 +55,6 @@ class DownloadOrganizationKey extends React.Component {
55
55
  this.props.onClose();
56
56
  }
57
57
 
58
- /**
59
- * Get the translate function
60
- * @returns {function(...[*]=)}
61
- */
62
- get translate() {
63
- return this.props.t;
64
- }
65
-
66
58
  /**
67
59
  * Render the component
68
60
  * @returns {JSX}
@@ -70,7 +62,7 @@ class DownloadOrganizationKey extends React.Component {
70
62
  render() {
71
63
  return (
72
64
  <DialogWrapper
73
- title={this.translate("Confirm Organization Recovery Key download")}
65
+ title={this.props.t("Confirm Organization Recovery Key download")}
74
66
  onClose={this.handleCloseClick}
75
67
  disabled={false}
76
68
  className="organization-recover-key-download-dialog">
@@ -21,7 +21,7 @@ import UserSettings from "../../../../shared/lib/Settings/UserSettings";
21
21
  import userSettingsFixture from "../../../test/fixture/Settings/userSettings";
22
22
 
23
23
  export default {
24
- title: 'Passbolt/Administration/DownloadOrganizationKey',
24
+ title: 'Passbolt Component/Administration/DownloadOrganizationKey',
25
25
  component: DownloadOrganizationKey
26
26
  };
27
27
 
@@ -15,6 +15,7 @@
15
15
  import React from "react";
16
16
  import PropTypes from "prop-types";
17
17
  import XRegExp from "xregexp";
18
+ import debounce from "debounce-promise";
18
19
  import Icon from "../../../../shared/components/Icons/Icon";
19
20
  import {Trans, withTranslation} from "react-i18next";
20
21
  import FormSubmitButton from "../../Common/Inputs/FormSubmitButton/FormSubmitButton";
@@ -25,6 +26,9 @@ import {withAppContext} from "../../../contexts/AppContext";
25
26
  import {withDialog} from "../../../contexts/DialogContext";
26
27
  import Password from "../../../../shared/components/Password/Password";
27
28
  import PasswordComplexity from "../../../../shared/components/PasswordComplexity/PasswordComplexity";
29
+ import SecretComplexity from "../../../../shared/lib/Secret/SecretComplexity";
30
+ import ExternalServiceUnavailableError from "../../../../shared/lib/Error/ExternalServiceUnavailableError";
31
+ import ExternalServiceError from "../../../../shared/lib/Error/ExternalServiceError";
28
32
 
29
33
  /** Resource password max length */
30
34
  const RESOURCE_PASSWORD_MAX_LENGTH = 4096;
@@ -40,6 +44,7 @@ class GenerateOrganizationKey extends React.Component {
40
44
  constructor(props) {
41
45
  super(props);
42
46
  this.state = this.defaultState;
47
+ this.evaluatePassphraseIsInDictionaryDebounce = debounce(this.evaluatePassphraseIsInDictionary, 300);
43
48
  this.bindCallbacks();
44
49
  this.createInputRef();
45
50
  }
@@ -56,10 +61,13 @@ class GenerateOrganizationKey extends React.Component {
56
61
  emailError: "",
57
62
  algorithm: "RSA",
58
63
  keySize: 4096,
59
- password: "",
60
- passwordError: "",
61
- passwordWarning: "",
62
- hasAlreadyBeenValidated: false // True if the form has already been submitted once
64
+ passphrase: "",
65
+ passphraseError: "",
66
+ passphraseWarning: "",
67
+ passphraseEntropy: null,
68
+ hasAlreadyBeenValidated: false, // True if the form has already been submitted once
69
+ isPwned: false,
70
+ isPwnedServiceAvailable: true // True if the isPwned service can be reached
63
71
  };
64
72
  }
65
73
 
@@ -71,7 +79,7 @@ class GenerateOrganizationKey extends React.Component {
71
79
  this.handleInputChange = this.handleInputChange.bind(this);
72
80
  this.handleNameInputKeyUp = this.handleNameInputKeyUp.bind(this);
73
81
  this.handleEmailInputKeyUp = this.handleEmailInputKeyUp.bind(this);
74
- this.handlePasswordInputKeyUp = this.handlePasswordInputKeyUp.bind(this);
82
+ this.handlePassphraseChange = this.handlePassphraseChange.bind(this);
75
83
  }
76
84
 
77
85
  /**
@@ -80,7 +88,7 @@ class GenerateOrganizationKey extends React.Component {
80
88
  createInputRef() {
81
89
  this.nameInputRef = React.createRef();
82
90
  this.emailInputRef = React.createRef();
83
- this.passwordInputRef = React.createRef();
91
+ this.passphraseInputRef = React.createRef();
84
92
  }
85
93
 
86
94
  /**
@@ -143,36 +151,77 @@ class GenerateOrganizationKey extends React.Component {
143
151
  }
144
152
 
145
153
  /**
146
- * Handle password input keyUp event.
154
+ * Handle passphrase input keyUp event.
155
+ * @param {ReactEvent} event The react event.
147
156
  */
148
- handlePasswordInputKeyUp() {
157
+ async handlePassphraseChange(event) {
158
+ const passphrase = event.target.value;
159
+ const passphraseEntropy = passphrase?.length
160
+ ? SecretGenerator.entropy(passphrase)
161
+ : null;
162
+ this.setState({passphrase, passphraseEntropy});
163
+
149
164
  if (this.state.hasAlreadyBeenValidated) {
150
- this.validatePasswordInput();
165
+ await this.validatePassphraseInput(passphrase, passphraseEntropy);
151
166
  } else {
152
- const hasResourcePasswordMaxLength = this.state.password.length >= RESOURCE_PASSWORD_MAX_LENGTH;
167
+ const hasResourcePassphraseMaxLength = passphrase.length >= RESOURCE_PASSWORD_MAX_LENGTH;
153
168
  const warningMessage = this.translate("this is the maximum size for this field, make sure your data was not truncated");
154
- const passwordWarning = hasResourcePasswordMaxLength ? warningMessage : '';
155
- this.setState({passwordWarning});
169
+ const passphraseWarning = hasResourcePassphraseMaxLength ? warningMessage : '';
170
+ this.setState({passphraseWarning});
156
171
  }
157
172
  }
158
173
 
159
174
  /**
160
- * Validate the password input.
161
- * @return {Promise}
175
+ * Validate the passphrase.
176
+ * @param {string} passphrase the passphrase to validate
177
+ * @param {integer|null} passphraseEntropy the entropy of the given passphrase
178
+ * @return {Promise<void>}
179
+ */
180
+ async validatePassphraseInput(passphrase, passphraseEntropy) {
181
+ let passphraseError = null;
182
+ if (!passphrase?.length) {
183
+ passphraseError = this.translate("A passphrase is required.");
184
+ } else if (passphraseEntropy < FAIR_STRENGTH_ENTROPY) {
185
+ passphraseError = this.translate(`A strong passphrase is required. The minimum complexity must be 'fair'`);
186
+ } else {
187
+ this.evaluatePassphraseIsInDictionaryDebounce();
188
+ }
189
+
190
+ this.setState({passphraseError});
191
+ }
192
+
193
+ /**
194
+ * Evaluate if the passphrase is in dictionary
195
+ * @return {Promise<void>} Return true if the passphrase is part of a dictionary, false otherwise
162
196
  */
163
- validatePasswordInput() {
164
- const password = this.state.password;
165
- let passwordError = null;
166
- if (!password.length) {
167
- passwordError = this.translate("A passphrase is required.");
197
+ async evaluatePassphraseIsInDictionary() {
198
+ if (!this.state.isPwnedServiceAvailable) {
199
+ return false;
168
200
  }
169
201
 
170
- if (SecretGenerator.entropy(this.state.password) < FAIR_STRENGTH_ENTROPY) {
171
- passwordError = this.translate(`A strong passphrase is required. The minimum complexity must be 'fair'`);
202
+ let isPwned;
203
+ try {
204
+ isPwned = await SecretComplexity.ispwned(this.state.passphrase);
205
+ } catch (error) {
206
+ // If the service is unavailable don't block the user journey.
207
+ if (error instanceof ExternalServiceUnavailableError || error instanceof ExternalServiceError) {
208
+ this.setState({
209
+ isPwnedServiceAvailable: false
210
+ });
211
+ return;
212
+ } else {
213
+ throw error;
214
+ }
172
215
  }
173
216
 
174
- this.setState({passwordError});
175
- return passwordError === null;
217
+ let passphraseError = this.state.passphraseError;
218
+ let passphraseEntropy = this.state.passphraseEntropy;
219
+ if (isPwned) {
220
+ passphraseError = this.translate("The passphrase should not be part of an exposed data breach.");
221
+ passphraseEntropy = 0;
222
+ }
223
+
224
+ this.setState({isPwned, passphraseEntropy, passphraseError});
176
225
  }
177
226
 
178
227
  /**
@@ -201,8 +250,8 @@ class GenerateOrganizationKey extends React.Component {
201
250
  this.nameInputRef.current.focus();
202
251
  } else if (this.state.emailError) {
203
252
  this.emailInputRef.current.focus();
204
- } else if (this.state.passwordError) {
205
- this.passwordInputRef.current.focus();
253
+ } else if (this.state.passphraseError) {
254
+ this.passphraseInputRef.current.focus();
206
255
  }
207
256
  }
208
257
 
@@ -241,19 +290,12 @@ class GenerateOrganizationKey extends React.Component {
241
290
  * @return {Promise<boolean>}
242
291
  */
243
292
  async validate() {
244
- // Reset the form errors.
245
- this.setState({
246
- nameError: "",
247
- emailError: "",
248
- passwordError: "",
249
- });
250
-
251
293
  // Validate the form inputs.
252
294
  const isNameValid = this.validateNameInput();
253
295
  const isEmailValid = this.validateEmailInput();
254
- const isPasswordValid = this.validatePasswordInput();
296
+ const isPassphraseValid = this.validatePassphraseInput(this.state.passphrase, this.state.passphraseEntropy);
255
297
 
256
- return isNameValid && isEmailValid && isPasswordValid;
298
+ return isNameValid && isEmailValid && isPassphraseValid;
257
299
  }
258
300
 
259
301
  async generateKey() {
@@ -262,7 +304,7 @@ class GenerateOrganizationKey extends React.Component {
262
304
  email: this.state.email,
263
305
  algorithm: this.state.algorithm,
264
306
  keySize: this.state.keySize,
265
- passphrase: this.state.password,
307
+ passphrase: this.state.passphrase,
266
308
  };
267
309
 
268
310
  return await this.props.context.port.request("passbolt.account-recovery.generate-organization-key", generateGpgKeyDto);
@@ -296,7 +338,6 @@ class GenerateOrganizationKey extends React.Component {
296
338
  * @returns {JSX}
297
339
  */
298
340
  render() {
299
- const passwordEntropy = this.state.password ? SecretGenerator.entropy(this.state.password) : null;
300
341
  return (
301
342
  <form onSubmit={this.handleFormSubmit} noValidate>
302
343
  <div className="form-content generate-organization-key">
@@ -341,25 +382,28 @@ class GenerateOrganizationKey extends React.Component {
341
382
  className="fluid" type="text"
342
383
  autoComplete="off" disabled={true} />
343
384
  </div>
344
- <div className={`input-password-wrapper input required ${this.state.passwordError ? "error" : ""}`}>
385
+ <div className={`input-password-wrapper input required ${this.state.passphraseError ? "error" : ""}`}>
345
386
  <label htmlFor="generate-organization-key-form-password">
346
387
  <Trans>Organization key passphrase</Trans>
347
- {this.state.passwordWarning &&
388
+ {this.state.passphraseWarning &&
348
389
  <Icon name="exclamation"/>
349
390
  }
350
391
  </label>
351
392
  <Password id="generate-organization-key-form-password" name="password"
352
393
  placeholder={this.translate("Passphrase")} autoComplete="new-password" preview={true}
353
394
  securityToken={this.props.context.userSettings.getSecurityToken()}
354
- onKeyUp={this.handlePasswordInputKeyUp} value={this.state.password}
355
- onChange={this.handleInputChange} disabled={this.hasAllInputDisabled()}
356
- inputRef={this.passwordInputRef}/>
357
- <PasswordComplexity entropy={passwordEntropy} error={Boolean(this.state.passwordError)}/>
358
- {this.state.passwordError &&
359
- <div className="password error-message">{this.state.passwordError}</div>
395
+ value={this.state.passphrase}
396
+ onChange={this.handlePassphraseChange} disabled={this.hasAllInputDisabled()}
397
+ inputRef={this.passphraseInputRef}/>
398
+ <PasswordComplexity entropy={this.state.passphraseEntropy}/>
399
+ {this.state.passphraseError &&
400
+ <div className="password error-message">{this.state.passphraseError}</div>
401
+ }
402
+ {this.state.passphraseWarning &&
403
+ <div className="password warning-message"><strong><Trans>Warning:</Trans></strong> {this.state.passphraseWarning}</div>
360
404
  }
361
- {this.state.passwordWarning &&
362
- <div className="password warning-message"><strong><Trans>Warning:</Trans></strong> {this.state.passwordWarning}</div>
405
+ {!this.state.isPwnedServiceAvailable &&
406
+ <div className="password warning-message"><strong><Trans>Warning:</Trans></strong> <Trans>The pwnedpasswords service is unavailable, your passphrase might be part of an exposed data breach</Trans></div>
363
407
  }
364
408
  </div>
365
409
  </div>