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,341 @@
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.0
13
+ */
14
+
15
+ import {AdminMfaContextProvider} from "../../../../react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext";
16
+ import {defaultProps, mockDuoError} from "../../../../react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.data";
17
+ import {enableFetchMocks} from 'jest-fetch-mock';
18
+ import MfaFormService from './MfaFormService';
19
+ import {mockYubikeyError} from '../../../../react-extension/components/Administration/DisplayMfaAdministration/DisplayMfaAdministration.test.data';
20
+
21
+ beforeEach(() => {
22
+ jest.resetModules();
23
+ });
24
+
25
+ describe("MfaFormService", () => {
26
+ let adminMfaContext, // The adminMfaContext to test
27
+ mfaFormService;
28
+ const translation = message => message;
29
+ const props = defaultProps(); // The props to pass
30
+
31
+ beforeEach(() => {
32
+ jest.resetAllMocks();
33
+ adminMfaContext = new AdminMfaContextProvider(props);
34
+ const setStateMock = state => adminMfaContext.state = Object.assign(adminMfaContext.state, state);
35
+ jest.spyOn(adminMfaContext, "setState").mockImplementation(setStateMock);
36
+ MfaFormService.killInstance();
37
+ mfaFormService = MfaFormService.getInstance(adminMfaContext, translation);
38
+ enableFetchMocks();
39
+ });
40
+
41
+ describe("MfaFormService::getInstance", () => {
42
+ it("should be a singleton", () => {
43
+ expect.assertions(1);
44
+ expect(mfaFormService).toBeDefined();
45
+ });
46
+
47
+ it("should not create a new instance", () => {
48
+ const newInstance = MfaFormService.getInstance();
49
+ expect.assertions(1);
50
+ expect(mfaFormService).toEqual(newInstance);
51
+ });
52
+ });
53
+
54
+
55
+ describe("MfaFormService::killInstance", () => {
56
+ it("should kill the instance and create a new one", () => {
57
+ MfaFormService.killInstance();
58
+ mfaFormService = MfaFormService.getInstance(null, null);
59
+ expect.assertions(1);
60
+ expect(mfaFormService).toEqual({"context": null, "translation": null});
61
+ });
62
+ });
63
+
64
+ describe("MfaFormService::validateYubikeyClientIdentifier", () => {
65
+ it("should return required message", () => {
66
+ const requiredMessage = "A client identifier is required.";
67
+ const result = mfaFormService.validateYubikeyClientIdentifier("");
68
+ expect.assertions(2);
69
+ expect(result).toEqual(requiredMessage);
70
+ expect(adminMfaContext.getErrors().yubikeyClientIdentifierError).toEqual(requiredMessage);
71
+ });
72
+ it("should return regex message", () => {
73
+ const errorMessage = "The client identifier should be an integer.";
74
+ //Letters are not allowed
75
+ let result = mfaFormService.validateYubikeyClientIdentifier("FFFF");
76
+
77
+ expect.assertions(4);
78
+ expect(result).toEqual(errorMessage);
79
+ //Max size 64
80
+ result = mfaFormService.validateYubikeyClientIdentifier("F".repeat(65));
81
+ expect(result).toEqual(errorMessage);
82
+ //No special characters
83
+ result = mfaFormService.validateYubikeyClientIdentifier("@@");
84
+ expect(result).toEqual(errorMessage);
85
+ expect(adminMfaContext.getErrors().yubikeyClientIdentifierError).toEqual(errorMessage);
86
+ });
87
+ it("should not return message", () => {
88
+ //Only numbers are allowed
89
+ const result = mfaFormService.validateYubikeyClientIdentifier("123456789");
90
+ expect.assertions(2);
91
+ expect(result).toEqual(null);
92
+ expect(adminMfaContext.getErrors().yubikeyClientIdentifierError).toEqual(null);
93
+ });
94
+ });
95
+
96
+ describe("MfaFormService::validateYubikeySecretKey", () => {
97
+ it("should return required message", () => {
98
+ const requiredMessage = "A secret key is required.";
99
+ const result = mfaFormService.validateYubikeySecretKey("");
100
+ expect.assertions(2);
101
+ expect(result).toEqual(requiredMessage);
102
+ expect(adminMfaContext.getErrors().yubikeySecretKeyError).toEqual(requiredMessage);
103
+ });
104
+ it("should return regex message", () => {
105
+ const errorMessage = "The client identifier should be an integer.";
106
+ //only / = + characters are allowed
107
+ let result = mfaFormService.validateYubikeyClientIdentifier("FFFFF12345**");
108
+ expect.assertions(4);
109
+ expect(result).toEqual(errorMessage);
110
+ //Max size 128
111
+ result = mfaFormService.validateYubikeyClientIdentifier("F".repeat(129));
112
+ expect(result).toEqual(errorMessage);
113
+ //Min size 10
114
+ result = mfaFormService.validateYubikeyClientIdentifier("@".repeat(9));
115
+ expect(result).toEqual(errorMessage);
116
+ expect(adminMfaContext.getErrors().yubikeyClientIdentifierError).toEqual(errorMessage);
117
+ });
118
+ it("should not return message", () => {
119
+ //Only without sensitive letters and number and / = + are allowed
120
+ let result = mfaFormService.validateYubikeySecretKey("mk6lyijz2AIhX3D9eLIYAxv63Co=");
121
+ expect(result).toEqual(null);
122
+ result = mfaFormService.validateYubikeySecretKey("mk6lyijz2AIhX3D9eLIYAxv63Co+");
123
+ expect(result).toEqual(null);
124
+ result = mfaFormService.validateYubikeySecretKey("mk6lyijz2AIhX3D9eLIYAxv63Co/");
125
+ expect(result).toEqual(null);
126
+ expect(adminMfaContext.getErrors().yubikeySecretKeyError).toEqual(null);
127
+ expect.assertions(4);
128
+ });
129
+ });
130
+
131
+ describe("MfaFormService::validateDuoHostname", () => {
132
+ it("should return required message", () => {
133
+ const requiredMessage = "A hostname is required.";
134
+ const result = mfaFormService.validateDuoHostname("");
135
+ expect(result).toEqual(requiredMessage);
136
+ expect(adminMfaContext.getErrors().duoHostnameError).toEqual(requiredMessage);
137
+ expect.assertions(2);
138
+ });
139
+ it("should return regex message", () => {
140
+ const errorMessage = "This is not a valid hostname.";
141
+ //hostname should start with 'api-'
142
+ let result = mfaFormService.validateDuoHostname("123456789-duosecurity.com");
143
+ expect(result).toEqual(errorMessage);
144
+ //hostname should include '-duosecurity.com'
145
+ result = mfaFormService.validateDuoHostname("api-123456789-passbolt.com");
146
+ expect(result).toEqual(errorMessage);
147
+ //hostname should not include special character
148
+ result = mfaFormService.validateDuoHostname("api-123456@89-duosecurity.com");
149
+ //hostname have uuid with max 16 characters
150
+ result = mfaFormService.validateDuoHostname("api-0123456789azertyu-duosecurity.com");
151
+ //hostname have uuid with min 8 characters
152
+ result = mfaFormService.validateDuoHostname("api-1L-duosecurity.com");
153
+ expect(result).toEqual(errorMessage);
154
+ expect(adminMfaContext.getErrors().duoHostnameError).toEqual(errorMessage);
155
+ expect.assertions(4);
156
+ });
157
+ it("should not return message", () => {
158
+ const result = mfaFormService.validateDuoHostname("api-634253af.duosecurity.com");
159
+ expect.assertions(2);
160
+ expect(result).toEqual(null);
161
+ expect(adminMfaContext.getErrors().duoHostnameError).toEqual(null);
162
+ });
163
+ });
164
+
165
+ describe("MfaFormService::validateDuoIntegrationKey", () => {
166
+ it("should return required message", () => {
167
+ const requiredMessage = "An integration key is required.";
168
+ const result = mfaFormService.validateDuoIntegrationKey("");
169
+ expect.assertions(2);
170
+ expect(result).toEqual(requiredMessage);
171
+ expect(adminMfaContext.getErrors().duoIntegrationKeyError).toEqual(requiredMessage);
172
+ });
173
+ it("should return regex message", () => {
174
+ const errorMessage = "This is not a valid integration key.";
175
+ //Min size 64
176
+ let result = mfaFormService.validateDuoIntegrationKey("F".repeat(15));
177
+ expect(result).toEqual(errorMessage);
178
+ //Max size 64
179
+ result = mfaFormService.validateDuoIntegrationKey("F".repeat(33));
180
+ expect(result).toEqual(errorMessage);
181
+ //No special characters
182
+ result = mfaFormService.validateDuoIntegrationKey("@&'");
183
+ expect(result).toEqual(errorMessage);
184
+ expect(adminMfaContext.getErrors().duoIntegrationKeyError).toEqual(errorMessage);
185
+ expect.assertions(4);
186
+ });
187
+ it("should not return message", () => {
188
+ //only upper and lowercase letters with numbers
189
+ const result = mfaFormService.validateDuoIntegrationKey("0123456789AZERTY");
190
+ expect(result).toEqual(null);
191
+ expect(adminMfaContext.getErrors().duoIntegrationKeyError).toEqual(null);
192
+ expect.assertions(2);
193
+ });
194
+ });
195
+
196
+ describe("MfaFormService::validateDuoSecretKey", () => {
197
+ it("should return required message", () => {
198
+ const requiredMessage = "A secret key is required.";
199
+ const result = mfaFormService.validateDuoSecretKey("");
200
+ expect(result).toEqual(requiredMessage);
201
+ expect(adminMfaContext.getErrors().duoSecretKeyError).toEqual(requiredMessage);
202
+ expect.assertions(2);
203
+ });
204
+ it("should return regex message", () => {
205
+ const errorMessage = "This is not a valid secret key.";
206
+
207
+ //Min size 32
208
+ let result = mfaFormService.validateDuoSecretKey("F".repeat(31));
209
+ expect(result).toEqual(errorMessage);
210
+ //Max size 129
211
+ result = mfaFormService.validateDuoSecretKey("F".repeat(129));
212
+ expect(result).toEqual(errorMessage);
213
+ //No special characters
214
+ result = mfaFormService.validateDuoSecretKey("@$ù=");
215
+ expect(result).toEqual(errorMessage);
216
+ expect(adminMfaContext.getErrors().duoSecretKeyError).toEqual(errorMessage);
217
+ expect.assertions(4);
218
+ });
219
+ it("should not return message", () => {
220
+ //only upper and lowercase letters with numbers
221
+ const result = mfaFormService.validateDuoSecretKey("aZ7".repeat(11));
222
+ expect(result).toEqual(null);
223
+ expect(adminMfaContext.getErrors().duoSecretKeyError).toEqual(null);
224
+ expect.assertions(2);
225
+ });
226
+ });
227
+
228
+ describe("MfaFormService::validateDuoSalt", () => {
229
+ it("should return required message", () => {
230
+ const requiredMessage = "A salt is required.";
231
+ const result = mfaFormService.validateDuoSalt("");
232
+ expect(result).toEqual(requiredMessage);
233
+ expect(adminMfaContext.getErrors().duoSaltError).toEqual(requiredMessage);
234
+ expect.assertions(2);
235
+ });
236
+ it("should return regex message", () => {
237
+ const errorMessage = "The salt should be between 40 and 128 characters in length.";
238
+
239
+ //Min size 32
240
+ let result = mfaFormService.validateDuoSalt("F".repeat(39));
241
+ expect(result).toEqual(errorMessage);
242
+ //Max size 129
243
+ result = mfaFormService.validateDuoSalt("F".repeat(129));
244
+ expect(result).toEqual(errorMessage);
245
+ expect(adminMfaContext.getErrors().duoSaltError).toEqual(errorMessage);
246
+ expect.assertions(3);
247
+ });
248
+ it("should not return message", () => {
249
+ //Oall characters allowed
250
+ const result = mfaFormService.validateDuoSalt("aZ7@".repeat(10));
251
+ expect(result).toEqual(null);
252
+ expect(adminMfaContext.getErrors().duoSaltError).toEqual(null);
253
+ expect.assertions(2);
254
+ });
255
+ });
256
+
257
+ describe("MfaFormService::validateDuoInputs", () => {
258
+ it("should not validate if duo is not selected", () => {
259
+ adminMfaContext.setSettings("duoToggle", false);
260
+ const result = mfaFormService.validateDuoInputs();
261
+ expect(result).toEqual({});
262
+ expect.assertions(1);
263
+ });
264
+
265
+ it("should validate if duo is selected", () => {
266
+ adminMfaContext.setSettings("duoToggle", true);
267
+
268
+ jest.spyOn(mfaFormService, "validateDuoHostname");
269
+ jest.spyOn(mfaFormService, "validateDuoIntegrationKey");
270
+ jest.spyOn(mfaFormService, "validateDuoSecretKey");
271
+ jest.spyOn(mfaFormService, "validateDuoSalt");
272
+
273
+ const result = mfaFormService.validateDuoInputs();
274
+ const settings = adminMfaContext.getSettings();
275
+
276
+
277
+ expect(mfaFormService.validateDuoHostname).toHaveBeenCalledWith(settings.duoHostname);
278
+ expect(mfaFormService.validateDuoIntegrationKey).toHaveBeenCalledWith(settings.duoIntegrationKey);
279
+ expect(mfaFormService.validateDuoSecretKey).toHaveBeenCalledWith(settings.duoSecretKey);
280
+ expect(mfaFormService.validateDuoSalt).toHaveBeenCalledWith(settings.duoSalt);
281
+ expect(result).toEqual(mockDuoError());
282
+ expect.assertions(5);
283
+ });
284
+ });
285
+
286
+ describe("MfaFormService::validateYubikeyInputs", () => {
287
+ it("should not validate if yubikey is not selected", () => {
288
+ adminMfaContext.setSettings("yubikeyToggle", false);
289
+
290
+ const result = mfaFormService.validateYubikeyInputs();
291
+
292
+ expect(result).toEqual({});
293
+ });
294
+
295
+ it("should validate if duo is selected", () => {
296
+ adminMfaContext.setSettings("yubikeyToggle", true);
297
+
298
+ jest.spyOn(mfaFormService, "validateYubikeyClientIdentifier");
299
+ jest.spyOn(mfaFormService, "validateYubikeySecretKey");
300
+
301
+ const result = mfaFormService.validateYubikeyInputs();
302
+ const settings = adminMfaContext.getSettings();
303
+
304
+ expect(mfaFormService.validateYubikeyClientIdentifier).toHaveBeenCalledWith(settings.yubikeyClientIdentifier);
305
+ expect(mfaFormService.validateYubikeySecretKey).toHaveBeenCalledWith(settings.yubikeySecretKey);
306
+ expect(result).toEqual(mockYubikeyError());
307
+ expect.assertions(3);
308
+ });
309
+ });
310
+
311
+ describe("MfaFormService::validate", () => {
312
+ it("should return false if there are some validation issues", async() => {
313
+ adminMfaContext.setSettings("yubikeyToggle", true);
314
+ adminMfaContext.setSettings("duoToggle", true);
315
+
316
+ jest.spyOn(mfaFormService, "validateYubikeyInputs");
317
+ jest.spyOn(mfaFormService, "validateDuoInputs");
318
+
319
+ const result = await mfaFormService.validate();
320
+ const errors = adminMfaContext.getErrors();
321
+
322
+ expect(result).toBeFalsy();
323
+ expect(mfaFormService.validateYubikeyInputs).toHaveBeenCalled();
324
+ expect(mfaFormService.validateDuoInputs).toHaveBeenCalled();
325
+ expect(errors).toEqual(Object.assign(mockYubikeyError(), mockDuoError()));
326
+ expect.assertions(4);
327
+ });
328
+ it("should return true if validation succeed", async() => {
329
+ jest.spyOn(mfaFormService, "validateYubikeyInputs");
330
+ jest.spyOn(mfaFormService, "validateDuoInputs");
331
+
332
+ const result = await mfaFormService.validate();
333
+
334
+ expect(result).toBeTruthy();
335
+ expect(mfaFormService.validateYubikeyInputs).toHaveBeenCalled();
336
+ expect(mfaFormService.validateDuoInputs).toHaveBeenCalled();
337
+ expect.assertions(3);
338
+ });
339
+ });
340
+ });
341
+
@@ -0,0 +1,92 @@
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.0
13
+ */
14
+
15
+ import DomainUtil from '../../../../react-extension/lib/Domain/DomainUtil';
16
+ import MapObject from '../../../../react-extension/lib/Map/MapObject';
17
+
18
+ /**
19
+ * Model related to the Self Registration form settings
20
+ */
21
+ class SelfRegistrationFormService {
22
+ /**
23
+ * Constructor
24
+ *
25
+ * @param {context} context
26
+ * @public
27
+ */
28
+ constructor(translate) {
29
+ this.translate = translate;
30
+ }
31
+
32
+ fields = new Map();
33
+
34
+ /**
35
+ * Validate the form.
36
+ * @returns {Promise<boolean>}
37
+ */
38
+ async validate(domains) {
39
+ this.fields = domains;
40
+ // Validate the form inputs.
41
+ const validation = this.validateInputs();
42
+ //Check if we have errors
43
+ return validation;
44
+ }
45
+
46
+ /**
47
+ * Validate inputs.
48
+ * @returns {Promise<void>}
49
+ */
50
+ validateInputs() {
51
+ const errors = new Map();
52
+ this.fields.forEach((value, key) => {
53
+ this.validateInput(key, value, errors);
54
+ });
55
+ return errors;
56
+ }
57
+
58
+ /**
59
+ * Validate inputs.
60
+ * @params {string} The input name
61
+ * @params {string} The input value
62
+ * @returns {Promise<void>}
63
+ */
64
+ async validateInput(key, value, errors) {
65
+ if (!value.length) {
66
+ errors.set(key, this.translate("A domain is required."));
67
+ } else {
68
+ try {
69
+ DomainUtil.checkDomainValidity(value);
70
+ } catch {
71
+ errors.set(key, this.translate("This should be a valid domain"));
72
+ }
73
+ }
74
+ //Avoid duplicate value
75
+ this.checkDuplicateValue(errors);
76
+ }
77
+
78
+ /**
79
+ * Check if we have a duplication.
80
+ * @returns {Promise<void>}
81
+ */
82
+ checkDuplicateValue(inputErrors) {
83
+ this.fields.forEach((value, key) => {
84
+ const hasDuplicate = MapObject.listValues(this.fields).filter(domain => domain === value && domain !== "").length > 1;
85
+ if (hasDuplicate) {
86
+ inputErrors.set(key, this.translate("This domain already exist"));
87
+ }
88
+ });
89
+ }
90
+ }
91
+
92
+ export default SelfRegistrationFormService;
@@ -0,0 +1,101 @@
1
+ /**
2
+ *import { userDirectoryContext } from '../../../../react-extension/contexts/Administration/AdministrationMfa/AdministrationMfaContext';
3
+ * Passbolt ~ Open source password manager for teams
4
+ * Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
5
+ *
6
+ * Licensed under GNU Affero General Public License version 3 of the or any later version.
7
+ * For full copyright and license information, please see the LICENSE.txt
8
+ * Redistributions of files must retain the above copyright notice.
9
+ *
10
+ * @copyright Copyright (c) 2022 Passbolt SA (https://www.passbolt.com)
11
+ * @license https://opensource.org/licenses/AGPL-3.0 AGPL License
12
+ * @link https://www.passbolt.com Passbolt(tm)
13
+ * @since 3.8.3
14
+ */
15
+
16
+
17
+ import {enableFetchMocks} from 'jest-fetch-mock';
18
+ import {AdminSelfRegistrationContextProvider} from "../../../../react-extension/contexts/Administration/AdministrationSelfRegistration/AdministrationSelfRegistrationContext";
19
+ import {defaultProps} from '../../../../react-extension/components/Administration/DisplaySelfRegistrationAdministration/ConfirmSaveSelfRegistrationSettings/ConfirmSaveSelfRegistrationSettings.test.data';
20
+ import SelfRegistrationFormService from './SelfRegistrationFormService';
21
+ import SelfRegistrationDomainsViewModel from '../../../models/selfRegistration/SelfRegistrationDomainsViewModel';
22
+ import MapObject from '../../../../react-extension/lib/Map/MapObject';
23
+
24
+ beforeEach(() => {
25
+ jest.resetModules();
26
+ });
27
+
28
+ describe("SelfRegistrationFormService", () => {
29
+ let selfRegistrationContext, // The selfRegistrationContext to test
30
+ selfRegistrationFormService;
31
+ const translation = message => message;
32
+ const props = defaultProps(); // The props to pass
33
+ const uuid = "2bb8b096-06ce-4c9a-a627-ec30ce045a83";
34
+
35
+ beforeEach(() => {
36
+ jest.resetAllMocks();
37
+ selfRegistrationContext = new AdminSelfRegistrationContextProvider(props);
38
+ mockState(selfRegistrationContext);
39
+ selfRegistrationFormService = new SelfRegistrationFormService(translation);
40
+ enableFetchMocks();
41
+ });
42
+
43
+
44
+ describe("UserDirectoryFormService::validateInput", () => {
45
+ it("should return required message", async() => {
46
+ expect.assertions(1);
47
+ const errors = new Map();
48
+ await selfRegistrationFormService.validateInput(uuid, "", errors);
49
+ expect(errors.get(uuid)).toEqual("A domain is required.");
50
+ });
51
+
52
+ it("should return a message to reject domain format", async() => {
53
+ expect.assertions(1);
54
+ const errors = new Map();
55
+ await selfRegistrationFormService.validateInput(uuid, "localhost", errors);
56
+ expect(errors.get(uuid)).toEqual("This should be a valid domain");
57
+ });
58
+
59
+ it("should call checkDuplicateValue", async() => {
60
+ jest.spyOn(selfRegistrationFormService, "checkDuplicateValue");
61
+ const errors = new Map();
62
+ await selfRegistrationFormService.validateInput(uuid, "hello.world", errors);
63
+ expect.assertions(1);
64
+ expect(selfRegistrationFormService.checkDuplicateValue).toHaveBeenCalled();
65
+ });
66
+ });
67
+
68
+ describe("UserDirectoryFormService::checkDuplicateValue", () => {
69
+ it("should return a message which indicate that the domain already exist", async() => {
70
+ selfRegistrationFormService.fields = ["passbolt.com", "passbolt.com"];
71
+ expect.assertions(1);
72
+ const errors = new Map();
73
+ await selfRegistrationFormService.checkDuplicateValue(errors);
74
+ expect(MapObject.listValues(errors)).toEqual(["This domain already exist", "This domain already exist"]);
75
+ });
76
+
77
+ it("should not return a message", async() => {
78
+ const domains = new SelfRegistrationDomainsViewModel(
79
+ {data: {"allowed_domains": ["passbolt.com"]}}
80
+ );
81
+ await selfRegistrationContext.setDomains(domains);
82
+ expect.assertions(1);
83
+ const errors = new Map();
84
+ await selfRegistrationFormService.checkDuplicateValue(errors);
85
+ expect(errors.size).toEqual(0);
86
+ });
87
+ });
88
+ });
89
+
90
+ function mockState(adminSelfRegistrationContext) {
91
+ const setStateMock = state => {
92
+ let newState;
93
+ if (typeof state === 'function') {
94
+ newState = state(adminSelfRegistrationContext.state);
95
+ } else {
96
+ newState = state;
97
+ }
98
+ adminSelfRegistrationContext.state = Object.assign(adminSelfRegistrationContext.state, newState);
99
+ };
100
+ jest.spyOn(adminSelfRegistrationContext, "setState").mockImplementation(setStateMock);
101
+ }
@@ -0,0 +1,118 @@
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.0
13
+ */
14
+
15
+ import XRegExp from 'xregexp';
16
+
17
+ /**
18
+ * Model related to the User Directory form settings
19
+ */
20
+ class UserDirectoryFormService {
21
+ /**
22
+ * Constructor
23
+ *
24
+ * @param {context} context
25
+ * @public
26
+ */
27
+ constructor(context, translate) {
28
+ this.context = context;
29
+ this.translate = translate;
30
+ }
31
+
32
+ /**
33
+ * getInstance for singleton pattern
34
+ * @param {context} context
35
+ * @public
36
+ */
37
+ static getInstance(context, translate) {
38
+ if (!this.instance) {
39
+ this.instance = new UserDirectoryFormService(context, translate);
40
+ }
41
+ return this.instance;
42
+ }
43
+
44
+ /**
45
+ * killInstance singleton
46
+ * @param {context} context
47
+ * @public
48
+ */
49
+ static killInstance() {
50
+ this.instance = null;
51
+ }
52
+
53
+ /**
54
+ * Validate the form.
55
+ * @returns {Promise<boolean>}
56
+ */
57
+ async validate() {
58
+ // Validate the form inputs.
59
+ const validation = {
60
+ ...this.validateHostInput(),
61
+ ...this.validatePortInput(),
62
+ ...this.validateDomainInput()
63
+ };
64
+
65
+ await this.context.setErrors(validation);
66
+ //Check if we have errors
67
+ return Object.values(validation).filter(x => x).length === 0;
68
+ }
69
+
70
+ /**
71
+ * Validate the host input.
72
+ * @returns {Promise<void>}
73
+ */
74
+ validateHostInput() {
75
+ const settings = this.context.getSettings();
76
+ let hostError = null;
77
+ const host = settings.host.trim();
78
+ if (!host.length) {
79
+ hostError = this.translate("A host is required.");
80
+ }
81
+ this.context.setError("hostError", hostError);
82
+ return {hostError};
83
+ }
84
+
85
+ /**
86
+ * Validate the port input.
87
+ * @returns {Promise<void>}
88
+ */
89
+ validatePortInput() {
90
+ const settings = this.context.getSettings();
91
+ let portError = null;
92
+ const port = settings.port.trim();
93
+ if (!port.length) {
94
+ portError = this.translate("A port is required.");
95
+ } else if (!XRegExp("^[0-9]+").test(port)) {
96
+ portError = this.translate("Only numeric characters allowed.");
97
+ }
98
+ this.context.setError("portError", portError);
99
+ return {portError};
100
+ }
101
+
102
+ /**
103
+ * Validate the domain input.
104
+ * @returns {Promise<void>}
105
+ */
106
+ validateDomainInput() {
107
+ const settings = this.context.getSettings();
108
+ let domainError = null;
109
+ const domain = settings.domain.trim();
110
+ if (!domain.length) {
111
+ domainError = this.translate("A domain name is required.");
112
+ }
113
+ this.context.setError("domainError", domainError);
114
+ return {domainError};
115
+ }
116
+ }
117
+
118
+ export default UserDirectoryFormService;