passbolt-styleguide 3.8.4 → 3.9.0-alpha2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/build/css/help.min.css +3 -3
  2. package/build/css/public.min.css +3 -3
  3. package/build/css/themes/default/api_authentication.min.css +3 -3
  4. package/build/css/themes/default/api_cloud.min.css +3 -3
  5. package/build/css/themes/default/api_main.min.css +3 -3
  6. package/build/css/themes/default/api_reports.min.css +3 -3
  7. package/build/css/themes/default/api_webinstaller.min.css +3 -3
  8. package/build/css/themes/default/ext_app.min.css +3 -3
  9. package/build/css/themes/default/ext_authentication.min.css +3 -3
  10. package/build/css/themes/default/ext_external.min.css +2 -2
  11. package/build/css/themes/default/ext_in_form_cta.min.css +3 -3
  12. package/build/css/themes/default/ext_in_form_menu.min.css +3 -3
  13. package/build/css/themes/default/ext_quickaccess.min.css +3 -3
  14. package/build/css/themes/midgar/api_authentication.min.css +3 -3
  15. package/build/css/themes/midgar/api_main.min.css +3 -3
  16. package/build/css/themes/midgar/api_reports.min.css +3 -3
  17. package/build/css/themes/midgar/ext_app.min.css +3 -3
  18. package/build/css/themes/midgar/ext_authentication.min.css +3 -3
  19. package/build/css/themes/midgar/ext_in_form_cta.min.css +3 -3
  20. package/build/css/themes/midgar/ext_in_form_menu.min.css +3 -3
  21. package/build/css/themes/midgar/ext_quickaccess.min.css +3 -3
  22. package/build/css/themes/solarized_dark/api_authentication.min.css +1 -1
  23. package/build/css/themes/solarized_dark/api_main.min.css +1 -1
  24. package/build/css/themes/solarized_dark/api_reports.min.css +1 -1
  25. package/build/css/themes/solarized_dark/ext_app.min.css +1 -1
  26. package/build/css/themes/solarized_dark/ext_authentication.min.css +1 -1
  27. package/build/css/themes/solarized_dark/ext_in_form_cta.min.css +1 -1
  28. package/build/css/themes/solarized_dark/ext_in_form_menu.min.css +1 -1
  29. package/build/css/themes/solarized_dark/ext_quickaccess.min.css +1 -1
  30. package/build/css/themes/solarized_light/api_authentication.min.css +1 -1
  31. package/build/css/themes/solarized_light/api_main.min.css +1 -1
  32. package/build/css/themes/solarized_light/api_reports.min.css +1 -1
  33. package/build/css/themes/solarized_light/ext_app.min.css +1 -1
  34. package/build/css/themes/solarized_light/ext_authentication.min.css +1 -1
  35. package/build/css/themes/solarized_light/ext_in_form_cta.min.css +1 -1
  36. package/build/css/themes/solarized_light/ext_in_form_menu.min.css +1 -1
  37. package/build/css/themes/solarized_light/ext_quickaccess.min.css +1 -1
  38. package/build/js/dist/api-account-recovery.js +1 -1
  39. package/build/js/dist/api-app.js +1 -1
  40. package/build/js/dist/api-app.js.LICENSE.txt +75 -5
  41. package/build/js/dist/api-feedback.js +2 -0
  42. package/build/js/dist/api-feedback.js.LICENSE.txt +45 -0
  43. package/build/js/dist/api-recover.js +1 -1
  44. package/build/js/dist/api-setup.js +1 -1
  45. package/build/js/dist/api-triage.js +1 -1
  46. package/build/js/dist/api-vendors.js +1 -1
  47. package/build/js/dist/api-vendors.js.LICENSE.txt +19 -9
  48. package/build/js/dist/src/locales/de-DE/common.json +995 -0
  49. package/build/js/dist/src/locales/en-UK/common.json +1061 -0
  50. package/build/js/dist/src/locales/es-ES/common.json +995 -0
  51. package/build/js/dist/src/locales/fr-FR/common.json +995 -0
  52. package/build/js/dist/src/locales/ja-JP/common.json +980 -0
  53. package/build/js/dist/src/locales/lt-LT/common.json +1025 -0
  54. package/build/js/dist/src/locales/nl-NL/common.json +995 -0
  55. package/build/js/dist/src/locales/pl-PL/common.json +1025 -0
  56. package/build/js/dist/src/locales/sv-SE/common.json +995 -0
  57. package/package.json +18 -1
  58. package/src/img/controls/attention.svg +1 -0
  59. package/src/locales/en-UK/common.json +80 -16
  60. package/src/react-extension/ApiApp.js +17 -5
  61. package/src/react-extension/ApiFeedback.entry.js +24 -0
  62. package/src/react-extension/ExtApp.js +12 -5
  63. package/src/react-extension/ExtAuthenticationLogin.js +17 -15
  64. package/src/react-extension/ExtAuthenticationLogin.test.stories.js +59 -0
  65. package/src/react-extension/ExtBootstrapApp.js +1 -0
  66. package/src/react-extension/components/Administration/AdministrationWorkspace.js +24 -0
  67. package/src/react-extension/components/Administration/AdministrationWorkspace.test.data.js +3 -3
  68. package/src/react-extension/components/Administration/AdministrationWorkspace.test.js +13 -1
  69. package/src/react-extension/components/Administration/AdministrationWorkspace.test.page.js +7 -0
  70. package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.js +101 -0
  71. package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.data.js +23 -0
  72. package/src/react-extension/components/Administration/ConfirmDeleteSsoSettingsDialog/ConfirmDeleteSsoSettingsDialog.test.stories.js +27 -0
  73. package/src/react-extension/components/Administration/ConfirmSaveAccountRecoverySettings/ConfirmSaveAccountRecoverySettings.js +1 -1
  74. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.js +78 -2
  75. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.data.js +3 -1
  76. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.js +60 -0
  77. package/src/react-extension/components/Administration/DisplayAdministrationMenu/DisplayAdministrationMenu.test.page.js +23 -4
  78. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationInternationalisationActions/DisplayAdministrationInternationalisationActions.js +125 -0
  79. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationMfaActions/DisplayAdministrationMfaActions.js +131 -0
  80. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSelfRegistrationActions/DisplayAdministrationSelfRegistrationActions.js +103 -0
  81. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSsoActions/DisplayAdministrationSsoActions.js +91 -0
  82. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationSubscriptionActions/DisplayAdministrationSubscriptionActions.js +85 -0
  83. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationUserDirectoryActions/DisplayAdministrationUserDirectoryActions.js +228 -0
  84. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.js +4 -0
  85. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceBreadcrumb/DisplayAdministrationWorkspaceBreadcrumb.test.js +9 -0
  86. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.js +3 -3
  87. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.data.js +14 -0
  88. package/src/react-extension/components/Administration/DisplayEmailNotificationsAdministration/DisplayEmailNotificationsAdministration.test.page.js +0 -17
  89. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.js +18 -115
  90. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.data.js +11 -13
  91. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.js +38 -43
  92. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.page.js +47 -10
  93. package/src/react-extension/components/Administration/DisplayInternationalizationAdministration/DisplayInternationalizationAdministration.test.stories.js +10 -43
  94. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.js +82 -367
  95. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.data.js +128 -42
  96. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.js +75 -121
  97. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.page.js +46 -16
  98. package/src/react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.stories.js +18 -14
  99. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.js +103 -0
  100. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.js +53 -0
  101. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.page.js +81 -0
  102. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmDeletionSelfRegistrationSettings/ConfirmDeletionSelfRegistrationSettings.test.stories.js +34 -0
  103. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.js +125 -0
  104. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.data.js +63 -0
  105. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.js +54 -0
  106. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.page.js +88 -0
  107. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.stories.js +35 -0
  108. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.js +381 -0
  109. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.data.js +69 -0
  110. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.js +332 -0
  111. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.page.js +247 -0
  112. package/src/react-extension/components/Administration/DisplaySelfRegistrationAdministration/DisplaySelfRegistrationAdministration.test.stories.js +72 -0
  113. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.js +19 -19
  114. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.data.js +1717 -1729
  115. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.js +11 -3
  116. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.page.js +4 -1
  117. package/src/react-extension/components/Administration/DisplaySimulateSynchronizeUserDirectoryAdministration/DisplaySimulateSynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
  118. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.js +41 -140
  119. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.data.js +15 -3
  120. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.js +22 -49
  121. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.page.js +19 -11
  122. package/src/react-extension/components/Administration/DisplaySubscriptionKey/DisplaySubscriptionKey.test.stories.js +9 -3
  123. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.js +5 -6
  124. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.data.js +1717 -1728
  125. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.js +11 -3
  126. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.page.js +4 -1
  127. package/src/react-extension/components/Administration/DisplaySynchronizeUserDirectoryAdministration/DisplaySynchronizeUserDirectoryAdministration.test.stories.js +11 -1784
  128. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.js +362 -835
  129. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.data.js +427 -418
  130. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.js +134 -175
  131. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.page.js +108 -11
  132. package/src/react-extension/components/Administration/DisplayUserDirectoryAdministration/DisplayUserDirectoryAdministration.test.stories.js +17 -25
  133. package/src/react-extension/components/Administration/EditSubscriptionKey/EditSubscriptionKey.js +4 -2
  134. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.js +3 -3
  135. package/src/react-extension/components/Administration/ManageAccountRecoveryAdministrationSettings/ManageAccountRecoveryAdministrationSettings.test.js +1 -1
  136. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.js +32 -7
  137. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.data.js +0 -3
  138. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.js +145 -1
  139. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.page.js +52 -1
  140. package/src/react-extension/components/Administration/ManageSmtpAdministrationSettings/ManageSmtpAdministrationSettings.test.stories.js +15 -0
  141. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.js +340 -0
  142. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.data.js +56 -0
  143. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.js +223 -0
  144. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.page.js +235 -0
  145. package/src/react-extension/components/Administration/ManageSsoSettings/ManageSsoSettings.test.stories.js +55 -0
  146. package/src/react-extension/components/Administration/ManageSsoSettings/SsoProviders.data.js +34 -0
  147. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.js +12 -3
  148. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/GenerateOrganizationKey.test.js +27 -0
  149. package/src/react-extension/components/Administration/SelectAccountRecoveryOrganizationKey/SelectAccountRecoveryOrganizationKey.test.page.js +8 -0
  150. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.js +197 -0
  151. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.data.js +37 -0
  152. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.js +187 -0
  153. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.page.js +120 -0
  154. package/src/react-extension/components/Administration/TestSsoSettingsDialog/TestSsoSettingsDialog.test.stories.js +31 -0
  155. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.js +9 -5
  156. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.data.js +4 -0
  157. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.js +11 -42
  158. package/src/react-extension/components/Authentication/CheckPassphrase/CheckPassphrase.test.page.js +1 -0
  159. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.js +9 -5
  160. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.data.js +4 -0
  161. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.js +16 -2
  162. package/src/react-extension/components/Authentication/CreateGpgKey/CreateGpgKey.test.page.js +17 -1
  163. package/src/react-extension/components/AuthenticationLogin/Login/Login.js +159 -61
  164. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.data.js +14 -11
  165. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.js +79 -0
  166. package/src/react-extension/components/AuthenticationLogin/Login/Login.test.page.js +16 -0
  167. package/src/react-extension/components/AuthenticationLogin/OrchestrateLogin/OrchestrateLoginBoxMain.js +2 -0
  168. package/src/react-extension/components/AuthenticationSetup/SetupAuthentication/SetupAuthentication.js +4 -0
  169. package/src/react-extension/components/Common/Error/ApiError/ApiError.js +119 -0
  170. package/src/react-extension/components/Common/Error/ApiError/ApiError.test.js +43 -0
  171. package/src/react-extension/components/Common/Error/ApiError/ApiError.test.page.js +108 -0
  172. package/src/react-extension/components/Common/Error/ApiError/ApiError.test.stories.js +39 -0
  173. package/src/react-extension/components/Common/Inputs/Autocomplete/Autocomplete.test.js +12 -0
  174. package/src/react-extension/components/Common/Inputs/Autocomplete/AutocompleteItem.js +2 -2
  175. package/src/react-extension/components/Common/Legacy/HandleLegacyAppjs.js +1 -1
  176. package/src/react-extension/components/Common/Navigation/Header/Logo.js +13 -1
  177. package/src/react-extension/components/Resource/CreateResource/CreateResource.js +103 -30
  178. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.js +44 -10
  179. package/src/react-extension/components/Resource/CreateResource/CreateResource.test.page.js +35 -7
  180. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesList.js +3 -3
  181. package/src/react-extension/components/Resource/DisplayResourcesList/DisplayResourcesListContextualMenu.js +6 -5
  182. package/src/react-extension/components/Resource/DisplayResourcesWorkspace/DisplayResourcesWorkspaceMenu.js +5 -4
  183. package/src/react-extension/components/Resource/EditResource/EditResource.js +95 -23
  184. package/src/react-extension/components/Resource/EditResource/EditResource.test.js +45 -13
  185. package/src/react-extension/components/Resource/EditResource/EditResource.test.page.js +35 -2
  186. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetails.js +2 -1
  187. package/src/react-extension/components/ResourceDetails/DisplayResourceDetails/DisplayResourceDetailsInformation.js +3 -2
  188. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.js +23 -2
  189. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.js +8 -0
  190. package/src/react-extension/components/ResourceFolder/CreateResourceFolder/CreateResourceFolder.test.page.js +26 -2
  191. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.js +22 -1
  192. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.js +8 -0
  193. package/src/react-extension/components/ResourceFolder/RenameResourceFolder/RenameResourceFolder.test.page.js +25 -2
  194. package/src/react-extension/components/ResourceFolderDetails/DisplayResourceFolderDetails/DisplayResourceFolderDetails.js +2 -1
  195. package/src/react-extension/components/ResourcePassword/GenerateResourcePassword/GenerateResourcePassword.js +2 -1
  196. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.js +14 -1
  197. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.js +8 -0
  198. package/src/react-extension/components/ResourceTag/EditResourceTag/EditResourceTag.test.page.js +12 -0
  199. package/src/react-extension/components/User/CreateUser/CreateUser.js +42 -3
  200. package/src/react-extension/components/User/CreateUser/CreateUser.test.js +16 -0
  201. package/src/react-extension/components/User/CreateUser/CreateUser.test.page.js +26 -0
  202. package/src/react-extension/components/User/DisplayUserWorkspaceActions/DisplayUserWorkspaceActions.js +2 -1
  203. package/src/react-extension/components/User/DisplayUsersContextualMenu/DisplayUsersContextualMenu.js +5 -5
  204. package/src/react-extension/components/User/EditUser/EditUser.js +29 -2
  205. package/src/react-extension/components/User/EditUser/EditUser.test.js +12 -0
  206. package/src/react-extension/components/User/EditUser/EditUser.test.page.js +26 -0
  207. package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.js +2 -1
  208. package/src/react-extension/components/UserDetails/DisplayUserDetails/DisplayUserDetails.test.data.js +1332 -1331
  209. package/src/react-extension/components/UserDetails/DisplayUserDetailsPublicKey/DisplayUserDetailsPublicKey.js +2 -1
  210. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.js +19 -1
  211. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.js +9 -0
  212. package/src/react-extension/components/UserGroup/CreateUserGroup/CreateUserGroup.test.page.js +12 -0
  213. package/src/react-extension/components/UserGroup/DisplayUserGroupDetails/DisplayUserGroupDetails.js +2 -1
  214. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.js +16 -1
  215. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.js +8 -0
  216. package/src/react-extension/components/UserGroup/EditUserGroup/EditUserGroup.test.page.js +26 -1
  217. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/ConfirmPassphrase.js +1 -1
  218. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.js +6 -4
  219. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.data.js +4 -1
  220. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.js +21 -11
  221. package/src/react-extension/components/UserSetting/ChangeUserPassphrase/EnterNewPassphrase.test.page.js +10 -1
  222. package/src/react-extension/contexts/AdminSmtpSettingsContext.js +2 -0
  223. package/src/react-extension/contexts/AdminSmtpSettingsContext.test.data.js +13 -0
  224. package/src/react-extension/contexts/AdminSmtpSettingsContext.test.js +3 -1
  225. package/src/react-extension/contexts/AdminSsoContext.js +558 -0
  226. package/src/react-extension/contexts/AdminSsoContext.test.data.js +51 -0
  227. package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.js +194 -0
  228. package/src/react-extension/contexts/Administration/AdministrationInternationalizationContext/AdministrationInternationalizationContext.test.js +111 -0
  229. package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.js +265 -0
  230. package/src/react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext.test.js +178 -0
  231. package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.js +453 -0
  232. package/src/react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext.test.js +218 -0
  233. package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.js +168 -0
  234. package/src/react-extension/contexts/Administration/AdministrationSubscription/AdministrationSubscription.test.js +73 -0
  235. package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.js +353 -0
  236. package/src/react-extension/contexts/Administration/AdministrationUserDirectory/AdministrationUserDirectoryContext.test.js +220 -0
  237. package/src/react-extension/contexts/AdministrationWorkspaceContext.js +17 -178
  238. package/src/react-extension/contexts/AdministrationWorkspaceContext.test.js +0 -26
  239. package/src/react-extension/contexts/ApiAppContext.test.data.js +4 -2
  240. package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.js +54 -4
  241. package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.data.js +10 -1
  242. package/src/react-extension/contexts/Authentication/AuthenticationLoginContext.test.js +92 -14
  243. package/src/react-extension/contexts/Authentication/AuthenticationSetupContext.js +1 -0
  244. package/src/react-extension/contexts/NavigationContext.js +34 -0
  245. package/src/react-extension/contexts/SsoContext.js +151 -0
  246. package/src/react-extension/contexts/SsoContext.test.data.js +36 -0
  247. package/src/react-extension/contexts/SsoContext.test.js +104 -0
  248. package/src/react-extension/lib/Domain/DomainUtil.js +70 -0
  249. package/src/react-extension/lib/Domain/DomainUtil.test.js +129 -0
  250. package/src/react-extension/lib/Domain/Domains.js +6113 -0
  251. package/src/react-extension/lib/Error/InputValidator.js +24 -0
  252. package/src/react-extension/lib/Map/DynamicRef.js +49 -0
  253. package/src/react-extension/lib/Map/DynamicRef.test.js +56 -0
  254. package/src/react-extension/lib/Map/MapObject.js +48 -0
  255. package/src/react-extension/lib/Map/MapObject.test.js +43 -0
  256. package/src/react-quickaccess/ExtQuickAccess.js +7 -4
  257. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.js +3 -1
  258. package/src/react-quickaccess/components/GeneratePasswordPage/GeneratePasswordPage.test.data.js +4 -0
  259. package/src/react-quickaccess/components/LoginPage/LoginPage.js +115 -4
  260. package/src/react-quickaccess/components/LoginPage/LoginPage.test.data.js +10 -0
  261. package/src/react-quickaccess/components/LoginPage/LoginPage.test.stories.js +30 -3
  262. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.js +33 -1
  263. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.data.js +25 -0
  264. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.js +60 -0
  265. package/src/react-quickaccess/components/ResourceAutoSave/SaveResource.test.page.js +60 -0
  266. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.js +33 -1
  267. package/src/react-quickaccess/components/ResourceCreatePage/ResourceCreatePage.test.js +36 -7
  268. package/src/react-quickaccess/components/ResourceViewPage/ResourceViewPage.js +3 -2
  269. package/src/react-quickaccess/contexts/SsoContext.js +150 -0
  270. package/src/react-web-integration/lib/InForm/InFormFieldSelector.js +5 -0
  271. package/src/shared/constants/inputs.const.js +30 -0
  272. package/src/shared/lib/Browser/clipBoard.js +45 -0
  273. package/src/shared/lib/Browser/clipBoard.test.js +59 -0
  274. package/src/shared/models/Mfa/Duo.js +36 -0
  275. package/src/shared/models/Mfa/Duo.test.js +59 -0
  276. package/src/shared/models/Mfa/MfaDTO.js +51 -0
  277. package/src/shared/models/Mfa/MfaDTO.test.js +48 -0
  278. package/src/shared/models/Mfa/MfaEnumeration.js +17 -0
  279. package/src/shared/models/Mfa/MfaModel.js +48 -0
  280. package/src/shared/models/Mfa/MfaModel.test.js +37 -0
  281. package/src/shared/models/Mfa/Yubikey.js +35 -0
  282. package/src/shared/models/Mfa/Yubikey.test.js +47 -0
  283. package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.js +55 -0
  284. package/src/shared/models/selfRegistration/SelfRegistrationDomainsViewModel.test.js +37 -0
  285. package/src/shared/models/selfRegistration/SelfRegistrationDto.js +42 -0
  286. package/src/shared/models/selfRegistration/SelfRegistrationDto.test.js +48 -0
  287. package/src/shared/models/selfRegistration/SelfRegistrationEnumeration.js +17 -0
  288. package/src/shared/models/subscription/SubscriptionDto.js +34 -0
  289. package/src/shared/models/subscription/SubscriptionDto.test.js +31 -0
  290. package/src/shared/models/subscription/SubscriptionModel.js +33 -0
  291. package/src/shared/models/subscription/SubscriptionModel.test.js +48 -0
  292. package/src/shared/models/user/UserModel.js +37 -0
  293. package/src/shared/models/userDirectory/UserDirectoryDTO.js +57 -0
  294. package/src/shared/models/userDirectory/UserDirectoryDTO.test.js +40 -0
  295. package/src/shared/models/userDirectory/UserDirectoryEnum.js +22 -0
  296. package/src/shared/models/userDirectory/UserDirectoryModel.js +64 -0
  297. package/src/shared/models/userDirectory/UserDirectoryModel.test.js +37 -0
  298. package/src/shared/services/actions/subscription/SubscriptionActionService.js +69 -0
  299. package/src/shared/services/actions/subscription/SubscriptionActionService.test.js +73 -0
  300. package/src/shared/services/api/Internationalisation/InternationalisationService.js +46 -0
  301. package/src/shared/services/api/Mfa/MfaService.js +54 -0
  302. package/src/shared/services/{accountRecovery → api/accountRecovery}/ApiAppAccountRecoveryUserService.js +2 -2
  303. package/src/shared/services/{accountRecovery → api/accountRecovery}/ExtAppAccountRecoveryUserService.js +0 -0
  304. package/src/shared/services/api/secrets/pownedService.js +64 -0
  305. package/src/shared/services/api/secrets/pownedService.test.js +63 -0
  306. package/src/shared/services/api/selfRegistration/selfRegistrationService.js +64 -0
  307. package/src/shared/services/api/user/UserService.js +45 -0
  308. package/src/shared/services/api/userDirectory/UserDirectoryService.js +108 -0
  309. package/src/shared/services/forms/Mfa/MfaFormService.js +195 -0
  310. package/src/shared/services/forms/Mfa/MfaFormService.test.js +341 -0
  311. package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.js +92 -0
  312. package/src/shared/services/forms/selfRegistration/SelfRegistrationFormService.test.js +101 -0
  313. package/src/shared/services/forms/userDirectory/UserDirectoryFormService.js +118 -0
  314. package/src/shared/services/forms/userDirectory/UserDirectoryFormService.test.js +128 -0
  315. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.js +0 -205
  316. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.data.js +0 -37
  317. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.js +0 -197
  318. package/src/react-extension/components/Administration/DisplayAdministrationWorkspaceActions/DisplayAdministrationWorkspaceActions.test.page.js +0 -133
