modoboa 2.4.11__py3-none-any.whl → 2.5.0__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.
- modoboa/admin/api/v2/serializers.py +14 -0
- modoboa/amavis/__init__.py +3 -0
- modoboa/amavis/app_settings.py +276 -0
- modoboa/amavis/apps.py +18 -0
- modoboa/amavis/checks/__init__.py +2 -0
- modoboa/amavis/checks/settings_checks.py +59 -0
- modoboa/amavis/dbrouter.py +35 -0
- modoboa/amavis/factories.py +164 -0
- modoboa/amavis/handlers.py +146 -0
- modoboa/amavis/lib.py +381 -0
- modoboa/amavis/management/__init__.py +0 -0
- modoboa/amavis/management/commands/__init__.py +0 -0
- modoboa/amavis/management/commands/amnotify.py +99 -0
- modoboa/amavis/management/commands/qcleanup.py +84 -0
- modoboa/amavis/migrations/0001_initial.py +340 -0
- modoboa/amavis/migrations/__init__.py +0 -0
- modoboa/amavis/models.py +226 -0
- modoboa/amavis/serializers.py +139 -0
- modoboa/amavis/sql_connector.py +240 -0
- modoboa/amavis/sql_email.py +66 -0
- modoboa/amavis/tasks.py +33 -0
- modoboa/amavis/templates/amavis/notifications/pending_requests.html +16 -0
- modoboa/amavis/tests/__init__.py +0 -0
- modoboa/amavis/tests/sa-learn +3 -0
- modoboa/amavis/tests/sample_messages/quarantined-input.txt +80 -0
- modoboa/amavis/tests/sample_messages/quarantined-output-plain_nolinks.txt +17 -0
- modoboa/amavis/tests/spamc +3 -0
- modoboa/amavis/tests/test_checks.py +25 -0
- modoboa/amavis/tests/test_handlers.py +214 -0
- modoboa/amavis/tests/test_lib.py +90 -0
- modoboa/amavis/tests/test_management_commands.py +45 -0
- modoboa/amavis/tests/test_sql_email.py +67 -0
- modoboa/amavis/tests/test_utils.py +19 -0
- modoboa/amavis/tests/test_viewsets.py +319 -0
- modoboa/amavis/urls.py +11 -0
- modoboa/amavis/utils.py +105 -0
- modoboa/amavis/viewsets.py +265 -0
- modoboa/core/api/v1/serializers.py +7 -5
- modoboa/core/api/v2/serializers.py +4 -2
- modoboa/core/api/v2/tests.py +16 -4
- modoboa/core/api/v2/urls.py +5 -5
- modoboa/core/api/v2/views.py +3 -1
- modoboa/core/api/v2/viewsets.py +24 -3
- modoboa/core/handlers.py +6 -2
- modoboa/core/management/commands/add_allowed_hosts.py +33 -0
- modoboa/core/management/commands/load_initial_data.py +10 -0
- modoboa/core/migrations/0025_rename_user_email_is_active_core_user_email_c0c03f_idx.py +23 -5
- modoboa/core/tests/test_core.py +24 -0
- modoboa/core/utils.py +3 -0
- modoboa/frontend_dist/assets/AccountAliasForm-BuSy_1n9.js +1 -0
- modoboa/frontend_dist/assets/AccountEditView-qdJmLM_e.js +1 -0
- modoboa/frontend_dist/assets/AccountLayout-DrN7vHsX.js +1 -0
- modoboa/frontend_dist/assets/AccountPasswordSubForm-DZGt_Xgq.js +1 -0
- modoboa/frontend_dist/assets/AccountView-CO65y0vZ.js +1 -0
- modoboa/frontend_dist/assets/AddressBook-BZNUlhek.js +1 -0
- modoboa/frontend_dist/assets/AdminLayout-CTNhuwTw.js +1 -0
- modoboa/frontend_dist/assets/AlarmsView-9yKGbmkC.css +1 -0
- modoboa/frontend_dist/assets/AlarmsView-DN_JIw9g.js +1 -0
- modoboa/frontend_dist/assets/AliasEditView-DjpPUTp9.js +1 -0
- modoboa/frontend_dist/assets/{AliasRecipientForm-IOae6sjF.js → AliasRecipientForm-B1Y8wFdP.js} +1 -1
- modoboa/frontend_dist/assets/AliasView-GOJ5lyQH.js +1 -0
- modoboa/frontend_dist/assets/AuditTrailView-fbXmq70e.js +1 -0
- modoboa/frontend_dist/assets/CalendarView-LlQQNEPL.js +1 -0
- modoboa/frontend_dist/assets/{ChoiceField-DJ_c78Cm.js → ChoiceField-B3ReQHVe.js} +1 -1
- modoboa/frontend_dist/assets/ComposeEmailForm-Bs1fZXAL.js +1 -0
- modoboa/frontend_dist/assets/ComposeEmailView-s3LMl3pO.js +1 -0
- modoboa/frontend_dist/assets/ConfirmDialog-DY_kUHLG.js +1 -0
- modoboa/frontend_dist/assets/{ConnectedLayout-Dvwmicnc.css → ConnectedLayout-Bxh21hcH.css} +1 -1
- modoboa/frontend_dist/assets/ConnectedLayout-UWjiYBNw.js +1 -0
- modoboa/frontend_dist/assets/CreationForm-ORg3fazt.js +1 -0
- modoboa/frontend_dist/assets/DashboardView-Dplk9itS.js +1 -0
- modoboa/frontend_dist/assets/DomainAdminList-DVn9x0rB.js +1 -0
- modoboa/frontend_dist/assets/DomainEditView-nAoL64D_.js +1 -0
- modoboa/frontend_dist/assets/{DomainTransportForm-C2xo0Yd7.js → DomainTransportForm-CA-DNUxX.js} +1 -1
- modoboa/frontend_dist/assets/{DomainView-BDKoBFYr.css → DomainView-CCLYXPHx.css} +1 -1
- modoboa/frontend_dist/assets/DomainView-CdXPpwJG.js +5 -0
- modoboa/frontend_dist/assets/DomainsView-B_59gowf.js +1 -0
- modoboa/frontend_dist/assets/DomainsView-DZ-ss9bI.css +1 -0
- modoboa/frontend_dist/assets/EmailField-CwcwI5xW.js +1 -0
- modoboa/frontend_dist/assets/EmailView-BshxcfAK.js +1 -0
- modoboa/frontend_dist/assets/EmptyLayout-DFfhnhLi.js +1 -0
- modoboa/frontend_dist/assets/FiltersView-Cf20MSTK.js +1 -0
- modoboa/frontend_dist/assets/ForwardEmailView-CZG062os.js +1 -0
- modoboa/frontend_dist/assets/{HtmlEditor-CJ9umKeO.js → HtmlEditor-Bh4c689R.js} +1 -1
- modoboa/frontend_dist/assets/IdentitiesView-BXAuU1YX.js +1 -0
- modoboa/frontend_dist/assets/{IdentitiesView-0ziuQ5s-.css → IdentitiesView-DPrrRMS5.css} +1 -1
- modoboa/frontend_dist/assets/InformationView-C9vvvQhJ.css +1 -0
- modoboa/frontend_dist/assets/InformationView-Cn5FZW7H.js +1 -0
- modoboa/frontend_dist/assets/{LoadingData-CYwX3Jpn.js → LoadingData-CdVvm4FI.js} +1 -1
- modoboa/frontend_dist/assets/{LoginCallbackView-E01qkKn0.js → LoginCallbackView-B9hAH4MI.js} +1 -1
- modoboa/frontend_dist/assets/{LoginView-Cy4uFV9h.js → LoginView-tHIR4Adc.js} +1 -1
- modoboa/frontend_dist/assets/MailboxView-Bugu2vhg.js +1 -0
- modoboa/frontend_dist/assets/MenuItems-PXjiG-fs.js +1 -0
- modoboa/frontend_dist/assets/MessageView-Cy4STShm.js +1 -0
- modoboa/frontend_dist/assets/MessagesView-DdkuEgfX.js +1 -0
- modoboa/frontend_dist/assets/MigrationsView-CidSEjCF.js +1 -0
- modoboa/frontend_dist/assets/{ParametersForm-BZM0QSvg.js → ParametersForm-CAv4SH-E.js} +1 -1
- modoboa/frontend_dist/assets/ParametersView-CX7Ffemw.js +1 -0
- modoboa/frontend_dist/assets/ParametersView-CrbNcmV3.js +1 -0
- modoboa/frontend_dist/assets/ProviderEditView-CrltAQXl.js +1 -0
- modoboa/frontend_dist/assets/ProviderGeneralForm-BYAzVnXM.js +1 -0
- modoboa/frontend_dist/assets/ProvidersView-osjIY4Ex.js +1 -0
- modoboa/frontend_dist/assets/QuarantineLayout-B8EcU9vS.js +1 -0
- modoboa/frontend_dist/assets/QuarantineView-D4gOE4EQ.css +1 -0
- modoboa/frontend_dist/assets/QuarantineView-D8Qg0MXA.js +1 -0
- modoboa/frontend_dist/assets/ReplyEmailView-BABPqWhd.js +1 -0
- modoboa/frontend_dist/assets/ResourcesForm-OaqdRYVs.js +1 -0
- modoboa/frontend_dist/assets/SelfServiceLayout-d277YTGR.js +1 -0
- modoboa/frontend_dist/assets/{SettingsView-BxLJBFY0.js → SettingsView-9iNcDhkI.js} +2 -2
- modoboa/frontend_dist/assets/StatisticsView-cHsPyGkL.js +1 -0
- modoboa/frontend_dist/assets/TimeSerieChart--V83dcJ9.js +1 -0
- modoboa/frontend_dist/assets/UserLayout-B3sBiTcZ.js +1 -0
- modoboa/frontend_dist/assets/VAlert-BuaaYN2h.js +1 -0
- modoboa/frontend_dist/assets/VApp-CKP-6zGP.js +1 -0
- modoboa/frontend_dist/assets/VAutocomplete-Dwv6_Rzq.js +1 -0
- modoboa/frontend_dist/assets/VAvatar-Cmga0vj6.js +1 -0
- modoboa/frontend_dist/assets/VBadge-BQrRJ9S0.css +1 -0
- modoboa/frontend_dist/assets/VBadge-CixeK87a.js +1 -0
- modoboa/frontend_dist/assets/VCard-CxH9DWoK.js +1 -0
- modoboa/frontend_dist/assets/VCheckbox-62GOpvvP.js +1 -0
- modoboa/frontend_dist/assets/{VCheckboxBtn-Dt810gWf.js → VCheckboxBtn-DMoNtKT8.js} +1 -1
- modoboa/frontend_dist/assets/VChip-D_styETR.js +1 -0
- modoboa/frontend_dist/assets/VColorPicker-BHscBGQV.js +1 -0
- modoboa/frontend_dist/assets/{VContainer-DvTbsotR.js → VContainer-B46caNs1.js} +1 -1
- modoboa/frontend_dist/assets/VDataTable-Bh8NbVSx.js +1 -0
- modoboa/frontend_dist/assets/VDataTableServer-BDR5hOmo.js +1 -0
- modoboa/frontend_dist/assets/VDataTableVirtual-BOQlNtIG.js +1 -0
- modoboa/frontend_dist/assets/{VDialog-Bk6EWNhz.js → VDialog-BcTg7w6P.js} +1 -1
- modoboa/frontend_dist/assets/VExpansionPanels-BmH5Jl2Z.js +1 -0
- modoboa/frontend_dist/assets/VFileInput-BC4yAygd.js +1 -0
- modoboa/frontend_dist/assets/VForm-D5iPGkde.js +1 -0
- modoboa/frontend_dist/assets/VInput-CcxkaOXT.css +1 -0
- modoboa/frontend_dist/assets/VInput-CoDJzvaW.js +1 -0
- modoboa/frontend_dist/assets/VMenu-gUG70-zD.js +1 -0
- modoboa/frontend_dist/assets/VPicker-BXuKT3zB.js +1 -0
- modoboa/frontend_dist/assets/VProgressCircular-BtOPiGCg.js +1 -0
- modoboa/frontend_dist/assets/VRadioGroup-DIFZKSn-.js +1 -0
- modoboa/frontend_dist/assets/{VRow-BF35mT1S.js → VRow-ozg66L7j.js} +1 -1
- modoboa/frontend_dist/assets/VSelect-C3RjAa45.js +1 -0
- modoboa/frontend_dist/assets/VSelectionControl-zyz-fJvC.js +1 -0
- modoboa/frontend_dist/assets/VSheet-BNx2X4Mk.js +1 -0
- modoboa/frontend_dist/assets/VSpacer-DinPiXs9.js +1 -0
- modoboa/frontend_dist/assets/VSwitch-DwxdeAEq.js +1 -0
- modoboa/frontend_dist/assets/VTable-DaLxa4FO.js +1 -0
- modoboa/frontend_dist/assets/VTabs-BP0Hgsgm.js +1 -0
- modoboa/frontend_dist/assets/VTextField-BzBVKKob.css +1 -0
- modoboa/frontend_dist/assets/VTextField-XoGTj1KG.js +1 -0
- modoboa/frontend_dist/assets/VTextarea-wBlRMIv_.js +1 -0
- modoboa/frontend_dist/assets/VToolbar-CFZfqeOr.js +1 -0
- modoboa/frontend_dist/assets/VWindowItem-BB7ETW3b.js +1 -0
- modoboa/frontend_dist/assets/WebmailLayout-_Hk1XhVq.js +1 -0
- modoboa/frontend_dist/assets/accounts-DUzbx6k8.js +1 -0
- modoboa/frontend_dist/assets/{admin-o-HRGnmT.js → admin-DewTk2H8.js} +1 -1
- modoboa/frontend_dist/assets/{aliases-DDVeehyg.js → aliases-4sXmjwXp.js} +1 -1
- modoboa/frontend_dist/assets/amavis-CC0li7_T.js +1 -0
- modoboa/frontend_dist/assets/amavis-DK8SHE6o.js +1 -0
- modoboa/frontend_dist/assets/{contacts-C84DY-Q1.js → contacts-BjghrPqZ.js} +1 -1
- modoboa/frontend_dist/assets/{domains-Bgn4ixHL.js → domains-BSawReeu.js} +1 -1
- modoboa/frontend_dist/assets/{domains.store-DTE-V7Y1.js → domains.store-D-vWCEIK.js} +1 -1
- modoboa/frontend_dist/assets/{filter-CnffiQAW.js → filter-C82FUCw_.js} +1 -1
- modoboa/frontend_dist/assets/forwardRefs-cvcnlhoK.js +1 -0
- modoboa/frontend_dist/assets/global.store-DbkcI5o2.js +1 -0
- modoboa/frontend_dist/assets/{importExport-BlQYb0NO.js → importExport-DzoL4Mvc.js} +1 -1
- modoboa/frontend_dist/assets/index-BImkz5Jx.js +984 -0
- modoboa/frontend_dist/assets/layout-C5FyYCHK.js +1 -0
- modoboa/frontend_dist/assets/{layout.store-DkjrAoXt.js → layout.store-NXWtFIwL.js} +1 -1
- modoboa/frontend_dist/assets/{logos-q8SEyAa4.js → logos-BswdveCV.js} +1 -1
- modoboa/frontend_dist/assets/{logs-B7IJ7LBa.js → logs-6CbtfaZS.js} +1 -1
- modoboa/frontend_dist/assets/{parameters-A6iBEYQq.js → parameters-aSQiR7kN.js} +1 -1
- modoboa/frontend_dist/assets/{parameters.store-BiXS4_6w.js → parameters.store-CzQqVatx.js} +1 -1
- modoboa/frontend_dist/assets/permissions-DNoefz-n.js +1 -0
- modoboa/frontend_dist/assets/{ssrBoot-AzTdjPjk.js → ssrBoot-CKUX4kcb.js} +1 -1
- modoboa/frontend_dist/assets/{tag-BnSYRTcD.js → tag-B_yWNNJD.js} +1 -1
- modoboa/frontend_dist/assets/transports-BDNB9wR5.js +1 -0
- modoboa/frontend_dist/assets/{webmail-CSH_3l6R.js → webmail-CdU6CD9b.js} +1 -1
- modoboa/frontend_dist/index.html +1 -1
- modoboa/lib/email_utils.py +2 -2
- modoboa/lib/permissions.py +7 -0
- modoboa/lib/test_runners.py +29 -0
- modoboa/lib/tests/__init__.py +5 -1
- modoboa/locale/br/LC_MESSAGES/django.po +87 -75
- modoboa/locale/cs/LC_MESSAGES/django.po +82 -74
- modoboa/locale/cs_CZ/LC_MESSAGES/django.po +145 -121
- modoboa/locale/de/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/de/LC_MESSAGES/django.po +339 -651
- modoboa/locale/de_DE/LC_MESSAGES/django.po +87 -75
- modoboa/locale/el_GR/LC_MESSAGES/django.po +160 -135
- modoboa/locale/en/LC_MESSAGES/django.po +82 -74
- modoboa/locale/es/LC_MESSAGES/django.po +158 -131
- modoboa/locale/es_MX/LC_MESSAGES/django.po +82 -74
- modoboa/locale/fi/LC_MESSAGES/django.po +87 -75
- modoboa/locale/fr/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/fr/LC_MESSAGES/django.po +469 -201
- modoboa/locale/hu/LC_MESSAGES/django.po +82 -74
- modoboa/locale/it/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/it/LC_MESSAGES/django.po +148 -122
- modoboa/locale/ja_JP/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/ja_JP/LC_MESSAGES/django.po +80 -72
- modoboa/locale/ka/LC_MESSAGES/django.po +82 -74
- modoboa/locale/nl_NL/LC_MESSAGES/django.po +160 -132
- modoboa/locale/no/LC_MESSAGES/django.po +82 -74
- modoboa/locale/pl_PL/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/pl_PL/LC_MESSAGES/django.po +172 -149
- modoboa/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/pt_BR/LC_MESSAGES/django.po +172 -144
- modoboa/locale/pt_PT/LC_MESSAGES/django.po +135 -112
- modoboa/locale/ro_RO/LC_MESSAGES/django.po +87 -75
- modoboa/locale/ru/LC_MESSAGES/django.po +142 -118
- modoboa/locale/si/LC_MESSAGES/django.po +82 -74
- modoboa/locale/sk/LC_MESSAGES/django.po +82 -74
- modoboa/locale/sk_SK/LC_MESSAGES/django.po +84 -76
- modoboa/locale/sl_SI/LC_MESSAGES/django.po +90 -76
- modoboa/locale/sv/LC_MESSAGES/django.mo +0 -0
- modoboa/locale/sv/LC_MESSAGES/django.po +172 -139
- modoboa/locale/tr/LC_MESSAGES/django.po +87 -75
- modoboa/locale/tr_TR/LC_MESSAGES/django.po +84 -74
- modoboa/locale/uk/LC_MESSAGES/django.po +82 -74
- modoboa/locale/zh/LC_MESSAGES/django.po +82 -74
- modoboa/locale/zh_CN/LC_MESSAGES/django.po +82 -74
- modoboa/locale/zh_TW/LC_MESSAGES/django.po +87 -75
- modoboa/parameters/api/v2/tests.py +2 -2
- modoboa/parameters/api/v2/viewsets.py +2 -0
- modoboa/policyd/tests.py +2 -0
- modoboa/urls_api_v2.py +6 -0
- {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/METADATA +6 -4
- {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/RECORD +231 -181
- modoboa/frontend_dist/assets/AccountAliasForm-BV6KvTu6.js +0 -1
- modoboa/frontend_dist/assets/AccountEditView-DDOFyfBD.js +0 -1
- modoboa/frontend_dist/assets/AccountLayout-rX51xgxT.js +0 -1
- modoboa/frontend_dist/assets/AccountPasswordSubForm-D9S6LaeH.js +0 -1
- modoboa/frontend_dist/assets/AccountView-cmvaZNq3.js +0 -1
- modoboa/frontend_dist/assets/AddressBook-DCJxL8SU.js +0 -1
- modoboa/frontend_dist/assets/AdminLayout-r0wfG2lO.js +0 -1
- modoboa/frontend_dist/assets/AlarmsView-Bheey-gp.css +0 -1
- modoboa/frontend_dist/assets/AlarmsView-C0bqC4PA.js +0 -1
- modoboa/frontend_dist/assets/AliasEditView-DVoWoCGY.js +0 -1
- modoboa/frontend_dist/assets/AliasView-DrONZXOh.js +0 -1
- modoboa/frontend_dist/assets/AuditTrailView-OTkoZaMU.js +0 -1
- modoboa/frontend_dist/assets/CalendarView-CqF4_Ui9.js +0 -1
- modoboa/frontend_dist/assets/ComposeEmailForm-DO5_GB3e.js +0 -1
- modoboa/frontend_dist/assets/ComposeEmailView-A91HCBsN.js +0 -1
- modoboa/frontend_dist/assets/ConfirmDialog-BBcgdAnO.js +0 -1
- modoboa/frontend_dist/assets/ConnectedLayout-1oRW-Rql.js +0 -1
- modoboa/frontend_dist/assets/CreationForm-71YJbjsA.js +0 -1
- modoboa/frontend_dist/assets/DashboardView-CdLpSfUl.js +0 -1
- modoboa/frontend_dist/assets/DomainAdminList-BjC4KsqI.js +0 -1
- modoboa/frontend_dist/assets/DomainEditView-CQjKwYxl.js +0 -1
- modoboa/frontend_dist/assets/DomainView-BhhuZI_N.js +0 -5
- modoboa/frontend_dist/assets/DomainsView-Cft4BP8Z.js +0 -1
- modoboa/frontend_dist/assets/DomainsView-DasJ0NdZ.css +0 -1
- modoboa/frontend_dist/assets/EmailField-C8umy0EU.js +0 -1
- modoboa/frontend_dist/assets/EmailView-ki7uEQPD.js +0 -1
- modoboa/frontend_dist/assets/EmptyLayout-DaA1XH9n.js +0 -1
- modoboa/frontend_dist/assets/FiltersView-FYFZxG4B.js +0 -1
- modoboa/frontend_dist/assets/ForwardEmailView-cUbnSYCF.js +0 -1
- modoboa/frontend_dist/assets/IdentitiesView-njNo8N5n.js +0 -1
- modoboa/frontend_dist/assets/InformationView-D1h38POt.js +0 -1
- modoboa/frontend_dist/assets/InformationView-U5Ww-Sx1.css +0 -1
- modoboa/frontend_dist/assets/MailboxView-IlrLWm_H.js +0 -1
- modoboa/frontend_dist/assets/MenuItems-BAtHWzAE.js +0 -1
- modoboa/frontend_dist/assets/MessagesView-OSpjixFq.js +0 -1
- modoboa/frontend_dist/assets/MigrationsView-DKNOsVzF.js +0 -1
- modoboa/frontend_dist/assets/ParametersView-C4bXASiq.js +0 -1
- modoboa/frontend_dist/assets/ParametersView-CYXgNmc1.js +0 -1
- modoboa/frontend_dist/assets/ProviderEditView-CyxCWTST.js +0 -1
- modoboa/frontend_dist/assets/ProviderGeneralForm-BYPjNHqB.js +0 -1
- modoboa/frontend_dist/assets/ProvidersView-CxrMkRyk.js +0 -1
- modoboa/frontend_dist/assets/ReplyEmailView-Dkw9-N26.js +0 -1
- modoboa/frontend_dist/assets/ResourcesForm-CuUvrOdY.js +0 -1
- modoboa/frontend_dist/assets/StatisticsView-BN7QsZMT.js +0 -1
- modoboa/frontend_dist/assets/TimeSerieChart-BMN8BeFZ.js +0 -1
- modoboa/frontend_dist/assets/UserLayout-B6-JQg4F.js +0 -1
- modoboa/frontend_dist/assets/VAlert-DIQTrRif.js +0 -1
- modoboa/frontend_dist/assets/VApp-CpkYA7js.js +0 -1
- modoboa/frontend_dist/assets/VAutocomplete-C4IpXyl8.js +0 -1
- modoboa/frontend_dist/assets/VAvatar-Lpb-Dion.js +0 -1
- modoboa/frontend_dist/assets/VCard-er_isjE_.js +0 -1
- modoboa/frontend_dist/assets/VCheckbox-D-u8JXP1.js +0 -1
- modoboa/frontend_dist/assets/VChip-B4iSpj8_.js +0 -1
- modoboa/frontend_dist/assets/VColorPicker-BAjGDsXv.js +0 -1
- modoboa/frontend_dist/assets/VDataTable-4JRjbtgF.js +0 -1
- modoboa/frontend_dist/assets/VDataTableServer-tIDT1m3-.js +0 -1
- modoboa/frontend_dist/assets/VDataTableVirtual-BlnO18u_.js +0 -1
- modoboa/frontend_dist/assets/VExpansionPanels-CwGtXDhr.js +0 -1
- modoboa/frontend_dist/assets/VFileInput-D1_7ZkO_.js +0 -1
- modoboa/frontend_dist/assets/VForm-DAkW4nfy.js +0 -1
- modoboa/frontend_dist/assets/VMenu-BPFJwj2f.js +0 -1
- modoboa/frontend_dist/assets/VPicker-CfT82M8N.js +0 -1
- modoboa/frontend_dist/assets/VProgressCircular-w75-3ogi.js +0 -1
- modoboa/frontend_dist/assets/VRadioGroup-0j6DNC_k.js +0 -1
- modoboa/frontend_dist/assets/VSelect-Cs4ARbAS.js +0 -1
- modoboa/frontend_dist/assets/VSelectionControl-Dg-XyRRS.js +0 -1
- modoboa/frontend_dist/assets/VSheet-Btq_Mu4s.js +0 -1
- modoboa/frontend_dist/assets/VSpacer-C7xukQmu.js +0 -1
- modoboa/frontend_dist/assets/VSwitch-Cs1NQrmk.js +0 -1
- modoboa/frontend_dist/assets/VTable-CNz2SGk4.js +0 -1
- modoboa/frontend_dist/assets/VTabs-B1fyVn4M.js +0 -1
- modoboa/frontend_dist/assets/VTextField-BdyvgvkG.js +0 -1
- modoboa/frontend_dist/assets/VTextField-C-J20yj_.css +0 -1
- modoboa/frontend_dist/assets/VTextarea-DnOMpe0Q.js +0 -1
- modoboa/frontend_dist/assets/VToolbar-BiCiBxBJ.js +0 -1
- modoboa/frontend_dist/assets/VWindowItem-ChWm_kz3.js +0 -1
- modoboa/frontend_dist/assets/WebmailLayout-o4uEkp9e.js +0 -1
- modoboa/frontend_dist/assets/forwardRefs-Dvjn_Xq4.js +0 -1
- modoboa/frontend_dist/assets/global.store-BaiD63EN.js +0 -1
- modoboa/frontend_dist/assets/index-I1VDlN4g.js +0 -984
- modoboa/frontend_dist/assets/layout-D8ZJPiJ_.js +0 -1
- modoboa/frontend_dist/assets/permissions-CITHLHVg.js +0 -1
- modoboa/frontend_dist/assets/transports-Dz7c6kIy.js +0 -1
- {modoboa-2.4.11.data → modoboa-2.5.0.data}/scripts/modoboa-admin.py +0 -0
- {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/WHEEL +0 -0
- {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/entry_points.txt +0 -0
- {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/licenses/LICENSE +0 -0
- {modoboa-2.4.11.dist-info → modoboa-2.5.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
from django.core.management.base import BaseCommand
|
|
7
|
+
from django.db.models import Count
|
|
8
|
+
|
|
9
|
+
from modoboa.parameters import tools as param_tools
|
|
10
|
+
from ...models import Maddr, Msgrcpt, Msgs
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Command(BaseCommand):
|
|
14
|
+
args = ""
|
|
15
|
+
help = "Amavis quarantine cleanup" # NOQA:A003
|
|
16
|
+
|
|
17
|
+
def add_arguments(self, parser):
|
|
18
|
+
"""Add extra arguments to command line."""
|
|
19
|
+
parser.add_argument(
|
|
20
|
+
"--debug", action="store_true", default=False, help="Activate debug output"
|
|
21
|
+
)
|
|
22
|
+
parser.add_argument(
|
|
23
|
+
"--verbose",
|
|
24
|
+
action="store_true",
|
|
25
|
+
default=False,
|
|
26
|
+
help="Display informational messages",
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
def __vprint(self, msg):
|
|
30
|
+
if not self.verbose:
|
|
31
|
+
return
|
|
32
|
+
print(msg)
|
|
33
|
+
|
|
34
|
+
def handle(self, *args, **options):
|
|
35
|
+
if options["debug"]:
|
|
36
|
+
import logging
|
|
37
|
+
|
|
38
|
+
log = logging.getLogger("django.db.backends")
|
|
39
|
+
log.setLevel(logging.DEBUG)
|
|
40
|
+
log.addHandler(logging.StreamHandler())
|
|
41
|
+
self.verbose = options["verbose"]
|
|
42
|
+
|
|
43
|
+
conf = dict(param_tools.get_global_parameters("amavis"))
|
|
44
|
+
|
|
45
|
+
flags = ["D"]
|
|
46
|
+
if conf["released_msgs_cleanup"]:
|
|
47
|
+
flags += ["R"]
|
|
48
|
+
|
|
49
|
+
self.__vprint("Deleting marked messages...")
|
|
50
|
+
ids = Msgrcpt.objects.filter(rs__in=flags).values("mail_id").distinct()
|
|
51
|
+
for msg in Msgs.objects.filter(mail_id__in=ids):
|
|
52
|
+
if not msg.msgrcpt_set.exclude(rs__in=flags).count():
|
|
53
|
+
msg.delete()
|
|
54
|
+
|
|
55
|
+
self.__vprint(
|
|
56
|
+
"Deleting messages older than {} days...".format(conf["max_messages_age"])
|
|
57
|
+
)
|
|
58
|
+
limit = int(time.time()) - (conf["max_messages_age"] * 24 * 3600)
|
|
59
|
+
while True:
|
|
60
|
+
qset = Msgs.objects.filter(
|
|
61
|
+
pk__in=list(
|
|
62
|
+
Msgs.objects.filter(time_num__lt=limit).values_list(
|
|
63
|
+
"pk", flat=True
|
|
64
|
+
)[:5000]
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
if not qset.exists():
|
|
68
|
+
break
|
|
69
|
+
qset.delete()
|
|
70
|
+
|
|
71
|
+
self.__vprint("Deleting unreferenced e-mail addresses...")
|
|
72
|
+
while True:
|
|
73
|
+
res = (
|
|
74
|
+
Maddr.objects.annotate(
|
|
75
|
+
msgs_count=Count("msgs"), msgrcpt_count=Count("msgrcpt")
|
|
76
|
+
)
|
|
77
|
+
.filter(msgs_count=0, msgrcpt_count=0)
|
|
78
|
+
.values_list("id", flat=True)[:100000]
|
|
79
|
+
)
|
|
80
|
+
if not res.exists():
|
|
81
|
+
break
|
|
82
|
+
Maddr.objects.filter(id__in=list(res)).delete()
|
|
83
|
+
|
|
84
|
+
self.__vprint("Done.")
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
from django.db import models, migrations
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Migration(migrations.Migration):
|
|
5
|
+
|
|
6
|
+
dependencies = []
|
|
7
|
+
|
|
8
|
+
operations = [
|
|
9
|
+
migrations.CreateModel(
|
|
10
|
+
name="Maddr",
|
|
11
|
+
fields=[
|
|
12
|
+
("partition_tag", models.IntegerField(default=0)),
|
|
13
|
+
("id", models.BigIntegerField(serialize=False, primary_key=True)),
|
|
14
|
+
("email", models.CharField(unique=True, max_length=255)),
|
|
15
|
+
("domain", models.CharField(max_length=765)),
|
|
16
|
+
],
|
|
17
|
+
options={
|
|
18
|
+
"db_table": "maddr",
|
|
19
|
+
"managed": False,
|
|
20
|
+
},
|
|
21
|
+
bases=(models.Model,),
|
|
22
|
+
),
|
|
23
|
+
migrations.CreateModel(
|
|
24
|
+
name="Mailaddr",
|
|
25
|
+
fields=[
|
|
26
|
+
("id", models.IntegerField(serialize=False, primary_key=True)),
|
|
27
|
+
("priority", models.IntegerField()),
|
|
28
|
+
("email", models.CharField(unique=True, max_length=255)),
|
|
29
|
+
],
|
|
30
|
+
options={
|
|
31
|
+
"db_table": "mailaddr",
|
|
32
|
+
"managed": False,
|
|
33
|
+
},
|
|
34
|
+
bases=(models.Model,),
|
|
35
|
+
),
|
|
36
|
+
migrations.CreateModel(
|
|
37
|
+
name="Msgs",
|
|
38
|
+
fields=[
|
|
39
|
+
("partition_tag", models.IntegerField(default=0)),
|
|
40
|
+
(
|
|
41
|
+
"mail_id",
|
|
42
|
+
models.CharField(max_length=12, serialize=False, primary_key=True),
|
|
43
|
+
),
|
|
44
|
+
("secret_id", models.CharField(max_length=12, blank=True)),
|
|
45
|
+
("am_id", models.CharField(max_length=60)),
|
|
46
|
+
("time_num", models.IntegerField()),
|
|
47
|
+
("time_iso", models.CharField(max_length=48)),
|
|
48
|
+
("policy", models.CharField(max_length=765, blank=True)),
|
|
49
|
+
("client_addr", models.CharField(max_length=765, blank=True)),
|
|
50
|
+
("size", models.IntegerField()),
|
|
51
|
+
("originating", models.CharField(max_length=3)),
|
|
52
|
+
("content", models.CharField(max_length=1, blank=True)),
|
|
53
|
+
("quar_type", models.CharField(max_length=1, blank=True)),
|
|
54
|
+
("quar_loc", models.CharField(max_length=255, blank=True)),
|
|
55
|
+
("dsn_sent", models.CharField(max_length=3, blank=True)),
|
|
56
|
+
("spam_level", models.FloatField(null=True, blank=True)),
|
|
57
|
+
("message_id", models.CharField(max_length=765, blank=True)),
|
|
58
|
+
("from_addr", models.CharField(max_length=765, blank=True)),
|
|
59
|
+
("subject", models.CharField(max_length=765, blank=True)),
|
|
60
|
+
("host", models.CharField(max_length=765)),
|
|
61
|
+
],
|
|
62
|
+
options={
|
|
63
|
+
"db_table": "msgs",
|
|
64
|
+
"managed": False,
|
|
65
|
+
},
|
|
66
|
+
bases=(models.Model,),
|
|
67
|
+
),
|
|
68
|
+
migrations.CreateModel(
|
|
69
|
+
name="Msgrcpt",
|
|
70
|
+
fields=[
|
|
71
|
+
("partition_tag", models.IntegerField(default=0)),
|
|
72
|
+
(
|
|
73
|
+
"mail",
|
|
74
|
+
models.ForeignKey(
|
|
75
|
+
primary_key=True,
|
|
76
|
+
serialize=False,
|
|
77
|
+
to="amavis.Msgs",
|
|
78
|
+
on_delete=models.CASCADE,
|
|
79
|
+
),
|
|
80
|
+
),
|
|
81
|
+
("rseqnum", models.IntegerField(default=0)),
|
|
82
|
+
("is_local", models.CharField(max_length=3)),
|
|
83
|
+
("content", models.CharField(max_length=3)),
|
|
84
|
+
("ds", models.CharField(max_length=3)),
|
|
85
|
+
("rs", models.CharField(max_length=3)),
|
|
86
|
+
("bl", models.CharField(max_length=3, blank=True)),
|
|
87
|
+
("wl", models.CharField(max_length=3, blank=True)),
|
|
88
|
+
("bspam_level", models.FloatField(null=True, blank=True)),
|
|
89
|
+
("smtp_resp", models.CharField(max_length=765, blank=True)),
|
|
90
|
+
],
|
|
91
|
+
options={
|
|
92
|
+
"db_table": "msgrcpt",
|
|
93
|
+
"managed": False,
|
|
94
|
+
},
|
|
95
|
+
bases=(models.Model,),
|
|
96
|
+
),
|
|
97
|
+
migrations.CreateModel(
|
|
98
|
+
name="Policy",
|
|
99
|
+
fields=[
|
|
100
|
+
(
|
|
101
|
+
"id",
|
|
102
|
+
models.AutoField(
|
|
103
|
+
verbose_name="ID",
|
|
104
|
+
serialize=False,
|
|
105
|
+
auto_created=True,
|
|
106
|
+
primary_key=True,
|
|
107
|
+
),
|
|
108
|
+
),
|
|
109
|
+
("policy_name", models.CharField(max_length=32, blank=True)),
|
|
110
|
+
("virus_lover", models.CharField(max_length=3, null=True, blank=True)),
|
|
111
|
+
("spam_lover", models.CharField(max_length=3, null=True, blank=True)),
|
|
112
|
+
(
|
|
113
|
+
"unchecked_lover",
|
|
114
|
+
models.CharField(max_length=3, null=True, blank=True),
|
|
115
|
+
),
|
|
116
|
+
(
|
|
117
|
+
"banned_files_lover",
|
|
118
|
+
models.CharField(max_length=3, null=True, blank=True),
|
|
119
|
+
),
|
|
120
|
+
(
|
|
121
|
+
"bad_header_lover",
|
|
122
|
+
models.CharField(max_length=3, null=True, blank=True),
|
|
123
|
+
),
|
|
124
|
+
(
|
|
125
|
+
"bypass_virus_checks",
|
|
126
|
+
models.CharField(
|
|
127
|
+
default=b"",
|
|
128
|
+
choices=[(b"N", "yes"), (b"Y", "no"), (b"", "default")],
|
|
129
|
+
max_length=3,
|
|
130
|
+
help_text="Bypass virus checks or not. Choose 'default' to use global settings.",
|
|
131
|
+
null=True,
|
|
132
|
+
verbose_name="Virus filter",
|
|
133
|
+
),
|
|
134
|
+
),
|
|
135
|
+
(
|
|
136
|
+
"bypass_spam_checks",
|
|
137
|
+
models.CharField(
|
|
138
|
+
default=b"",
|
|
139
|
+
choices=[(b"N", "yes"), (b"Y", "no"), (b"", "default")],
|
|
140
|
+
max_length=3,
|
|
141
|
+
help_text="Bypass spam checks or not. Choose 'default' to use global settings.",
|
|
142
|
+
null=True,
|
|
143
|
+
verbose_name="Spam filter",
|
|
144
|
+
),
|
|
145
|
+
),
|
|
146
|
+
(
|
|
147
|
+
"bypass_banned_checks",
|
|
148
|
+
models.CharField(
|
|
149
|
+
default=b"",
|
|
150
|
+
choices=[(b"N", "yes"), (b"Y", "no"), (b"", "default")],
|
|
151
|
+
max_length=3,
|
|
152
|
+
help_text="Bypass banned checks or not. Choose 'default' to use global settings.",
|
|
153
|
+
null=True,
|
|
154
|
+
verbose_name="Banned filter",
|
|
155
|
+
),
|
|
156
|
+
),
|
|
157
|
+
(
|
|
158
|
+
"bypass_header_checks",
|
|
159
|
+
models.CharField(max_length=3, null=True, blank=True),
|
|
160
|
+
),
|
|
161
|
+
(
|
|
162
|
+
"virus_quarantine_to",
|
|
163
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
164
|
+
),
|
|
165
|
+
(
|
|
166
|
+
"spam_quarantine_to",
|
|
167
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
168
|
+
),
|
|
169
|
+
(
|
|
170
|
+
"banned_quarantine_to",
|
|
171
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
172
|
+
),
|
|
173
|
+
(
|
|
174
|
+
"unchecked_quarantine_to",
|
|
175
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
176
|
+
),
|
|
177
|
+
(
|
|
178
|
+
"bad_header_quarantine_to",
|
|
179
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
180
|
+
),
|
|
181
|
+
(
|
|
182
|
+
"clean_quarantine_to",
|
|
183
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
184
|
+
),
|
|
185
|
+
(
|
|
186
|
+
"archive_quarantine_to",
|
|
187
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
188
|
+
),
|
|
189
|
+
("spam_tag_level", models.FloatField(null=True, blank=True)),
|
|
190
|
+
("spam_tag2_level", models.FloatField(null=True, blank=True)),
|
|
191
|
+
("spam_tag3_level", models.FloatField(null=True, blank=True)),
|
|
192
|
+
("spam_kill_level", models.FloatField(null=True, blank=True)),
|
|
193
|
+
("spam_dsn_cutoff_level", models.FloatField(null=True, blank=True)),
|
|
194
|
+
(
|
|
195
|
+
"spam_quarantine_cutoff_level",
|
|
196
|
+
models.FloatField(null=True, blank=True),
|
|
197
|
+
),
|
|
198
|
+
(
|
|
199
|
+
"addr_extension_virus",
|
|
200
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
201
|
+
),
|
|
202
|
+
(
|
|
203
|
+
"addr_extension_spam",
|
|
204
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
205
|
+
),
|
|
206
|
+
(
|
|
207
|
+
"addr_extension_banned",
|
|
208
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
209
|
+
),
|
|
210
|
+
(
|
|
211
|
+
"addr_extension_bad_header",
|
|
212
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
213
|
+
),
|
|
214
|
+
(
|
|
215
|
+
"warnvirusrecip",
|
|
216
|
+
models.CharField(max_length=3, null=True, blank=True),
|
|
217
|
+
),
|
|
218
|
+
(
|
|
219
|
+
"warnbannedrecip",
|
|
220
|
+
models.CharField(max_length=3, null=True, blank=True),
|
|
221
|
+
),
|
|
222
|
+
(
|
|
223
|
+
"warnbadhrecip",
|
|
224
|
+
models.CharField(max_length=3, null=True, blank=True),
|
|
225
|
+
),
|
|
226
|
+
(
|
|
227
|
+
"newvirus_admin",
|
|
228
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
229
|
+
),
|
|
230
|
+
(
|
|
231
|
+
"virus_admin",
|
|
232
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
233
|
+
),
|
|
234
|
+
(
|
|
235
|
+
"banned_admin",
|
|
236
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
237
|
+
),
|
|
238
|
+
(
|
|
239
|
+
"bad_header_admin",
|
|
240
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
241
|
+
),
|
|
242
|
+
("spam_admin", models.CharField(max_length=192, null=True, blank=True)),
|
|
243
|
+
(
|
|
244
|
+
"spam_subject_tag",
|
|
245
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
246
|
+
),
|
|
247
|
+
(
|
|
248
|
+
"spam_subject_tag2",
|
|
249
|
+
models.CharField(
|
|
250
|
+
default=None,
|
|
251
|
+
max_length=192,
|
|
252
|
+
blank=True,
|
|
253
|
+
help_text="Modify spam subject using the specified text. Choose 'default' to use global settings.",
|
|
254
|
+
null=True,
|
|
255
|
+
verbose_name="Spam marker",
|
|
256
|
+
),
|
|
257
|
+
),
|
|
258
|
+
(
|
|
259
|
+
"spam_subject_tag3",
|
|
260
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
261
|
+
),
|
|
262
|
+
("message_size_limit", models.IntegerField(null=True, blank=True)),
|
|
263
|
+
(
|
|
264
|
+
"banned_rulenames",
|
|
265
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
266
|
+
),
|
|
267
|
+
(
|
|
268
|
+
"disclaimer_options",
|
|
269
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
270
|
+
),
|
|
271
|
+
(
|
|
272
|
+
"forward_method",
|
|
273
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
274
|
+
),
|
|
275
|
+
(
|
|
276
|
+
"sa_userconf",
|
|
277
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
278
|
+
),
|
|
279
|
+
(
|
|
280
|
+
"sa_username",
|
|
281
|
+
models.CharField(max_length=192, null=True, blank=True),
|
|
282
|
+
),
|
|
283
|
+
],
|
|
284
|
+
options={
|
|
285
|
+
"db_table": "policy",
|
|
286
|
+
"managed": False,
|
|
287
|
+
},
|
|
288
|
+
bases=(models.Model,),
|
|
289
|
+
),
|
|
290
|
+
migrations.CreateModel(
|
|
291
|
+
name="Quarantine",
|
|
292
|
+
fields=[
|
|
293
|
+
("partition_tag", models.IntegerField(default=0)),
|
|
294
|
+
(
|
|
295
|
+
"mail",
|
|
296
|
+
models.ForeignKey(
|
|
297
|
+
primary_key=True,
|
|
298
|
+
serialize=False,
|
|
299
|
+
to="amavis.Msgs",
|
|
300
|
+
on_delete=models.CASCADE,
|
|
301
|
+
),
|
|
302
|
+
),
|
|
303
|
+
("chunk_ind", models.IntegerField()),
|
|
304
|
+
("mail_text", models.TextField()),
|
|
305
|
+
],
|
|
306
|
+
options={
|
|
307
|
+
"ordering": ["-mail__time_num"],
|
|
308
|
+
"db_table": "quarantine",
|
|
309
|
+
"managed": False,
|
|
310
|
+
},
|
|
311
|
+
bases=(models.Model,),
|
|
312
|
+
),
|
|
313
|
+
migrations.CreateModel(
|
|
314
|
+
name="Users",
|
|
315
|
+
fields=[
|
|
316
|
+
("id", models.AutoField(serialize=False, primary_key=True)),
|
|
317
|
+
("priority", models.IntegerField()),
|
|
318
|
+
("email", models.CharField(unique=True, max_length=255)),
|
|
319
|
+
("fullname", models.CharField(max_length=765, blank=True)),
|
|
320
|
+
],
|
|
321
|
+
options={
|
|
322
|
+
"db_table": "users",
|
|
323
|
+
"managed": False,
|
|
324
|
+
},
|
|
325
|
+
bases=(models.Model,),
|
|
326
|
+
),
|
|
327
|
+
migrations.CreateModel(
|
|
328
|
+
name="Wblist",
|
|
329
|
+
fields=[
|
|
330
|
+
("rid", models.IntegerField(serialize=False, primary_key=True)),
|
|
331
|
+
("sid", models.IntegerField(primary_key=True)),
|
|
332
|
+
("wb", models.CharField(max_length=30)),
|
|
333
|
+
],
|
|
334
|
+
options={
|
|
335
|
+
"db_table": "wblist",
|
|
336
|
+
"managed": False,
|
|
337
|
+
},
|
|
338
|
+
bases=(models.Model,),
|
|
339
|
+
),
|
|
340
|
+
]
|
|
File without changes
|
modoboa/amavis/models.py
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# This is an auto-generated Django model module.
|
|
2
|
+
# You'll have to do the following manually to clean this up:
|
|
3
|
+
# * Rearrange models' order
|
|
4
|
+
# * Make sure each model has one field with primary_key=True
|
|
5
|
+
# Feel free to rename the models, but don't rename db_table values
|
|
6
|
+
# or field names.
|
|
7
|
+
#
|
|
8
|
+
# Also note: You'll have to insert the output of
|
|
9
|
+
# 'django-admin.py sqlcustom [appname]'into your database.
|
|
10
|
+
#
|
|
11
|
+
# Original Amavis version : 2.6.2
|
|
12
|
+
|
|
13
|
+
from datetime import datetime
|
|
14
|
+
|
|
15
|
+
from django.db import models
|
|
16
|
+
from django.utils.translation import gettext_lazy
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class Maddr(models.Model):
|
|
20
|
+
partition_tag = models.IntegerField(default=0)
|
|
21
|
+
id = models.BigIntegerField(primary_key=True) # NOQA:A003
|
|
22
|
+
email = models.CharField(max_length=255)
|
|
23
|
+
domain = models.CharField(max_length=255)
|
|
24
|
+
|
|
25
|
+
class Meta:
|
|
26
|
+
db_table = "maddr"
|
|
27
|
+
unique_together = [("partition_tag", "email")]
|
|
28
|
+
managed = False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Mailaddr(models.Model):
|
|
32
|
+
id = models.IntegerField(primary_key=True) # NOQA:A003
|
|
33
|
+
priority = models.IntegerField()
|
|
34
|
+
email = models.CharField(unique=True, max_length=255)
|
|
35
|
+
|
|
36
|
+
class Meta:
|
|
37
|
+
db_table = "mailaddr"
|
|
38
|
+
managed = False
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class Msgs(models.Model):
|
|
42
|
+
partition_tag = models.IntegerField(default=0)
|
|
43
|
+
mail_id = models.BinaryField(max_length=16, primary_key=True)
|
|
44
|
+
secret_id = models.BinaryField()
|
|
45
|
+
am_id = models.CharField(max_length=60)
|
|
46
|
+
time_num = models.IntegerField()
|
|
47
|
+
time_iso = models.CharField(max_length=48)
|
|
48
|
+
sid = models.ForeignKey(Maddr, db_column="sid", on_delete=models.CASCADE)
|
|
49
|
+
policy = models.CharField(max_length=765, blank=True)
|
|
50
|
+
client_addr = models.CharField(max_length=765, blank=True)
|
|
51
|
+
size = models.IntegerField()
|
|
52
|
+
originating = models.CharField(max_length=3)
|
|
53
|
+
content = models.CharField(max_length=1, blank=True)
|
|
54
|
+
quar_type = models.CharField(max_length=1, blank=True)
|
|
55
|
+
quar_loc = models.CharField(max_length=255, blank=True)
|
|
56
|
+
dsn_sent = models.CharField(max_length=3, blank=True)
|
|
57
|
+
spam_level = models.FloatField(null=True, blank=True)
|
|
58
|
+
message_id = models.CharField(max_length=765, blank=True)
|
|
59
|
+
from_addr = models.CharField(max_length=765, blank=True)
|
|
60
|
+
subject = models.CharField(max_length=765, blank=True)
|
|
61
|
+
host = models.CharField(max_length=765)
|
|
62
|
+
|
|
63
|
+
class Meta:
|
|
64
|
+
db_table = "msgs"
|
|
65
|
+
managed = False
|
|
66
|
+
unique_together = ("partition_tag", "mail_id")
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def time_datetime(self) -> datetime:
|
|
70
|
+
return datetime.fromtimestamp(self.time_num)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class Msgrcpt(models.Model):
|
|
74
|
+
partition_tag = models.IntegerField(default=0)
|
|
75
|
+
mail = models.ForeignKey(Msgs, primary_key=True, on_delete=models.CASCADE)
|
|
76
|
+
rid = models.ForeignKey(Maddr, db_column="rid", on_delete=models.CASCADE)
|
|
77
|
+
rseqnum = models.IntegerField(default=0)
|
|
78
|
+
is_local = models.CharField(max_length=3)
|
|
79
|
+
content = models.CharField(max_length=3)
|
|
80
|
+
ds = models.CharField(max_length=3)
|
|
81
|
+
rs = models.CharField(max_length=3)
|
|
82
|
+
bl = models.CharField(max_length=3, blank=True)
|
|
83
|
+
wl = models.CharField(max_length=3, blank=True)
|
|
84
|
+
bspam_level = models.FloatField(null=True, blank=True)
|
|
85
|
+
smtp_resp = models.CharField(max_length=765, blank=True)
|
|
86
|
+
|
|
87
|
+
class Meta:
|
|
88
|
+
db_table = "msgrcpt"
|
|
89
|
+
managed = False
|
|
90
|
+
unique_together = ("partition_tag", "mail", "rseqnum")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class Policy(models.Model):
|
|
94
|
+
policy_name = models.CharField(max_length=32, blank=True)
|
|
95
|
+
virus_lover = models.CharField(max_length=3, blank=True, null=True)
|
|
96
|
+
spam_lover = models.CharField(max_length=3, blank=True, null=True)
|
|
97
|
+
unchecked_lover = models.CharField(max_length=3, blank=True, null=True)
|
|
98
|
+
banned_files_lover = models.CharField(max_length=3, blank=True, null=True)
|
|
99
|
+
bad_header_lover = models.CharField(max_length=3, blank=True, null=True)
|
|
100
|
+
bypass_virus_checks = models.CharField(
|
|
101
|
+
gettext_lazy("Virus filter"),
|
|
102
|
+
default="",
|
|
103
|
+
null=True,
|
|
104
|
+
choices=(
|
|
105
|
+
("N", gettext_lazy("yes")),
|
|
106
|
+
("Y", gettext_lazy("no")),
|
|
107
|
+
("", gettext_lazy("default")),
|
|
108
|
+
),
|
|
109
|
+
max_length=3,
|
|
110
|
+
help_text=gettext_lazy(
|
|
111
|
+
"Bypass virus checks or not. Choose 'default' to use global " "settings."
|
|
112
|
+
),
|
|
113
|
+
)
|
|
114
|
+
bypass_spam_checks = models.CharField(
|
|
115
|
+
gettext_lazy("Spam filter"),
|
|
116
|
+
default="",
|
|
117
|
+
null=True,
|
|
118
|
+
choices=(
|
|
119
|
+
("N", gettext_lazy("yes")),
|
|
120
|
+
("Y", gettext_lazy("no")),
|
|
121
|
+
("", gettext_lazy("default")),
|
|
122
|
+
),
|
|
123
|
+
max_length=3,
|
|
124
|
+
help_text=gettext_lazy(
|
|
125
|
+
"Bypass spam checks or not. Choose 'default' to use global " "settings."
|
|
126
|
+
),
|
|
127
|
+
)
|
|
128
|
+
bypass_banned_checks = models.CharField(
|
|
129
|
+
gettext_lazy("Banned filter"),
|
|
130
|
+
default="",
|
|
131
|
+
null=True,
|
|
132
|
+
choices=(
|
|
133
|
+
("N", gettext_lazy("yes")),
|
|
134
|
+
("Y", gettext_lazy("no")),
|
|
135
|
+
("", gettext_lazy("default")),
|
|
136
|
+
),
|
|
137
|
+
max_length=3,
|
|
138
|
+
help_text=gettext_lazy(
|
|
139
|
+
"Bypass banned checks or not. Choose 'default' to use global " "settings."
|
|
140
|
+
),
|
|
141
|
+
)
|
|
142
|
+
bypass_header_checks = models.CharField(max_length=3, blank=True, null=True)
|
|
143
|
+
virus_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
|
|
144
|
+
spam_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
|
|
145
|
+
banned_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
|
|
146
|
+
unchecked_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
|
|
147
|
+
bad_header_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
|
|
148
|
+
clean_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
|
|
149
|
+
archive_quarantine_to = models.CharField(max_length=192, blank=True, null=True)
|
|
150
|
+
spam_tag_level = models.FloatField(null=True, blank=True)
|
|
151
|
+
spam_tag2_level = models.FloatField(null=True, blank=True)
|
|
152
|
+
spam_tag3_level = models.FloatField(null=True, blank=True)
|
|
153
|
+
spam_kill_level = models.FloatField(null=True, blank=True)
|
|
154
|
+
spam_dsn_cutoff_level = models.FloatField(null=True, blank=True)
|
|
155
|
+
spam_quarantine_cutoff_level = models.FloatField(null=True, blank=True)
|
|
156
|
+
addr_extension_virus = models.CharField(max_length=192, blank=True, null=True)
|
|
157
|
+
addr_extension_spam = models.CharField(max_length=192, blank=True, null=True)
|
|
158
|
+
addr_extension_banned = models.CharField(max_length=192, blank=True, null=True)
|
|
159
|
+
addr_extension_bad_header = models.CharField(max_length=192, blank=True, null=True)
|
|
160
|
+
warnvirusrecip = models.CharField(max_length=3, blank=True, null=True)
|
|
161
|
+
warnbannedrecip = models.CharField(max_length=3, blank=True, null=True)
|
|
162
|
+
warnbadhrecip = models.CharField(max_length=3, blank=True, null=True)
|
|
163
|
+
newvirus_admin = models.CharField(max_length=192, blank=True, null=True)
|
|
164
|
+
virus_admin = models.CharField(max_length=192, blank=True, null=True)
|
|
165
|
+
banned_admin = models.CharField(max_length=192, blank=True, null=True)
|
|
166
|
+
bad_header_admin = models.CharField(max_length=192, blank=True, null=True)
|
|
167
|
+
spam_admin = models.CharField(max_length=192, blank=True, null=True)
|
|
168
|
+
spam_subject_tag = models.CharField(max_length=192, blank=True, null=True)
|
|
169
|
+
spam_subject_tag2 = models.CharField(
|
|
170
|
+
gettext_lazy("Spam marker"),
|
|
171
|
+
default=None,
|
|
172
|
+
max_length=192,
|
|
173
|
+
blank=True,
|
|
174
|
+
null=True,
|
|
175
|
+
help_text=gettext_lazy(
|
|
176
|
+
"Modify spam subject using the specified text. "
|
|
177
|
+
"Choose 'default' to use global settings."
|
|
178
|
+
),
|
|
179
|
+
)
|
|
180
|
+
spam_subject_tag3 = models.CharField(max_length=192, blank=True, null=True)
|
|
181
|
+
message_size_limit = models.IntegerField(null=True, blank=True)
|
|
182
|
+
banned_rulenames = models.CharField(max_length=192, blank=True, null=True)
|
|
183
|
+
disclaimer_options = models.CharField(max_length=192, blank=True, null=True)
|
|
184
|
+
forward_method = models.CharField(max_length=192, blank=True, null=True)
|
|
185
|
+
sa_userconf = models.CharField(max_length=192, blank=True, null=True)
|
|
186
|
+
sa_username = models.CharField(max_length=192, blank=True, null=True)
|
|
187
|
+
|
|
188
|
+
class Meta:
|
|
189
|
+
db_table = "policy"
|
|
190
|
+
managed = False
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
class Quarantine(models.Model):
|
|
194
|
+
partition_tag = models.IntegerField(default=0)
|
|
195
|
+
mail = models.ForeignKey(Msgs, primary_key=True, on_delete=models.CASCADE)
|
|
196
|
+
chunk_ind = models.IntegerField()
|
|
197
|
+
mail_text = models.BinaryField()
|
|
198
|
+
|
|
199
|
+
class Meta:
|
|
200
|
+
db_table = "quarantine"
|
|
201
|
+
managed = False
|
|
202
|
+
ordering = ["-mail__time_num"]
|
|
203
|
+
unique_together = ("partition_tag", "mail", "chunk_ind")
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class Users(models.Model):
|
|
207
|
+
id = models.AutoField(primary_key=True) # NOQA:A003
|
|
208
|
+
priority = models.IntegerField()
|
|
209
|
+
policy = models.ForeignKey(Policy, on_delete=models.CASCADE)
|
|
210
|
+
email = models.CharField(unique=True, max_length=255)
|
|
211
|
+
fullname = models.CharField(max_length=765, blank=True)
|
|
212
|
+
|
|
213
|
+
class Meta:
|
|
214
|
+
db_table = "users"
|
|
215
|
+
managed = False
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class Wblist(models.Model):
|
|
219
|
+
rid = models.IntegerField(primary_key=True)
|
|
220
|
+
sid = models.IntegerField()
|
|
221
|
+
wb = models.CharField(max_length=30)
|
|
222
|
+
|
|
223
|
+
class Meta:
|
|
224
|
+
db_table = "wblist"
|
|
225
|
+
managed = False
|
|
226
|
+
unique_together = [("rid", "sid")]
|