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
@@ -45,7 +45,8 @@ describe("AuthenticationLoginContextProvider", () => {
45
45
  mockComponentSetState(contextProvider);
46
46
 
47
47
  expect.assertions(2);
48
- await contextProvider.initialize();
48
+ await contextProvider.componentDidMount();
49
+
49
50
  expect(props.context.port.requestListeners["passbolt.auth.verify-server-key"]).toHaveBeenCalled();
50
51
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGN_IN);
51
52
  });
@@ -56,7 +57,7 @@ describe("AuthenticationLoginContextProvider", () => {
56
57
  mockComponentSetState(contextProvider);
57
58
 
58
59
  expect.assertions(4);
59
- await contextProvider.initialize();
60
+ await contextProvider.componentDidMount();
60
61
  expect(props.context.port.requestListeners["passbolt.auth.verify-server-key"]).toHaveBeenCalled();
61
62
  expect(props.context.port.requestListeners["passbolt.auth.get-server-key"]).toHaveBeenCalled();
62
63
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.ACCEPT_NEW_SERVER_KEY);
@@ -70,7 +71,7 @@ describe("AuthenticationLoginContextProvider", () => {
70
71
  mockComponentSetState(contextProvider);
71
72
 
72
73
  expect.assertions(3);
73
- await contextProvider.initialize();
74
+ await contextProvider.componentDidMount();
74
75
  expect(props.context.port.requestListeners["passbolt.auth.verify-server-key"]).toHaveBeenCalled();
75
76
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.UNEXPECTED_ERROR);
76
77
  expect(contextProvider.state.error.message).toEqual("Unexpected error");
@@ -84,7 +85,7 @@ describe("AuthenticationLoginContextProvider", () => {
84
85
  mockComponentSetState(contextProvider);
85
86
 
86
87
  expect.assertions(3);
87
- await contextProvider.initialize();
88
+ await contextProvider.componentDidMount();
88
89
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.ACCEPT_NEW_SERVER_KEY);
89
90
  await contextProvider.acceptNewServerKey();
90
91
  expect(props.context.port.requestListeners["passbolt.auth.replace-server-key"]).toHaveBeenCalled();
@@ -98,7 +99,7 @@ describe("AuthenticationLoginContextProvider", () => {
98
99
  mockComponentSetState(contextProvider);
99
100
 
100
101
  expect.assertions(4);
101
- await contextProvider.initialize();
102
+ await contextProvider.componentDidMount();
102
103
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.ACCEPT_NEW_SERVER_KEY);
103
104
  await contextProvider.acceptNewServerKey();
104
105
  expect(props.context.port.requestListeners["passbolt.auth.replace-server-key"]).toHaveBeenCalled();
@@ -114,7 +115,7 @@ describe("AuthenticationLoginContextProvider", () => {
114
115
  mockComponentSetState(contextProvider);
115
116
 
116
117
  expect.assertions(2);
117
- await contextProvider.initialize();
118
+ await contextProvider.componentDidMount();
118
119
  await contextProvider.checkPassphrase("passphrase");
119
120
  expect(props.context.port.requestListeners["passbolt.auth.verify-passphrase"]).toHaveBeenCalledWith("passphrase", undefined);
120
121
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGN_IN);
@@ -127,7 +128,7 @@ describe("AuthenticationLoginContextProvider", () => {
127
128
  mockComponentSetState(contextProvider);
128
129
 
129
130
  expect.assertions(3);
130
- await contextProvider.initialize();
131
+ await contextProvider.componentDidMount();
131
132
  try {
132
133
  await contextProvider.checkPassphrase("passphrase");
133
134
  expect(false).toBeTruthy();
@@ -145,7 +146,7 @@ describe("AuthenticationLoginContextProvider", () => {
145
146
  mockComponentSetState(contextProvider);
146
147
 
147
148
  expect.assertions(3);
148
- await contextProvider.initialize();
149
+ await contextProvider.componentDidMount();
149
150
  await contextProvider.checkPassphrase("passphrase");
150
151
  expect(props.context.port.requestListeners["passbolt.auth.verify-passphrase"]).toHaveBeenCalledWith("passphrase", undefined);
151
152
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.UNEXPECTED_ERROR);
@@ -160,7 +161,7 @@ describe("AuthenticationLoginContextProvider", () => {
160
161
  mockComponentSetState(contextProvider);
161
162
 
162
163
  expect.assertions(2);
163
- await contextProvider.initialize();
164
+ await contextProvider.componentDidMount();
164
165
  await contextProvider.signIn("passphrase");
165
166
  expect(props.context.port.requestListeners["passbolt.auth.login"]).toHaveBeenCalledWith("passphrase", false, undefined);
166
167
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGNING_IN);
@@ -173,7 +174,7 @@ describe("AuthenticationLoginContextProvider", () => {
173
174
  mockComponentSetState(contextProvider);
174
175
 
175
176
  expect.assertions(2);
176
- await contextProvider.initialize();
177
+ await contextProvider.componentDidMount();
177
178
  await contextProvider.signIn("passphrase");
178
179
  expect(props.context.port.requestListeners["passbolt.auth.login"]).toHaveBeenCalledWith("passphrase", false, undefined);
179
180
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGN_IN_ERROR);
@@ -187,7 +188,7 @@ describe("AuthenticationLoginContextProvider", () => {
187
188
  mockComponentSetState(contextProvider);
188
189
 
189
190
  expect.assertions(1);
190
- await contextProvider.initialize();
191
+ await contextProvider.componentDidMount();
191
192
  await contextProvider.needHelpCredentialsLost();
192
193
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.INITIATE_ACCOUNT_RECOVERY);
193
194
  });
@@ -198,7 +199,7 @@ describe("AuthenticationLoginContextProvider", () => {
198
199
  mockComponentSetState(contextProvider);
199
200
 
200
201
  expect.assertions(1);
201
- await contextProvider.initialize();
202
+ await contextProvider.componentDidMount();
202
203
  await contextProvider.needHelpCredentialsLost();
203
204
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.HELP_CREDENTIALS_LOST);
204
205
  });
@@ -211,7 +212,7 @@ describe("AuthenticationLoginContextProvider", () => {
211
212
  mockComponentSetState(contextProvider);
212
213
 
213
214
  expect.assertions(2);
214
- await contextProvider.initialize();
215
+ await contextProvider.componentDidMount();
215
216
  await contextProvider.requestHelpCredentialsLost();
216
217
  expect(props.context.port.requestListeners["passbolt.auth.request-help-credentials-lost"]).toHaveBeenCalled();
217
218
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.CHECK_MAILBOX);
@@ -224,11 +225,88 @@ describe("AuthenticationLoginContextProvider", () => {
224
225
  mockComponentSetState(contextProvider);
225
226
 
226
227
  expect.assertions(3);
227
- await contextProvider.initialize();
228
+ await contextProvider.componentDidMount();
228
229
  await contextProvider.requestHelpCredentialsLost();
229
230
  expect(props.context.port.requestListeners["passbolt.auth.request-help-credentials-lost"]).toHaveBeenCalled();
230
231
  expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.UNEXPECTED_ERROR);
231
232
  expect(contextProvider.state.error.message).toEqual("Unexpected error");
232
233
  });
233
234
  });
235
+
236
+ describe("AuthenticationLoginContextProvider::handleSsoSignIn", () => {
237
+ it("When the user initiates an SSO sign-in, the context should call the sso context to handle the sign-in", async() => {
238
+ const props = defaultProps({
239
+ ssoContext: {
240
+ runSignInProcess: jest.fn(() => {})
241
+ }
242
+ });
243
+ const contextProvider = new AuthenticationLoginContextProvider(props);
244
+ mockComponentSetState(contextProvider);
245
+
246
+ await contextProvider.componentDidMount();
247
+
248
+ expect.assertions(1);
249
+ await contextProvider.handleSsoSignIn();
250
+ expect(props.ssoContext.runSignInProcess).toHaveBeenCalledTimes(1);
251
+ });
252
+
253
+ it("After a successful SSO sign-in the machine state should be SIGNING_IN", async() => {
254
+ const props = defaultProps({
255
+ ssoContext: {
256
+ runSignInProcess: jest.fn(() => {})
257
+ }
258
+ });
259
+ const contextProvider = new AuthenticationLoginContextProvider(props);
260
+ mockComponentSetState(contextProvider);
261
+
262
+ await contextProvider.componentDidMount();
263
+
264
+ expect.assertions(1);
265
+ await contextProvider.handleSsoSignIn();
266
+ expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGNING_IN);
267
+ });
268
+
269
+ it("When the user fails to sign-in for an unexpected reason, the machine state should be on UNEXPECTED_ERROR", async() => {
270
+ const error = new Error("This is an unexpected error");
271
+ const props = defaultProps({
272
+ ssoContext: {
273
+ runSignInProcess: jest.fn(() => { throw error; })
274
+ }
275
+ });
276
+ const contextProvider = new AuthenticationLoginContextProvider(props);
277
+ mockComponentSetState(contextProvider);
278
+
279
+ await contextProvider.componentDidMount();
280
+
281
+ expect.assertions(2);
282
+ await contextProvider.handleSsoSignIn();
283
+ expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.UNEXPECTED_ERROR);
284
+ expect(contextProvider.state.error.message).toEqual(error.message);
285
+ });
286
+
287
+ it("When the user closes the popup, the state should remain on SIGN_IN and the error should be thrown back", async() => {
288
+ const error = new Error("The user closed the pop-up");
289
+ error.name = "UserClosedSsoPopUpError";
290
+
291
+ const props = defaultProps({
292
+ ssoContext: {
293
+ runSignInProcess: jest.fn(() => { throw error; })
294
+ }
295
+ });
296
+
297
+ const contextProvider = new AuthenticationLoginContextProvider(props);
298
+ mockComponentSetState(contextProvider);
299
+ await contextProvider.componentDidMount();
300
+
301
+ expect.assertions(2);
302
+
303
+ try {
304
+ await contextProvider.handleSsoSignIn();
305
+ } catch (e) {
306
+ expect(e).toStrictEqual(error);
307
+ }
308
+
309
+ expect(contextProvider.state.state).toEqual(AuthenticationLoginWorkflowStates.SIGN_IN);
310
+ });
311
+ });
234
312
  });
@@ -29,6 +29,7 @@ export const AuthenticationSetupWorkflowStates = {
29
29
  COMPLETING_SETUP: 'Completing setup',
30
30
  UNEXPECTED_ERROR: 'Unexpected Error',
31
31
  VALIDATE_PASSPHRASE: 'Validate passphrase',
32
+ CONFIGURING_SSO: "Configuring SSO"
32
33
  };
33
34
 
34
35
  /**
@@ -23,6 +23,8 @@ export const NavigationContext = React.createContext({
23
23
  // Administration
24
24
  onGoToAdministrationRequested: () => {
25
25
  }, // Whenever the users wants to navigate to the administration workspace
26
+ onGoToAdministrationSelfRegistrationRequested: () => {
27
+ }, // Whenever the users wants to navigate to the administration workspace self registration
26
28
  onGoToAdministrationMfaRequested: () => {
27
29
  }, // Whenever the users wants to navigate to the administration workspace mfa
28
30
  onGoToAdministrationUsersDirectoryRequested: () => {
@@ -37,6 +39,8 @@ export const NavigationContext = React.createContext({
37
39
  }, // Whenever the users wants to navigate to the administration workspace account recovery
38
40
  onGoToAdministrationSmtpSettingsRequested: () => {
39
41
  }, // Whenever the users wants to navigate to the administration workspace SMTP settings
42
+ onGoToAdministrationSsoRequested: () => {
43
+ }, // Whenever the user wants to navigate to the administration workspace sso
40
44
  // Passwords
41
45
  onGoToPasswordsRequested: () => {
42
46
  }, // Whenever the user wants to navigate to the passwords workspace
@@ -93,6 +97,8 @@ class NavigationContextProvider extends React.Component {
93
97
  onGoToAdministrationInternationalizationRequested: this.onGoToAdministrationInternationalizationRequested.bind(this), // Whenever the user wants to navigate to the administration workspace internationalization
94
98
  onGoToAdministrationAccountRecoveryRequested: this.onGoToAdministrationAccountRecoveryRequested.bind(this), // Whenever the user wants to navigate to the administration workspace account recovery
95
99
  onGoToAdministrationSmtpSettingsRequested: this.onGoToAdministrationSmtpSettingsRequested.bind(this), // Whenever the users wants to navigate to the administration workspace SMTP settings
100
+ onGoToAdministrationSelfRegistrationRequested: this.onGoToAdministrationSelfRegistrationRequested.bind(this), //Whenever the users wants to navigate to the administration workspace self registration settings
101
+ onGoToAdministrationSsoRequested: this.onGoToAdministrationSsoRequested.bind(this), // Whenever the user wants to navigate to the administration workspace sso
96
102
  // Passwords
97
103
  onGoToPasswordsRequested: this.onGoToPasswordsRequested.bind(this), // Whenever the user wants to navigate to the passwords workspace
98
104
  // Users
@@ -151,6 +157,8 @@ class NavigationContextProvider extends React.Component {
151
157
  pathname = "/app/administration/users-directory";
152
158
  } else if (this.isSmtpSettingsEnable) {
153
159
  pathname = "/app/administration/smtp-settings";
160
+ } else if (this.isSelfRegistrationEnable) {
161
+ pathname = "/app/administration/self-registation";
154
162
  }
155
163
  await this.goTo("api", pathname);
156
164
  }
@@ -163,6 +171,15 @@ class NavigationContextProvider extends React.Component {
163
171
  await this.goTo("api", "/app/administration/mfa");
164
172
  }
165
173
 
174
+ /**
175
+ * Whenever the user wants to navigate to the administration workspace selft registration.
176
+ * @returns {Promise<void>}
177
+ */
178
+ async onGoToAdministrationSelfRegistrationRequested() {
179
+ await this.goTo("api", "/app/administration/self-registration");
180
+ }
181
+
182
+
166
183
  /**
167
184
  * Whenever the user wants to navigate to the administration workspace users directory.
168
185
  * @returns {Promise<void>}
@@ -211,6 +228,14 @@ class NavigationContextProvider extends React.Component {
211
228
  await this.goTo("browser-extension", "/app/administration/account-recovery");
212
229
  }
213
230
 
231
+ /**
232
+ * Whenever the user wants to navigate to the administration workspace sso.
233
+ * @returns {Promise<void>}
234
+ */
235
+ async onGoToAdministrationSsoRequested() {
236
+ await this.goTo("browser-extension", "/app/administration/sso");
237
+ }
238
+
214
239
  /**
215
240
  * Returns true if the user has the MFA capability
216
241
  * @returns {boolean}
@@ -238,6 +263,15 @@ class NavigationContextProvider extends React.Component {
238
263
  return siteSettings && siteSettings.canIUse('smtpSettings');
239
264
  }
240
265
 
266
+ /**
267
+ * Returns true if the user has the self registration enabled
268
+ * @returns {boolean}
269
+ */
270
+ get isSelfRegistrationEnable() {
271
+ const siteSettings = this.props.context.siteSettings;
272
+ return siteSettings && siteSettings.canIUse('selfRegistration');
273
+ }
274
+
241
275
  /*
242
276
  * =============================================================
243
277
  * Passwords navigation
@@ -0,0 +1,151 @@
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 = 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}`);
86
+ await this.props.context.port.request('passbolt.auth.post-login-redirect');
87
+ } catch (e) {
88
+ console.error(e);
89
+ this.handleSpecificError(e);
90
+ throw e;
91
+ }
92
+ }
93
+
94
+ /**
95
+ * Handles error from the background page during SSO sign-in.
96
+ * @param {Error} e
97
+ */
98
+ handleSpecificError(e) {
99
+ let errorToThrow = e;
100
+ switch (e.name) {
101
+ case 'InvalidMasterPasswordError': {
102
+ errorToThrow = new Error(this.props.t("The passphrase from the SSO kit doesn't match your private key: {{error}}", {error: e.message}));
103
+ break;
104
+ }
105
+ case 'OutdatedSsoKitError': {
106
+ errorToThrow = new Error(this.props.t("The SSO kit is outdated and can't be used to decrypt your passphrase: {{error}}", {error: e.message}));
107
+ break;
108
+ }
109
+ }
110
+
111
+ throw errorToThrow;
112
+ }
113
+
114
+ /**
115
+ * Render the component
116
+ * @returns {JSX}
117
+ */
118
+ render() {
119
+ return (
120
+ <SsoContext.Provider value={this.state}>
121
+ {this.props.children}
122
+ </SsoContext.Provider>
123
+ );
124
+ }
125
+ }
126
+
127
+ SsoContextProvider.propTypes = {
128
+ context: PropTypes.any, // The application context
129
+ children: PropTypes.any, // The children components
130
+ t: PropTypes.func, // The translation function
131
+ };
132
+ export default withAppContext(withTranslation('common')(SsoContextProvider));
133
+
134
+ /**
135
+ * Resource Workspace Context Consumer HOC
136
+ * @param WrappedComponent
137
+ */
138
+ export function withSso(WrappedComponent) {
139
+ return class withSso extends React.Component {
140
+ render() {
141
+ return (
142
+ <SsoContext.Consumer>
143
+ {
144
+ ssoContext => <WrappedComponent ssoContext={ssoContext} {...this.props} />
145
+ }
146
+ </SsoContext.Consumer>
147
+ );
148
+ }
149
+ };
150
+ }
151
+
@@ -0,0 +1,36 @@
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
+
15
+ import {defaultAppContext} from "./ExtAppContext.test.data";
16
+ import MockPort from "../test/mock/MockPort";
17
+
18
+ /**
19
+ * Default context
20
+ * @param {Object} data The props to override
21
+ * @param {string} providerId the sso provider id configured
22
+ * @returns {object}
23
+ */
24
+ export function defaultProps(data = {}, providerId = null) {
25
+ const port = new MockPort();
26
+ port.addRequestListener("passbolt.sso.get-local-configured-provider", jest.fn(() => Promise.resolve(providerId)));
27
+ port.addRequestListener("passbolt.sso.sign-in-with-azure", jest.fn(() => Promise.resolve()));
28
+ port.addRequestListener("passbolt.auth.post-login-redirect", jest.fn(() => Promise.resolve()));
29
+
30
+ const defaultAuthenticationLoginAppContext = {
31
+ context: {
32
+ port: port,
33
+ }
34
+ };
35
+ return Object.assign(defaultAppContext(defaultAuthenticationLoginAppContext), data);
36
+ }
@@ -0,0 +1,104 @@
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
+
15
+ import each from "jest-each";
16
+ import mockComponentSetState from "../test/mock/components/React/mockSetState";
17
+ import {SsoContextProvider} from "./SsoContext";
18
+ import {defaultProps} from "./SsoContext.test.data";
19
+
20
+ beforeEach(() => {
21
+ jest.resetModules();
22
+ jest.clearAllMocks();
23
+ });
24
+
25
+ describe("SsoContextProvider", () => {
26
+ each([
27
+ {name: "provider is Azure", providerId: "azure"},
28
+ {name: "no provider available", providerId: null},
29
+ ]).describe(`SsoContextProvider configuration handling`, scenario => {
30
+ it(`SsoContextProvider::loadSsoConfiguration: Should call for the background page to retrieve the SSO provider data and set it on its state: ${scenario.name}`, async() => {
31
+ const props = defaultProps(null, scenario.providerId);
32
+ const contextProvider = new SsoContextProvider(props);
33
+ mockComponentSetState(contextProvider);
34
+
35
+ expect.assertions(2);
36
+
37
+ await contextProvider.loadSsoConfiguration();
38
+
39
+ expect(props.context.port.requestListeners["passbolt.sso.get-local-configured-provider"]).toHaveBeenCalled();
40
+ expect(contextProvider.state.ssoLocalConfiguredProvider).toEqual(scenario.providerId);
41
+ });
42
+
43
+ it(`SsoContextProvider::getProvider: Should return the SSO provider id: ${scenario.name}`, async() => {
44
+ const props = defaultProps(null, scenario.providerId);
45
+ const contextProvider = new SsoContextProvider(props);
46
+ mockComponentSetState(contextProvider);
47
+
48
+ expect.assertions(1);
49
+
50
+ await contextProvider.loadSsoConfiguration();
51
+
52
+ expect(contextProvider.getProvider()).toEqual(scenario.providerId);
53
+ });
54
+
55
+ it(`SsoContextProvider::hasUserAnSsoKit: Should return true when an SSO provider is available false otherwise: ${scenario.name}`, async() => {
56
+ const props = defaultProps(null, scenario.providerId);
57
+ const contextProvider = new SsoContextProvider(props);
58
+ mockComponentSetState(contextProvider);
59
+
60
+ expect.assertions(1);
61
+
62
+ await contextProvider.loadSsoConfiguration();
63
+
64
+ expect(contextProvider.hasUserAnSsoKit()).toEqual(Boolean(scenario.providerId));
65
+ });
66
+ });
67
+
68
+ describe("SsoContextProvider::runSignInProcess", () => {
69
+ it("Should call for the background page to delegate the Sign in process", async() => {
70
+ const props = defaultProps(null, "azure");
71
+ const contextProvider = new SsoContextProvider(props);
72
+ mockComponentSetState(contextProvider);
73
+
74
+ expect.assertions(2);
75
+
76
+ await contextProvider.loadSsoConfiguration();
77
+ await contextProvider.runSignInProcess();
78
+
79
+ expect(props.context.port.requestListeners["passbolt.sso.sign-in-with-azure"]).toHaveBeenCalledTimes(1);
80
+ expect(props.context.port.requestListeners["passbolt.auth.post-login-redirect"]).toHaveBeenCalledTimes(1);
81
+ });
82
+
83
+ it("Should throw an error when something wrong happens during sign-in", async() => {
84
+ const error = new Error("An unexpected error occured");
85
+ const props = defaultProps(null, "azure");
86
+ props.context.port.addRequestListener("passbolt.sso.sign-in-with-azure", jest.fn(() => Promise.reject(error)));
87
+ const contextProvider = new SsoContextProvider(props);
88
+ mockComponentSetState(contextProvider);
89
+
90
+ expect.assertions(3);
91
+
92
+ await contextProvider.loadSsoConfiguration();
93
+
94
+ try {
95
+ await contextProvider.runSignInProcess();
96
+ } catch (e) {
97
+ expect(e).toStrictEqual(error);
98
+ }
99
+
100
+ expect(props.context.port.requestListeners["passbolt.sso.sign-in-with-azure"]).toHaveBeenCalledTimes(1);
101
+ expect(props.context.port.requestListeners["passbolt.auth.post-login-redirect"]).not.toHaveBeenCalled();
102
+ });
103
+ });
104
+ });
@@ -0,0 +1,70 @@
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.8.3
13
+ */
14
+
15
+ import XRegExp from 'xregexp';
16
+ import {nonProfessionalDomains} from './Domains';
17
+
18
+ const HOSTNAMEREGEX = "(?:[_\\p{L}0-9][-_\\p{L}0-9]*\\.)*(?:[\\p{L}0-9][-\\p{L}0-9]{0,62})\\.(?:(?:[a-z]{2}\\.)?[a-z]{2,})";
19
+
20
+ /**
21
+ * The DomainUtil which will interact with domains
22
+ */
23
+ class DomainUtil {
24
+ /**
25
+ * Extract domain for email address
26
+ * @param {string} domain
27
+ * @returns {String}
28
+ */
29
+ static extractDomainFromEmail(email) {
30
+ const regex = XRegExp(`(?<=@)${HOSTNAMEREGEX}`);
31
+ const match = XRegExp.match(email, regex);
32
+ return match || "";
33
+ }
34
+
35
+ /**
36
+ * Check if the domain is a profesionnal
37
+ * @param {string} domain
38
+ * @returns {Boolean}
39
+ */
40
+ static isProfessional(domain) {
41
+ return !nonProfessionalDomains.includes(domain);
42
+ }
43
+
44
+ /**
45
+ * Check the domain through regex and URL validation
46
+ * @param {string} domain
47
+ * @returns {Void}
48
+ */
49
+ static checkDomainValidity(domain) {
50
+ const regex = XRegExp(`^${HOSTNAMEREGEX}$`);
51
+ if (!regex.test(domain)) {
52
+ throw new Error(
53
+ "Cannot parse domain. The domain does not match the pattern."
54
+ );
55
+ }
56
+ try {
57
+ // we had https to avoid issue for validation
58
+ const url = new URL(`https://${domain}`);
59
+ if (!url.host) {
60
+ throw new Error(
61
+ "Cannot parse domain. The domain does not match the pattern."
62
+ );
63
+ }
64
+ } catch (error) {
65
+ throw new Error("Cannot parse domain. The domain is not valid.");
66
+ }
67
+ }
68
+ }
69
+
70
+ export default DomainUtil;