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
@@ -37,7 +37,7 @@ describe("See the Create Resource", () => {
37
37
  folderParentId: null
38
38
  };
39
39
 
40
- const mockContextRequest = implementation => jest.spyOn(context.port, 'request').mockImplementation(implementation);
40
+ const mockContextRequest = implementation => jest.spyOn(context.port, 'request').mockImplementationOnce(implementation);
41
41
  const truncatedWarningMessage = "Warning: this is the maximum size for this field, make sure your data was not truncated.";
42
42
  describe('As LU I can start adding a password', () => {
43
43
  /**
@@ -46,6 +46,11 @@ describe("See the Create Resource", () => {
46
46
  beforeEach(() => {
47
47
  context.setContext({resourceCreateDialogProps});
48
48
  page = new CreateResourcePage(context, props);
49
+ jest.useFakeTimers();
50
+ });
51
+
52
+ afterEach(() => {
53
+ jest.clearAllTimers();
49
54
  });
50
55
 
51
56
  it('matches the styleguide', () => {
@@ -102,8 +107,10 @@ describe("See the Create Resource", () => {
102
107
 
103
108
  it('views password when clicking on the view button.', async() => {
104
109
  expect.assertions(8);
110
+ mockContextRequest(() => Promise(0));
105
111
  const passwordValue = "secret-decrypted";
106
- page.passwordCreate.fillInput(page.passwordCreate.password, passwordValue);
112
+ await page.passwordCreate.fillInputPassword(passwordValue);
113
+
107
114
  // View password
108
115
  await page.passwordCreate.click(page.passwordCreate.passwordViewButton);
109
116
  expect(page.passwordCreate.password.value).toBe(passwordValue);
@@ -137,7 +144,8 @@ describe("See the Create Resource", () => {
137
144
  page.passwordCreate.fillInput(page.passwordCreate.name, resourceMeta.name);
138
145
  page.passwordCreate.fillInput(page.passwordCreate.uri, resourceMeta.uri);
139
146
  page.passwordCreate.fillInput(page.passwordCreate.username, resourceMeta.username);
140
- page.passwordCreate.fillInput(page.passwordCreate.password, resourceMeta.password);
147
+ await page.passwordCreate.fillInputPassword(resourceMeta.password);
148
+
141
149
  expect(page.passwordCreate.complexityText.textContent).not.toBe("Complexity: n/aEntropy: NaN bits");
142
150
  expect(page.passwordCreate.progressBar.classList.contains("not_available")).toBe(false);
143
151
  page.passwordCreate.fillInput(page.passwordCreate.description, resourceMeta.description);
@@ -180,7 +188,7 @@ describe("See the Create Resource", () => {
180
188
  page.passwordCreate.fillInput(page.passwordCreate.name, resourceMeta.name);
181
189
  page.passwordCreate.fillInput(page.passwordCreate.uri, resourceMeta.uri);
182
190
  page.passwordCreate.fillInput(page.passwordCreate.username, resourceMeta.username);
183
- page.passwordCreate.fillInput(page.passwordCreate.password, resourceMeta.password);
191
+ await page.passwordCreate.fillInputPassword(resourceMeta.password);
184
192
  expect(page.passwordCreate.complexityText.textContent).not.toBe("Complexity: n/aEntropy: NaN bits");
185
193
  expect(page.passwordCreate.progressBar.classList.contains("not_available")).toBe(false);
186
194
  page.passwordCreate.fillInput(page.passwordCreate.description, resourceMeta.description);
@@ -235,7 +243,7 @@ describe("See the Create Resource", () => {
235
243
  }));
236
244
 
237
245
  page.passwordCreate.fillInput(page.passwordCreate.name, "name");
238
- page.passwordCreate.fillInput(page.passwordCreate.password, "password");
246
+ await page.passwordCreate.fillInputPassword("password");
239
247
 
240
248
  // Mock the request function to make it the expected result
241
249
  mockContextRequest(requestMockImpl);
@@ -271,7 +279,7 @@ describe("See the Create Resource", () => {
271
279
  expect.assertions(1);
272
280
  // Mock the request function to make it return an error.
273
281
  page.passwordCreate.fillInput(page.passwordCreate.name, "name");
274
- page.passwordCreate.fillInput(page.passwordCreate.password, "password");
282
+ await page.passwordCreate.fillInputPassword("password");
275
283
 
276
284
  const error = new PassboltApiFetchError("Jest simulate API error.");
277
285
  jest.spyOn(context.port, 'request').mockImplementationOnce(() => {
@@ -298,14 +306,40 @@ describe("See the Create Resource", () => {
298
306
  expect(page.passwordCreate.passwordGeneratorDialog).not.toBeNull();
299
307
  });
300
308
 
301
- it("As a user I should see a feedback when the password or descriptions fields content is truncated by a field limit", async() => {
302
- expect.assertions(2);
309
+ it("As a user I should see a feedback when the password, descriptions, name, username or uri fields content is truncated by a field limit", async() => {
310
+ expect.assertions(5);
303
311
  page.passwordCreate.fillInput(page.passwordCreate.password, 'a'.repeat(4097));
304
312
  page.passwordCreate.fillInput(page.passwordCreate.description, 'a'.repeat(10000));
305
- page.passwordCreate.keyUpInput(page.passwordCreate.password);
306
- page.passwordCreate.keyUpInput(page.passwordCreate.description);
313
+ page.passwordCreate.fillInput(page.passwordCreate.name, 'a'.repeat(256));
314
+ page.passwordCreate.fillInput(page.passwordCreate.username, 'a'.repeat(255));
315
+ page.passwordCreate.fillInput(page.passwordCreate.uri, 'a'.repeat(1025));
316
+
317
+ await page.passwordCreate.keyUpInput(page.passwordCreate.password);
318
+ await page.passwordCreate.keyUpInput(page.passwordCreate.description);
319
+ await page.passwordCreate.keyUpInput(page.passwordCreate.username);
320
+ await page.passwordCreate.keyUpInput(page.passwordCreate.name);
321
+ await page.passwordCreate.keyUpInput(page.passwordCreate.uri);
322
+
307
323
  expect(page.passwordCreate.passwordWarningMessage.textContent).toEqual(truncatedWarningMessage);
308
324
  expect(page.passwordCreate.descriptionWarningMessage.textContent).toEqual(truncatedWarningMessage);
325
+ expect(page.passwordCreate.nameWarningMessage.textContent).toEqual(truncatedWarningMessage);
326
+ expect(page.passwordCreate.uriWarningMessage.textContent).toEqual(truncatedWarningMessage);
327
+ expect(page.passwordCreate.usernameWarningMessage.textContent).toEqual(truncatedWarningMessage);
328
+ });
329
+
330
+ it("As a signed-in user creating a password on the application, I should get warn when I enter a pwned password and not be blocked", async() => {
331
+ expect.assertions(2);
332
+
333
+ mockContextRequest(() => Promise.resolve(2));
334
+ await page.passwordCreate.fillInputPassword('hello-world');
335
+ // we expect a warning to inform about powned password
336
+ await waitFor(() => {});
337
+ expect(page.passwordCreate.pwnedWarningMessage.textContent).toEqual("The password is part of an exposed data breach.");
338
+ mockContextRequest(() => Promise.reject());
339
+ await page.passwordCreate.fillInputPassword('another test');
340
+ // we expect a warning to inform about a network issue
341
+ await waitFor(() => {});
342
+ expect(page.passwordCreate.pwnedWarningMessage.textContent).toEqual("The pwnedpasswords service is unavailable, your password might be part of an exposed data breach");
309
343
  });
310
344
  });
311
345
  });
@@ -20,7 +20,6 @@ import DialogContextProvider from "../../../contexts/DialogContext";
20
20
  import {MemoryRouter} from "react-router-dom";
21
21
  import MockTranslationProvider from "../../../test/mock/components/Internationalisation/MockTranslationProvider";
22
22
  import CreateResource from "./CreateResource";
23
-
24
23
  /**
25
24
  * The PasswordCreateDialog component represented as a page
26
25
  */
@@ -136,6 +135,13 @@ class PasswordCreatePageObject {
136
135
  return this._container.querySelector('.name.error-message');
137
136
  }
138
137
 
138
+ /**
139
+ * Returns the name warning mesage input element
140
+ */
141
+ get nameWarningMessage() {
142
+ return this._container.querySelector('.name.warning-message');
143
+ }
144
+
139
145
  /**
140
146
  * Returns the uri input element
141
147
  */
@@ -143,6 +149,13 @@ class PasswordCreatePageObject {
143
149
  return this._container.querySelector('#create-password-form-uri');
144
150
  }
145
151
 
152
+ /**
153
+ * Returns the uri warning mesage input element
154
+ */
155
+ get uriWarningMessage() {
156
+ return this._container.querySelector('.uri.warning-message');
157
+ }
158
+
146
159
  /**
147
160
  * Returns the username / email input element
148
161
  */
@@ -150,6 +163,13 @@ class PasswordCreatePageObject {
150
163
  return this._container.querySelector('#create-password-form-username');
151
164
  }
152
165
 
166
+ /**
167
+ * Returns the username warning mesage input element
168
+ */
169
+ get usernameWarningMessage() {
170
+ return this._container.querySelector('.username.warning-message');
171
+ }
172
+
153
173
  /**
154
174
  * Returns the password input element
155
175
  */
@@ -171,6 +191,13 @@ class PasswordCreatePageObject {
171
191
  return this._container.querySelector('.password.warning-message');
172
192
  }
173
193
 
194
+ /**
195
+ * Returns the pwned warning message
196
+ */
197
+ get pwnedWarningMessage() {
198
+ return this._container.querySelector('.pwned-password.warning-message');
199
+ }
200
+
174
201
  /**
175
202
  * Returns the complexity text input element
176
203
  */
@@ -228,8 +255,6 @@ class PasswordCreatePageObject {
228
255
  return this._container.querySelector('.password-generator');
229
256
  }
230
257
 
231
-
232
-
233
258
  /**
234
259
  * Returns the save button element
235
260
  */
@@ -237,8 +262,6 @@ class PasswordCreatePageObject {
237
262
  return this._container.querySelector('.submit-wrapper button[type=\"submit\"]');
238
263
  }
239
264
 
240
-
241
-
242
265
  /**
243
266
  * Returns the cancel button element
244
267
  */
@@ -254,8 +277,6 @@ class PasswordCreatePageObject {
254
277
  return this._container.querySelector('.error-dialog .dialog .dialog-content .form-content');
255
278
  }
256
279
 
257
-
258
-
259
280
  /**
260
281
  * Returns true if the page object exists in the container
261
282
  */
@@ -289,6 +310,13 @@ class PasswordCreatePageObject {
289
310
  fireEvent.change(element, dataInputEvent);
290
311
  }
291
312
 
313
+ /** fill the input password with data */
314
+ async fillInputPassword(data) {
315
+ const dataInputEvent = {target: {value: data}};
316
+ fireEvent.change(this.password, dataInputEvent);
317
+ jest.runAllTimers();
318
+ }
319
+
292
320
  /** focus the input element with data */
293
321
  focusInput(element) {
294
322
  fireEvent.focus(element);
@@ -31,6 +31,7 @@ import {Trans, withTranslation} from "react-i18next";
31
31
  import {DateTime} from "luxon";
32
32
  import {withDrag} from "../../../contexts/DragContext";
33
33
  import DisplayDragResource from "./DisplayDragResource";
34
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
34
35
 
35
36
  /**
36
37
  * This component allows to display the filtered resources into a grid
@@ -221,8 +222,7 @@ class DisplayResourcesList extends React.Component {
221
222
  async handleCopyUsernameClick(ev, resource) {
222
223
  // Avoid the grid to select the resource while copying a resource username.
223
224
  ev.stopPropagation();
224
-
225
- await navigator.clipboard.writeText(resource.username);
225
+ await ClipBoard.copy(resource.username, this.props.context.port);
226
226
  this.props.actionFeedbackContext.displaySuccess(this.translate("The username has been copied to clipboard"));
227
227
  }
228
228
 
@@ -288,7 +288,7 @@ class DisplayResourcesList extends React.Component {
288
288
  return;
289
289
  }
290
290
  }
291
- await navigator.clipboard.writeText(password);
291
+ await ClipBoard.copy(password, this.props.context.port);
292
292
  await this.props.resourceWorkspaceContext.onResourceCopied();
293
293
  await this.props.actionFeedbackContext.displaySuccess(this.translate("The secret has been copied to clipboard"));
294
294
  }
@@ -26,6 +26,7 @@ import {
26
26
  } from "../../../contexts/ResourceWorkspaceContext";
27
27
  import sanitizeUrl, {urlProtocols} from "../../../lib/Sanitize/sanitizeUrl";
28
28
  import {Trans, withTranslation} from "react-i18next";
29
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
29
30
 
30
31
  class DisplayResourcesListContextualMenu extends React.Component {
31
32
  /**
@@ -77,7 +78,7 @@ class DisplayResourcesListContextualMenu extends React.Component {
77
78
  * handle username resource
78
79
  */
79
80
  async handleUsernameClickEvent() {
80
- await navigator.clipboard.writeText(this.resource.username);
81
+ await ClipBoard.copy(this.resource.username, this.props.context.port);
81
82
  this.props.actionFeedbackContext.displaySuccess(this.translate("The username has been copied to clipboard"));
82
83
  this.props.hide();
83
84
  }
@@ -86,7 +87,7 @@ class DisplayResourcesListContextualMenu extends React.Component {
86
87
  * handle uri resource
87
88
  */
88
89
  async handleUriClickEvent() {
89
- await navigator.clipboard.writeText(this.resource.uri);
90
+ await ClipBoard.copy(this.resource.uri, this.props.context.port);
90
91
  this.props.actionFeedbackContext.displaySuccess(this.translate("The uri has been copied to clipboard"));
91
92
  this.props.hide();
92
93
  }
@@ -97,7 +98,7 @@ class DisplayResourcesListContextualMenu extends React.Component {
97
98
  async handlePermalinkClickEvent() {
98
99
  const baseUrl = this.props.context.userSettings.getTrustedDomain();
99
100
  const permalink = `${baseUrl}/app/passwords/view/${this.resource.id}`;
100
- await navigator.clipboard.writeText(permalink);
101
+ await ClipBoard.copy(permalink, this.props.context.port);
101
102
  this.props.actionFeedbackContext.displaySuccess(this.translate("The permalink has been copied to clipboard"));
102
103
  this.props.hide();
103
104
  }
@@ -114,11 +115,11 @@ class DisplayResourcesListContextualMenu extends React.Component {
114
115
  throw new TypeError(this.translate("The password is empty."));
115
116
  }
116
117
  if (typeof plaintextDto === 'string') {
117
- await navigator.clipboard.writeText(plaintextDto);
118
+ await ClipBoard.copy(plaintextDto, this.props.context.port);
118
119
  this.props.resourceWorkspaceContext.onResourceCopied();
119
120
  } else {
120
121
  if (Object.prototype.hasOwnProperty.call(plaintextDto, 'password')) {
121
- await navigator.clipboard.writeText(plaintextDto.password);
122
+ await ClipBoard.copy(plaintextDto.password, this.props.context.port);
122
123
  this.props.resourceWorkspaceContext.onResourceCopied();
123
124
  } else {
124
125
  throw new TypeError(this.translate("The password field is not defined."));
@@ -24,6 +24,7 @@ import EditResource from "../EditResource/EditResource";
24
24
  import ShareDialog from "../../Share/ShareDialog";
25
25
  import ExportResources from "../ExportResources/ExportResources";
26
26
  import {Trans, withTranslation} from "react-i18next";
27
+ import ClipBoard from '../../../../shared/lib/Browser/clipBoard';
27
28
 
28
29
  /**
29
30
  * This component allows the current user to add a new comment on a resource
@@ -165,7 +166,7 @@ class DisplayResourcesWorkspaceMenu extends React.Component {
165
166
  this.handleCloseMoreMenu();
166
167
  const baseUrl = this.props.context.userSettings.getTrustedDomain();
167
168
  const permalink = `${baseUrl}/app/passwords/view/${this.selectedResources[0].id}`;
168
- await navigator.clipboard.writeText(permalink);
169
+ await ClipBoard.copy(permalink, this.props.context.port);
169
170
  this.displaySuccessNotification(this.translate("The permalink has been copied to clipboard"));
170
171
  }
171
172
 
@@ -174,7 +175,7 @@ class DisplayResourcesWorkspaceMenu extends React.Component {
174
175
  */
175
176
  async handleCopyUsernameClickEvent() {
176
177
  this.handleCloseMoreMenu();
177
- await navigator.clipboard.writeText(this.selectedResources[0].username);
178
+ await ClipBoard.copy(this.selectedResources[0].username, this.props.context.port);
178
179
  this.displaySuccessNotification(this.translate("The username has been copied to clipboard"));
179
180
  }
180
181
 
@@ -190,10 +191,10 @@ class DisplayResourcesWorkspaceMenu extends React.Component {
190
191
  throw new TypeError(this.translate("The password is empty."));
191
192
  }
192
193
  if (typeof plaintextDto === 'string') {
193
- await navigator.clipboard.writeText(plaintextDto);
194
+ await ClipBoard.copy(plaintextDto, this.props.context.port);
194
195
  } else {
195
196
  if (Object.prototype.hasOwnProperty.call(plaintextDto, 'password')) {
196
- await navigator.clipboard.writeText(plaintextDto.password);
197
+ await ClipBoard.copy(plaintextDto.password, this.props.context.port);
197
198
  } else {
198
199
  throw new TypeError(this.translate("The password field is not defined."));
199
200
  }
@@ -29,12 +29,11 @@ import GenerateResourcePassword from "../../ResourcePassword/GenerateResourcePas
29
29
  import {withResourcePasswordGeneratorContext} from "../../../contexts/ResourcePasswordGeneratorContext";
30
30
  import Password from "../../../../shared/components/Password/Password";
31
31
  import PasswordComplexity from "../../../../shared/components/PasswordComplexity/PasswordComplexity";
32
-
33
- /** Resource password max length */
34
- const RESOURCE_PASSWORD_MAX_LENGTH = 4096;
35
-
36
- /** Resource description max length */
37
- const RESOURCE_DESCRIPTION_MAX_LENGTH = 10000;
32
+ import {maxSizeValidation} from "../../../lib/Error/InputValidator";
33
+ import {RESOURCE_PASSWORD_MAX_LENGTH} from '../../../../shared/constants/inputs.const';
34
+ import {RESOURCE_NAME_MAX_LENGTH, RESOURCE_DESCRIPTION_MAX_LENGTH, RESOURCE_URI_MAX_LENGTH} from '../../../../shared/constants/inputs.const';
35
+ import debounce from 'debounce-promise';
36
+ import PownedService from '../../../../shared/services/api/secrets/pownedService';
38
37
 
39
38
  class EditResource extends Component {
40
39
  constructor(props) {
@@ -42,6 +41,8 @@ class EditResource extends Component {
42
41
  this.state = this.defaultState;
43
42
  this.initEventHandlers();
44
43
  this.createInputRef();
44
+ this.isPwndProcessingPromise = null;
45
+ this.evaluatePasswordIsInDictionaryDebounce = debounce(this.evaluatePasswordIsInDictionary, 300);
45
46
  }
46
47
 
47
48
  get defaultState() {
@@ -51,10 +52,13 @@ class EditResource extends Component {
51
52
  nameOriginal: resource.name || "",
52
53
  name: resource.name || "",
53
54
  nameError: "",
55
+ nameWarning: "",
54
56
  username: resource.username || "",
55
57
  usernameError: "",
58
+ usernameWarning: "",
56
59
  uri: resource.uri || "",
57
60
  uriError: "",
61
+ uriWarning: "",
58
62
  password: "",
59
63
  passwordError: "",
60
64
  passwordWarning: "",
@@ -63,7 +67,9 @@ class EditResource extends Component {
63
67
  descriptionWarning: "",
64
68
  isSecretDecrypting: true,
65
69
  encryptDescription: null,
66
- resourceTypeId: resource.resource_type_id || ""
70
+ resourceTypeId: resource.resource_type_id || "",
71
+ isPwnedServiceAvailable: true,
72
+ passwordInDictionary: false
67
73
  };
68
74
  }
69
75
 
@@ -71,7 +77,6 @@ class EditResource extends Component {
71
77
  this.handleClose = this.handleClose.bind(this);
72
78
  this.handleFormSubmit = this.handleFormSubmit.bind(this);
73
79
  this.handleInputChange = this.handleInputChange.bind(this);
74
- this.handleNameInputKeyUp = this.handleNameInputKeyUp.bind(this);
75
80
  this.handlePasswordInputKeyUp = this.handlePasswordInputKeyUp.bind(this);
76
81
  this.handleOpenGenerator = this.handleOpenGenerator.bind(this);
77
82
  this.handleGeneratePasswordButtonClick = this.handleGeneratePasswordButtonClick.bind(this);
@@ -79,6 +84,9 @@ class EditResource extends Component {
79
84
  this.handleDescriptionInputBlur = this.handleDescriptionInputBlur.bind(this);
80
85
  this.handleDescriptionToggle = this.handleDescriptionToggle.bind(this);
81
86
  this.handleDescriptionInputKeyUp = this.handleDescriptionInputKeyUp.bind(this);
87
+ this.handleUriInputKeyUp = this.handleUriInputKeyUp.bind(this);
88
+ this.handleUsernameInputKeyUp = this.handleUsernameInputKeyUp.bind(this);
89
+ this.handleNameInputKeyUp = this.handleNameInputKeyUp.bind(this);
82
90
  }
83
91
 
84
92
  /**
@@ -94,6 +102,7 @@ class EditResource extends Component {
94
102
  * Whenever the component has been mounted
95
103
  */
96
104
  componentDidMount() {
105
+ this.pownedService = new PownedService(this.props.context.port);
97
106
  this.initialize();
98
107
  }
99
108
 
@@ -111,6 +120,7 @@ class EditResource extends Component {
111
120
  const encrypt = this.mustEncryptDescription();
112
121
  this.setState({encryptDescription: encrypt});
113
122
  }
123
+ this.evaluatePasswordIsInDictionary();
114
124
  }
115
125
 
116
126
  /*
@@ -263,6 +273,17 @@ class EditResource extends Component {
263
273
  });
264
274
  }
265
275
 
276
+ /**
277
+ * Evaluate to check if password is in a dictionary.
278
+ * @return {Promise}
279
+ */
280
+ async evaluatePasswordIsInDictionary() {
281
+ if (this.state.isPwnedServiceAvailable) {
282
+ const result = await this.pownedService.evaluateSecret(this.state.password, this.state.isPwnedServiceAvailable);
283
+ this.setState({isPwnedServiceAvailable: result.isPwnedServiceAvailable, passwordInDictionary: result.inDictionary});
284
+ }
285
+ }
286
+
266
287
  /*
267
288
  * =============================================================
268
289
  * Update resource
@@ -415,6 +436,13 @@ class EditResource extends Component {
415
436
  const target = event.target;
416
437
  const value = target.value;
417
438
  const name = target.name;
439
+
440
+ if (name === "password") {
441
+ if (value.length) {
442
+ this.isPwndProcessingPromise = this.evaluatePasswordIsInDictionaryDebounce();
443
+ }
444
+ }
445
+
418
446
  this.setState({
419
447
  [name]: value
420
448
  });
@@ -439,19 +467,18 @@ class EditResource extends Component {
439
467
  /**
440
468
  * Handle name input keyUp event.
441
469
  */
442
- handleNameInputKeyUp() {
443
- const state = this.validateNameInput();
444
- this.setState(state);
470
+ async handleNameInputKeyUp() {
471
+ await this.validateNameInput();
472
+ const nameWarning = maxSizeValidation(this.state.name, RESOURCE_NAME_MAX_LENGTH, this.translate);
473
+ this.setState({nameWarning});
445
474
  }
446
475
 
447
476
  /**
448
477
  * Handle password input keyUp event.
449
478
  */
450
479
  async handlePasswordInputKeyUp() {
451
- const hasResourcePasswordMaxLength = this.state.password.length >= RESOURCE_PASSWORD_MAX_LENGTH;
452
480
  await this.validatePasswordInput();
453
- const warningMessage = this.translate("this is the maximum size for this field, make sure your data was not truncated");
454
- const passwordWarning = hasResourcePasswordMaxLength ? warningMessage : '';
481
+ const passwordWarning = maxSizeValidation(this.state.password, RESOURCE_PASSWORD_MAX_LENGTH, this.translate);
455
482
  this.setState({passwordWarning});
456
483
  }
457
484
 
@@ -501,13 +528,28 @@ class EditResource extends Component {
501
528
  * Whenever the user input keys in the description area
502
529
  */
503
530
  handleDescriptionInputKeyUp() {
504
- const hasResourceDescriptionMaxLength = this.state.description.length >= RESOURCE_DESCRIPTION_MAX_LENGTH;
505
-
506
- const warningMessage = this.translate("this is the maximum size for this field, make sure your data was not truncated");
507
- const descriptionWarning = hasResourceDescriptionMaxLength ? warningMessage : '';
531
+ const descriptionWarning = maxSizeValidation(this.state.description, RESOURCE_DESCRIPTION_MAX_LENGTH, this.translate);
508
532
  this.setState({descriptionWarning});
509
533
  }
510
534
 
535
+
536
+ /**
537
+ * Whenever the user input keys in the name area
538
+ */
539
+ handleUriInputKeyUp() {
540
+ const uriWarning = maxSizeValidation(this.state.uri, RESOURCE_URI_MAX_LENGTH, this.translate);
541
+ this.setState({uriWarning});
542
+ }
543
+
544
+ /**
545
+ * Whenever the user input keys in the username area
546
+ */
547
+ handleUsernameInputKeyUp() {
548
+ const usernameWarning = maxSizeValidation(this.state.username, RESOURCE_NAME_MAX_LENGTH, this.translate);
549
+ this.setState({usernameWarning});
550
+ }
551
+
552
+
511
553
  /*
512
554
  * =============================================================
513
555
  * Decryption
@@ -636,7 +678,9 @@ class EditResource extends Component {
636
678
  <form onSubmit={this.handleFormSubmit} noValidate>
637
679
  <div className="form-content">
638
680
  <div className={`input text required ${this.state.nameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
639
- <label htmlFor="edit-password-form-name"><Trans>Name</Trans></label>
681
+ <label htmlFor="edit-password-form-name"><Trans>Name</Trans>{this.state.nameWarning &&
682
+ <Icon name="exclamation"/>
683
+ }</label>
640
684
  <input id="edit-password-form-name" name="name" type="text" value={this.state.name}
641
685
  onKeyUp={this.handleNameInputKeyUp} onChange={this.handleInputChange}
642
686
  disabled={this.hasAllInputDisabled()} ref={this.nameInputRef} className="required fluid" maxLength="255"
@@ -644,29 +688,51 @@ class EditResource extends Component {
644
688
  {this.state.nameError &&
645
689
  <div className="name error-message">{this.state.nameError}</div>
646
690
  }
691
+ {this.state.nameWarning && (
692
+ <div className="name warning-message">
693
+ <strong><Trans>Warning:</Trans></strong> {this.state.nameWarning}
694
+ </div>
695
+ )}
647
696
  </div>
648
697
  <div className={`input text ${this.state.uriError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
649
- <label htmlFor="edit-password-form-uri"><Trans>URI</Trans></label>
698
+ <label htmlFor="edit-password-form-uri"><Trans>URI</Trans>{this.state.uriWarning &&
699
+ <Icon name="exclamation"/>
700
+ }</label>
650
701
  <input id="edit-password-form-uri" name="uri" className="fluid" maxLength="1024" type="text"
651
702
  autoComplete="off" value={this.state.uri} onChange={this.handleInputChange} placeholder={this.translate("URI")}
703
+ onKeyUp={this.handleUriInputKeyUp}
652
704
  disabled={this.hasAllInputDisabled()}/>
653
705
  {this.state.uriError &&
654
706
  <div className="error-message">{this.state.uriError}</div>
655
707
  }
708
+ {this.state.uriWarning && (
709
+ <div className="uri warning-message">
710
+ <strong><Trans>Warning:</Trans></strong> {this.state.uriWarning}
711
+ </div>
712
+ )}
656
713
  </div>
657
714
  <div className={`input text ${this.state.usernameError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
658
- <label htmlFor="edit-password-form-username"><Trans>Username</Trans></label>
715
+ <label htmlFor="edit-password-form-username"><Trans>Username</Trans>{this.state.usernameWarning &&
716
+ <Icon name="exclamation"/>
717
+ }</label>
659
718
  <input id="edit-password-form-username" name="username" type="text" className="fluid" maxLength="255"
660
- autoComplete="off" value={this.state.username} onChange={this.handleInputChange} placeholder={this.translate("Username")}
719
+ autoComplete="off" value={this.state.username} onChange={this.handleInputChange}
720
+ onKeyUp={this.handleUsernameInputKeyUp}
721
+ placeholder={this.translate("Username")}
661
722
  disabled={this.hasAllInputDisabled()}/>
662
723
  {this.state.usernameError &&
663
724
  <div className="error-message">{this.state.usernameError}</div>
664
725
  }
726
+ {this.state.usernameWarning && (
727
+ <div className="username warning-message">
728
+ <strong><Trans>Warning:</Trans></strong> {this.state.usernameWarning}
729
+ </div>
730
+ )}
665
731
  </div>
666
732
  <div className={`input-password-wrapper input required ${this.state.passwordError ? "error" : ""} ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
667
733
  <label htmlFor="edit-password-form-password">
668
734
  <Trans>Password</Trans>
669
- {this.state.passwordWarning &&
735
+ {(this.state.passwordWarning || this.state.passwordInDictionary || !this.state.isPwnedServiceAvailable) &&
670
736
  <Icon name="exclamation"/>
671
737
  }
672
738
  </label>
@@ -696,6 +762,12 @@ class EditResource extends Component {
696
762
  {this.state.passwordWarning &&
697
763
  <div className="password warning-message"><strong><Trans>Warning:</Trans></strong> {this.state.passwordWarning}</div>
698
764
  }
765
+ {!this.state.isPwnedServiceAvailable &&
766
+ <div className="pwned-password invalid-passphrase warning-message"><Trans>The pwnedpasswords service is unavailable, your password might be part of an exposed data breach</Trans></div>
767
+ }
768
+ {this.state.passwordInDictionary &&
769
+ <div className="pwned-password invalid-passphrase warning-message"><Trans>The password is part of an exposed data breach.</Trans></div>
770
+ }
699
771
  </div>
700
772
  <div className={`input textarea ${this.hasAllInputDisabled() ? 'disabled' : ''}`}>
701
773
  <label htmlFor="edit-password-form-description"><Trans>Description</Trans>