@@ -20,6 +20,7 @@ import {withAppContext} from "../../../contexts/AppContext";
20
20
  import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
21
21
  import {DateTime} from "luxon";
22
22
  import {Trans, withTranslation} from "react-i18next";
23
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
23
24
 
24
25
  /**
25
26
  * This component displays the user details about public key
@@ -179,7 +180,7 @@ class DisplayUserDetailsPublicKey extends React.Component {
179
180
  */
180
181
  async handlePublicKeyCopy() {
181
182
  const armoredKey = this.state.gpgkeyInfo.armoredKey;
182
- await navigator.clipboard.writeText(armoredKey);
183
+ await ClipBoard.copy(armoredKey, this.props.context.port);
183
184
  this.props.actionFeedbackContext.displaySuccess(this.translate("The public key has been copied to clipboard"));
184
185
  }
185
186
 
@@ -25,6 +25,9 @@ import {withDialog} from "../../../contexts/DialogContext";
25
25
  import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
26
26
  import {Trans, withTranslation} from "react-i18next";
27
27
  import EditUserGroupItem from "../EditUserGroup/EditUserGroupItem";
28
+ import {maxSizeValidation} from '../../../lib/Error/InputValidator';
29
+ import Icon from "../../../../shared/components/Icons/Icon";
30
+ import {RESOURCE_GROUP_NAME_MAX_LENGTH} from '../../../../shared/constants/inputs.const';
28
31
 
