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
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2021 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2021 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.9.0
13
+ *
14
+ */
15
+
16
+ beforeEach(() => {
17
+ jest.resetModules();
18
+ });
19
+
20
+ import {defaultAppContext, mockExtensionCall} from './SaveResource.test.data';
21
+ import {defaultProps} from '../ResourceCreatePage/ResourceCreatePage.test.data';
22
+ import SaveResourcePage from './SaveResource.test.page';
23
+ import {waitFor} from '@testing-library/react';
24
+
25
+ beforeEach(() => {
26
+ jest.resetModules();
27
+ });
28
+
29
+ describe("See the Create Resource - save resource", () => {
30
+ let page; // The page to test against
31
+ const context = defaultAppContext(); // The applicative context
32
+ const props = defaultProps(); // The props to pass
33
+
34
+ beforeEach(() => {
35
+ jest.useFakeTimers();
36
+ mockExtensionCall(context);
37
+ page = new SaveResourcePage(context, props);
38
+ });
39
+
40
+ afterEach(() => {
41
+ jest.clearAllTimers();
42
+ });
43
+
44
+ it("As a signed-in user creating a password on the quickaccess, I should get warn when I enter a pwned password and not be blocked", async() => {
45
+ expect.assertions(2);
46
+
47
+ await page.fillInputPassword('hello-world');
48
+ await waitFor(() => {});
49
+ // we expect a warning to inform about powned password
50
+ expect(page.pwnedWarningMessage.textContent).toEqual("The password is part of an exposed data breach.");
51
+
52
+ await page.fillInputPassword('unavailable');
53
+ await waitFor(() => {});
54
+ // we expect a warning to inform about a network issue
55
+ expect(page.pwnedWarningMessage.textContent).toEqual("The pwnedpasswords service is unavailable, your password might be part of an exposed data breach");
56
+ });
57
+ });
58
+
59
+
60
+
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2021 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2021 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.9.0
13
+ *
14
+ */
15
+ import React from "react";
16
+ import {render} from "@testing-library/react";
17
+ import {StaticRouter} from 'react-router-dom';
18
+ import MockTranslationProvider from '../../../react-extension/test/mock/components/Internationalisation/MockTranslationProvider';
19
+ import {fireEvent} from '@testing-library/react';
20
+ import SaveResource from "./SaveResource";
21
+
22
+ /**
23
+ * The SaveResource component represented as a page
24
+ */
25
+ export default class SaveResourcePage {
26
+ /**
27
+ * Default constructor
28
+ * @param props Props to attach
29
+ */
30
+ constructor(context, props) {
31
+ this._page = render(
32
+ <MockTranslationProvider>
33
+ <StaticRouter context={context}>
34
+ <SaveResource context={context} prepareResourceContext={props.prepareResourceContext} debug />
35
+ </StaticRouter>
36
+ </MockTranslationProvider>
37
+ );
38
+ }
39
+
40
+ /**
41
+ * Returns the password input element
42
+ */
43
+ get password() {
44
+ return this._page.container.querySelector('#password');
45
+ }
46
+
47
+ /**
48
+ * Returns the pwned warning message
49
+ */
50
+ get pwnedWarningMessage() {
51
+ return this._page.container.querySelector('.pwned-password.warning-message');
52
+ }
53
+
54
+ /** fill the input password with data */
55
+ async fillInputPassword(data) {
56
+ const dataInputEvent = {target: {value: data}};
57
+ fireEvent.change(this.password, dataInputEvent);
58
+ jest.runAllTimers();
59
+ }
60
+ }
@@ -9,6 +9,8 @@ import {withPrepareResourceContext} from "../../contexts/PrepareResourceContext"
9
9
  import Icon from "../../../shared/components/Icons/Icon";
10
10
  import Password from "../../../shared/components/Password/Password";
11
11
  import PasswordComplexity from "../../../shared/components/PasswordComplexity/PasswordComplexity";
12
+ import debounce from 'debounce-promise';
13
+ import PownedService from "../../../shared/services/api/secrets/pownedService";
12
14
 
