modoboa 2.6.0__py3-none-any.whl → 2.6.2__py3-none-any.whl

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 (171) hide show
  1. modoboa/admin/api/v2/serializers.py +5 -0
  2. modoboa/admin/api/v2/tests.py +16 -0
  3. modoboa/admin/api/v2/viewsets.py +11 -1
  4. modoboa/admin/app_settings.py +39 -0
  5. modoboa/admin/lib.py +8 -3
  6. modoboa/admin/models/alias.py +22 -0
  7. modoboa/admin/tests/test_alias_targets.py +68 -0
  8. modoboa/admin/tests/test_mx.py +12 -12
  9. modoboa/autoreply/models.py +2 -2
  10. modoboa/core/commands/templates/settings.py.tpl +11 -1
  11. modoboa/frontend_dist/assets/{AccountAliasForm-Bu1I8sLg.js → AccountAliasForm-BzwhK9cz.js} +1 -1
  12. modoboa/frontend_dist/assets/{AccountEditView-YOpDW-Ob.js → AccountEditView-Dujx5Scp.js} +1 -1
  13. modoboa/frontend_dist/assets/AccountLayout-BDiVTbNa.js +1 -0
  14. modoboa/frontend_dist/assets/{AccountPasswordSubForm-B9X5wAXp.js → AccountPasswordSubForm-DtqTon2C.js} +1 -1
  15. modoboa/frontend_dist/assets/{AccountView-DCqbD7oi.js → AccountView-D8vnHee_.js} +1 -1
  16. modoboa/frontend_dist/assets/{AddressBook-B53LXIsD.js → AddressBook-DWGt9xIC.js} +1 -1
  17. modoboa/frontend_dist/assets/{AdminLayout-DX-RXYiU.js → AdminLayout-GPLTQAzV.js} +1 -1
  18. modoboa/frontend_dist/assets/AlarmsView-DDN5FZ4i.js +1 -0
  19. modoboa/frontend_dist/assets/AlarmsView-Dal0VD8U.css +1 -0
  20. modoboa/frontend_dist/assets/{AliasEditView-BiMPygn9.js → AliasEditView-BeXQf1Ja.js} +1 -1
  21. modoboa/frontend_dist/assets/{AliasRecipientForm-BhQfATiS.js → AliasRecipientForm-CGPKUJVF.js} +1 -1
  22. modoboa/frontend_dist/assets/{AliasView-eIct4lMV.js → AliasView-nnu5M-6u.js} +1 -1
  23. modoboa/frontend_dist/assets/{AuditTrailView-FiUNTjpE.js → AuditTrailView-Bysr09YT.js} +1 -1
  24. modoboa/frontend_dist/assets/{CalendarView-DbWVDoWq.js → CalendarView-CGdVWsxp.js} +1 -1
  25. modoboa/frontend_dist/assets/{ChoiceField-17aCFpF6.js → ChoiceField-k5nIk4ck.js} +1 -1
  26. modoboa/frontend_dist/assets/{ComposeEmailForm-B-BP3lzX.js → ComposeEmailForm-DUyJM2FF.js} +1 -1
  27. modoboa/frontend_dist/assets/ComposeEmailView-Byvgy2YX.js +1 -0
  28. modoboa/frontend_dist/assets/{ConfirmDialog-Dr0i2kqK.js → ConfirmDialog-B0TjtODh.js} +1 -1
  29. modoboa/frontend_dist/assets/{ConnectedLayout-irTI2ekJ.js → ConnectedLayout-C-YqPGtT.js} +1 -1
  30. modoboa/frontend_dist/assets/{CreationForm-BZMhQOez.js → CreationForm-oDKUwmFm.js} +1 -1
  31. modoboa/frontend_dist/assets/{DashboardView-CBpsEG3P.js → DashboardView-D_WPdBgH.js} +1 -1
  32. modoboa/frontend_dist/assets/{DomainAdminList-BikGujRD.js → DomainAdminList-Bv43h5YQ.js} +1 -1
  33. modoboa/frontend_dist/assets/{DomainEditView-SOvfeZWo.js → DomainEditView-wXBS3A63.js} +1 -1
  34. modoboa/frontend_dist/assets/{DomainTransportForm-CmFZ1Cxm.js → DomainTransportForm-DflFVeEo.js} +1 -1
  35. modoboa/frontend_dist/assets/{DomainView-DasOm4jM.js → DomainView-DZn2Rzef.js} +1 -1
  36. modoboa/frontend_dist/assets/DomainsView-BJIxWiDj.js +1 -0
  37. modoboa/frontend_dist/assets/DomainsView-WlF6IHNs.css +1 -0
  38. modoboa/frontend_dist/assets/{EmailField-DpBYkqam.js → EmailField-CFNREcuM.js} +1 -1
  39. modoboa/frontend_dist/assets/{EmailView-D9vO7HHB.js → EmailView-CAukleod.js} +1 -1
  40. modoboa/frontend_dist/assets/EmptyLayout-CgltY47x.js +1 -0
  41. modoboa/frontend_dist/assets/{FiltersView-FjdtF4HL.js → FiltersView-COwmHjdx.js} +1 -1
  42. modoboa/frontend_dist/assets/ForwardEmailView-DxNEqmlZ.js +1 -0
  43. modoboa/frontend_dist/assets/{HtmlEditor-Zn0wjDog.js → HtmlEditor-CSRAxVCo.js} +1 -1
  44. modoboa/frontend_dist/assets/IdentitiesView-ChlrCGeN.js +1 -0
  45. modoboa/frontend_dist/assets/IdentitiesView-Cl2lbfkM.css +1 -0
  46. modoboa/frontend_dist/assets/{InformationView-gEYTQ37R.js → InformationView-Cq0mfs4D.js} +1 -1
  47. modoboa/frontend_dist/assets/{LoadingData-Cxd490P6.js → LoadingData-1iXkFEpZ.js} +1 -1
  48. modoboa/frontend_dist/assets/{LoginCallbackView-C9zhejHH.js → LoginCallbackView-wq3vJcja.js} +1 -1
  49. modoboa/frontend_dist/assets/{LoginView-sWEH834U.js → LoginView-DZQijPLC.js} +1 -1
  50. modoboa/frontend_dist/assets/{MailboxView-Dn3iDym9.js → MailboxView-Xo1djG8R.js} +1 -1
  51. modoboa/frontend_dist/assets/{MenuItems-BRChEdLp.js → MenuItems-Cm9c9dyI.js} +1 -1
  52. modoboa/frontend_dist/assets/{MessageView-CDbJxbxm.js → MessageView-D0810wvi.js} +1 -1
  53. modoboa/frontend_dist/assets/{MessagesView-C_vBxVzN.js → MessagesView-D-BBhhOJ.js} +1 -1
  54. modoboa/frontend_dist/assets/{MigrationsView-D6peiQuR.js → MigrationsView-B-OvKVxP.js} +1 -1
  55. modoboa/frontend_dist/assets/ParametersForm-CPrKRznO.js +1 -0
  56. modoboa/frontend_dist/assets/ParametersForm-t6-3GMDS.css +1 -0
  57. modoboa/frontend_dist/assets/ParametersView-BcyDgfqX.css +1 -0
  58. modoboa/frontend_dist/assets/ParametersView-CMunpHG1.js +1 -0
  59. modoboa/frontend_dist/assets/ParametersView-jdeMts_I.js +1 -0
  60. modoboa/frontend_dist/assets/{ProviderEditView-EH2NSz3x.js → ProviderEditView-CFm5-K3j.js} +1 -1
  61. modoboa/frontend_dist/assets/ProviderGeneralForm-jpkQRqL5.js +1 -0
  62. modoboa/frontend_dist/assets/{ProvidersView-BoH99d3a.js → ProvidersView-D5UWPOH9.js} +1 -1
  63. modoboa/frontend_dist/assets/QuarantineLayout-DbM_Wx4I.js +1 -0
  64. modoboa/frontend_dist/assets/{QuarantineView-BDzDrWwK.js → QuarantineView-B2tBwskg.js} +1 -1
  65. modoboa/frontend_dist/assets/ReplyEmailView-Deogiaa7.js +1 -0
  66. modoboa/frontend_dist/assets/{ResourcesForm-C1YGkT8i.js → ResourcesForm-D5G8hixZ.js} +1 -1
  67. modoboa/frontend_dist/assets/SelfServiceLayout-De0pXOuH.js +1 -0
  68. modoboa/frontend_dist/assets/{SettingsView-Cy5O-88Y.js → SettingsView-BUd1HmFo.js} +2 -2
  69. modoboa/frontend_dist/assets/{StatisticsView-DtlBQK9z.js → StatisticsView-DYzFg6_F.js} +1 -1
  70. modoboa/frontend_dist/assets/{TimeSerieChart-DNjvmMDE.js → TimeSerieChart-DeItUg1R.js} +1 -1
  71. modoboa/frontend_dist/assets/UserLayout-CzNQqfm5.js +1 -0
  72. modoboa/frontend_dist/assets/{VAlert-x6n3drjw.js → VAlert-mUmhR_lW.js} +1 -1
  73. modoboa/frontend_dist/assets/{VApp-C74A9rX5.js → VApp-D-widb3i.js} +1 -1
  74. modoboa/frontend_dist/assets/{VAutocomplete-Bg2AlW_n.js → VAutocomplete-6cfcsvjI.js} +1 -1
  75. modoboa/frontend_dist/assets/{VAvatar-J563boKh.js → VAvatar-BAW2MRci.js} +1 -1
  76. modoboa/frontend_dist/assets/{VBadge-CtEsXuih.js → VBadge-D1u6z0HB.js} +1 -1
  77. modoboa/frontend_dist/assets/{VCard-CJ2oGh_i.js → VCard-DI9bqjLN.js} +1 -1
  78. modoboa/frontend_dist/assets/{VCheckbox-VicuXIJq.js → VCheckbox-CFYky8Vk.js} +1 -1
  79. modoboa/frontend_dist/assets/{VCheckboxBtn-CLh3m66z.js → VCheckboxBtn-B35nMyHy.js} +1 -1
  80. modoboa/frontend_dist/assets/{VChip-DvxO74Mw.js → VChip-C2Lh9BaB.js} +1 -1
  81. modoboa/frontend_dist/assets/{VColorPicker-DcVohVWE.js → VColorPicker-C-5tY_au.js} +1 -1
  82. modoboa/frontend_dist/assets/{VContainer-L2EoH3dT.js → VContainer-CTzYfsVd.js} +1 -1
  83. modoboa/frontend_dist/assets/{VDataTable-CAT0QYJz.js → VDataTable-ClNLUB1Q.js} +1 -1
  84. modoboa/frontend_dist/assets/{VDataTableServer-DP13Fhfa.js → VDataTableServer-DnuQ8rkQ.js} +1 -1
  85. modoboa/frontend_dist/assets/{VDataTableVirtual-LVNemzH7.js → VDataTableVirtual-CbOL_PbK.js} +1 -1
  86. modoboa/frontend_dist/assets/{VDialog-CaQnQSDn.js → VDialog-CqMQCPwz.js} +1 -1
  87. modoboa/frontend_dist/assets/{VExpansionPanels-Dnwgt5uT.js → VExpansionPanels-Cf4WPRqX.js} +1 -1
  88. modoboa/frontend_dist/assets/{VFileInput-z44hJIWr.js → VFileInput-CvKkPeTl.js} +1 -1
  89. modoboa/frontend_dist/assets/{VForm-BwTUBf4u.js → VForm-DUC3-Taa.js} +1 -1
  90. modoboa/frontend_dist/assets/{VInput-Dpmea5z9.js → VInput-B6b2s-5B.js} +1 -1
  91. modoboa/frontend_dist/assets/{VMenu-DDmBlbM8.js → VMenu-sBFHa2zz.js} +1 -1
  92. modoboa/frontend_dist/assets/{VPicker-Dz7GbXwU.js → VPicker-DTZ3WsV_.js} +1 -1
  93. modoboa/frontend_dist/assets/{VProgressCircular-CtqQON49.js → VProgressCircular-BOPNpUlJ.js} +1 -1
  94. modoboa/frontend_dist/assets/{VRadioGroup-WW8uMAv4.js → VRadioGroup-G9uvkWom.js} +1 -1
  95. modoboa/frontend_dist/assets/{VRow-CAbOSEHS.js → VRow-Dnsej546.js} +1 -1
  96. modoboa/frontend_dist/assets/{VSelect-Cdh0qO5m.js → VSelect-BdxqTzW5.js} +1 -1
  97. modoboa/frontend_dist/assets/{VSelectionControl-BN-zQ3C6.js → VSelectionControl-BHD9kDEZ.js} +1 -1
  98. modoboa/frontend_dist/assets/{VSheet-9RDZpWCf.js → VSheet-DRQqJmTV.js} +1 -1
  99. modoboa/frontend_dist/assets/VSpacer-Cxcym55r.js +1 -0
  100. modoboa/frontend_dist/assets/{VSwitch-CixaedmQ.js → VSwitch-bLRfr5zT.js} +1 -1
  101. modoboa/frontend_dist/assets/{VTable-DO7ofPSj.js → VTable-CLV2Uv-1.js} +1 -1
  102. modoboa/frontend_dist/assets/{VTabs-C1-E1DJE.js → VTabs-GZimpcz5.js} +1 -1
  103. modoboa/frontend_dist/assets/{VTextField-C9VUP7V9.js → VTextField-Dt3N956g.js} +1 -1
  104. modoboa/frontend_dist/assets/{VTextarea-B28SmJ2v.js → VTextarea-PA2LHtN4.js} +1 -1
  105. modoboa/frontend_dist/assets/{VToolbar-Cs-fVa4M.js → VToolbar-Du_s_183.js} +1 -1
  106. modoboa/frontend_dist/assets/{VWindowItem-C9PFEbE6.js → VWindowItem-CBUkz4P7.js} +1 -1
  107. modoboa/frontend_dist/assets/{WebmailLayout-Dp6jIazW.js → WebmailLayout-BnRwSunS.js} +1 -1
  108. modoboa/frontend_dist/assets/{accounts-BT429O7P.js → accounts-CxGXJgEh.js} +1 -1
  109. modoboa/frontend_dist/assets/{admin-Cu5rjY7m.js → admin-COcAacoq.js} +1 -1
  110. modoboa/frontend_dist/assets/{aliases-Q4uTcEh4.js → aliases-DJbDT92U.js} +1 -1
  111. modoboa/frontend_dist/assets/{amavis-Bx0pxvRn.js → amavis-BqfDWEXM.js} +1 -1
  112. modoboa/frontend_dist/assets/{amavis-Be87kCqw.js → amavis-CbsMYC6e.js} +1 -1
  113. modoboa/frontend_dist/assets/{contacts-Dx240BT8.js → contacts-BqHRqWBy.js} +1 -1
  114. modoboa/frontend_dist/assets/domains-FSnyP8bd.js +1 -0
  115. modoboa/frontend_dist/assets/domains.store-GfcrCBY7.js +1 -0
  116. modoboa/frontend_dist/assets/{filter-C_GJovn5.js → filter-fudwgMWN.js} +1 -1
  117. modoboa/frontend_dist/assets/{forwardRefs-DPrLRqxP.js → forwardRefs-DDY5bVRf.js} +1 -1
  118. modoboa/frontend_dist/assets/{global.store-CNChIxQL.js → global.store-DrPrIa_j.js} +1 -1
  119. modoboa/frontend_dist/assets/{importExport-7sRHU_3R.js → importExport-D12RGpG8.js} +1 -1
  120. modoboa/frontend_dist/assets/{index-YIGRKgNA.js → index-Be6X7UaJ.js} +9 -9
  121. modoboa/frontend_dist/assets/{layout-BM4C5b2r.js → layout-DD534hN7.js} +1 -1
  122. modoboa/frontend_dist/assets/{layout.store-CCOp6tv6.js → layout.store-ZOCP2JtQ.js} +1 -1
  123. modoboa/frontend_dist/assets/{logos-CboXciB_.js → logos-DY4N2P_F.js} +1 -1
  124. modoboa/frontend_dist/assets/{logs-BeuijmJA.js → logs-CgQS5lzy.js} +1 -1
  125. modoboa/frontend_dist/assets/{parameters-DpVw-Zs4.js → parameters-BOf7j4fc.js} +1 -1
  126. modoboa/frontend_dist/assets/{parameters.store-DRarkO6b.js → parameters.store-6D12J_uw.js} +1 -1
  127. modoboa/frontend_dist/assets/{permissions-C33K6cJv.js → permissions-DxMzIhgI.js} +1 -1
  128. modoboa/frontend_dist/assets/{ssrBoot-CpJ-7WlH.js → ssrBoot-BbpCPk1A.js} +1 -1
  129. modoboa/frontend_dist/assets/{tag-DV1_zOzl.js → tag-D-_IsM8n.js} +1 -1
  130. modoboa/frontend_dist/assets/{theme-BGzdVPko.js → theme-B2lOH8MT.js} +1 -1
  131. modoboa/frontend_dist/assets/transports-K6Dg3jL3.js +1 -0
  132. modoboa/frontend_dist/assets/{webmail-DRyN8JIK.js → webmail-Dtit1NLT.js} +1 -1
  133. modoboa/frontend_dist/index.html +1 -1
  134. modoboa/locale/ja_JP/LC_MESSAGES/django.mo +0 -0
  135. modoboa/locale/ja_JP/LC_MESSAGES/django.po +1 -1
  136. modoboa/locale/zh/LC_MESSAGES/django.mo +0 -0
  137. modoboa/locale/zh/LC_MESSAGES/django.po +1 -1
  138. modoboa/relaydomains/tests.py +1 -1
  139. modoboa/urls.py +0 -5
  140. {modoboa-2.6.0.dist-info → modoboa-2.6.2.dist-info}/METADATA +5 -5
  141. {modoboa-2.6.0.dist-info → modoboa-2.6.2.dist-info}/RECORD +146 -146
  142. modoboa/core/api/v1/tests.py +0 -26
  143. modoboa/frontend_dist/assets/AccountLayout-Cf_FVfvJ.js +0 -1
  144. modoboa/frontend_dist/assets/AlarmsView-9yKGbmkC.css +0 -1
  145. modoboa/frontend_dist/assets/AlarmsView-C0KvogOj.js +0 -1
  146. modoboa/frontend_dist/assets/ComposeEmailView-6JrFhK1W.js +0 -1
  147. modoboa/frontend_dist/assets/DomainsView-DVJA4-oN.js +0 -1
  148. modoboa/frontend_dist/assets/DomainsView-DZ-ss9bI.css +0 -1
  149. modoboa/frontend_dist/assets/EmptyLayout-Dz3F8c7x.js +0 -1
  150. modoboa/frontend_dist/assets/ForwardEmailView-DF5BQJjL.js +0 -1
  151. modoboa/frontend_dist/assets/IdentitiesView-Cf5eQoKA.js +0 -1
  152. modoboa/frontend_dist/assets/IdentitiesView-D3AAiZLZ.css +0 -1
  153. modoboa/frontend_dist/assets/ParametersForm-Dip8Sobe.js +0 -1
  154. modoboa/frontend_dist/assets/ParametersForm-Dk-qwlRm.css +0 -1
  155. modoboa/frontend_dist/assets/ParametersView-CwI0-9kV.js +0 -1
  156. modoboa/frontend_dist/assets/ParametersView-DaKFNERg.css +0 -1
  157. modoboa/frontend_dist/assets/ParametersView-wFKfiEVR.js +0 -1
  158. modoboa/frontend_dist/assets/ProviderGeneralForm-CAVNOJp6.js +0 -1
  159. modoboa/frontend_dist/assets/QuarantineLayout--4g9urq2.js +0 -1
  160. modoboa/frontend_dist/assets/ReplyEmailView-D0VgYBnw.js +0 -1
  161. modoboa/frontend_dist/assets/SelfServiceLayout-BYkSLc4n.js +0 -1
  162. modoboa/frontend_dist/assets/UserLayout-Cgqq7HVi.js +0 -1
  163. modoboa/frontend_dist/assets/VSpacer-BWZq1PhD.js +0 -1
  164. modoboa/frontend_dist/assets/domains-CQv8gtbQ.js +0 -1
  165. modoboa/frontend_dist/assets/domains.store-CfpnnBGo.js +0 -1
  166. modoboa/frontend_dist/assets/transports-B9mWU1W8.js +0 -1
  167. {modoboa-2.6.0.data → modoboa-2.6.2.data}/scripts/modoboa-admin.py +0 -0
  168. {modoboa-2.6.0.dist-info → modoboa-2.6.2.dist-info}/WHEEL +0 -0
  169. {modoboa-2.6.0.dist-info → modoboa-2.6.2.dist-info}/entry_points.txt +0 -0
  170. {modoboa-2.6.0.dist-info → modoboa-2.6.2.dist-info}/licenses/LICENSE +0 -0
  171. {modoboa-2.6.0.dist-info → modoboa-2.6.2.dist-info}/top_level.txt +0 -0