29
32
  class CreateUserGroup extends Component {
30
33
  /**
@@ -51,6 +54,7 @@ class CreateUserGroup extends Component {
51
54
  // Input fields
52
55
  name: '',
53
56
  nameError: "",
57
+ nameWarning: "",
54
58
 
55
59
  // group users list
56
60
  groups_users: [],
@@ -143,6 +147,8 @@ class CreateUserGroup extends Component {
143
147
  handleNameInputKeyUp() {
144
148
  const state = this.validateNameInput();
145
149
  this.setState(state);
150
+ const nameWarning = maxSizeValidation(this.state.name, RESOURCE_GROUP_NAME_MAX_LENGTH, this.translate);
151
+ this.setState({nameWarning});
146
152
  }
147
153
 
148
154
  /**
@@ -520,13 +526,20 @@ class CreateUserGroup extends Component {
520
526
  <form className="group-form" onSubmit={this.handleFormSubmit} noValidate>
521
527
  <div className="form-content">
522
528
  <div className={`input text required ${this.state.nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
523
- <label htmlFor="group_name"><Trans>Group name</Trans></label>
529
+ <label htmlFor="group_name"><Trans>Group name</Trans>{this.state.nameWarning &&
530
+ <Icon name="exclamation"/>
531
+ }</label>
524
532
  <input id="group-name-input" name="name" className="required" maxLength="50" type="text" placeholder={this.translate("group name")}
525
533
  onKeyUp={this.handleNameInputKeyUp} onChange={this.handleInputChange}
526
534
  disabled={this.hasAllInputDisabled()} ref={this.nameInputRef}/>
527
535
  {this.state.nameError &&
528
536
  <div className="name error-message">{this.state.nameError}</div>
529
537
  }
538
+ {this.state.nameWarning &&
539
+ (<div className="name warning-message">
540
+ <strong><Trans>Warning:</Trans></strong> {this.state.nameWarning}
541
+ </div>)
542
+ }
530
543
  </div>
531
544
 
532
545
  <div className="input required">
@@ -562,6 +575,11 @@ class CreateUserGroup extends Component {
562
575
  <span><Trans>You need to click save for the changes to take place.</Trans></span>
563
576
  </div>
564
577
  }
578
+ {this.state.nameWarning && (
579
+ <div className="message warning">
580
+ <strong><Trans>Warning:</Trans></strong> {this.state.nameWarning}
581
+ </div>
582
+ )}
565
583
  <div className="form-content permission-add">
566
584
  <Autocomplete
567
585
  id="user-name-input"
@@ -21,6 +21,8 @@ import {ActionFeedbackContext} from "../../../contexts/ActionFeedbackContext";
21
21
  import PassboltApiFetchError from "../../../../shared/lib/Error/PassboltApiFetchError";
22
22
  import {waitFor} from "@testing-library/react";
23
23
 
24
+ const truncatedWarningMessage = "Warning: this is the maximum size for this field, make sure your data was not truncated.";
25
+
24
26
  describe("See the Create Dialog Group", () => {
25
27
  let page; // The page to test against
26
28
  const context = defaultAppContext(); // The applicative context
@@ -213,5 +215,12 @@ describe("See the Create Dialog Group", () => {
213
215
  // display groupname error message
214
216
  expect(page.createGroup.nameErrorMessage.textContent).toBe("The group name test already exists.");
215
217
  });
218
+
219
+ it("As an user I should see a feedback when name field content is truncated by a field limit", async() => {
220
+ expect.assertions(1);
221
+ page.createGroup.fillInput(page.createGroup.name, 'a'.repeat(255));
222
+ await page.createGroup.keyUpInput(page.createGroup.name);
223
+ expect(page.createGroup.nameWarningMessage.textContent).toEqual(truncatedWarningMessage);
224
+ });
216
225
  });
217
226
  });
@@ -249,6 +249,13 @@ class CreateGroupPageObject {
249
249
  return this._container.querySelector('.error-dialog .dialog .dialog-content .form-content');
250
250
  }
251
251
 
252
+ /**
253
+ * Returns the name warning mesage input element
254
+ */
255
+ get nameWarningMessage() {
256
+ return this._container.querySelector('.name.warning-message');
257
+ }
258
+
252
259
  /**
253
260
  * Returns true if the page object exists in the container
254
261
  */
@@ -282,6 +289,11 @@ class CreateGroupPageObject {
282
289
  fireEvent.change(element, dataInputEvent);
283
290
  }
284
291
 
292
+ /** on keypup element */
293
+ keyUpInput(component) {
294
+ fireEvent.keyUp(component, {keyCode: 38});
295
+ }
296
+
285
297
  /** select item */
286
298
  async selectFirstItem(index) {
287
299
  await this.click(this.selectRights(index));
@@ -22,6 +22,7 @@ import GroupAvatar from "../../Common/Avatar/GroupAvatar";
22
22
  import DisplayUserGroupDetailsMembers from "../DisplayUserGroupDetailsMembers/DisplayUserGroupDetailsMembers";
23
23
  import {withActionFeedback} from "../../../contexts/ActionFeedbackContext";
24
24
  import {Trans, withTranslation} from "react-i18next";
25
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
25
26
 
26
27
  /**
27
28
  * This component displays the details of a users group
@@ -64,7 +65,7 @@ class DisplayUserGroupDetails extends React.Component {
64
65
  async handlePermalinkClick() {
65
66
  const baseUrl = this.props.context.userSettings.getTrustedDomain();
66
67
  const permalink = `${baseUrl}/app/groups/view/${this.group.id}`;
67
- await navigator.clipboard.writeText(permalink);
68
+ await ClipBoard.copy(permalink, this.props.context.port);
68
69
  this.props.actionFeedbackContext.displaySuccess(this.translate("The permalink has been copied to clipboard"));
69
70
  }
70
71
 
@@ -27,6 +27,10 @@ import {withRouter} from "react-router-dom";
27
27
  import {Trans, withTranslation} from "react-i18next";
28
28
  import SharePermissionItemSkeleton from "../../Share/SharePermissionItemSkeleton";
29
29
  import EditUserGroupItem from "./EditUserGroupItem";
30
+ import {maxSizeValidation} from '../../../lib/Error/InputValidator';
31
+ import Icon from "../../../../shared/components/Icons/Icon";
32
+ import {RESOURCE_GROUP_NAME_MAX_LENGTH} from "../../../../shared/constants/inputs.const";
33
+
30
34
 
31
35
  /**
32
36
  * This component allows to edit an user group
@@ -57,6 +61,7 @@ class EditUserGroup extends Component {
57
61
  loading: true // True if the component is in a loading mode
58
62
  },
59
63
  errors: {},
64
+ nameWarning: "",
60
65
  validation: {
61
66
  hasAlreadyBeenValidated: false // True when the form has already been submitted
62
67
  }
@@ -398,6 +403,9 @@ class EditUserGroup extends Component {
398
403
  this.setState({groupToEdit: Object.assign({}, this.state.groupToEdit, {name})});
399
404
  if (this.state.validation.hasAlreadyBeenValidated) {
400
405
  this.validateName();
406
+ } else {
407
+ const nameWarning = maxSizeValidation(name, RESOURCE_GROUP_NAME_MAX_LENGTH, this.translate);
408
+ this.setState({nameWarning});
401
409
  }
402
410
  }
403
411
 
@@ -745,10 +753,17 @@ class EditUserGroup extends Component {
745
753
  <Trans>The group name already exists.</Trans>
746
754
  </div>
747
755
  }
756
+ {this.state.nameWarning &&
757
+ (<div className="name warning-message">
758
+ <strong><Trans>Warning:</Trans></strong> {this.state.nameWarning}
759
+ </div>)
760
+ }
748
761
  </div>
749
762
 
750
763
  <div className="input required">
751
- <label><Trans>Group members</Trans></label>
764
+ <label><Trans>Group members</Trans>{this.state.nameWarning &&
765
+ <Icon name="exclamation"/>
766
+ }</label>
752
767
  </div>
753
768
  </div>
754
769
 
@@ -24,6 +24,7 @@ import NotifyError from "../../Common/Error/NotifyError/NotifyError";
24
24
  beforeEach(() => {
25
25
  jest.resetModules();
26
26
  });
27
+ const truncatedWarningMessage = "Warning: this is the maximum size for this field, make sure your data was not truncated.";
27
28
 
28
29
  describe("See the Edit User Group", () => {
29
30
  let page; // The page to test against
@@ -179,5 +180,12 @@ describe("See the Edit User Group", () => {
179
180
  await waitFor(() => {});
180
181
  expect(page.hasNoManager).toBeTruthy();
181
182
  });
183
+
184
+ it("As an user I should see a feedback when name field content is truncated by a field limit", async() => {
185
+ expect.assertions(1);
186
+ page.fillInput(page.name, 'a'.repeat(255));
187
+ await page.keyUpInput(page.name);
188
+ expect(page.nameWarningMessage.textContent).toEqual(truncatedWarningMessage);
189
+ });
182
190
  });
183
191
  });
@@ -44,11 +44,18 @@ export default class EditUserGroupTestPage {
44
44
  );
45
45
  }
46
46
 
47
+ /**
48
+ * Returns the name input element
49
+ */
50
+ get name() {
51
+ return this._page.container.querySelector('#group-name-input');
52
+ }
53
+
47
54
  /**
48
55
  * Return the group name input
49
56
  */
50
57
  get groupName() {
51
- return this._page.container.querySelector('#group-name-input').value;
58
+ return this.name.value;
52
59
  }
53
60
 
54
61
  /**
@@ -107,6 +114,13 @@ export default class EditUserGroupTestPage {
107
114
  return ! this._page.container.querySelector('.cannot-add-user');
108
115
  }
109
116
 
117
+ /**
118
+ * Returns the name warning mesage input element
119
+ */
120
+ get nameWarningMessage() {
121
+ return this._page.container.querySelector('.name.warning-message');
122
+ }
123
+
110
124
  /**
111
125
  * Returns the username input
112
126
  */
@@ -206,6 +220,17 @@ export default class EditUserGroupTestPage {
206
220
  });
207
221
  }