13
15
  class ResourceCreatePage extends React.Component {
14
16
  constructor(props) {
@@ -16,9 +18,12 @@ class ResourceCreatePage extends React.Component {
16
18
  this.initEventHandlers();
17
19
  this.state = this.getDefaultState();
18
20
  this.createInputRef();
21
+ this.isPwndProcessingPromise = null;
22
+ this.evaluatePasswordIsInDictionaryDebounce = debounce(this.evaluatePasswordIsInDictionaryDebounce, 300);
19
23
  }
20
24
 
21
25
  async componentDidMount() {
26
+ this.pownedService = new PownedService(this.props.context.port);
22
27
  await this.handlePreparedResource();
23
28
  this.handleLastGeneratedPassword();
24
29
  }
@@ -45,6 +50,8 @@ class ResourceCreatePage extends React.Component {
45
50
  password: "",
46
51
  passwordError: "",
47
52
  passwordEntropy: null,
53
+ isPwnedServiceAvailable: true,
54
+ passwordInDictionary: false
48
55
  };
49
56
  }
50
57
 
@@ -201,6 +208,7 @@ class ResourceCreatePage extends React.Component {
201
208
  */
202
209
  async handleFormSubmit(event) {
203
210
  event.preventDefault();
211
+
204
212
  this.setState({
205
213
  processing: true,
206
214
  error: "",
@@ -259,6 +267,17 @@ class ResourceCreatePage extends React.Component {
259
267
  }
260
268
  }
261
269
 
270
+ /**
271
+ * Evaluate to check if password is in a dictionary.
272
+ * @return {Promise}
273
+ */
274
+ async evaluatePasswordIsInDictionaryDebounce() {
275
+ if (this.state.isPwnedServiceAvailable) {
276
+ const result = await this.pownedService.evaluateSecret(this.state.password);
277
+ this.setState({isPwnedServiceAvailable: result.isPwnedServiceAvailable, passwordInDictionary: result.inDictionary});
278
+ }
279
+ }
280
+
262
281
  formatValidationFieldError(fieldErrors) {
263
282
  if (!fieldErrors) {
264
283
  return "";
@@ -267,6 +286,10 @@ class ResourceCreatePage extends React.Component {
267
286
  }
268
287
 
269
288
  handlePasswordChange(event) {
289
+ if (event.target.value.length) {
290
+ this.isPwndProcessingPromise = this.evaluatePasswordIsInDictionaryDebounce();
291
+ }
292
+
270
293
  this.loadPassword(event.target.value);
271
294
  }
272
295
 
@@ -360,7 +383,10 @@ class ResourceCreatePage extends React.Component {
360
383
  }
361
384
  </div>
362
385
  <div className={`input-password-wrapper input required ${this.state.passwordError ? "error" : ""}`}>
363
- <label htmlFor="password"><Trans>Password</Trans></label>
386
+ <label htmlFor="password"><Trans>Password</Trans>
387
+ {(this.state.passwordInDictionary || !this.state.isPwnedServiceAvailable) &&
388
+ <Icon name="exclamation"/>
389
+ }</label>
364
390
  <div className="password-button-inline">
365
391
  <Password name="password" value={this.state.password} preview={true} onChange={this.handlePasswordChange} disabled={this.state.processing}
366
392
  autoComplete="new-password" placeholder={this.translate('Password')} id="password" inputRef={this.passwordInputRef}/>
@@ -381,6 +407,12 @@ class ResourceCreatePage extends React.Component {
381
407
  {this.state.passwordError &&
382
408
  <div className="error-message">{this.state.passwordError}</div>
383
409
  }
410
+ {!this.state.isPwnedServiceAvailable &&
411
+ <div className="pwned-password warning-message"><Trans>The pwnedpasswords service is unavailable, your password might be part of an exposed data breach</Trans></div>
412
+ }
413
+ {this.state.passwordInDictionary &&
414
+ <div className="pwned-password warning-message"><Trans>The password is part of an exposed data breach.</Trans></div>
415
+ }
384
416
  </div>
385
417
  </div>
386
418
  </div>
@@ -11,6 +11,7 @@ import {defaultAppContext, defaultProps} from "./ResourceCreatePage.test.data";
11
11
 
12
12
  // Reset the modules before each test.
13
13
  beforeEach(() => {
14
+ jest.useFakeTimers();
14
15
  jest.resetModules();
15
16
  });
16
17
 
@@ -18,6 +19,7 @@ beforeEach(() => {
18
19
  afterEach(() => {
19
20
  cleanup();
20
21
  delete window.passbolt;
22
+ jest.clearAllTimers();
21
23
  });
22
24
 
23
25
  describe("ResourceCreatePage", () => {
@@ -148,10 +150,18 @@ describe("ResourceCreatePage", () => {
148
150
  const createPasswordEventMockCallback = jest.fn();
149
151
  const context = defaultAppContext();
150
152
  const props = defaultProps();
153
+ const inputPasswordChange = async password => {
154
+ const passwordInput = component.container.querySelector('[name="password"]');
155
+ const passwordInputEvent = {target: {value: password}};
156
+ fireEvent.change(passwordInput, passwordInputEvent);
157
+ jest.runAllTimers();
158
+ };
159
+
160
+ const pwnedWarningMessage = () => component.container.querySelector('.pwned-password.warning-message');
151
161
  // Mock the passbolt messaging layer.
152
162
  context.port = {
153
- request: function(event) {
154
- return new Promise(resolve => {
163
+ request: function(event, value) {
164
+ return new Promise((resolve, reject) => {
155
165
  if (event === "passbolt.quickaccess.prepare-resource") {
156
166
  resolve({
157
167
  name: "Passbolt Browser Extension Test",
@@ -162,6 +172,14 @@ describe("ResourceCreatePage", () => {
162
172
  resolve({
163
173
  id: "newly-created-resource-id"
164
174
  });
175
+ } else if (event === "passbolt.secrets.powned-password") {
176
+ if (value === "hello-world") {
177
+ resolve(3);
178
+ } else if (value === "unavailable") {
179
+ reject();
180
+ } else {
181
+ resolve(0);
182
+ }
165
183
  }
166
184
  });
167
185
  }
@@ -175,6 +193,8 @@ describe("ResourceCreatePage", () => {
175
193
  </MockTranslationProvider>
176
194
  );
177
195
 
196
+ expect.assertions(4);
197
+
178
198
  // Wait the passbolt.request executed in the ComponentDidMount is resolved.
179
199
  await waitFor(() => {
180
200
  if (props.prepareResourceContext.getLastGeneratedPassword.mock.calls.length === 0) {
@@ -186,9 +206,17 @@ describe("ResourceCreatePage", () => {
186
206
  const usernameInput = component.container.querySelector('[name="username"]');
187
207
  const usernameInputEvent = {target: {value: "test@passbolt.com"}};
188
208
  fireEvent.change(usernameInput, usernameInputEvent);
189
- const passwordInput = component.container.querySelector('[name="password"]');
190
- const passwordInputEvent = {target: {value: "P4ssb0lt"}};
191
- fireEvent.change(passwordInput, passwordInputEvent);
209
+
210
+ await inputPasswordChange("P4ssb0lt");
211
+ expect(pwnedWarningMessage()).toBe(null);
212
+ //Powned password should raise a warning and not block submit
213
+ await inputPasswordChange("hello-world");
214
+ await waitFor(() => {});
215
+ expect(pwnedWarningMessage().textContent).toBe("The password is part of an exposed data breach.");
216
+ //Service for powned password unavailable should not block
217
+ await inputPasswordChange("unavailable");
218
+ await waitFor(() => {});
219
+ expect(pwnedWarningMessage().textContent).toBe("The pwnedpasswords service is unavailable, your password might be part of an exposed data breach");
192
220
 
193
221
  // Submit the form.
194
222
  const submitButton = component.container.querySelector('button[type="submit"]');
@@ -203,8 +231,9 @@ describe("ResourceCreatePage", () => {
203
231
  uri: "https://passbolt-browser-extension/test",
204
232
  username: "test@passbolt.com"
205
233
  };
206
- expect.assertions(1);
207
- expect(createPasswordEventMockCallback).toHaveBeenCalledWith(resourceMeta, "P4ssb0lt");
234
+ expect(createPasswordEventMockCallback).toHaveBeenCalledWith(resourceMeta, "unavailable");
208
235
  });
209
236
  });
210
237
  });
238
+
239
+
@@ -5,6 +5,7 @@ import {Trans, withTranslation} from "react-i18next";
5
5
  import {withAppContext} from "../../contexts/AppContext";
6
6
  import {withRouter} from "react-router-dom";
7
7
  import Icon from "../../../shared/components/Icons/Icon";
8
+ import ClipBoard from '../../../shared/lib/Browser/clipBoard';
8
9
 
9
10
  class ResourceViewPage extends React.Component {
10
11
  constructor(props) {
@@ -81,7 +82,7 @@ class ResourceViewPage extends React.Component {
81
82
 
82
83
  try {
83
84
  this.setState({copyLoginState: 'processing'});
84
- await navigator.clipboard.writeText(this.state.resource.username);
85
+ await ClipBoard.copy(this.state.resource.username, this.props.context.port);
85
86
  this.setState({copyLoginState: 'done'});
86
87
  setTimeout(() => {
87
88
  this.setState({copyLoginState: 'default'});
@@ -130,7 +131,7 @@ class ResourceViewPage extends React.Component {
130
131
  }
131
132
  }
132
133
 
133
- await navigator.clipboard.writeText(password);
134
+ await ClipBoard.copy(password, this.props.context.port);
134
135
  this.setState({copySecretState: 'done'});
135
136
  setTimeout(() => {
136
137
  this.setState({copySecretState: 'default'});
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.9.0
13
+ */
14
+ import React from "react";
15
+ import PropTypes from "prop-types";
16
+ import {withAppContext} from "./AppContext";
17
+ import {withTranslation} from "react-i18next";
18
+
19
+ export const SsoContext = React.createContext({
20
+ loadSsoConfiguration: () => {}, // Load the current sso configuration and store it in the state
21
+ getProvider: () => {}, // Return the current sso configuration from the context state
22
+ hasUserAnSsoKit: () => {}, // Returns true if the current user has an SSO kit built locally
23
+ runSignInProcess: () => {}, // Launches the SSO process with the configured provider
24
+ });
25
+
26
+ /**
27
+ * The related context provider
28
+ */
29
+ export class SsoContextProvider extends React.Component {
30
+ /**
31
+ * Default constructor
32
+ * @param props The component props
33
+ */
34
+ constructor(props) {
35
+ super(props);
36
+ this.state = this.defaultState;
37
+ }
38
+
39
+ /**
40
+ * Returns the default component state
41
+ */
42
+ get defaultState() {
43
+ this.handleSpecificError.bind(this);
44
+ return {
45
+ ssoLocalConfiguredProvider: null, // the provider configured for the local SSO kit if any, null otherwise
46
+ loadSsoConfiguration: this.loadSsoConfiguration.bind(this), // Load the current sso configuration and store it in the state
47
+ getProvider: this.getProvider.bind(this), // Return the current sso provider configured
48
+ hasUserAnSsoKit: this.hasUserAnSsoKit.bind(this), // Returns true if the current user has an SSO kit built locally
49
+ runSignInProcess: this.runSignInProcess.bind(this), // Launches the SSO process with the configured provider
50
+ };
51
+ }
52
+
53
+ /**
54
+ * Find the sso configuration
55
+ * @return {Promise<void>}
56
+ */
57
+ async loadSsoConfiguration() {
58
+ const ssoLocalConfiguredProvider = await this.props.context.port.request("passbolt.sso.get-local-configured-provider");
59
+ this.setState({ssoLocalConfiguredProvider});
60
+ }
61
+
62
+ /**
63
+ * Get the current sso provider configured.
64
+ * @returns {string}
65
+ */
66
+ getProvider() {
67
+ return this.state.ssoLocalConfiguredProvider;
68
+ }
69
+
70
+ /**
71
+ * Returns true if the current user has an SSO kit built locally
72
+ * @returns {boolean}
73
+ */
74
+ hasUserAnSsoKit() {
75
+ return Boolean(this.state.ssoLocalConfiguredProvider);
76
+ }
77
+
78
+ /**
79
+ * Launches the SSO process with the configured provider
80
+ * @returns {Promise<void>}
81
+ */
82
+ async runSignInProcess() {
83
+ try {
84
+ const provider = this.getProvider();
85
+ await this.props.context.port.request(`passbolt.sso.sign-in-with-${provider}`, true);
86
+ } catch (e) {
87
+ console.error(e);
88
+ this.handleSpecificError(e);
89
+ throw e;
90
+ }
91
+ }
92
+
93
+ /**
94
+ * Handles error from the background page during SSO sign-in.
95
+ * @param {Error} e
96
+ */
97
+ handleSpecificError(e) {
98
+ let errorToThrow = e;
99
+ switch (e.name) {
100
+ case 'InvalidMasterPasswordError': {
101
+ errorToThrow = new Error(this.props.t("The passphrase from the SSO kit doesn't match your private key: {{error}}", {error: e.message}));
102
+ break;
103
+ }
104
+ case 'OutdatedSsoKitError': {
105
+ errorToThrow = new Error(this.props.t("The SSO kit is outdated and can't be used to decrypt your passphrase: {{error}}", {error: e.message}));
106
+ break;
107
+ }
108
+ }
109
+
110
+ throw errorToThrow;
111
+ }
112
+
113
+ /**
114
+ * Render the component
115
+ * @returns {JSX}
116
+ */
117
+ render() {
118
+ return (
119
+ <SsoContext.Provider value={this.state}>
120
+ {this.props.children}
121
+ </SsoContext.Provider>
122
+ );
123
+ }
124
+ }
125
+
126
+ SsoContextProvider.propTypes = {
127
+ context: PropTypes.any, // The application context
128
+ children: PropTypes.any, // The children components
129
+ t: PropTypes.func, // The translation function
130
+ };
131
+ export default withAppContext(withTranslation('common')(SsoContextProvider));
132
+
133
+ /**
134
+ * Resource Workspace Context Consumer HOC
135
+ * @param WrappedComponent
136
+ */
137
+ export function withSso(WrappedComponent) {
138
+ return class withSso extends React.Component {
139
+ render() {
140
+ return (
141
+ <SsoContext.Consumer>
142
+ {
143
+ ssoContext => <WrappedComponent ssoContext={ssoContext} {...this.props} />
144
+ }
145
+ </SsoContext.Consumer>
146
+ );
147
+ }
148
+ };
149
+ }
150
+
@@ -20,15 +20,18 @@ export default {
20
20
  * Selectors to detect username inputs (input type text or not type with id or class or name contain user)
21
21
  * The selector create-account-input is for ovh.com website
22
22
  * The selector benutzerkennung is for german website
23
+ * The selector utilisateur is for french website
23
24
  */
24
25
  USERNAME_FIELD_SELECTOR: `input[type='text' i][name*='user' i]:not([hidden]):not([disabled]),
25
26
  input[type='text' i][name*='email' i]:not([hidden]):not([disabled]),
26
27
  input[type='text' i][name*='login' i]:not([hidden]):not([disabled]),
27
28
  input[type='text' i][name*='benutzerkennung' i]:not([hidden]):not([disabled]),
29
+ input[type='text' i][name*='utilisateur' i]:not([hidden]):not([disabled]),
28
30
  input[type='text' i][id*='user' i]:not([hidden]):not([disabled]),
29
31
  input[type='text' i][id*='email' i]:not([hidden]):not([disabled]),
30
32
  input[type='text' i][id*='login' i]:not([hidden]):not([disabled]),
31
33
  input[type='text' i][id*='benutzerkennung' i]:not([hidden]):not([disabled]),
34
+ input[type='text' i][id*='utilisateur' i]:not([hidden]):not([disabled]),
32
35
  input[type='text' i][class*='user' i]:not([hidden]):not([disabled]),
33
36
  input[type='text' i][class*='email' i]:not([hidden]):not([disabled]),
34
37
  input[type='text' i][class*='create-account-input' i]:not([hidden]):not([disabled]),
@@ -42,10 +45,12 @@ export default {
42
45
  input[name*='email' i]:not([type]):not([hidden]):not([disabled]),
43
46
  input[name*='login' i]:not([type]):not([hidden]):not([disabled]),
44
47
  input[name*='benutzerkennung' i]:not([type]):not([hidden]):not([disabled]),
48
+ input[name*='utilisateur' i]:not([type]):not([hidden]):not([disabled]),
45
49
  input[id*='user' i]:not([type]):not([hidden]):not([disabled]),
46
50
  input[id*='email' i]:not([type]):not([hidden]):not([disabled]),
47
51
  input[id*='login' i]:not([type]):not([hidden]):not([disabled]),
48
52
  input[id*='benutzerkennung' i]:not([type]):not([hidden]):not([disabled]),
53
+ input[id*='utilisateur' i]:not([type]):not([hidden]):not([disabled]),
49
54
  input[class*='user' i]:not([type]):not([hidden]):not([disabled]),
50
55
  input[class*='email' i]:not([type]):not([hidden]):not([disabled]),
51
56
  input[class*='create-account-input' i]:not([type]):not([hidden]):not([disabled]),
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2020 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2020 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.9.0
13
+ */
14
+
15
+ /** user inputs max length */
16
+ export const USER_INPUT_MAX_LENGTH = 128;
17
+ /** Resource group name max length */
18
+ export const RESOURCE_GROUP_NAME_MAX_LENGTH = 50;
19
+ /** Resource name max length */
20
+ export const RESOURCE_NAME_MAX_LENGTH = 255;
21
+ /** Resource folder name max length */
22
+ export const RESOURCE_FOLDER_NAME_MAX_LENGTH = 256;
23
+ /** Resource name max length */
24
+ export const RESOURCE_TAG_MAX_LENGTH = 128;
25
+ /** Resource password max length */
26
+ export const RESOURCE_PASSWORD_MAX_LENGTH = 4096;
27
+ /** Resource description max length */
28
+ export const RESOURCE_DESCRIPTION_MAX_LENGTH = 10000;
29
+ /** Resource uri max length */
30
+ export const RESOURCE_URI_MAX_LENGTH = 1024;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2023 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2020 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.9.0
13
+ */
14
+
15
+ /**
16
+ * A utility class for copying text to the clipboard.
17
+ * @class ClipBoard
18
+ */
19
+
20
+ class ClipBoard {
21
+ /**
22
+ * Copies the given text to the clipboard.
23
+ * @static
24
+ * @param {string} text - The text to copy to the clipboard.
25
+ * @returns {Promise}
26
+ */
27
+ static async copy(text, port) {
28
+ if (navigator.clipboard) {
29
+ try {
30
+ await navigator.clipboard.writeText(text);
31
+ } catch {
32
+ ClipBoard.copyWithBrowserExtension(text, port);
33
+ }
34
+ } else {
35
+ ClipBoard.copyWithBrowserExtension(text, port);
36
+ }
37
+ }
38
+
39
+ static copyWithBrowserExtension(text, port) {
40
+ port.request("passbolt.clipboard.copy", text);
41
+ }
42
+ }
43
+
44
+
45
+ export default ClipBoard;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Passbolt ~ Open source password manager for teams
3
+ * Copyright (c) 2023 Passbolt SA (https://www.passbolt.com)
4
+ *
5
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
6
+ * For full copyright and license information, please see the LICENSE.txt
7
+ * Redistributions of files must retain the above copyright notice.
8
+ *
9
+ * @copyright Copyright (c) 2020 Passbolt SA (https://www.passbolt.com)
10
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
11
+ * @link https://www.passbolt.com Passbolt(tm)
12
+ * @since 3.9.0
13
+ */
14
+
15
+
16
+ /**
17
+ * Unit tests on ClipBoard in regard of specifications
18
+ */
19
+ import ClipBoard from './clipBoard';
20
+
21
+ describe('ClipBoard', () => {
22
+ const portMock = {
23
+ request: jest.fn()
24
+ };
25
+ const toCopy = "text";
26
+ describe('copy method', () => {
27
+ it('should call the navigator.clipboard.writeText method if it is available', async() => {
28
+ navigator.clipboard = {
29
+ writeText: jest.fn()
30
+ };
31
+ await ClipBoard.copy(toCopy, portMock);
32
+ expect(navigator.clipboard.writeText).toHaveBeenCalledWith(toCopy);
33
+ expect(portMock.request).not.toHaveBeenCalled();
34
+ });
35
+
36
+ it('should call the copyWithBrowserExtension method if the navigator.clipboard API is not available', async() => {
37
+ navigator.clipboard = null;
38
+ await ClipBoard.copy(toCopy, portMock);
39
+ expect(portMock.request).toHaveBeenCalledWith('passbolt.clipboard.copy', toCopy);
40
+ });
41
+
42
+ it('should call the copyWithBrowserExtension method if the writeText method throws an error', async() => {
43
+ navigator.clipboard = {
44
+ writeText: jest.fn(() => {
45
+ throw new Error('Some error');
46
+ })
47
+ };
48
+ await ClipBoard.copy(toCopy, portMock);
49
+ expect(portMock.request).toHaveBeenCalledWith('passbolt.clipboard.copy', toCopy);
50
+ });
51
+ });
52
+
53
+ describe('copyWithBrowserExtension: method', () => {
54
+ it('should call the request method of the port object with the correct arguments', () => {
55
+ ClipBoard.copyWithBrowserExtension(toCopy, portMock);
56
+ expect(portMock.request).toHaveBeenCalledWith('passbolt.clipboard.copy', toCopy);
57
+ });
58
+ });
59
+ });