@@ -244,6 +244,11 @@ class AdminGlobalParametersSerializer(serializers.Serializer):
244
244
  auto_create_domain_and_mailbox = serializers.BooleanField(default=True)
245
245
  create_alias_on_mbox_rename = serializers.BooleanField(default=False)
246
246
 
247
+ # Aliases settings
248
+ alias_can_target_any_domain = serializers.BooleanField(default=True)
249
+ alias_target_block_list = serializers.CharField(required=False, allow_null=True)
250
+ alias_target_allow_list = serializers.CharField(required=False, allow_null=True)
251
+
247
252
  def validate_default_domain_quota(self, value):
248
253
  """Ensure quota is a positive integer."""
249
254
  if value < 0:
@@ -653,6 +653,22 @@ dlist; dlist@test.com; True; user1@test.com; user@extdomain.com
653
653
  received_content[0] = ",".join(admin_row)
654
654
  self.assertCountEqual(expected_response.strip().split("\r\n"), received_content)
655
655
 
656
+ def test_export_accounts(self):
657
+ response = self.client.get(f"{reverse('v2:identities-export')}?type=account")
658
+ expected_response = "account,admin,,,,True,SuperAdmins,,\r\naccount,admin@test.com,{PLAIN}toto,,,True,DomainAdmins,admin@test.com,10,test.com\r\naccount,admin@test2.com,{PLAIN}toto,,,True,DomainAdmins,admin@test2.com,10,test2.com\r\naccount,user@test.com,{PLAIN}toto,,,True,SimpleUsers,user@test.com,10\r\naccount,user@test2.com,{PLAIN}toto,,,True,SimpleUsers,user@test2.com,10\r\n" # NOQA:E501
659
+ received_content = force_str(response.content.strip()).split("\r\n")
660
+ # Empty admin password because it is hashed using SHA512-CRYPT
661
+ admin_row = received_content[0].split(",")
662
+ admin_row[2] = ""
663
+ received_content[0] = ",".join(admin_row)
664
+ self.assertCountEqual(expected_response.strip().split("\r\n"), received_content)
665
+
666
+ def test_export_aliases(self):
667
+ response = self.client.get(f"{reverse('v2:identities-export')}?type=alias")
668
+ expected_response = "alias,alias@test.com,True,user@test.com\r\nalias,forward@test.com,True,user@external.com\r\nalias,postmaster@test.com,True,test@truc.fr,toto@titi.com\r\n" # NOQA:E501
669
+ received_content = force_str(response.content.strip()).split("\r\n")
670
+ self.assertCountEqual(expected_response.strip().split("\r\n"), received_content)
671
+
656
672
 
657
673
  class AliasViewSetTestCase(ModoAPITestCase):
658
674
  @classmethod
@@ -58,10 +58,19 @@ class DomainViewSet(
58
58
  ):
59
59
  """V2 viewset."""
60
60
 
61
+ filter_backends = (
62
+ filters.OrderingFilter,
63
+ filters.SearchFilter,
64
+ dj_filters.DjangoFilterBackend,
65
+ )
66
+ pagination_class = pagination.CustomPageNumberPagination
61
67
  permission_classes = (
62
68
  permissions.IsAuthenticated,
63
69
  permissions.DjangoModelPermissions,
64
70
  )
71
+ search_fields = [
72
+ "^name",
73
+ ]
65
74
 
66
75
  def get_queryset(self):
67
76
  """Filter queryset based on current user."""
@@ -240,7 +249,8 @@ class IdentityViewSet(GetThrottleViewsetMixin, viewsets.ViewSet):
240
249
  def export(self, request, **kwargs):
241
250
  """Export accounts and aliases to CSV."""
242
251
  result = []
243
- for idt in lib.get_identities(request.user):
252
+ idtfilter = request.GET.get("type")
253
+ for idt in lib.get_identities(request.user, idtfilter=idtfilter):
244
254
  result.append(idt.to_csv_row())
245
255
  return response.Response(result)
246
256
 
@@ -239,6 +239,45 @@ GLOBAL_PARAMETERS_STRUCT = collections.OrderedDict(
239
239
  ),
240
240
  },
241
241
  ),
242
+ (
243
+ "aliases",
244
+ {
245
+ "label": gettext_lazy("Aliases"),
246
+ "params": collections.OrderedDict(
247
+ [
248
+ (
249
+ "alias_can_target_any_domain",
250
+ {
251
+ "label": gettext_lazy("Alias can target any domain"),
252
+ "help_text": gettext_lazy(
253
+ "Allow aliases to target any domain, not just the local domains."
254
+ ),
255
+ },
256
+ ),
257
+ (
258
+ "alias_target_block_list",
259
+ {
260
+ "label": gettext_lazy("Alias target block list"),
261
+ "help_text": gettext_lazy(
262
+ "A list of domains that aliases cannot target (comma separated)."
263
+ ),
264
+ "display": "alias_can_target_any_domain=true",
265
+ },
266
+ ),
267
+ (
268
+ "alias_target_allow_list",
269
+ {
270
+ "label": gettext_lazy("Alias target allow list"),
271
+ "help_text": gettext_lazy(
272
+ "A list of domains that aliases can target (comma separated)."
273
+ ),
274
+ "display": "alias_can_target_any_domain=false",
275
+ },
276
+ ),
277
+ ]
278
+ ),
279
+ },
280
+ ),
242
281
  ]
243
282
  )
244
283
 
modoboa/admin/lib.py CHANGED
@@ -31,7 +31,12 @@ from . import signals
31
31
  from .models import Alias, Domain, DomainAlias
32
32
 
33
33
 