208
222
 
223
+ /** fill the input element with data */
224
+ fillInput(element, data) {
225
+ const dataInputEvent = {target: {value: data}};
226
+ fireEvent.change(element, dataInputEvent);
227
+ }
228
+
229
+ /** on keypup element */
230
+ keyUpInput(component) {
231
+ fireEvent.keyUp(component, {keyCode: 38});
232
+ }
233
+
209
234
  async click(element) {
210
235
  const event = {button: 0};
211
236
  fireEvent.click(element, event);
@@ -199,7 +199,7 @@ class ConfirmPassphrase extends React.Component {
199
199
  <div className="error-message">{this.state.passphraseError}</div>
200
200
  }
201
201
  {!this.state.passphraseError &&
202
- <div className="help-message">You need to enter your current passphrase.</div>
202
+ <div className="help-message"><Trans>You need to enter your current passphrase.</Trans></div>
203
203
  }
204
204
  </div>
205
205
  </div>
@@ -20,7 +20,6 @@ import NotifyError from "../../Common/Error/NotifyError/NotifyError";
20
20
  import {withDialog} from "../../../contexts/DialogContext";
21
21
  import debounce from "debounce-promise";
22
22
  import SecurityComplexity from "../../../../shared/lib/Secret/SecretComplexity";
23
- import SecretComplexity from "../../../../shared/lib/Secret/SecretComplexity";
24
23
  import {Trans, withTranslation} from "react-i18next";
25
24
  import {withAppContext} from "../../../contexts/AppContext";
26
25
  import Password from "../../../../shared/components/Password/Password";
@@ -29,6 +28,7 @@ import PasswordComplexity from "../../../../shared/components/PasswordComplexity
29
28
  import ExternalServiceUnavailableError from "../../../../shared/lib/Error/ExternalServiceUnavailableError";
30
29
  import Tooltip from "../../Common/Tooltip/Tooltip";
31
30
  import ExternalServiceError from "../../../../shared/lib/Error/ExternalServiceError";
31
+ import PownedService from '../../../../shared/services/api/secrets/pownedService';
32
32
 
33
33
  /**
34
34
  * This component displays the user choose passphrase information
@@ -121,6 +121,7 @@ class EnterNewPassphrase extends React.Component {
121
121
  * Whenever the component is mounted
122
122
  */
123
123
  componentDidMount() {
124
+ this.pownedService = new PownedService(this.props.context.port);
124
125
  this.focusOnPassphrase();
125
126
  }
126
127
 
@@ -139,7 +140,6 @@ class EnterNewPassphrase extends React.Component {
139
140
  const passphrase = event.target.value;
140
141
  let hintClassNames = {};
141
142
  let passphraseEntropy = null;
142
-
143
143
  if (passphrase.length) {
144
144
  passphraseEntropy = SecretGenerator.entropy(passphrase);
145
145
  hintClassNames = this.evaluatePassphraseHintClassNames(passphrase);
@@ -191,8 +191,10 @@ class EnterNewPassphrase extends React.Component {
191
191
  notInDictionaryHint = "error";
192
192
  } else {
193
193
  try {
194
- const isPwned = await SecretComplexity.ispwned(passphrase);
195
- notInDictionaryHint = isPwned ? "error" : "success";
194
+ const result = await this.pownedService.evaluateSecret(this.state.passphrase);
195
+ const isPwned = result.inDictionary;
196
+ isPwnedServiceAvailable = result.isPwnedServiceAvailable;
197
+ notInDictionaryHint = isPwnedServiceAvailable ? (isPwned ? "error" : "success") : "unavailable";
196
198
  } catch (error) {
197
199
  // If the service is unavailable don't block the user journey.
198
200
  if (error instanceof ExternalServiceUnavailableError || error instanceof ExternalServiceError) {
@@ -8,7 +8,10 @@ import userSettingsFixture from "../../../test/fixture/Settings/userSettings";
8
8
  export function defaultProps() {
9
9
  const props = {
10
10
  context: {
11
- userSettings: new UserSettings(userSettingsFixture)
11
+ userSettings: new UserSettings(userSettingsFixture),
12
+ port: {
13
+ request: () => Promise.resolve(0)
14
+ }
12
15
  },
13
16
  userSettingsContext: {
14
17
  onUpdatePassphraseRequested: jest.fn(),
@@ -20,21 +20,23 @@ import {defaultProps} from "./EnterNewPassphrase.test.data";
20
20
  import {waitFor} from "@testing-library/react";
21
21
  import PassboltApiFetchError from "../../../../shared/lib/Error/PassboltApiFetchError";
22
22
  import NotifyError from "../../Common/Error/NotifyError/NotifyError";
23
- import PwnedPasswords from "../../../../shared/lib/Secret/PwnedPasswords";
24
23
 
25
24
  jest.mock("../../../../shared/lib/Secret/PwnedPasswords");
26
25
 
27
- beforeEach(() => {
28
- jest.useFakeTimers();
29
- jest.resetModules();
30
- jest.clearAllMocks();
31
- PwnedPasswords.pwnedPasswords.mockResolvedValue(false);
32
- });
33
-
34
26
  describe("As LU I should see the user confirm passphrase page", () => {
35
27
  let page; // The page to test against
36
28
  const props = defaultProps();
37
29
 
30
+ beforeEach(() => {
31
+ jest.useFakeTimers();
32
+ jest.resetModules();
33
+ jest.clearAllMocks();
34
+ });
35
+
36
+ afterEach(() => {
37
+ jest.clearAllTimers();
38
+ });
39
+
38
40
  describe('As LU I can start confirm my passphrase', () => {
39
41
  /**
40
42
  * Given the user settings passphrase
@@ -71,7 +73,7 @@ describe("As LU I should see the user confirm passphrase page", () => {
71
73
  });
72
74
 
73
75
  it('As LU I should see the passphrase very weak strength updated on change', async() => {
74
- const veryWeakPassphrase = 'blabla';
76
+ const veryWeakPassphrase = 'blablabla';
75
77
  await page.insertPassphrase(veryWeakPassphrase);
76
78
  await waitFor(() => expect(page.isVeryWeakPassphrase).toBeTruthy());
77
79
  });
@@ -166,11 +168,11 @@ describe("As LU I should see the user confirm passphrase page", () => {
166
168
  expect(page.updateButton.className).toBe('button primary disabled');
167
169
 
168
170
  // Fill the form
169
- page.insertPassphrase("passphrase");
171
+ await page.insertPassphrase("passphrase");
172
+
170
173
  await waitFor(() => expect(page.canUpdate).toBeTruthy());
171
174
  const mockReject = error => jest.fn(() => new Promise((resolve, reject) => reject(error)));
172
175
  jest.spyOn(props.userSettingsContext, 'onUpdatePassphraseRequested').mockImplementationOnce(mockReject(new PassboltApiFetchError("Jest simulate API error.")));
173
-
174
176
  await page.update(() => {
175
177
  if (!page.notInDictionaryHint.classList.contains("success")) {
176
178
  throw new Error("The page state didn't change yet.");
@@ -179,5 +181,13 @@ describe("As LU I should see the user confirm passphrase page", () => {
179
181
  const ErrorDialogProps = {error: new Error("Jest simulate API error.")};
180
182
  expect(props.dialogContext.open).toHaveBeenCalledWith(NotifyError, ErrorDialogProps);
181
183
  });
184
+
185
+ it('As LU I should be inform about ExternalServiceUnavailableError for powned password service', async() => {
186
+ jest.spyOn(props.context.port, "request").mockImplementationOnce(() => Promise.reject());
187
+ expect.assertions(2);
188
+ await page.insertPassphrase("Service is unavailable");
189
+ expect(page.notInDictionaryHint.classList.contains("unavailable")).toBeTruthy();
190
+ expect(page.tootltip.textContent).toBe("The pwnedpasswords service is unavailable, your passphrase might be part of an exposed data breach");
191
+ });
182
192
  });
183
193
  });
@@ -159,6 +159,13 @@ export default class EnterNewPassphrasePage {
159
159
  return this._page.container.querySelectorAll(".password-hints li")[4];
160
160
  }
161
161
 
162
+ /**
163
+ * Returns the tooltip for service unavailable for powned password
164
+ */
165
+ get tootltip() {
166
+ return this._page.container.querySelector(".password-hints .unavailable .tooltip .tooltip-text");
167
+ }
168
+
162
169
  /**
163
170
  * Returns true if the page object exists in the container
164
171
  */
@@ -186,8 +193,10 @@ export default class EnterNewPassphrasePage {
186
193
  }
187
194
 
188
195
  /** fill the passphrase input element with data */
189
- insertPassphrase(data) {
196
+ async insertPassphrase(data) {
190
197
  this.fillInput(this.passphraseInput, data);
198
+ jest.runAllTimers();
199
+ await waitFor(() => {});
191
200
  }
192
201
 
193
202
  /** click update */
@@ -153,6 +153,8 @@ export class AdminSmtpSettingsContextProvider extends React.Component {
153
153
  delete dto.provider;
154
154
  await this.smtpSettingsModel.saveSmtpSettings(dto);
155
155
  this.props.actionFeedbackContext.displaySuccess(this.props.t("The SMTP settings have been saved successfully"));
156
+ const newSettings = Object.assign({}, this.state.currentSmtpSettings, {"source": "db"});
157
+ this.setState({currentSmtpSettings: newSettings});
156
158
  } catch (e) {
157
159
  this.handleError(e);
158
160
  }
@@ -74,3 +74,16 @@ export function withAwsSesSmtpSettings(data = {}) {
74
74
  ...data
75
75
  });
76
76
  }
77
+
78
+ export function withNoAuthenticationMethod(data = {}) {
79
+ const settings = withExistingSmtpSettings(data);
80
+ settings.username = null;
81
+ settings.password = null;
82
+ return settings;
83
+ }
84
+
85
+ export function withUsernameAuthenticationMethod(data = {}) {
86
+ const settings = withExistingSmtpSettings(data);
87
+ settings.password = null;
88
+ return settings;
89
+ }
@@ -78,7 +78,7 @@ describe("AdminSmtpSettingsContext", () => {
78
78
 
79
79
  describe("AdminSmtpSettingsContextProvider::saveSettings()", () => {
80
80
  it("should get the current SMTP settings and store them in its state with the corresponding provider", async() => {
81
- expect.assertions(2);
81
+ expect.assertions(3);
82
82
 
83
83
  const currentSmtpSettings = {
84
84
  id: uuid(),
@@ -126,9 +126,11 @@ describe("AdminSmtpSettingsContext", () => {
126
126
  }
127
127
 
128
128
  await adminSmtpContext.saveSmtpSettings();
129
+ const settings = await adminSmtpContext.getCurrentSmtpSettings();
129
130
 
130
131
  // 1 call is a GET, the other is the POST
131
132
  expect(smtpSettingsCallMock).toHaveBeenCalledTimes(2);
133
+ expect(settings.source).toEqual("db");
132
134
  });
133
135
  });
134
136
  });