34
- def get_identities(user, searchquery=None, idtfilter=None, grpfilter=None):
34
+ def get_identities(
35
+ user: User,
36
+ searchquery: str | None = None,
37
+ idtfilter: str | None = None,
38
+ grpfilter: str | None = None,
39
+ ) -> chain:
35
40
  """Return all the identities owned by a user.
36
41
 
37
42
  :param user: the desired user
@@ -213,7 +218,7 @@ def get_authoritative_resolver(domain, resolver=None):
213
218
 
214
219
  def get_dns_records(name, typ, resolver=None):
215
220
  """Retrieve DNS records for given name and type."""
216
- logger = logging.getLogger("modoboa.admin")
221
+ logger = logging.getLogger("modoboa.dns")
217
222
 
218
223
  try:
219
224
  resolver = get_authoritative_resolver(name, resolver=resolver)
@@ -242,7 +247,7 @@ def get_dns_records(name, typ, resolver=None):
242
247
  def get_domain_mx_list(domain):
243
248
  """Return a list of MX IP address for domain."""
244
249
  result = []
245
- logger = logging.getLogger("modoboa.admin")
250
+ logger = logging.getLogger("modoboa.dns")
246
251
  resolver = get_dns_resolver()
247
252
  dns_answers = get_dns_records(domain, "MX", resolver)
248
253
  if dns_answers is None:
@@ -21,6 +21,7 @@ from modoboa.lib.exceptions import (
21
21
  ModoboaException,
22
22
  AliasExists,
23
23
  )
24
+ from modoboa.parameters import tools as param_tools
24
25
  from .. import signals
25
26
  from .base import AdminObject
26
27
  from .domain import Domain
@@ -90,6 +91,25 @@ class AliasManager(models.Manager):
90
91
  )
91
92
 
92
93
 
94
+ def convert_to_list(raw_value: str) -> list[str]:
95
+ """Convert input string to list of string."""
96
+ return [item.strip() for item in raw_value.split(",")]
97
+
98
+
99
+ def is_alias_target_allowed(domain: str) -> bool:
100
+ """Check if alias target is allowed or not."""
101
+ params = dict(param_tools.get_global_parameters(app="admin"))
102
+ if params.get("alias_can_target_any_domain"):
103
+ blocked_domains = params.get("alias_target_block_list")
104
+ if blocked_domains and domain in convert_to_list(blocked_domains):
105
+ return False
106
+ else:
107
+ allowed_domains = params.get("alias_target_allow_list")
108
+ if allowed_domains and domain not in convert_to_list(allowed_domains):
109
+ return False
110
+ return True
111
+
112
+
93
113
  class Alias(AdminObject):
94
114
  """Mailbox alias."""
95
115
 
@@ -182,6 +202,8 @@ class Alias(AdminObject):
182
202
  if domname is None:
183
203
  raise BadRequest("{} {}".format(_("Invalid address"), address))
184
204
  domain = Domain.objects.filter(name=domname).first()
205
+ if not domain and not is_alias_target_allowed(domname):
206
+ raise BadRequest(f"{_('Target domain not allowed')}: {domname}")
185
207
  kwargs = {"address": address, "alias": self}
186
208
  if (domain is not None) and (
187
209
  any(
@@ -0,0 +1,68 @@
1
+ """Tests for alias target allow/block settings."""
2
+
3
+ from django.urls import reverse
4
+
5
+ from modoboa.admin import factories, models
6
+ from modoboa.lib.tests import ModoAPITestCase
7
+
8
+
9
+ class AliasTargetSettingsTestCase(ModoAPITestCase):
10
+
11
+ @classmethod
12
+ def setUpTestData(cls): # NOQA:N802
13
+ super().setUpTestData()
14
+ factories.populate_database()
15
+
16
+ def test_block_external_domain_when_any_allowed_with_block_list(self):
17
+ # alias_can_target_any_domain = True and block external domain
18
+ self.set_global_parameter("alias_can_target_any_domain", True, app="admin")
19
+ self.set_global_parameter("alias_target_block_list", "bad.com", app="admin")
20
+
21
+ values = {
22
+ "address": "list@test.com",
23
+ "recipients": ["user@bad.com"],
24
+ "enabled": True,
25
+ }
26
+ resp = self.client.post(reverse("v2:alias-list"), values, format="json")
27
+ # Creation should fail
28
+ self.assertEqual(resp.status_code, 400)
29
+ self.assertEqual(resp.json()["error"], "Target domain not allowed: bad.com")
30
+
31
+ def test_allow_only_list_when_any_disallowed(self):
32
+ # alias_can_target_any_domain = False and allow list contains domain
33
+ self.set_global_parameter("alias_can_target_any_domain", False, app="admin")
34
+ self.set_global_parameter("alias_target_allow_list", "ok.com", app="admin")
35
+
36
+ # Check if local domain is still allowed
37
+ values = {
38
+ "address": "list2@test.com",
39
+ "recipients": ["user@test.com"],
40
+ "enabled": True,
41
+ }
42
+ resp = self.client.post(reverse("v2:alias-list"), values, format="json")
43
+ self.assertEqual(resp.status_code, 201)
44
+
45
+ values = {
46
+ "address": "list3@test.com",
47
+ "recipients": ["user@ok.com"],
48
+ "enabled": True,
49
+ }
50
+ resp = self.client.post(reverse("v2:alias-list"), values, format="json")
51
+ self.assertEqual(resp.status_code, 201)
52
+ alias = models.Alias.objects.get(address="list3@test.com", internal=False)
53
+ # Allowed external domain should remain external
54
+ self.assertTrue(
55
+ alias.aliasrecipient_set.filter(
56
+ address="user@ok.com", r_mailbox__isnull=True, r_alias__isnull=True
57
+ ).exists()
58
+ )
59
+
60
+ # Now try a domain not in allow list, should stay external as well
61
+ values = {
62
+ "address": "list4@test.com",
63
+ "recipients": ["user@bad.com"],
64
+ "enabled": True,
65
+ }
66
+ resp = self.client.post(reverse("v2:alias-list"), values, format="json")
67
+ self.assertEqual(resp.status_code, 400)
68
+ self.assertEqual(resp.json()["error"], "Target domain not allowed: bad.com")
@@ -138,7 +138,7 @@ class MXTestCase(ModoTestCase):
138
138
  """Test to get error loggins from specific DNS server."""
139
139
  mock_query.side_effect = utils.mock_dns_query_result
140
140
  mock_ip_address.side_effect = utils.mock_ip_address_result
141
- with LogCapture("modoboa.admin") as log:
141
+ with LogCapture("modoboa.dns") as log:
142
142
  get_domain_mx_list("does-not-exist.example.com")
143
143
  get_domain_mx_list("no-mx.example.com")
144
144
  get_domain_mx_list("no-ns-servers.example.com")
@@ -148,36 +148,36 @@ class MXTestCase(ModoTestCase):
148
148
  get_domain_mx_list("bad-response.example.com")
149
149
  log.check(
150
150
  (
151
- "modoboa.admin",
151
+ "modoboa.dns",
152
152
  "ERROR",
153
153
  _("No DNS record found for %s") % "does-not-exist.example.com",
154
154
  ),
155
- ("modoboa.admin", "ERROR", _("No MX record for %s") % "no-mx.example.com"),
156
- ("modoboa.admin", "ERROR", _("No working name servers found")),
155
+ ("modoboa.dns", "ERROR", _("No MX record for %s") % "no-mx.example.com"),
156
+ ("modoboa.dns", "ERROR", _("No working name servers found")),
157
157
  (
158
- "modoboa.admin",
158
+ "modoboa.dns",
159
159
  "WARNING",
160
160
  _("DNS resolution timeout, unable to query %s at the moment")
161
161
  % "timeout.example.com",
162
162
  ),
163
163
  (
164
- "modoboa.admin",
164
+ "modoboa.dns",
165
165
  "ERROR",
166
166
  _("No DNS record found for %s") % "does-not-exist.example.com",
167
167
  ),
168
168
  (
169
- "modoboa.admin",
169
+ "modoboa.dns",
170
170
  "ERROR",
171
171
  _("No DNS record found for %s") % "does-not-exist.example.com",
172
172
  ),
173
173
  (
174
- "modoboa.admin",
174
+ "modoboa.dns",
175
175
  "WARNING",
176
176
  _("Invalid IP address format for %(domain)s; %(addr)s")
177
177
  % {"domain": "bad-response.example.com", "addr": "000.0.0.0"},
178
178
  ),
179
179
  (
180
- "modoboa.admin",
180
+ "modoboa.dns",
181
181
  "WARNING",
182
182
  _("Invalid IP address format for %(domain)s; %(addr)s")
183
183
  % {"domain": "bad-response.example.com", "addr": "000.0.0.0"},
@@ -193,15 +193,15 @@ class MXTestCase(ModoTestCase):
193
193
  localconfig = core_models.LocalConfig.objects.first()
194
194
  localconfig.parameters.set_value("enable_ipv6_mx_checks", True, "admin")
195
195
  localconfig.save()
196
- with LogCapture("modoboa.admin") as log:
196
+ with LogCapture("modoboa.dns") as log:
197
197
  get_domain_mx_list("test3.com")
198
198
  log.check(
199
- ("modoboa.admin", "ERROR", _("No AAAA record for %s") % "mx3.example.com")
199
+ ("modoboa.dns", "ERROR", _("No AAAA record for %s") % "mx3.example.com")
200
200
  )
201
201
  localconfig = core_models.LocalConfig.objects.first()
202
202
  localconfig.parameters.set_value("enable_ipv6_mx_checks", False, "admin")
203
203
  localconfig.save()
204
- with LogCapture("modoboa.admin") as log2:
204
+ with LogCapture("modoboa.dns") as log2:
205
205
  get_domain_mx_list("test3.com")
206
206
  log2.check()
207
207
 
@@ -58,9 +58,9 @@ class ARmessage(models.Model):
58
58
  name = "autoreply"
59
59
  action = [("vacation", ":subject", self.subject, ":days", days, content)]
60
60
  if not fset.getfilter(name):
61
- fset.addfilter(name, condition, action)
61
+ fset.addfilter(name, condition, action, matchtype="allof")
62
62
  else:
63
- fset.updatefilter(name, name, condition, action)
63
+ fset.updatefilter(name, name, condition, action, matchtype="allof")
64
64
  for filter in fset.filters:
65
65
  if filter["name"] == name:
66
66
  filter["description"] = (
@@ -245,7 +245,7 @@ SPECTACULAR_SETTINGS = {
245
245
  'SCHEMA_PATH_PREFIX': r'/api/v[0-9]',
246
246
  'TITLE': 'Modoboa API',
247
247
  'VERSION': None,
248
- 'SERVE_PERMISSIONS': ['rest_framework.permissions.IsAuthenticated'],
248
+ 'SERVE_AUTHENTICATION': [],
249
249
  }
250
250
 
251
251
  # Modoboa settings
@@ -361,6 +361,11 @@ LOGGING = {
361
361
  'facility': SysLogHandler.LOG_MAIL,
362
362
  'formatter': 'syslog'
363
363
  },
364
+ 'syslog': {
365
+ 'class': 'logging.handlers.SysLogHandler',
366
+ 'facility': SysLogHandler.LOG_SYSLOG,
367
+ 'formatter': 'syslog'
368
+ },
364
369
  'modoboa': {
365
370
  'class': 'modoboa.core.loggers.SQLHandler',
366
371
  }
@@ -381,6 +386,11 @@ LOGGING = {
381
386
  'level': 'INFO',
382
387
  'propagate': False
383
388
  },
389
+ 'modoboa.dns': {
390
+ 'handlers': ['syslog'],
391
+ 'level': 'INFO',
392
+ 'propagate': False
393
+ },
384
394
  'modoboa.policyd': {
385
395
  'handlers': ['syslog-mail'],
386
396
  'level': 'INFO',
@@ -1 +1 @@
1
- import{C as q}from"./ChoiceField-17aCFpF6.js";import{u as M,b as S,h as V,i as f,j as _,c as R,o as y,w as h,a as d,f as s,e as U,t as x,k as N,_ as C,z as D,m as j,l as Q,F as T,s as G}from"./index-YIGRKgNA.js";import{V as H,a as L}from"./VRow-CAbOSEHS.js";import{V as B}from"./VAlert-x6n3drjw.js";import{c as P}from"./VAvatar-J563boKh.js";import{V as k,r as F}from"./VForm-BwTUBf4u.js";import{_ as z}from"./AccountPasswordSubForm-B9X5wAXp.js";import{E as I}from"./EmailField-DpBYkqam.js";import{V as E}from"./VTextField-C9VUP7V9.js";import{V as $}from"./VSwitch-CixaedmQ.js";import{u as K}from"./domains.store-CfpnnBGo.js";import{a as Y}from"./accounts-BT429O7P.js";import{V as J}from"./VChip-DvxO74Mw.js";const W={class:"headline"},X={class:"mt-4"},Ve={__name:"AccountRoleForm",props:{modelValue:{type:Object,default:null}},setup(g,{expose:w}){const i=M(),{$gettext:l}=S(),v=g,m=V(),c=f(()=>v.modelValue),a=f(()=>i.authUser),p=f(()=>{const r=b.value.find(n=>n.value===c.value.role);return r!==void 0?r.label:""}),e=f(()=>{const r=b.value.find(n=>n.value===c.value.role);return r!==void 0?r.help:""}),b=f(()=>a.value.role===_.SUPER_ADMIN?[...A,...o,...u,...t]:a.value.role===_.DOMAIN_ADMIN?[...A]:a.value.role===_.RESELLER?[...o,...A]:[]),A=[{label:l("Simple user"),value:_.USER,help:l("A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.")}],o=[{label:l("Domain administrator"),value:_.DOMAIN_ADMIN,help:l("A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.")}],u=[{label:l("Reseller"),value:_.RESELLER,help:l("An intermediate user who has the same privileges than a Domain administrator, plus the possibility to create domains and to assign resources.")}],t=[{label:l("Super administrator"),value:_.SUPER_ADMIN,help:l("A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.")}];return w({vFormRef:m,roleLabel:p}),(r,n)=>(y(),R(k,{ref_key:"vFormRef",ref:m},{default:h(()=>[d(H,null,{default:h(()=>[d(L,{cols:"7"},{default:h(()=>[d(s(q),{modelValue:c.value.role,"onUpdate:modelValue":n[0]||(n[0]=O=>c.value.role=O),label:s(l)("Choose a role"),choices:b.value,"choices-per-line":2},null,8,["modelValue","label","choices"])]),_:1}),d(L,{cols:"5"},{default:h(()=>[d(B,{color:"primary",class:"mt-11 ml-4 rounded-lg"},{default:h(()=>[U("h3",W,x(p.value),1),U("p",X,x(e.value),1),d(P,{color:"white",class:"float-right",size:"large",icon:"mdi-help-circle-outline"})]),_:1})]),_:1})]),_:1})]),_:1},512))}},Z={class:"m-label"},ee={class:"m-label"},ae={class:"m-label"},he={__name:"AccountGeneralForm",props:{modelValue:{type:Object,default:null},editing:{type:Boolean,default:!1}},setup(g,{expose:w}){const{$gettext:i}=S(),l=M(),v=g,m=V(),c=V({}),a=f(()=>v.modelValue),p=f(()=>a.value.role===_.USER?i("Enter an email address"):i("Enter a simple username or an email address")),e=f(()=>a.value.role===_.USER?"email":"text");function b(){a.value.username.indexOf("@")!==-1&&(a.value.mailbox.full_address=a.value.username,a.value.mailbox.message_limit=null)}return w({vFormRef:m,formErrors:c}),(A,o)=>(y(),R(k,{ref_key:"vFormRef",ref:m},{default:h(()=>[U("label",Z,x(s(i)("Username")),1),d(I,{ref:"username",modelValue:a.value.username,"onUpdate:modelValue":[o[0]||(o[0]=u=>a.value.username=u),b],placeholder:p.value,type:e.value,rules:e.value==="email"?[s(F).required,s(F).email]:[s(F).required],role:a.value.role,"error-msg":c.value.value?c.value.value.username:[]},null,8,["modelValue","placeholder","type","rules","role","error-msg"]),U("label",ee,x(s(i)("First name")),1),d(E,{modelValue:a.value.first_name,"onUpdate:modelValue":o[1]||(o[1]=u=>a.value.first_name=u),autocomplete:"new-password",variant:"outlined",density:"compact"},null,8,["modelValue"]),U("label",ae,x(s(i)("Last name")),1),d(E,{modelValue:a.value.last_name,"onUpdate:modelValue":o[2]||(o[2]=u=>a.value.last_name=u),autocomplete:"new-password",variant:"outlined",density:"compact"},null,8,["modelValue"]),s(l).authUser.pk!==a.value.pk?(y(),R(z,{key:0,ref:"passwordForm",modelValue:a.value,"onUpdate:modelValue":o[3]||(o[3]=u=>a.value=u),editing:g.editing,"form-errors":c.value},null,8,["modelValue","editing","form-errors"])):(y(),R(B,{key:1,type:"info",variant:"tonal",class:"py-2"},{default:h(()=>[N(x(s(i)("You can update your password from the Account section")),1)]),_:1})),d($,{modelValue:a.value.is_active,"onUpdate:modelValue":o[4]||(o[4]=u=>a.value.is_active=u),label:s(i)("Enabled"),density:"compact",color:"primary"},null,8,["modelValue","label"])]),_:1},512))}},le={class:"m-label"},oe={class:"m-label"},te={__name:"AccountMailboxForm",props:{modelValue:{type:Object,default:null}},emits:["update:modelValue"],setup(g,{expose:w,emit:i}){const{$gettext:l}=S(),v=i,m=g,c=K(),a=f(()=>c.domains),p=V(),e=V({mailbox:{}});D(m.modelValue,t=>{t?(e.value={...t},e.value.role===_.USER&&(e.value.mailbox||(e.value.mailbox={}),e.value.mailbox.full_address=e.value.username),e.value.mailbox.message_limit===""&&(e.value.mailbox.message_limit=null)):e.value={mailbox:{}}},{immediate:!0}),D(e,t=>{v("update:modelValue",t)},{deep:!0});const b=f(()=>{const t=e.value.mailbox.full_address;if(t&&t.indexOf("@")!==-1){const r=a.value.find(n=>n.name===t.split("@")[1]);if(r)return parseInt(r.default_mailbox_quota)}}),A=f(()=>{let t=l("Use domain default value");return b.value!==void 0&&(b.value===0?t+=` (${l("unlimited")})`:t+=` (${b.value} MB)`),t});function o(t){t&&delete e.value.mailbox.quota}function u(t){t===""&&(e.value.mailbox.message_limit=null)}return w({vFormRef:p}),(t,r)=>(y(),R(k,{ref_key:"vFormRef",ref:p},{default:h(()=>[U("label",le,x(s(l)("Quota")),1),d($,{modelValue:e.value.mailbox.use_domain_quota,"onUpdate:modelValue":[r[0]||(r[0]=n=>e.value.mailbox.use_domain_quota=n),o],label:A.value,color:"primary"},null,8,["modelValue","label"]),e.value.mailbox.use_domain_quota?j("",!0):(y(),R(E,{key:0,modelValue:e.value.mailbox.quota,"onUpdate:modelValue":r[1]||(r[1]=n=>e.value.mailbox.quota=n),placeholder:s(l)("Ex: 10MB. Leave empty for no limit"),hint:s(l)("Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)."),"persistent-hint":"",variant:"outlined",density:"compact"},null,8,["modelValue","placeholder","hint"])),U("label",oe,x(s(l)("Daily message sending limit")),1),d(E,{modelValue:e.value.mailbox.message_limit,"onUpdate:modelValue":[r[2]||(r[2]=n=>e.value.mailbox.message_limit=n),u],placeholder:s(l)("Leave empty for no limit"),hint:s(l)("Number of messages this mailbox can send per day. Leave empty for no limit."),"persistent-hint":"",variant:"outlined",density:"compact",rules:[s(F).numericOrNull]},null,8,["modelValue","placeholder","hint","rules"]),d($,{modelValue:e.value.mailbox.is_send_only,"onUpdate:modelValue":r[3]||(r[3]=n=>e.value.mailbox.is_send_only=n),label:s(l)("Send only account"),density:"compact",color:"primary"},null,8,["modelValue","label"])]),_:1},512))}},xe=C(te,[["__scopeId","data-v-41714779"]]),ye={__name:"AccountAliasForm",props:{modelValue:{type:Object,default:null}},setup(g,{expose:w}){const{$gettext:i}=S(),l=g,v=f(()=>l.modelValue),m=V(""),c=V(),a=V(),p=V(!1),e=V([]);async function b(){if(e.value=[],p.value=!0,v.value.aliases.indexOf(m.value)!==-1){e.value=[i("Alias already added")],m.value="",p.value=!1;return}try{await Y.validate({aliases:[m.value],mailbox:v.value.mailbox}),v.value.aliases.push(m.value),m.value="",a.value.resetValidation()}catch(o){o.response.data.aliases?o.response.data.aliases:o.response.data.non_field_errors&&o.response.data.non_field_errors}finally{p.value=!1}}function A(o){v.value.aliases.splice(o,1)}return w({vFormRef:a}),(o,u)=>(y(),R(k,{ref_key:"vFormRef",ref:a},{default:h(()=>[d(s(I),{ref_key:"aliasField",ref:c,modelValue:m.value,"onUpdate:modelValue":u[0]||(u[0]=t=>m.value=t),placeholder:s(i)("Start typing a name here..."),hint:s(i)("Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)."),"persistent-hint":"",loading:p.value,"error-msg":e.value,onDomainSelected:b},null,8,["modelValue","placeholder","hint","loading","error-msg"]),(y(!0),Q(T,null,G(v.value.aliases,(t,r)=>(y(),R(J,{key:r,class:"mr-2 mt-2",closable:"","onClick:close":n=>A(r)},{default:h(()=>[N(x(t),1)]),_:2},1032,["onClick:close"]))),128))]),_:1},512))}};export{xe as A,ye as _,he as a,Ve as b};
1
+ import{C as q}from"./ChoiceField-k5nIk4ck.js";import{u as M,b as S,h as V,i as f,j as _,c as R,o as y,w as h,a as d,f as s,e as U,t as x,k as N,_ as C,z as D,m as j,l as Q,F as T,s as G}from"./index-Be6X7UaJ.js";import{V as H,a as L}from"./VRow-Dnsej546.js";import{V as B}from"./VAlert-mUmhR_lW.js";import{c as P}from"./VAvatar-BAW2MRci.js";import{V as k,r as F}from"./VForm-DUC3-Taa.js";import{_ as z}from"./AccountPasswordSubForm-DtqTon2C.js";import{E as I}from"./EmailField-CFNREcuM.js";import{V as E}from"./VTextField-Dt3N956g.js";import{V as $}from"./VSwitch-bLRfr5zT.js";import{u as K}from"./domains.store-GfcrCBY7.js";import{a as Y}from"./accounts-CxGXJgEh.js";import{V as J}from"./VChip-C2Lh9BaB.js";const W={class:"headline"},X={class:"mt-4"},Ve={__name:"AccountRoleForm",props:{modelValue:{type:Object,default:null}},setup(g,{expose:w}){const i=M(),{$gettext:l}=S(),v=g,m=V(),c=f(()=>v.modelValue),a=f(()=>i.authUser),p=f(()=>{const r=b.value.find(n=>n.value===c.value.role);return r!==void 0?r.label:""}),e=f(()=>{const r=b.value.find(n=>n.value===c.value.role);return r!==void 0?r.help:""}),b=f(()=>a.value.role===_.SUPER_ADMIN?[...A,...o,...u,...t]:a.value.role===_.DOMAIN_ADMIN?[...A]:a.value.role===_.RESELLER?[...o,...A]:[]),A=[{label:l("Simple user"),value:_.USER,help:l("A user with no privileges but with a mailbox. He will be allowed to use all end-user features: webmail, calendar, contacts, filters.")}],o=[{label:l("Domain administrator"),value:_.DOMAIN_ADMIN,help:l("A user with privileges on one or more domain. He will be allowed to administer mailboxes and he can also have a mailbox.")}],u=[{label:l("Reseller"),value:_.RESELLER,help:l("An intermediate user who has the same privileges than a Domain administrator, plus the possibility to create domains and to assign resources.")}],t=[{label:l("Super administrator"),value:_.SUPER_ADMIN,help:l("A user with all privileges, can do anything. By default, such a user does not have a mailbox so he can't access end-user features.")}];return w({vFormRef:m,roleLabel:p}),(r,n)=>(y(),R(k,{ref_key:"vFormRef",ref:m},{default:h(()=>[d(H,null,{default:h(()=>[d(L,{cols:"7"},{default:h(()=>[d(s(q),{modelValue:c.value.role,"onUpdate:modelValue":n[0]||(n[0]=O=>c.value.role=O),label:s(l)("Choose a role"),choices:b.value,"choices-per-line":2},null,8,["modelValue","label","choices"])]),_:1}),d(L,{cols:"5"},{default:h(()=>[d(B,{color:"primary",class:"mt-11 ml-4 rounded-lg"},{default:h(()=>[U("h3",W,x(p.value),1),U("p",X,x(e.value),1),d(P,{color:"white",class:"float-right",size:"large",icon:"mdi-help-circle-outline"})]),_:1})]),_:1})]),_:1})]),_:1},512))}},Z={class:"m-label"},ee={class:"m-label"},ae={class:"m-label"},he={__name:"AccountGeneralForm",props:{modelValue:{type:Object,default:null},editing:{type:Boolean,default:!1}},setup(g,{expose:w}){const{$gettext:i}=S(),l=M(),v=g,m=V(),c=V({}),a=f(()=>v.modelValue),p=f(()=>a.value.role===_.USER?i("Enter an email address"):i("Enter a simple username or an email address")),e=f(()=>a.value.role===_.USER?"email":"text");function b(){a.value.username.indexOf("@")!==-1&&(a.value.mailbox.full_address=a.value.username,a.value.mailbox.message_limit=null)}return w({vFormRef:m,formErrors:c}),(A,o)=>(y(),R(k,{ref_key:"vFormRef",ref:m},{default:h(()=>[U("label",Z,x(s(i)("Username")),1),d(I,{ref:"username",modelValue:a.value.username,"onUpdate:modelValue":[o[0]||(o[0]=u=>a.value.username=u),b],placeholder:p.value,type:e.value,rules:e.value==="email"?[s(F).required,s(F).email]:[s(F).required],role:a.value.role,"error-msg":c.value.value?c.value.value.username:[]},null,8,["modelValue","placeholder","type","rules","role","error-msg"]),U("label",ee,x(s(i)("First name")),1),d(E,{modelValue:a.value.first_name,"onUpdate:modelValue":o[1]||(o[1]=u=>a.value.first_name=u),autocomplete:"new-password",variant:"outlined",density:"compact"},null,8,["modelValue"]),U("label",ae,x(s(i)("Last name")),1),d(E,{modelValue:a.value.last_name,"onUpdate:modelValue":o[2]||(o[2]=u=>a.value.last_name=u),autocomplete:"new-password",variant:"outlined",density:"compact"},null,8,["modelValue"]),s(l).authUser.pk!==a.value.pk?(y(),R(z,{key:0,ref:"passwordForm",modelValue:a.value,"onUpdate:modelValue":o[3]||(o[3]=u=>a.value=u),editing:g.editing,"form-errors":c.value},null,8,["modelValue","editing","form-errors"])):(y(),R(B,{key:1,type:"info",variant:"tonal",class:"py-2"},{default:h(()=>[N(x(s(i)("You can update your password from the Account section")),1)]),_:1})),d($,{modelValue:a.value.is_active,"onUpdate:modelValue":o[4]||(o[4]=u=>a.value.is_active=u),label:s(i)("Enabled"),density:"compact",color:"primary"},null,8,["modelValue","label"])]),_:1},512))}},le={class:"m-label"},oe={class:"m-label"},te={__name:"AccountMailboxForm",props:{modelValue:{type:Object,default:null}},emits:["update:modelValue"],setup(g,{expose:w,emit:i}){const{$gettext:l}=S(),v=i,m=g,c=K(),a=f(()=>c.domains),p=V(),e=V({mailbox:{}});D(m.modelValue,t=>{t?(e.value={...t},e.value.role===_.USER&&(e.value.mailbox||(e.value.mailbox={}),e.value.mailbox.full_address=e.value.username),e.value.mailbox.message_limit===""&&(e.value.mailbox.message_limit=null)):e.value={mailbox:{}}},{immediate:!0}),D(e,t=>{v("update:modelValue",t)},{deep:!0});const b=f(()=>{const t=e.value.mailbox.full_address;if(t&&t.indexOf("@")!==-1){const r=a.value.find(n=>n.name===t.split("@")[1]);if(r)return parseInt(r.default_mailbox_quota)}}),A=f(()=>{let t=l("Use domain default value");return b.value!==void 0&&(b.value===0?t+=` (${l("unlimited")})`:t+=` (${b.value} MB)`),t});function o(t){t&&delete e.value.mailbox.quota}function u(t){t===""&&(e.value.mailbox.message_limit=null)}return w({vFormRef:p}),(t,r)=>(y(),R(k,{ref_key:"vFormRef",ref:p},{default:h(()=>[U("label",le,x(s(l)("Quota")),1),d($,{modelValue:e.value.mailbox.use_domain_quota,"onUpdate:modelValue":[r[0]||(r[0]=n=>e.value.mailbox.use_domain_quota=n),o],label:A.value,color:"primary"},null,8,["modelValue","label"]),e.value.mailbox.use_domain_quota?j("",!0):(y(),R(E,{key:0,modelValue:e.value.mailbox.quota,"onUpdate:modelValue":r[1]||(r[1]=n=>e.value.mailbox.quota=n),placeholder:s(l)("Ex: 10MB. Leave empty for no limit"),hint:s(l)("Quota for this mailbox, can be expressed in KB, MB (default) or GB. Define a custom value or use domain's default one. Leave empty to define an unlimited value (not allowed for domain administrators)."),"persistent-hint":"",variant:"outlined",density:"compact"},null,8,["modelValue","placeholder","hint"])),U("label",oe,x(s(l)("Daily message sending limit")),1),d(E,{modelValue:e.value.mailbox.message_limit,"onUpdate:modelValue":[r[2]||(r[2]=n=>e.value.mailbox.message_limit=n),u],placeholder:s(l)("Leave empty for no limit"),hint:s(l)("Number of messages this mailbox can send per day. Leave empty for no limit."),"persistent-hint":"",variant:"outlined",density:"compact",rules:[s(F).numericOrNull]},null,8,["modelValue","placeholder","hint","rules"]),d($,{modelValue:e.value.mailbox.is_send_only,"onUpdate:modelValue":r[3]||(r[3]=n=>e.value.mailbox.is_send_only=n),label:s(l)("Send only account"),density:"compact",color:"primary"},null,8,["modelValue","label"])]),_:1},512))}},xe=C(te,[["__scopeId","data-v-41714779"]]),ye={__name:"AccountAliasForm",props:{modelValue:{type:Object,default:null}},setup(g,{expose:w}){const{$gettext:i}=S(),l=g,v=f(()=>l.modelValue),m=V(""),c=V(),a=V(),p=V(!1),e=V([]);async function b(){if(e.value=[],p.value=!0,v.value.aliases.indexOf(m.value)!==-1){e.value=[i("Alias already added")],m.value="",p.value=!1;return}try{await Y.validate({aliases:[m.value],mailbox:v.value.mailbox}),v.value.aliases.push(m.value),m.value="",a.value.resetValidation()}catch(o){o.response.data.aliases?o.response.data.aliases:o.response.data.non_field_errors&&o.response.data.non_field_errors}finally{p.value=!1}}function A(o){v.value.aliases.splice(o,1)}return w({vFormRef:a}),(o,u)=>(y(),R(k,{ref_key:"vFormRef",ref:a},{default:h(()=>[d(s(I),{ref_key:"aliasField",ref:c,modelValue:m.value,"onUpdate:modelValue":u[0]||(u[0]=t=>m.value=t),placeholder:s(i)("Start typing a name here..."),hint:s(i)("Alias(es) of this mailbox. To create a catchall alias, just enter the domain name (@domain.tld)."),"persistent-hint":"",loading:p.value,"error-msg":e.value,onDomainSelected:b},null,8,["modelValue","placeholder","hint","loading","error-msg"]),(y(!0),Q(T,null,G(v.value.aliases,(t,r)=>(y(),R(J,{key:r,class:"mr-2 mt-2",closable:"","onClick:close":n=>A(r)},{default:h(()=>[N(x(t),1)]),_:2},1032,["onClick:close"]))),128))]),_:1},512))}};export{xe as A,ye as _,he as a,Ve as b};
@@ -1 +1 @@
1
- import{b as L,u as H,B as J,q as K,h as c,i as P,j as T,d as W,z as X,c as d,l as p,o,a,e as v,w as e,m as k,f as m,k as f,t as r,F as B,_ as Y}from"./index-YIGRKgNA.js";import{b as Z,a as ee,A as ae,_ as le}from"./AccountAliasForm-Bu1I8sLg.js";import{_ as te}from"./ResourcesForm-C1YGkT8i.js";import{L as oe}from"./LoadingData-Cxd490P6.js";import{a as j}from"./accounts-BT429O7P.js";import{p as se}from"./parameters-DpVw-Zs4.js";import{u as ue}from"./permissions-C33K6cJv.js";import{d as V,c as U,V as q}from"./VAvatar-J563boKh.js";import{V as g,c as b,a as x,b as re}from"./VExpansionPanels-Dnwgt5uT.js";import{V as _,a as n}from"./VRow-CAbOSEHS.js";import{V as ne,a as ie}from"./VToolbar-Cs-fVa4M.js";import"./ChoiceField-17aCFpF6.js";import"./VAlert-x6n3drjw.js";import"./VProgressCircular-CtqQON49.js";import"./tag-DV1_zOzl.js";import"./VForm-BwTUBf4u.js";import"./VInput-Dpmea5z9.js";import"./forwardRefs-DPrLRqxP.js";import"./ssrBoot-CpJ-7WlH.js";import"./AccountPasswordSubForm-B9X5wAXp.js";import"./VTextField-C9VUP7V9.js";import"./VSwitch-CixaedmQ.js";import"./VSelectionControl-BN-zQ3C6.js";import"./EmailField-DpBYkqam.js";import"./domains.store-CfpnnBGo.js";import"./domains-CQv8gtbQ.js";import"./VChip-DvxO74Mw.js";import"./VContainer-L2EoH3dT.js";/* empty css */const de={key:1},me={key:0},fe={key:0},ce={class:"mr-2"},_e={class:"mr-2"},ve={key:0},pe={class:"mr-2"},ke={class:"mr-2"},ye={class:"mr-2"},Ve={key:0},ge={class:"mr-2"},be={key:0},xe={class:"mr-2"},Fe={class:"mr-2"},we={class:"mt-4 d-flex justify-end"},he={__name:"AccountEditForm",setup(G){const{$gettext:i}=L(),N=H(),F=J(),O=K(),{canSetRole:S}=ue(),l=c({pk:F.params.id}),w=P(()=>l.value.username&&l.value.username.indexOf("@")!==-1),$=P(()=>{const t=C.value.params&&C.value.params.enable_admin_limits&&l.value.role!==T.USER&&l.value.role!==T.SUPER_ADMIN;return t===void 0?!1:t}),C=c({}),h=c(0),y=c(!1),E=c(!1),A=c(),I=c(),M=c(),D=c(),R=c(),Q=P(()=>{const t={roleForm:A,generalForm:I};return w.value&&(t.aliasForm=D,t.mailboxForm=M),$.value&&(t.resourcesForm=R),t});async function z(){E.value=!1,h.value=[];for(const[t,s]of Object.entries(Q.value))if(s.value!=null){const{valid:u}=await s.value.vFormRef.validate();u||(E.value=!0,h.value.push(t))}if(!E.value){y.value=!0;try{const t={...l.value};w.value?t.mailbox.full_address=t.username:t.mailbox&&delete t.mailbox.full_address,t.new_password&&(t.password=t.new_password,delete t.new_password,delete t.password_confirmation),$.value&&R.value!==null&&(t.resources=R.value.getPayload()),t.aliases===null&&delete t.aliases,S.value||(l.value.pk===N.authUser.pk?t.role=N.authUser.role:t.role=T.USER),await j.patch(l.value.pk,t),O.push({name:"AccountDetail",params:{id:F.params.id}})}finally{y.value=!1}}}return W(()=>{j.get(F.params.id).then(t=>{l.value=t.data,y.value=!1}),S.value&&se.getGlobalApplication("limits").then(t=>{C.value=t.data})}),X(l,()=>{delete l.value.domains,l.value.mailbox===null&&delete l.value.mailbox},{deep:!0}),(t,s)=>y.value?(o(),d(oe,{key:0})):(o(),p("div",de,[a(re,{modelValue:h.value,"onUpdate:modelValue":s[5]||(s[5]=u=>h.value=u),multiple:E.value},{default:e(()=>[m(S)?(o(),d(g,{key:0,eager:"",value:"roleForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Role")),1)]),_:1}),a(n,{cols:"8",class:"text-medium-emphasis"},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",me)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[A.value?(o(),d(n,{key:0,cols:"6"},{default:e(()=>[f(r(A.value.roleLabel),1)]),_:1})):k("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(Z,{ref_key:"roleForm",ref:A,modelValue:l.value,"onUpdate:modelValue":s[0]||(s[0]=u=>l.value=u)},null,8,["modelValue"])]),_:1})]),_:1})):k("",!0),a(g,{eager:"",value:"generalForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Identification")),1)]),_:1}),a(n,{cols:"8",class:""},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",fe)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[a(n,{cols:"6"},{default:e(()=>[v("div",ce,r(m(i)("Username:"))+" "+r(l.value.username),1)]),_:1}),a(n,{cols:"6"},{default:e(()=>[v("div",_e,[f(r(m(i)("Enabled"))+" ",1),l.value.is_active?(o(),d(U,{key:0,color:"success"},{default:e(()=>s[7]||(s[7]=[f("mdi-check-circle-outline")])),_:1,__:[7]})):(o(),d(U,{key:1},{default:e(()=>s[8]||(s[8]=[f("mdi-close-circle-outline")])),_:1,__:[8]}))])]),_:1})]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(ee,{ref_key:"generalForm",ref:I,modelValue:l.value,"onUpdate:modelValue":s[1]||(s[1]=u=>l.value=u),editing:""},null,8,["modelValue"])]),_:1})]),_:1}),w.value?(o(),d(g,{key:1,eager:"",value:"mailboxForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Mailbox")),1)]),_:1}),a(n,{cols:"8",class:""},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",ve)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[l.value.mailbox?(o(),p(B,{key:0},[l.value.mailbox.use_domain_quota?(o(),d(n,{key:0,cols:"6"},{default:e(()=>[v("div",pe,r(m(i)("Quota: "))+" "+r(m(i)("domain's default value")),1)]),_:1})):(o(),d(n,{key:1,cols:"6"},{default:e(()=>[v("div",ke,r(m(i)("Quota: "))+" "+r(l.value.mailbox.quota),1)]),_:1})),a(n,{cols:"6"},{default:e(()=>[v("div",ye,[f(r(m(i)("Send only"))+" ",1),l.value.mailbox.is_send_only?(o(),d(U,{key:0,color:"success"},{default:e(()=>s[9]||(s[9]=[f("mdi-check-circle-outline")])),_:1,__:[9]})):(o(),d(U,{key:1},{default:e(()=>s[10]||(s[10]=[f("mdi-close-circle-outline")])),_:1,__:[10]}))])]),_:1})],64)):k("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(ae,{ref_key:"mailboxForm",ref:M,modelValue:l.value,"onUpdate:modelValue":s[2]||(s[2]=u=>l.value=u)},null,8,["modelValue"])]),_:1})]),_:1})):k("",!0),w.value?(o(),d(g,{key:2,eager:"",value:"aliasForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Alias")),1)]),_:1}),a(n,{cols:"8",class:""},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",Ve)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[l.value.aliases?(o(),d(n,{key:0,cols:"6"},{default:e(()=>[v("div",ge,r(m(i)("Number of associated alias:"))+" "+r(l.value.aliases.length),1)]),_:1})):k("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(le,{ref_key:"aliasForm",ref:D,modelValue:l.value,"onUpdate:modelValue":s[3]||(s[3]=u=>l.value=u)},null,8,["modelValue"])]),_:1})]),_:1})):k("",!0),$.value?(o(),d(g,{key:3,eager:"",value:"resourcesForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Resources")),1)]),_:1}),a(n,{cols:"8",class:""},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",be)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[l.value.resources!=null&&l.value.resources.length==2?(o(),p(B,{key:0},[a(n,{cols:"6"},{default:e(()=>[v("div",xe,r(m(i)("Number of allowed mailboxes:"))+" "+r(l.value.resources[0].max_value),1)]),_:1}),a(n,{cols:"6"},{default:e(()=>[v("div",Fe,r(m(i)("Number of allowed mailbox aliases:"))+" "+r(l.value.resources[1].max_value),1)]),_:1})],64)):k("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(te,{ref_key:"resourcesForm",ref:R,modelValue:l.value.resources,"onUpdate:modelValue":s[4]||(s[4]=u=>l.value.resources=u)},null,8,["modelValue"])]),_:1})]),_:1})):k("",!0)]),_:1},8,["modelValue","multiple"]),v("div",we,[a(q,{loading:y.value,variant:"outlined",onClick:s[6]||(s[6]=u=>t.$router.go(-1))},{default:e(()=>[f(r(m(i)("Cancel")),1)]),_:1},8,["loading"]),a(q,{class:"ml-4",color:"primary darken-1",variant:"outlined",loading:y.value,onClick:z},{default:e(()=>[f(r(m(i)("Save")),1)]),_:1},8,["loading"])])]))}},Ee={__name:"AccountEditView",setup(G){const{$gettext:i}=L();return(N,F)=>(o(),p(B,null,[a(ne,{flat:""},{default:e(()=>[a(ie,null,{default:e(()=>[f(r(m(i)("Edit account")),1)]),_:1})]),_:1}),a(he)],64))}},la=Y(Ee,[["__scopeId","data-v-4019c7f8"]]);export{la as default};
1
+ import{b as L,u as H,B as J,q as K,h as c,i as P,j as T,d as W,z as X,c as d,l as p,o,a,e as v,w as e,m as k,f as m,k as f,t as r,F as B,_ as Y}from"./index-Be6X7UaJ.js";import{b as Z,a as ee,A as ae,_ as le}from"./AccountAliasForm-BzwhK9cz.js";import{_ as te}from"./ResourcesForm-D5G8hixZ.js";import{L as oe}from"./LoadingData-1iXkFEpZ.js";import{a as j}from"./accounts-CxGXJgEh.js";import{p as se}from"./parameters-BOf7j4fc.js";import{u as ue}from"./permissions-DxMzIhgI.js";import{d as V,c as U,V as q}from"./VAvatar-BAW2MRci.js";import{V as g,c as b,a as x,b as re}from"./VExpansionPanels-Cf4WPRqX.js";import{V as _,a as n}from"./VRow-Dnsej546.js";import{V as ne,a as ie}from"./VToolbar-Du_s_183.js";import"./ChoiceField-k5nIk4ck.js";import"./VAlert-mUmhR_lW.js";import"./VProgressCircular-BOPNpUlJ.js";import"./tag-D-_IsM8n.js";import"./VForm-DUC3-Taa.js";import"./VInput-B6b2s-5B.js";import"./forwardRefs-DDY5bVRf.js";import"./ssrBoot-BbpCPk1A.js";import"./AccountPasswordSubForm-DtqTon2C.js";import"./VTextField-Dt3N956g.js";import"./VSwitch-bLRfr5zT.js";import"./VSelectionControl-BHD9kDEZ.js";import"./EmailField-CFNREcuM.js";import"./domains.store-GfcrCBY7.js";import"./domains-FSnyP8bd.js";import"./VChip-C2Lh9BaB.js";import"./VContainer-CTzYfsVd.js";/* empty css */const de={key:1},me={key:0},fe={key:0},ce={class:"mr-2"},_e={class:"mr-2"},ve={key:0},pe={class:"mr-2"},ke={class:"mr-2"},ye={class:"mr-2"},Ve={key:0},ge={class:"mr-2"},be={key:0},xe={class:"mr-2"},Fe={class:"mr-2"},we={class:"mt-4 d-flex justify-end"},he={__name:"AccountEditForm",setup(G){const{$gettext:i}=L(),N=H(),F=J(),O=K(),{canSetRole:S}=ue(),l=c({pk:F.params.id}),w=P(()=>l.value.username&&l.value.username.indexOf("@")!==-1),$=P(()=>{const t=C.value.params&&C.value.params.enable_admin_limits&&l.value.role!==T.USER&&l.value.role!==T.SUPER_ADMIN;return t===void 0?!1:t}),C=c({}),h=c(0),y=c(!1),E=c(!1),A=c(),I=c(),M=c(),D=c(),R=c(),Q=P(()=>{const t={roleForm:A,generalForm:I};return w.value&&(t.aliasForm=D,t.mailboxForm=M),$.value&&(t.resourcesForm=R),t});async function z(){E.value=!1,h.value=[];for(const[t,s]of Object.entries(Q.value))if(s.value!=null){const{valid:u}=await s.value.vFormRef.validate();u||(E.value=!0,h.value.push(t))}if(!E.value){y.value=!0;try{const t={...l.value};w.value?t.mailbox.full_address=t.username:t.mailbox&&delete t.mailbox.full_address,t.new_password&&(t.password=t.new_password,delete t.new_password,delete t.password_confirmation),$.value&&R.value!==null&&(t.resources=R.value.getPayload()),t.aliases===null&&delete t.aliases,S.value||(l.value.pk===N.authUser.pk?t.role=N.authUser.role:t.role=T.USER),await j.patch(l.value.pk,t),O.push({name:"AccountDetail",params:{id:F.params.id}})}finally{y.value=!1}}}return W(()=>{j.get(F.params.id).then(t=>{l.value=t.data,y.value=!1}),S.value&&se.getGlobalApplication("limits").then(t=>{C.value=t.data})}),X(l,()=>{delete l.value.domains,l.value.mailbox===null&&delete l.value.mailbox},{deep:!0}),(t,s)=>y.value?(o(),d(oe,{key:0})):(o(),p("div",de,[a(re,{modelValue:h.value,"onUpdate:modelValue":s[5]||(s[5]=u=>h.value=u),multiple:E.value},{default:e(()=>[m(S)?(o(),d(g,{key:0,eager:"",value:"roleForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Role")),1)]),_:1}),a(n,{cols:"8",class:"text-medium-emphasis"},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",me)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[A.value?(o(),d(n,{key:0,cols:"6"},{default:e(()=>[f(r(A.value.roleLabel),1)]),_:1})):k("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(Z,{ref_key:"roleForm",ref:A,modelValue:l.value,"onUpdate:modelValue":s[0]||(s[0]=u=>l.value=u)},null,8,["modelValue"])]),_:1})]),_:1})):k("",!0),a(g,{eager:"",value:"generalForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Identification")),1)]),_:1}),a(n,{cols:"8",class:""},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",fe)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[a(n,{cols:"6"},{default:e(()=>[v("div",ce,r(m(i)("Username:"))+" "+r(l.value.username),1)]),_:1}),a(n,{cols:"6"},{default:e(()=>[v("div",_e,[f(r(m(i)("Enabled"))+" ",1),l.value.is_active?(o(),d(U,{key:0,color:"success"},{default:e(()=>s[7]||(s[7]=[f("mdi-check-circle-outline")])),_:1,__:[7]})):(o(),d(U,{key:1},{default:e(()=>s[8]||(s[8]=[f("mdi-close-circle-outline")])),_:1,__:[8]}))])]),_:1})]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(ee,{ref_key:"generalForm",ref:I,modelValue:l.value,"onUpdate:modelValue":s[1]||(s[1]=u=>l.value=u),editing:""},null,8,["modelValue"])]),_:1})]),_:1}),w.value?(o(),d(g,{key:1,eager:"",value:"mailboxForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Mailbox")),1)]),_:1}),a(n,{cols:"8",class:""},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",ve)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[l.value.mailbox?(o(),p(B,{key:0},[l.value.mailbox.use_domain_quota?(o(),d(n,{key:0,cols:"6"},{default:e(()=>[v("div",pe,r(m(i)("Quota: "))+" "+r(m(i)("domain's default value")),1)]),_:1})):(o(),d(n,{key:1,cols:"6"},{default:e(()=>[v("div",ke,r(m(i)("Quota: "))+" "+r(l.value.mailbox.quota),1)]),_:1})),a(n,{cols:"6"},{default:e(()=>[v("div",ye,[f(r(m(i)("Send only"))+" ",1),l.value.mailbox.is_send_only?(o(),d(U,{key:0,color:"success"},{default:e(()=>s[9]||(s[9]=[f("mdi-check-circle-outline")])),_:1,__:[9]})):(o(),d(U,{key:1},{default:e(()=>s[10]||(s[10]=[f("mdi-close-circle-outline")])),_:1,__:[10]}))])]),_:1})],64)):k("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(ae,{ref_key:"mailboxForm",ref:M,modelValue:l.value,"onUpdate:modelValue":s[2]||(s[2]=u=>l.value=u)},null,8,["modelValue"])]),_:1})]),_:1})):k("",!0),w.value?(o(),d(g,{key:2,eager:"",value:"aliasForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Alias")),1)]),_:1}),a(n,{cols:"8",class:""},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",Ve)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[l.value.aliases?(o(),d(n,{key:0,cols:"6"},{default:e(()=>[v("div",ge,r(m(i)("Number of associated alias:"))+" "+r(l.value.aliases.length),1)]),_:1})):k("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(le,{ref_key:"aliasForm",ref:D,modelValue:l.value,"onUpdate:modelValue":s[3]||(s[3]=u=>l.value=u)},null,8,["modelValue"])]),_:1})]),_:1})):k("",!0),$.value?(o(),d(g,{key:3,eager:"",value:"resourcesForm"},{default:e(()=>[a(b,null,{default:e(({expanded:u})=>[a(_,{"no-gutters":""},{default:e(()=>[a(n,{cols:"4"},{default:e(()=>[f(r(m(i)("Resources")),1)]),_:1}),a(n,{cols:"8",class:""},{default:e(()=>[a(V,{"leave-absolute":""},{default:e(()=>[u?(o(),p("span",be)):(o(),d(_,{key:1,"no-gutters":"",style:{width:"100%"}},{default:e(()=>[l.value.resources!=null&&l.value.resources.length==2?(o(),p(B,{key:0},[a(n,{cols:"6"},{default:e(()=>[v("div",xe,r(m(i)("Number of allowed mailboxes:"))+" "+r(l.value.resources[0].max_value),1)]),_:1}),a(n,{cols:"6"},{default:e(()=>[v("div",Fe,r(m(i)("Number of allowed mailbox aliases:"))+" "+r(l.value.resources[1].max_value),1)]),_:1})],64)):k("",!0)]),_:1}))]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:1}),a(x,null,{default:e(()=>[a(te,{ref_key:"resourcesForm",ref:R,modelValue:l.value.resources,"onUpdate:modelValue":s[4]||(s[4]=u=>l.value.resources=u)},null,8,["modelValue"])]),_:1})]),_:1})):k("",!0)]),_:1},8,["modelValue","multiple"]),v("div",we,[a(q,{loading:y.value,variant:"outlined",onClick:s[6]||(s[6]=u=>t.$router.go(-1))},{default:e(()=>[f(r(m(i)("Cancel")),1)]),_:1},8,["loading"]),a(q,{class:"ml-4",color:"primary darken-1",variant:"outlined",loading:y.value,onClick:z},{default:e(()=>[f(r(m(i)("Save")),1)]),_:1},8,["loading"])])]))}},Ee={__name:"AccountEditView",setup(G){const{$gettext:i}=L();return(N,F)=>(o(),p(B,null,[a(ne,{flat:""},{default:e(()=>[a(ie,null,{default:e(()=>[f(r(m(i)("Edit account")),1)]),_:1})]),_:1}),a(he)],64))}},la=Y(Ee,[["__scopeId","data-v-4019c7f8"]]);export{la as default};
@@ -0,0 +1 @@
1
+ import{u as n,b as c,h as u,i as a,c as l,o as f}from"./index-Be6X7UaJ.js";import{_}from"./ConnectedLayout-C-YqPGtT.js";import{p as h}from"./parameters-BOf7j4fc.js";import"./theme-B2lOH8MT.js";import"./VContainer-CTzYfsVd.js";/* empty css */import"./tag-D-_IsM8n.js";import"./VApp-D-widb3i.js";import"./layout-DD534hN7.js";import"./ssrBoot-BbpCPk1A.js";import"./logos-DY4N2P_F.js";import"./layout.store-ZOCP2JtQ.js";import"./VAvatar-BAW2MRci.js";import"./VProgressCircular-BOPNpUlJ.js";import"./forwardRefs-DDY5bVRf.js";import"./VMenu-sBFHa2zz.js";import"./global.store-DrPrIa_j.js";import"./VBadge-D1u6z0HB.js";import"./VCard-DI9bqjLN.js";import"./VRow-Dnsej546.js";import"./VSheet-DRQqJmTV.js";const z={__name:"AccountLayout",setup(d){const s=n(),{$gettext:e}=c(),r=u([]),m=a(()=>s.authUser),p=a(()=>{const t=[],i={contacts:"mdi-contacts-outline",webmail:"mdi-at"};if(t.push({text:e("Settings"),to:{name:"AccountSettings"},icon:"mdi-cog"}),m.value.mailbox){t.push({text:e("Filters"),to:{name:"AccountFilters"},icon:"mdi-filter"});for(const o of r.value)t.push({icon:i[o.name],text:o.label,to:{name:"AccountParametersEdit",params:{app:o.name}}})}return t});return h.getUserApplications().then(t=>{r.value=t.data}),(t,i)=>(f(),l(_,{color:"grey","menu-items":p.value},null,8,["menu-items"]))}};export{z as default};
@@ -1 +1 @@
1
- import{b as P,n as _,i as b,l as m,o as n,m as p,a as o,F as V,e as v,t as y,f as l,w as u,c as h}from"./index-YIGRKgNA.js";import{a as E}from"./accounts-BT429O7P.js";import{r as c}from"./VForm-BwTUBf4u.js";import{V as w}from"./VTextField-C9VUP7V9.js";import{a as g,V as R}from"./VRow-CAbOSEHS.js";import{V as S}from"./VSwitch-CixaedmQ.js";import{V as q}from"./VAlert-x6n3drjw.js";import{V as A}from"./VAvatar-J563boKh.js";const F={class:"m-label"},N={class:"text-white mr-4"},H={__name:"AccountPasswordSubForm",props:{modelValue:{type:Object,default:null},withPasswordCheck:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},editing:{type:Boolean,default:!1},formErrors:{type:Object,required:!1,default:()=>{}}},setup(s){const{$gettext:t}=P(),k=_(),r=s,e=b(()=>r.modelValue),f=b(()=>!r.disabled&&(!r.editing||e.value.password)),x=i=>i===e.value.new_password||t("Password mismatch");function C(){navigator.clipboard.writeText(e.value.new_password).then(()=>{k.displayNotification({msg:t("Password copied to clipboard")})})}function B(i){i?E.getRandomPassword().then(a=>{e.value.new_password=a.data.password}):(e.value.new_password=null,e.value.password_confirmation=null)}return(i,a)=>(n(),m("div",null,[s.withPasswordCheck?(n(),m(V,{key:0},[v("label",F,y(l(t)("Current password")),1),o(w,{modelValue:e.value.password,"onUpdate:modelValue":a[0]||(a[0]=d=>e.value.password=d),autocomplete:"new-password",variant:"outlined",type:"password",density:"compact","validate-on":"submit",rules:s.disabled?[]:[l(c).required],disabled:s.disabled,"error-messages":r.formErrors?r.formErrors.password:[]},null,8,["modelValue","rules","disabled","error-messages"])],64)):p("",!0),o(R,{justify:"center"},{default:u(()=>[o(g,{cols:"auto"},{default:u(()=>[o(S,{modelValue:e.value.random_password,"onUpdate:modelValue":[a[1]||(a[1]=d=>e.value.random_password=d),B],label:l(t)("Random password"),density:"compact",color:"primary",class:"text-center",disabled:s.disabled},null,8,["modelValue","label","disabled"])]),_:1}),o(g,null,{default:u(()=>[e.value.random_password?(n(),h(q,{key:0,style:{"background-color":"#515d78"},class:"ml-6",density:"compact"},{default:u(()=>[v("span",N,y(e.value.new_password),1),o(A,{size:"small",color:"white",variant:"text",density:"compact",disabled:s.disabled,icon:"mdi-clipboard-multiple-outline",title:l(t)("Copy to clipboard"),onClick:C},null,8,["disabled","title"])]),_:1})):p("",!0)]),_:1})]),_:1}),e.value.random_password?p("",!0):(n(),m(V,{key:1},[o(w,{modelValue:e.value.new_password,"onUpdate:modelValue":a[2]||(a[2]=d=>e.value.new_password=d),variant:"outlined",label:l(t)("Password"),type:"password",autocomplete:"new-password",density:"compact",disabled:s.disabled,rules:f.value?[l(c).required]:[]},null,8,["modelValue","label","disabled","rules"]),o(w,{modelValue:e.value.password_confirmation,"onUpdate:modelValue":a[3]||(a[3]=d=>e.value.password_confirmation=d),variant:"outlined",type:"password",label:l(t)("Confirmation"),density:"compact",disabled:s.disabled,rules:f.value?[l(c).required,x]:[],"error-messages":r.formErrors?r.formErrors.new_password:[]},null,8,["modelValue","label","disabled","rules","error-messages"])],64))]))}};export{H as _};
1
+ import{b as P,n as _,i as b,l as m,o as n,m as p,a as o,F as V,e as v,t as y,f as l,w as u,c as h}from"./index-Be6X7UaJ.js";import{a as E}from"./accounts-CxGXJgEh.js";import{r as c}from"./VForm-DUC3-Taa.js";import{V as w}from"./VTextField-Dt3N956g.js";import{a as g,V as R}from"./VRow-Dnsej546.js";import{V as S}from"./VSwitch-bLRfr5zT.js";import{V as q}from"./VAlert-mUmhR_lW.js";import{V as A}from"./VAvatar-BAW2MRci.js";const F={class:"m-label"},N={class:"text-white mr-4"},H={__name:"AccountPasswordSubForm",props:{modelValue:{type:Object,default:null},withPasswordCheck:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},editing:{type:Boolean,default:!1},formErrors:{type:Object,required:!1,default:()=>{}}},setup(s){const{$gettext:t}=P(),k=_(),r=s,e=b(()=>r.modelValue),f=b(()=>!r.disabled&&(!r.editing||e.value.password)),x=i=>i===e.value.new_password||t("Password mismatch");function C(){navigator.clipboard.writeText(e.value.new_password).then(()=>{k.displayNotification({msg:t("Password copied to clipboard")})})}function B(i){i?E.getRandomPassword().then(a=>{e.value.new_password=a.data.password}):(e.value.new_password=null,e.value.password_confirmation=null)}return(i,a)=>(n(),m("div",null,[s.withPasswordCheck?(n(),m(V,{key:0},[v("label",F,y(l(t)("Current password")),1),o(w,{modelValue:e.value.password,"onUpdate:modelValue":a[0]||(a[0]=d=>e.value.password=d),autocomplete:"new-password",variant:"outlined",type:"password",density:"compact","validate-on":"submit",rules:s.disabled?[]:[l(c).required],disabled:s.disabled,"error-messages":r.formErrors?r.formErrors.password:[]},null,8,["modelValue","rules","disabled","error-messages"])],64)):p("",!0),o(R,{justify:"center"},{default:u(()=>[o(g,{cols:"auto"},{default:u(()=>[o(S,{modelValue:e.value.random_password,"onUpdate:modelValue":[a[1]||(a[1]=d=>e.value.random_password=d),B],label:l(t)("Random password"),density:"compact",color:"primary",class:"text-center",disabled:s.disabled},null,8,["modelValue","label","disabled"])]),_:1}),o(g,null,{default:u(()=>[e.value.random_password?(n(),h(q,{key:0,style:{"background-color":"#515d78"},class:"ml-6",density:"compact"},{default:u(()=>[v("span",N,y(e.value.new_password),1),o(A,{size:"small",color:"white",variant:"text",density:"compact",disabled:s.disabled,icon:"mdi-clipboard-multiple-outline",title:l(t)("Copy to clipboard"),onClick:C},null,8,["disabled","title"])]),_:1})):p("",!0)]),_:1})]),_:1}),e.value.random_password?p("",!0):(n(),m(V,{key:1},[o(w,{modelValue:e.value.new_password,"onUpdate:modelValue":a[2]||(a[2]=d=>e.value.new_password=d),variant:"outlined",label:l(t)("Password"),type:"password",autocomplete:"new-password",density:"compact",disabled:s.disabled,rules:f.value?[l(c).required]:[]},null,8,["modelValue","label","disabled","rules"]),o(w,{modelValue:e.value.password_confirmation,"onUpdate:modelValue":a[3]||(a[3]=d=>e.value.password_confirmation=d),variant:"outlined",type:"password",label:l(t)("Confirmation"),density:"compact",disabled:s.disabled,rules:f.value?[l(c).required,x]:[],"error-messages":r.formErrors?r.formErrors.new_password:[]},null,8,["modelValue","label","disabled","rules","error-messages"])],64))]))}};export{H as _};
@@ -1 +1 @@
1
- import{c as d,o,w as e,a as t,e as k,t as a,l as _,F as p,s as T,k as s,C as w,n as P,b as j,h as x,f,m as v,_ as U,B as G,j as B}from"./index-YIGRKgNA.js";import{u as z}from"./permissions-C33K6cJv.js";import{a as Q}from"./accounts-BT429O7P.js";import{p as H}from"./parameters-DpVw-Zs4.js";import{c as A,V,a as C}from"./VCard-CJ2oGh_i.js";import{V as J}from"./VChip-DvxO74Mw.js";import{V as K}from"./VDataTable-CAT0QYJz.js";import{V as $,c as E,a as D}from"./VAvatar-J563boKh.js";import{V as W}from"./VTextField-C9VUP7V9.js";import{V as g,a as c}from"./VRow-CAbOSEHS.js";import{V as X,a as Y}from"./VToolbar-Cs-fVa4M.js";import"./tag-DV1_zOzl.js";import"./VProgressCircular-CtqQON49.js";import"./VSelect-Cdh0qO5m.js";import"./VInput-Dpmea5z9.js";import"./forwardRefs-DPrLRqxP.js";import"./ssrBoot-CpJ-7WlH.js";import"./VMenu-DDmBlbM8.js";import"./VCheckboxBtn-CLh3m66z.js";import"./VSelectionControl-BN-zQ3C6.js";import"./VTable-DO7ofPSj.js";import"./filter-C_GJovn5.js";/* empty css */const Z={class:"headline"},ee={__name:"AccountAliases",props:{account:{type:Object,default:null}},setup(l){return(n,m)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",Z,a(n.$gettext("Aliases")),1)]),_:1}),t(V,null,{default:e(()=>[(o(!0),_(p,null,T(l.account.aliases,u=>(o(),d(J,{key:u,class:"mr-2 mt-2"},{default:e(()=>[s(a(u),1)]),_:2},1024))),128))]),_:1})]),_:1}))}},N="senderaddresses",M={getAll(){return w.get(`${N}/`)},getAllForMailbox(l){return w.get(`${N}/`,{params:{mailbox:l}})},create(l){return w.post(`${N}/`,l)},delete(l){return w.delete(`${N}/${l}/`)}},te={class:"headline"},ae={key:0},le={__name:"AccountSenderAddresses",props:{account:{type:Object,default:null}},setup(l){const n=P(),{$gettext:m}=j(),u=l,r=x([]),y=x(!1),i=x(""),q=[{title:m("Address"),key:"address"},{title:"",key:"actions",align:"end",sortable:!1}];function I(){r.value.push({}),y.value=!0}function R(){M.getAllForMailbox(u.account.mailbox.pk).then(h=>{r.value=h.data})}function L(){const h={address:i.value,mailbox:u.account.mailbox.pk};M.create(h).then(()=>{R(),i.value=null,y.value=!1,n.displayNotification({msg:m("Sender address added")})})}function O(h){M.delete(h.pk).then(()=>{R(),n.displayNotification({msg:m("Sender address deleted")})})}return R(),(h,S)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",te,a(f(m)("Sender addresses")),1)]),_:1}),t(V,null,{default:e(()=>[t(K,{headers:q,items:r.value,"no-data-text":f(m)("No sender address defined for this account")},{"item.address":e(({item:b})=>[b.pk?(o(),_("span",ae,a(b.address),1)):(o(),d(W,{key:1,modelValue:i.value,"onUpdate:modelValue":S[0]||(S[0]=F=>i.value=F),label:f(m)("Specify an email address")},{append:e(()=>[i.value?(o(),d($,{key:0,icon:"mdi-content-save",color:"primary",variant:"text",onClick:L})):v("",!0)]),_:1},8,["modelValue","label"]))]),"item.actions":e(({item:b})=>[b.pk?(o(),d($,{key:0,icon:"mdi-delete-outline",color:"red",title:f(m)("Remove this address"),variant:"text",onClick:F=>O(b)},null,8,["title","onClick"])):v("",!0)]),bottom:e(()=>S[1]||(S[1]=[])),_:2},1032,["items","no-data-text"]),y.value?v("",!0):(o(),d($,{key:0,size:"small",color:"primary",variant:"outlined",onClick:I},{default:e(()=>[t(E,{size:"small",icon:"mdi-plus"}),s(" "+a(f(m)("Add sender address")),1)]),_:1}))]),_:1})]),_:1}))}},ne={class:"headline"},oe={__name:"AccountSummary",props:{account:{type:Object,default:null}},setup(l){return(n,m)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",ne,a(n.$gettext("General information")),1)]),_:1}),t(V,null,{default:e(()=>[t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Creation date")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(n.$date(l.account.date_joined)),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Last login date")),1)]),_:1}),l.account.last_login?(o(),d(c,{key:0,cols:"6"},{default:e(()=>[s(a(n.$date(l.account.last_login)),1)]),_:1})):(o(),d(c,{key:1,cols:"6"},{default:e(()=>[s(a(n.$gettext("Never logged-in")),1)]),_:1}))]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Full name")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(l.account.first_name)+" "+a(l.account.last_name),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Role")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(l.account.role),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Secondary email")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(l.account.secondary_email),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Phone number")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(l.account.phone_number),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Enabled")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[t(E,{color:l.account.is_active?"success":"error",icon:l.account.is_active?"mdi-check-circle":"mdi-close-circle",variant:"flat"},null,8,["color","icon"])]),_:1})]),_:1}),l.account.mailbox?(o(),_(p,{key:0},[t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Quota")),1)]),_:1}),l.account.mailbox.quota==="0"?(o(),d(c,{key:0,cols:"6"},{default:e(()=>[s(a(n.$gettext("Unlimited")),1)]),_:1})):(o(),d(c,{key:1,cols:"6"},{default:e(()=>[t(D,{color:l.account.mailbox.quota_usage<80?"primary":"warning","model-value":l.account.mailbox.quota_usage,height:"25",class:"white--text"},{default:e(({value:u})=>[s(a(Math.ceil(u))+"% ("+a(l.account.mailbox.quota)+" "+a(n.$gettext("MB"))+") ",1)]),_:1},8,["color","model-value"])]),_:1}))]),_:1}),l.account.mailbox.message_limit!==null&&l.account.mailbox.message_limit!==void 0?(o(),d(g,{key:0},{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Daily sending limit")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[l.account.mailbox.message_limit===0?(o(),_(p,{key:0},[s(a(n.$gettext("Sending forbidden")),1)],64)):(o(),d(D,{key:1,color:l.account.mailbox.sent_messages_in_percent<80?"primary":"warning","model-value":l.account.mailbox.sent_messages_in_percent,height:"25",class:"white--text"},{default:e(({value:u})=>[s(a(Math.ceil(u))+"% ("+a(l.account.mailbox.message_limit)+" "+a(n.$gettext("messages"))+") ",1)]),_:1},8,["color","model-value"]))]),_:1})]),_:1})):v("",!0)],64)):v("",!0)]),_:1})]),_:1}))}},se={class:"headline"},ue={key:1},ce={class:"text-disabled"},ie={__name:"DomainAdminDomains",props:{account:{type:Object,default:null}},setup(l){const{$gettext:n}=j();return(m,u)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",se,a(f(n)("Administered domains")),1)]),_:1}),t(V,null,{default:e(()=>[l.account.domains!==void 0&&l.account.domains.length?(o(!0),_(p,{key:0},T(l.account.domains,r=>(o(),d(g,{key:r},{default:e(()=>[t(c,{cols:"12"},{default:e(()=>[s(a(r),1)]),_:2},1024)]),_:2},1024))),128)):(o(),_("div",ue,a(f(n)("No domain managed")),1)),k("div",ce,a(f(n)("Add/Remove from the domain page")),1)]),_:1})]),_:1}))}},de={class:"headline"},re={__name:"ResourcesView",props:{resources:{type:Array,default:null}},setup(l){const{$gettext:n}=j(),m=r=>r.name==="quota"?n("No quota"):n("Creation denied");function u(r){return r<50?"primary":r<80?"warning":"error"}return(r,y)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",de,a(f(n)("Resources usage")),1)]),_:1}),t(V,null,{default:e(()=>[(o(!0),_(p,null,T(l.resources,i=>(o(),_("div",{key:i.name,class:"mt-4"},[i.max_value===-1?(o(),_(p,{key:0},[s(a(i.label)+" ("+a(f(n)("Unlimited"))+") ",1)],64)):i.max_value===0?(o(),_(p,{key:1},[s(a(i.label)+" ("+a(m(i))+") ",1)],64)):(o(),_(p,{key:2},[s(a(i.label)+" ("+a(Math.ceil(i.usage))+"%) ",1),t(D,{"model-value":i.usage,color:u(i.usage)},null,8,["model-value","color"])],64))]))),128))]),_:1})]),_:1}))}},me={__name:"AccountView",setup(l){const n=G(),{canSetRole:m}=z(),u=x({pk:n.params.id}),r=x({});function y(){Q.get(n.params.id).then(i=>{u.value=i.data})}return m.value&&H.getGlobalApplication("limits").then(i=>{r.value=i.data}),y(),(i,q)=>(o(),_(p,null,[t(X,{flat:""},{default:e(()=>[t(Y,null,{default:e(()=>[s(a(i.$gettext("Account"))+" "+a(u.value.username)+" ",1),t($,{color:"primary",icon:"mdi-circle-edit-outline",to:{name:"AccountEdit",params:{id:u.value.pk}}},null,8,["to"]),t($,{color:"primary",icon:"mdi-reload",onClick:y})]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[t(oe,{account:u.value},null,8,["account"]),u.value.role===f(B).DOMAIN_ADMIN?(o(),d(ie,{key:0,class:"mt-2",account:u.value},null,8,["account"])):v("",!0)]),_:1}),t(c,{cols:"6"},{default:e(()=>[r.value.params&&r.value.params.enable_admin_limits&&u.value.role!==f(B).USER&&u.value.role!==f(B).SUPER_ADMIN?(o(),d(re,{key:0,resources:u.value.resources},null,8,["resources"])):v("",!0),u.value.aliases?(o(),d(ee,{key:1,class:"mt-2",account:u.value},null,8,["account"])):v("",!0),u.value.mailbox?(o(),d(le,{key:2,class:"mt-2",account:u.value},null,8,["account"])):v("",!0)]),_:1})]),_:1})],64))}},qe=U(me,[["__scopeId","data-v-388d62f6"]]);export{qe as default};
1
+ import{c as d,o,w as e,a as t,e as k,t as a,l as _,F as p,s as T,k as s,C as w,n as P,b as j,h as x,f,m as v,_ as U,B as G,j as B}from"./index-Be6X7UaJ.js";import{u as z}from"./permissions-DxMzIhgI.js";import{a as Q}from"./accounts-CxGXJgEh.js";import{p as H}from"./parameters-BOf7j4fc.js";import{c as A,V,a as C}from"./VCard-DI9bqjLN.js";import{V as J}from"./VChip-C2Lh9BaB.js";import{V as K}from"./VDataTable-ClNLUB1Q.js";import{V as $,c as E,a as D}from"./VAvatar-BAW2MRci.js";import{V as W}from"./VTextField-Dt3N956g.js";import{V as g,a as c}from"./VRow-Dnsej546.js";import{V as X,a as Y}from"./VToolbar-Du_s_183.js";import"./tag-D-_IsM8n.js";import"./VProgressCircular-BOPNpUlJ.js";import"./VSelect-BdxqTzW5.js";import"./VInput-B6b2s-5B.js";import"./forwardRefs-DDY5bVRf.js";import"./ssrBoot-BbpCPk1A.js";import"./VMenu-sBFHa2zz.js";import"./VCheckboxBtn-B35nMyHy.js";import"./VSelectionControl-BHD9kDEZ.js";import"./VTable-CLV2Uv-1.js";import"./filter-fudwgMWN.js";/* empty css */const Z={class:"headline"},ee={__name:"AccountAliases",props:{account:{type:Object,default:null}},setup(l){return(n,m)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",Z,a(n.$gettext("Aliases")),1)]),_:1}),t(V,null,{default:e(()=>[(o(!0),_(p,null,T(l.account.aliases,u=>(o(),d(J,{key:u,class:"mr-2 mt-2"},{default:e(()=>[s(a(u),1)]),_:2},1024))),128))]),_:1})]),_:1}))}},N="senderaddresses",M={getAll(){return w.get(`${N}/`)},getAllForMailbox(l){return w.get(`${N}/`,{params:{mailbox:l}})},create(l){return w.post(`${N}/`,l)},delete(l){return w.delete(`${N}/${l}/`)}},te={class:"headline"},ae={key:0},le={__name:"AccountSenderAddresses",props:{account:{type:Object,default:null}},setup(l){const n=P(),{$gettext:m}=j(),u=l,r=x([]),y=x(!1),i=x(""),q=[{title:m("Address"),key:"address"},{title:"",key:"actions",align:"end",sortable:!1}];function I(){r.value.push({}),y.value=!0}function R(){M.getAllForMailbox(u.account.mailbox.pk).then(h=>{r.value=h.data})}function L(){const h={address:i.value,mailbox:u.account.mailbox.pk};M.create(h).then(()=>{R(),i.value=null,y.value=!1,n.displayNotification({msg:m("Sender address added")})})}function O(h){M.delete(h.pk).then(()=>{R(),n.displayNotification({msg:m("Sender address deleted")})})}return R(),(h,S)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",te,a(f(m)("Sender addresses")),1)]),_:1}),t(V,null,{default:e(()=>[t(K,{headers:q,items:r.value,"no-data-text":f(m)("No sender address defined for this account")},{"item.address":e(({item:b})=>[b.pk?(o(),_("span",ae,a(b.address),1)):(o(),d(W,{key:1,modelValue:i.value,"onUpdate:modelValue":S[0]||(S[0]=F=>i.value=F),label:f(m)("Specify an email address")},{append:e(()=>[i.value?(o(),d($,{key:0,icon:"mdi-content-save",color:"primary",variant:"text",onClick:L})):v("",!0)]),_:1},8,["modelValue","label"]))]),"item.actions":e(({item:b})=>[b.pk?(o(),d($,{key:0,icon:"mdi-delete-outline",color:"red",title:f(m)("Remove this address"),variant:"text",onClick:F=>O(b)},null,8,["title","onClick"])):v("",!0)]),bottom:e(()=>S[1]||(S[1]=[])),_:2},1032,["items","no-data-text"]),y.value?v("",!0):(o(),d($,{key:0,size:"small",color:"primary",variant:"outlined",onClick:I},{default:e(()=>[t(E,{size:"small",icon:"mdi-plus"}),s(" "+a(f(m)("Add sender address")),1)]),_:1}))]),_:1})]),_:1}))}},ne={class:"headline"},oe={__name:"AccountSummary",props:{account:{type:Object,default:null}},setup(l){return(n,m)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",ne,a(n.$gettext("General information")),1)]),_:1}),t(V,null,{default:e(()=>[t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Creation date")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(n.$date(l.account.date_joined)),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Last login date")),1)]),_:1}),l.account.last_login?(o(),d(c,{key:0,cols:"6"},{default:e(()=>[s(a(n.$date(l.account.last_login)),1)]),_:1})):(o(),d(c,{key:1,cols:"6"},{default:e(()=>[s(a(n.$gettext("Never logged-in")),1)]),_:1}))]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Full name")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(l.account.first_name)+" "+a(l.account.last_name),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Role")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(l.account.role),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Secondary email")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(l.account.secondary_email),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Phone number")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[s(a(l.account.phone_number),1)]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Enabled")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[t(E,{color:l.account.is_active?"success":"error",icon:l.account.is_active?"mdi-check-circle":"mdi-close-circle",variant:"flat"},null,8,["color","icon"])]),_:1})]),_:1}),l.account.mailbox?(o(),_(p,{key:0},[t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Quota")),1)]),_:1}),l.account.mailbox.quota==="0"?(o(),d(c,{key:0,cols:"6"},{default:e(()=>[s(a(n.$gettext("Unlimited")),1)]),_:1})):(o(),d(c,{key:1,cols:"6"},{default:e(()=>[t(D,{color:l.account.mailbox.quota_usage<80?"primary":"warning","model-value":l.account.mailbox.quota_usage,height:"25",class:"white--text"},{default:e(({value:u})=>[s(a(Math.ceil(u))+"% ("+a(l.account.mailbox.quota)+" "+a(n.$gettext("MB"))+") ",1)]),_:1},8,["color","model-value"])]),_:1}))]),_:1}),l.account.mailbox.message_limit!==null&&l.account.mailbox.message_limit!==void 0?(o(),d(g,{key:0},{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[s(a(n.$gettext("Daily sending limit")),1)]),_:1}),t(c,{cols:"6"},{default:e(()=>[l.account.mailbox.message_limit===0?(o(),_(p,{key:0},[s(a(n.$gettext("Sending forbidden")),1)],64)):(o(),d(D,{key:1,color:l.account.mailbox.sent_messages_in_percent<80?"primary":"warning","model-value":l.account.mailbox.sent_messages_in_percent,height:"25",class:"white--text"},{default:e(({value:u})=>[s(a(Math.ceil(u))+"% ("+a(l.account.mailbox.message_limit)+" "+a(n.$gettext("messages"))+") ",1)]),_:1},8,["color","model-value"]))]),_:1})]),_:1})):v("",!0)],64)):v("",!0)]),_:1})]),_:1}))}},se={class:"headline"},ue={key:1},ce={class:"text-disabled"},ie={__name:"DomainAdminDomains",props:{account:{type:Object,default:null}},setup(l){const{$gettext:n}=j();return(m,u)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",se,a(f(n)("Administered domains")),1)]),_:1}),t(V,null,{default:e(()=>[l.account.domains!==void 0&&l.account.domains.length?(o(!0),_(p,{key:0},T(l.account.domains,r=>(o(),d(g,{key:r},{default:e(()=>[t(c,{cols:"12"},{default:e(()=>[s(a(r),1)]),_:2},1024)]),_:2},1024))),128)):(o(),_("div",ue,a(f(n)("No domain managed")),1)),k("div",ce,a(f(n)("Add/Remove from the domain page")),1)]),_:1})]),_:1}))}},de={class:"headline"},re={__name:"ResourcesView",props:{resources:{type:Array,default:null}},setup(l){const{$gettext:n}=j(),m=r=>r.name==="quota"?n("No quota"):n("Creation denied");function u(r){return r<50?"primary":r<80?"warning":"error"}return(r,y)=>(o(),d(C,null,{default:e(()=>[t(A,null,{default:e(()=>[k("span",de,a(f(n)("Resources usage")),1)]),_:1}),t(V,null,{default:e(()=>[(o(!0),_(p,null,T(l.resources,i=>(o(),_("div",{key:i.name,class:"mt-4"},[i.max_value===-1?(o(),_(p,{key:0},[s(a(i.label)+" ("+a(f(n)("Unlimited"))+") ",1)],64)):i.max_value===0?(o(),_(p,{key:1},[s(a(i.label)+" ("+a(m(i))+") ",1)],64)):(o(),_(p,{key:2},[s(a(i.label)+" ("+a(Math.ceil(i.usage))+"%) ",1),t(D,{"model-value":i.usage,color:u(i.usage)},null,8,["model-value","color"])],64))]))),128))]),_:1})]),_:1}))}},me={__name:"AccountView",setup(l){const n=G(),{canSetRole:m}=z(),u=x({pk:n.params.id}),r=x({});function y(){Q.get(n.params.id).then(i=>{u.value=i.data})}return m.value&&H.getGlobalApplication("limits").then(i=>{r.value=i.data}),y(),(i,q)=>(o(),_(p,null,[t(X,{flat:""},{default:e(()=>[t(Y,null,{default:e(()=>[s(a(i.$gettext("Account"))+" "+a(u.value.username)+" ",1),t($,{color:"primary",icon:"mdi-circle-edit-outline",to:{name:"AccountEdit",params:{id:u.value.pk}}},null,8,["to"]),t($,{color:"primary",icon:"mdi-reload",onClick:y})]),_:1})]),_:1}),t(g,null,{default:e(()=>[t(c,{cols:"6"},{default:e(()=>[t(oe,{account:u.value},null,8,["account"]),u.value.role===f(B).DOMAIN_ADMIN?(o(),d(ie,{key:0,class:"mt-2",account:u.value},null,8,["account"])):v("",!0)]),_:1}),t(c,{cols:"6"},{default:e(()=>[r.value.params&&r.value.params.enable_admin_limits&&u.value.role!==f(B).USER&&u.value.role!==f(B).SUPER_ADMIN?(o(),d(re,{key:0,resources:u.value.resources},null,8,["resources"])):v("",!0),u.value.aliases?(o(),d(ee,{key:1,class:"mt-2",account:u.value},null,8,["account"])):v("",!0),u.value.mailbox?(o(),d(le,{key:2,class:"mt-2",account:u.value},null,8,["account"])):v("",!0)]),_:1})]),_:1})],64))}},qe=U(me,[["__scopeId","data-v-388d62f6"]]);export{qe as default};