From 99fbfd8f788f389a24220b3c86a4b384fd00e960 Mon Sep 17 00:00:00 2001 From: usmannasir <01-134132-158@student.bahria.edu.pk> Date: Mon, 25 Jun 2018 03:37:23 +0500 Subject: [PATCH] postfix_access_policy_delegation protocol --- CyberCP/__init__.pyc | Bin 137 -> 144 bytes CyberCP/settings.py | 1 + CyberCP/settings.pyc | Bin 3809 -> 3838 bytes CyberCP/urls.py | 1 + api/__init__.pyc | Bin 133 -> 140 bytes api/admin.pyc | Bin 254 -> 261 bytes api/models.pyc | Bin 251 -> 258 bytes backup/__init__.pyc | Bin 136 -> 143 bytes backup/admin.pyc | Bin 353 -> 360 bytes backup/models.pyc | Bin 3165 -> 3186 bytes baseTemplate/__init__.pyc | Bin 142 -> 149 bytes baseTemplate/admin.pyc | Bin 263 -> 270 bytes baseTemplate/models.pyc | Bin 588 -> 602 bytes .../templates/baseTemplate/index.html | 17 +- databases/__init__.pyc | Bin 139 -> 146 bytes databases/admin.pyc | Bin 342 -> 349 bytes databases/models.pyc | Bin 716 -> 730 bytes dns/__init__.pyc | Bin 133 -> 140 bytes dns/admin.pyc | Bin 445 -> 452 bytes dns/models.pyc | Bin 4899 -> 5004 bytes emailPremium/__init__.py | 0 emailPremium/__init__.pyc | Bin 0 -> 149 bytes emailPremium/admin.py | 6 + emailPremium/admin.pyc | Bin 0 -> 270 bytes emailPremium/apps.py | 8 + emailPremium/migrations/__init__.py | 0 emailPremium/models.py | 29 + emailPremium/models.pyc | Bin 0 -> 267 bytes .../static/emailPremium/emailPremium.js | 673 ++++++++++++++++++ .../static/emailPremium/settings-gears.png | Bin 0 -> 1228 bytes emailPremium/static/emailPremium/vpsON.png | Bin 0 -> 757 bytes emailPremium/static/emailPremium/vpsOff.png | Bin 0 -> 667 bytes .../templates/emailPremium/emailLimits.html | 221 ++++++ .../templates/emailPremium/emailPage.html | 228 ++++++ .../templates/emailPremium/listDomains.html | 90 +++ emailPremium/tests.py | 6 + emailPremium/urls.py | 28 + emailPremium/views.py | 575 +++++++++++++++ filemanager/__init__.pyc | Bin 141 -> 148 bytes filemanager/admin.pyc | Bin 262 -> 269 bytes filemanager/models.pyc | Bin 259 -> 266 bytes firewall/__init__.pyc | Bin 138 -> 145 bytes firewall/admin.pyc | Bin 195 -> 202 bytes firewall/models.pyc | Bin 637 -> 651 bytes firewall/templates/firewall/spamassassin.html | 200 ++++++ firewall/urls.py | 5 + firewall/views.py | 13 + ftp/__init__.pyc | Bin 133 -> 140 bytes ftp/admin.pyc | Bin 332 -> 339 bytes ftp/models.pyc | Bin 1433 -> 1454 bytes loginSystem/__init__.pyc | Bin 141 -> 148 bytes loginSystem/admin.pyc | Bin 348 -> 355 bytes loginSystem/models.pyc | Bin 912 -> 926 bytes mailServer/__init__.pyc | Bin 140 -> 147 bytes mailServer/admin.pyc | Bin 261 -> 268 bytes mailServer/models.py | 1 - mailServer/models.pyc | Bin 2450 -> 3322 bytes mailServer/urls.py | 1 + mailServer/views.py | 13 +- managePHP/__init__.pyc | Bin 139 -> 146 bytes managePHP/admin.pyc | Bin 379 -> 386 bytes managePHP/models.pyc | Bin 962 -> 983 bytes .../managePHP/installExtensions.html | 2 +- manageSSL/__init__.pyc | Bin 139 -> 146 bytes manageSSL/admin.pyc | Bin 260 -> 267 bytes manageSSL/models.pyc | Bin 257 -> 264 bytes packages/__init__.pyc | Bin 138 -> 145 bytes packages/admin.pyc | Bin 357 -> 364 bytes packages/models.pyc | Bin 959 -> 973 bytes plogical/mailUtilities.py | 13 +- plogical/upgrade.py | 17 +- postfixSenderPolicy/__init__.py | 0 .../__pycache__/rawFileParser.cpython-36.pyc | Bin 0 -> 6988 bytes postfixSenderPolicy/accept_traffic.py | 108 +++ postfixSenderPolicy/cacheManager.py | 198 ++++++ postfixSenderPolicy/client.py | 48 ++ postfixSenderPolicy/cpecs.service | 12 + postfixSenderPolicy/policyCTRL.py | 55 ++ postfixSenderPolicy/policyConstraint.py | 33 + postfixSenderPolicy/startServer.py | 59 ++ serverLogs/__init__.pyc | Bin 140 -> 147 bytes serverLogs/admin.pyc | Bin 261 -> 268 bytes serverLogs/models.pyc | Bin 258 -> 265 bytes serverStatus/__init__.pyc | Bin 142 -> 149 bytes serverStatus/admin.pyc | Bin 263 -> 270 bytes serverStatus/models.pyc | Bin 260 -> 267 bytes static/emailPremium/emailPremium.js | 199 ++++++ static/emailPremium/settings-gears.png | Bin 0 -> 1228 bytes static/emailPremium/vpsON.png | Bin 0 -> 757 bytes static/emailPremium/vpsOff.png | Bin 0 -> 667 bytes static/mailServer/settings-gears.png | Bin 0 -> 1228 bytes static/mailServer/vpsON.png | Bin 0 -> 757 bytes static/mailServer/vpsOff.png | Bin 0 -> 667 bytes tuning/__init__.pyc | Bin 136 -> 143 bytes tuning/admin.pyc | Bin 257 -> 264 bytes tuning/models.pyc | Bin 254 -> 261 bytes userManagment/__init__.pyc | Bin 143 -> 150 bytes userManagment/admin.pyc | Bin 264 -> 271 bytes userManagment/models.pyc | Bin 261 -> 268 bytes websiteFunctions/__init__.pyc | Bin 146 -> 153 bytes websiteFunctions/admin.pyc | Bin 348 -> 355 bytes websiteFunctions/models.pyc | Bin 2358 -> 2400 bytes 102 files changed, 2845 insertions(+), 15 deletions(-) create mode 100644 emailPremium/__init__.py create mode 100644 emailPremium/__init__.pyc create mode 100644 emailPremium/admin.py create mode 100644 emailPremium/admin.pyc create mode 100644 emailPremium/apps.py create mode 100644 emailPremium/migrations/__init__.py create mode 100644 emailPremium/models.py create mode 100644 emailPremium/models.pyc create mode 100644 emailPremium/static/emailPremium/emailPremium.js create mode 100644 emailPremium/static/emailPremium/settings-gears.png create mode 100644 emailPremium/static/emailPremium/vpsON.png create mode 100644 emailPremium/static/emailPremium/vpsOff.png create mode 100644 emailPremium/templates/emailPremium/emailLimits.html create mode 100644 emailPremium/templates/emailPremium/emailPage.html create mode 100644 emailPremium/templates/emailPremium/listDomains.html create mode 100644 emailPremium/tests.py create mode 100644 emailPremium/urls.py create mode 100644 emailPremium/views.py create mode 100644 firewall/templates/firewall/spamassassin.html create mode 100644 postfixSenderPolicy/__init__.py create mode 100755 postfixSenderPolicy/__pycache__/rawFileParser.cpython-36.pyc create mode 100755 postfixSenderPolicy/accept_traffic.py create mode 100755 postfixSenderPolicy/cacheManager.py create mode 100755 postfixSenderPolicy/client.py create mode 100755 postfixSenderPolicy/cpecs.service create mode 100755 postfixSenderPolicy/policyCTRL.py create mode 100644 postfixSenderPolicy/policyConstraint.py create mode 100755 postfixSenderPolicy/startServer.py create mode 100644 static/emailPremium/emailPremium.js create mode 100644 static/emailPremium/settings-gears.png create mode 100644 static/emailPremium/vpsON.png create mode 100644 static/emailPremium/vpsOff.png create mode 100644 static/mailServer/settings-gears.png create mode 100644 static/mailServer/vpsON.png create mode 100644 static/mailServer/vpsOff.png diff --git a/CyberCP/__init__.pyc b/CyberCP/__init__.pyc index b4c1a3d744ca390318c4a5a3a769d6794a993eee..64abb8684e5c76c6aae25f5e871c1c83992e8c9a 100644 GIT binary patch delta 32 ncmeBVoWRJz{F#@l%2zXbB8MrXrZ6=S!f57_GLLP_P~b8Ke#aQqAQ4!=CJUYb`8C)@ zs?;~=l2>5C6Lg7$_8$Q3kUB)COvYrYkrt#A!M751=o&RbeQgC>zC~ z4rnG*CnyH$0>xo)up1inK;w1d6Q~!W0;USnp9S@S`q>=-X|4>i41tDOMnI!1W1w-C zuY7C&TVTQsBtTB!n;V#P15<8b8k+bFnsNGxN;th{Wy+c6oGBv9&c9t;kP|l+RiH(P zYS5DXq(rjI&Nf9YXaypScW>akW2N~CbxuU*-TuI>g0u=sO8n{Js>C%9*ClRv_)FrZ zhg%Z2UF2Ru@{VWkO5F2sU*ds>hZ0kHOcz1$=T))Rew2Gqdwms`ANdc^t(5sYd7)e8 zm6eIvi9ls8d#xQ96ZZP(JDeLfh#)u^`k#L%W#9jJpIFRunT*W7F zb9ZtPudAmeDyjV6uU`MF-mB^#*N3Y#=_@n+ZRcAYBQc6uM|eh`9!ei$;bI6Us2o%Q zssvSmszGj04Z^7qS)f{oY($blb)b4^x`NXboaR7J12y1IMOXnfav}rN1TDhU3~B*+ zK&=R~(F={*pz(Ji7t{`shlq-Z1LTW=Iyl=2>as**=?3+%^n&_W`auIMgS@rruna?% zVHji@Ml8dqWf-#zk>C?+?2RwVF0u( zS=i|viMuxLN!+*bK;mHnL+KFwwklQ|g7J6Nm!w8L#)z|= edGNwJetV=}Ed?+1Go#Sis=OF}=df|_y!izniFY#q diff --git a/CyberCP/urls.py b/CyberCP/urls.py index 748d094b7..f69178e01 100644 --- a/CyberCP/urls.py +++ b/CyberCP/urls.py @@ -35,4 +35,5 @@ urlpatterns = [ url(r'^manageSSL/',include('manageSSL.urls')), url(r'^api/',include('api.urls')), url(r'^filemanager/',include('filemanager.urls')), + url(r'^emailPremium/',include('emailPremium.urls')), ] diff --git a/api/__init__.pyc b/api/__init__.pyc index b65fd3706856c9f87f39b87f7c06f6037d1cce75..cafcf5aa50d685cd90a18afb6f696cc027cac4bf 100644 GIT binary patch delta 32 ncmZo=>|x|!{>;l&<*OMzk;9bHbfTRkdq7cYZf0rj#Be` delta 24 fcmeBSY-QwN{>;l2x&LA0L=IC%y@_^`6XWy%T+au6 diff --git a/api/admin.pyc b/api/admin.pyc index 82f1d16fa3d1855471a37344130cb627ea9251e1..74a54ef27499cdbc6e12fdf9c90bf892ba183bbc 100644 GIT binary patch delta 53 zcmeyz*viDg{F#@l%2zXbBFB0~BL)Tr{fzwFRQ=N8+{8S6=gOqiqJYG_)SQ5#)ZEO{ I+=&-;0lnrDF8}}l delta 46 zcmZo=`p3w@{F#?4a{t4~i5%;tv>6x}^fU5vQ}s)Wa})FQohy@4ivkk!QgbHW&;}TX){>;l&<*OMzk;9bHVxpZSdq7cYZf0rj#Bf6Zk46b- delta 24 fcmeBY>|o?z{>;l2F19anB8MrX;Y2&hiE)MiQcecD diff --git a/backup/admin.pyc b/backup/admin.pyc index 18caa545dedf1f0f83faba3c8efa035a1583eb8a..4d2523c91cc5fdbbe6e3d0551e111958b47f2965 100644 GIT binary patch delta 55 zcmaFJ^n!_l`7Mh=9f5 delta 48 zcmaFC^pJ^z`7Mvgh`jAoMsc_i5bic)hkOLI5xW6x(s6`H({U21Y7_j(Lb J$;r+8TBX2^GHs%=aJlek3EbT!JVAPy#dZM1_0j*50?M{ diff --git a/baseTemplate/__init__.pyc b/baseTemplate/__init__.pyc index 25e5b7d666b81f123ff1ff53d09982a71620df18..c01a8aaad574c8478df21ed02e0a4348468ebcaf 100644 GIT binary patch delta 32 ncmeBUoXW_-{F#@l(pNKjB8MrX-9$S{_JE?)+|1J4iQ(n|kpl^T delta 24 fcmbQr*vH7h{F#?aV@YY`L=IC%^NDtn6XVPQRNw~b diff --git a/baseTemplate/admin.pyc b/baseTemplate/admin.pyc index cb9c918b20afd7e02543ea25c06e71b2182e4ea4..c40f5d03d3abd0c73a924be6243086828072339b 100644 GIT binary patch delta 53 zcmZo?>SN+y{>;l&>8lw%kz>80H3I{Kenx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!=2`0H|XT(*OVf delta 46 zcmeBUYG>kL{>;mzv7|I|BFB0u69xtb{fzwFRQ=N8+{8S6=gOqiqJYG_)SQVo%m6@5 B4?O?? diff --git a/baseTemplate/models.pyc b/baseTemplate/models.pyc index 0b1265b820627a02207dc31d74768d8e0207058b..0833bba840cb6b83ee5727ca5794af0a6700ae26 100644 GIT binary patch delta 97 zcmX@Za*Kt7`7(MH>bN2K|iu+*JM2;@reMedo%g)S`gIywse4qSV~X S(%i{4jI~6mlAmnEBn1HF-XFC9 delta 41 qcmcb`a)yP2`7 {% trans "Tuning" %} - {% trans "NEW" %} +
  • + + + {% trans "Mail Settings" %} + {% trans "NEW" %} + + +
  • + @@ -586,6 +600,7 @@ + diff --git a/databases/__init__.pyc b/databases/__init__.pyc index f8e7593fcef0244e89d978996df937d771a400c6..20b7d66024157acce1a4a967cc3b0ccaee6bf388 100644 GIT binary patch delta 32 ncmeBXoW#h%{F#@l%2zXbB8MrX^+Y>K_JE?)+|1J4iQy&ykT3~! delta 24 fcmbQl*v-hn{F#?a?n+zaL=IC%lZkec6XQ$(S0x7& diff --git a/databases/admin.pyc b/databases/admin.pyc index b3edea730692d3c2cc946d203019e41c91225792..8c25f8f364fe56297a534efea767374adc49d154 100644 GIT binary patch delta 54 zcmcb{beD;P`7M2^3T77Ppw`WgATsrseGxrurD&Xq~2MFELm>~5)S|X delta 47 zcmcc1bd8CF`7g?0^fU5vQ}s)Wa})FQohy@4ivkk!QgbG&F`5Ga Dc@__$ diff --git a/databases/models.pyc b/databases/models.pyc index 479ad2eeee334ff6ab38ed7ff19c30e7b8d45f25..ba555fcd27da50edcaaf0d310fa42ebc46f9b73e 100644 GIT binary patch delta 57 ycmX@ZdW)5V`7MvmQ#jFywDnIzc*ic)hkOLHgRWt@v4A~SgdlMDbG#1j+% delta 79 zcmcb`dWMyQ`7|x|!{>;l&<*OMzk;9bHbfTRkdq7cYZf0rj#Be` delta 24 fcmeBSY-QwN{>;mDpr|2oB8MrX-b6deiE(-WS+xf? diff --git a/dns/admin.pyc b/dns/admin.pyc index 59087644994782e19c815ec265087ae1c06d7529..9fdc2ee113ea5078ee2ecf8a898ef638f1a22aae 100644 GIT binary patch delta 35 qcmdnXe1w^U`7MvfFlMx)8OjFRjDMX9-&rMZ*a7|j8?QVNOy delta 27 jcmX@YyqB4S`7fw%~y diff --git a/dns/models.pyc b/dns/models.pyc index 0c689a527683e80ca7505c10cbaa52521b7d3d72..12a6163474a9de905f7b1932d745c685eeac81c4 100644 GIT binary patch delta 326 zcmZ3i)}zkB{F#@l%2zXbBgcOxM&n6BlI#IRskxb@xsw%{KcNeVZ+2l(!cZnXc{bY% zOr=}cofy$Yr6+517NZM_Z$8f{j76z9cL9ph%?r7Wuqfl;O+Zlwbh!BDnY{H_l=|{x cQF@QR6HRHOU>$~ulMRGsqYH{n{w<^d07v3rMF0Q* delta 229 zcmeBCU#!N#{F#?4chRiKjU4}(7<&X=F)v-UKAc`@HoC$!a7CBY{qYg!JU^g2@QU P$&-X;!+BzpQ-n1Dq9H>< diff --git a/emailPremium/__init__.py b/emailPremium/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/emailPremium/__init__.pyc b/emailPremium/__init__.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d77c0fe14555c174c5ec9c7d12195fd6561e5c43 GIT binary patch literal 149 zcmZSn%*&-Nts9-p00oRd+5w1*S%5?e14FO|NW@PANHCxg#dbh3{fzwFRQ=N8+{8S6 z=gOqiqJYG_)SQ5#)ZEO{T!@HsfPQLjVkTTLK0Y%qvm`!Vub{Go189UzZhlH>PO2Tq JqGBLs006Z!Aj1Fv literal 0 HcmV?d00001 diff --git a/emailPremium/admin.py b/emailPremium/admin.py new file mode 100644 index 000000000..13be29d96 --- /dev/null +++ b/emailPremium/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.contrib import admin + +# Register your models here. diff --git a/emailPremium/admin.pyc b/emailPremium/admin.pyc new file mode 100644 index 0000000000000000000000000000000000000000..067b5361a59deb2566c2d5fc9456dfa9dc5eddfc GIT binary patch literal 270 zcmYL^&uRiO5XL9j3L><4_bPNRx(`s1g7>o6n>~c=X4 z27}7kj8VIEaVG3&L)O2YXY!0$sn3#2M5Xpjke^u0kM>_-JqDkn9rkr=Tg|(q7sl>8 w5OyVz_TBC{VC=O=*GD8<=+fEs9g?=U=K1yY?=eq#enY_&huiw&RAnyz0j$71kpKVy literal 0 HcmV?d00001 diff --git a/emailPremium/apps.py b/emailPremium/apps.py new file mode 100644 index 000000000..69075763f --- /dev/null +++ b/emailPremium/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class EmailpremiumConfig(AppConfig): + name = 'emailPremium' diff --git a/emailPremium/migrations/__init__.py b/emailPremium/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/emailPremium/models.py b/emailPremium/models.py new file mode 100644 index 000000000..b40864678 --- /dev/null +++ b/emailPremium/models.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models +from mailServer.models import Domains, EUsers +# Create your models here. + + + +class DomainLimits(models.Model): + domain = models.ForeignKey(Domains, on_delete=models.CASCADE) + limitStatus = models.IntegerField(default=0) + monthlyLimit = models.IntegerField(default=10000) + monthlyUsed = models.IntegerField(default=0) + +class EmailLimits(models.Model): + email = models.ForeignKey(EUsers, on_delete=models.CASCADE) + limitStatus = models.IntegerField(default=0) + monthlyLimits = models.IntegerField(default=2000) + monthlyUsed = models.IntegerField(default=0) + hourlyLimit = models.IntegerField(default=50) + hourlyUsed = models.IntegerField(default=0) + emailLogs = models.IntegerField(default=0) + +class EmailLogs(models.Model): + email = models.ForeignKey(EUsers, on_delete=models.CASCADE) + destination = models.CharField(max_length=200) + timeStamp = models.CharField(max_length=200) + diff --git a/emailPremium/models.pyc b/emailPremium/models.pyc new file mode 100644 index 0000000000000000000000000000000000000000..575d463419d4d77f1b84804da801fa040248abc4 GIT binary patch literal 267 zcmYL^!3x4K42IKAL#KGpCIPUj9d*d-MWB?Ap$7?ccHU=EstiJ**#BRD1_x~N_h38TuzB)(O3*PzhK zVK22EI%Db>vbEiRhTMz{A35`WK-@fmE+M~2Y< z47m_v--A_t0GSEV3)fQi8YBfY3Zjw$q5!DtJww`mkT}pK5G^1QXd{>lav01pKoN*L zAtc0{Y_Q9LT0ky@D+W6is0=CyW&q6xSphRG7wpr*A0RWc-oo@kTmp0q&?vCtv}Xuc zWrO`&2sZ)j*{oMkGa+^XH3Dq`268sgU+)+SzJkn20{b26JD^>k847{s0~tUo;NAo> zz~%!ZU1#-sU`%zF1o;IsC|tN7sOQMmen3Rm$^6UvAK$aeHVFTFbUa9`Dx2AGr~Z?B zOf&wd?JebPiE6&Zc>CF8)>{8e<#)aL*HgSdoJn;4TRpd6t?Tn0>t;uv%CX#){OLt_ z(_*v7r+q_}rpmtE$R3lMb|jMP)#q*6KZSmuYrMvD_~Y`gVMPY={E|m`+kU-~5mn+_ zGG)cmt6EL0f{%dCVodUOcVXyYmGuB}I14-?i-Ae@ItVj5Y0Rzw3bL1Y`ns||Vin=h z(zwiiNFAsr(9^{+MB{vJV0bi>p+Ha50;TlhT@4&vtfB|+?VcmLdr`y&^N<7gc7I-e z_xC#%zPZzV(l*_^*<#4Z*~z8)yIEzbm86H~)g>oOb=yk>jEp9#8gCMG>^pPf>clD2 z^(9z0RwW8*9<2&H#K@N1lc==!iqDdsj-yhhE!wA8gA@&PH;0CGx|Q-SSls+AYQegD z2c;4Utzr*}_Fmbua_7>i=eBPxFX{TZ>%@z9ok!lj{hg|1^lNc34-b>G-g5(kMTtJ| z%|0wPIXUCDfgPjIrIg?XcOL`ZGZ&1!LyNbZW9ANeadc_wd#=afjQ6FYmj|9*ly~pO zm&51tfl<5LX`k)N16rl`?I(128u9fP)Ce(@SCz@}92DNSL*%PA>yGTQ!C8<`)MX5lF!N|bSLf61l*T^8m(8$UJhzzt1jI0a{{5FIF z3lJm?x%nxXX_dG&*uQ=I7pOrJWJ7R%T1k0gQ7S`udAVL@UUqSEVnM22eo^}DcQ#T$ OMGT&T{=WcZNB_SR1L6W17i0ck0t&{0WuaVSFQ8(e2vALoDUf{u!~iNw$^;v7DJCHu ztN>^T$Q-cVOEDG!N&Yc$mj1~m-f`innGva35EIZyhlniuh%6upL=Y(xkaaOY(!xK< zArc}O`~Onh|4Rw~FD3rJoc#Yr>HnLR|8Ld)zg_?TPRswhZU66e|9>#y|D);uAI<## zc=rD%^Zq|s`2Xpm|4$eHf41!Zv*nYo|Na9EP`8pGzhDMNCT0#EUOs+)0XYpVZCyhP zCpVvfknqTajI4svvWm+3hW44W=gwQSc*Tm9>o)J$dHD4CD_5`GxOL~j<0tPwfBW|1 z=dXYNn!{gK08RYr>Eak7A(?xy)BaEb1KWe^-;P=>3Fvw%@ia~){ppG&<>z8HPWu0U z|Azbix$?I^J4`yOG$TdR+}WLdjEBx7xM;rcn0qPE*HK^NgGRQ@tuV#t zCE1dbPFltGYF6-gg&BzOCH4ymFEo(pj8ZM~`Ly?U>h0J`>Jz!wHe9H5wDSY!P=5EQ^RPS&0Xu_GvZzeKN;-0V~srgUMj@J`sJGFX?eEn!_w{LGr z#M}$rOv*3!biK^x`z4mX@Y&@b$$LvmB5pPHm)$Fi$@p+{f1%6)_uVr8&=m`1OC hrp0vR)KiHV`=S+groof literal 0 HcmV?d00001 diff --git a/emailPremium/static/emailPremium/vpsOff.png b/emailPremium/static/emailPremium/vpsOff.png new file mode 100644 index 0000000000000000000000000000000000000000..e511e68de738c23a52a8a08a4dd8a7a254dcba99 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk5Uj7}P}D}aLRC7!;n?2lMQc+A;8>|OkYfq^m8)5S5w;`H3h_SqqhB5fb% zONE79+}d%PcZnd=O*H{-&s(`>jvIocbzOERbiH-eIntk?xTsa&l6va`h0Gvr#~Y8# zgp|A%H8#}G(m9@#e`xRS>d6mgrky+U`P`iEJcmDIWb@yb&=fo~ZH@I?`{Xm+(~E!h z%#4{Bs8QDPL!;uiMeK+H6zwwiqpO8?ijEBG=XrE97Ti2w-1b_sElxUwgs2 zM5ZXG8zGLXls~TZpRgz?xMSX8&CACQT0abzm%G74roSssPvHfPe#ua!&x`QT^OE}MTxDXf*swJ)wB`Jv|saDBFsX&Us$iUD-*T7WQ$RNbf$ja2z%D_z9z{twL zpsQk)1&W5;{FKbJO57TLs|o=V3WFrbhT#0PlJdl&REF~Ma=pyF?Be9af>gcyqV(DC SY@~pS7(8A5T-G@yGywq4iU$1v literal 0 HcmV?d00001 diff --git a/emailPremium/templates/emailPremium/emailLimits.html b/emailPremium/templates/emailPremium/emailLimits.html new file mode 100644 index 000000000..47870f81e --- /dev/null +++ b/emailPremium/templates/emailPremium/emailLimits.html @@ -0,0 +1,221 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{{ domain }} Email Limits - CyberPanel{% endblock %} +{% block content %} + +{% load static %} +{% get_current_language as LANGUAGE_CODE %} + + +
    + +
    +

    {{ domain }}

    +

    {% trans "View and change email limits for a domain name." %}

    +
    + + {% if not error %} + + +
    + +
    + +

    + {% trans "Domain Resource Usage" %} +

    + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +
    DomainEmails AccountsMonthly LimitMonthly UsedLimit StatusOperations
    {{ domain }}{{ emailAccounts }}{{ monthlyLimit }}{{ monthlyUsed }} + + + + + + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    + + +
    + +
    +
    +

    {% trans "Can not change limits. Error message:" %} {$ errorMessage $}

    +
    + +
    +

    {% trans "Limits successfully changed, refreshing in 3 seconds." %}

    +
    + +
    +

    {% trans "Could not connect to server. Please refresh this page." %}

    +
    +
    + + + +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    + +
    + +

    + {% trans "Email Resource Usage" %} +

    + + +
    +
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    EmailMonthly LimitMonthly UsedHourly LimitHourly UsedLimit StatusOperations
    + + + + + + +
    + +
    +

    {% trans "Cannot list websites. Error message:" %} {$ errorMessage $}

    +
    + +
    + +
    + + + + +
    + + +
    +
    + +
    +
    + + +
    +
    + + {% else %} + +
    +

    {{ domain }}

    +
    + + + {% endif %} + + + + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/emailPremium/templates/emailPremium/emailPage.html b/emailPremium/templates/emailPremium/emailPage.html new file mode 100644 index 000000000..e7a947bc4 --- /dev/null +++ b/emailPremium/templates/emailPremium/emailPage.html @@ -0,0 +1,228 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{{ emailAddress }} Limits - CyberPanel{% endblock %} +{% block content %} + +{% load static %} +{% get_current_language as LANGUAGE_CODE %} + + +
    + +
    +

    {{ emailAddress }}

    +

    {% trans "View and change limits for an Email Address." %}

    +
    + + {% if not error %} + + +
    + +
    + +

    + {% trans "Email Resource Usage" %} +

    + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EmailMonthly LimitMonthly UsedHourly LimitHourly UsedLimit StatusLogsOperations
    {{ emailAddress }}{$ monthlyLimit $}{$ monthlyUsed $}{$ hourlyLimit $}{$ hourlyUsed $} + + + + + + + + + + + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + +
    + +
    + +
    +
    + +
    +
    + + +
    + +
    + + +
    +
    + + +
    + +
    +
    +

    {% trans "Can not change limits. Error message:" %} {$ errorMessage $}

    +
    + +
    +

    {% trans "Limits successfully changed." %}

    +
    + +
    +

    {% trans "Could not connect to server. Please refresh this page." %}

    +
    +
    + + + +
    + + +
    +
    + +
    +
    + + +
    +
    + + +
    + +
    + +

    + {% trans "Email Logs" %} +

    + + +
    +
    +
    + +
    + +
    + +
    + +
    + + + + + + + + + + + + + + + + + +
    IDSourceDestinationTime
    + +
    +

    {% trans "Cannot list websites. Error message:" %} {$ errorMessage $}

    +
    + +
    + +
    + + + + +
    + + +
    +
    + +
    +
    + + +
    +
    + + {% else %} + +
    +

    {{ domain }}

    +
    + + + {% endif %} + + + + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/emailPremium/templates/emailPremium/listDomains.html b/emailPremium/templates/emailPremium/listDomains.html new file mode 100644 index 000000000..9bedac9e7 --- /dev/null +++ b/emailPremium/templates/emailPremium/listDomains.html @@ -0,0 +1,90 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Domains - CyberPanel" %}{% endblock %} +{% block content %} + +{% load static %} +{% get_current_language as LANGUAGE_CODE %} + + + +
    + +
    +

    {% trans "List Domains" %}

    +

    {% trans "On this page you manage emails limits for Domains/Email Addresses" %}

    +
    + +
    +
    +

    + {% trans "Domains" %} +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    DomainEmails AccountsMonthly LimitMonthly UsedLimit StatusOperations
    + + + + + + +
    + +
    +

    {% trans "Cannot list websites. Error message:" %} {$ errorMessage $}

    +
    + +
    + +
    + + + + +
    + + +
    + +
    +
    +
    + + + +{% endblock %} \ No newline at end of file diff --git a/emailPremium/tests.py b/emailPremium/tests.py new file mode 100644 index 000000000..5982e6bcd --- /dev/null +++ b/emailPremium/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.test import TestCase + +# Create your tests here. diff --git a/emailPremium/urls.py b/emailPremium/urls.py new file mode 100644 index 000000000..7e42bf025 --- /dev/null +++ b/emailPremium/urls.py @@ -0,0 +1,28 @@ +from django.conf.urls import url +import views + +urlpatterns = [ + + url(r'^listDomains$', views.listDomains, name='listDomains'), + url(r'^getFurtherDomains$', views.getFurtherDomains, name='getFurtherDomains'), + url(r'^enableDisableEmailLimits$', views.enableDisableEmailLimits, name='enableDisableEmailLimits'), + + url(r'^(?P([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?)$', views.emailLimits, name='emailLimits'), + url(r'^changeDomainLimit$', views.changeDomainLimit, name='changeDomainLimit'), + url(r'^getFurtherEmail$', views.getFurtherEmail, name='getFurtherEmail'), + + url(r'^enableDisableIndividualEmailLimits$', views.enableDisableIndividualEmailLimits, name='enableDisableIndividualEmailLimits'), + + url(r'(?P\w+@.+)', views.emailPage, name='emailPage'), + url(r'^getEmailStats$', views.getEmailStats, name='getEmailStats'), + + + url(r'^enableDisableIndividualEmailLogs$', views.enableDisableIndividualEmailLogs, name='enableDisableIndividualEmailLogs'), + url(r'^changeDomainEmailLimitsIndividual$', views.changeDomainEmailLimitsIndividual, name='changeDomainEmailLimitsIndividual'), + url(r'^getEmailLogs$', views.getEmailLogs, name='getEmailLogs'), + url(r'^flushEmailLogs$', views.flushEmailLogs, name='flushEmailLogs'), + + + + +] \ No newline at end of file diff --git a/emailPremium/views.py b/emailPremium/views.py new file mode 100644 index 000000000..c11a07dc6 --- /dev/null +++ b/emailPremium/views.py @@ -0,0 +1,575 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.shortcuts import render,redirect +from django.http import HttpResponse +from mailServer.models import Domains, EUsers +# Create your views here. +from loginSystem.models import Administrator +from websiteFunctions.models import Websites +from loginSystem.views import loadLoginPage +import plogical.CyberCPLogFileWriter as logging +import json +from .models import DomainLimits, EmailLimits, EmailLogs +from math import ceil +from postfixSenderPolicy.client import cacheClient + + +# Create your views here. + +def listDomains(request): + try: + val = request.session['userID'] + + try: + admin = Administrator.objects.get(pk=request.session['userID']) + + if admin.type == 1: + websites = Websites.objects.all() + else: + websites = Websites.objects.filter(admin=admin) + + + pages = float(len(websites)) / float(10) + pagination = [] + + if pages <= 1.0: + pages = 1 + pagination.append('
  • ') + else: + pages = ceil(pages) + finalPages = int(pages) + 1 + + for i in range(1, finalPages): + pagination.append('
  • ' + str(i) + '
  • ') + + + return render(request,'emailPremium/listDomains.html',{"pagination":pagination}) + + except BaseException, msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg)) + return HttpResponse("See CyberCP main log file.") + + except KeyError: + return redirect(loadLoginPage) + +def getFurtherDomains(request): + try: + val = request.session['userID'] + + try: + + admin = Administrator.objects.get(pk=request.session['userID']) + + if request.method == 'POST': + try: + data = json.loads(request.body) + status = data['page'] + pageNumber = int(status) + + except BaseException, msg: + status = str(msg) + + + if admin.type == 1: + finalPageNumber = ((pageNumber * 10))-10 + endPageNumber = finalPageNumber + 10 + websites = Websites.objects.all()[finalPageNumber:endPageNumber] + + else: + finalPageNumber = ((pageNumber * 10)) - 10 + endPageNumber = finalPageNumber + 10 + websites = Websites.objects.filter(admin=admin)[finalPageNumber:endPageNumber] + + json_data = "[" + checker = 0 + + for items in websites: + + try: + domain = Domains.objects.get(domainOwner=items) + domainLimits = DomainLimits.objects.get(domain=domain) + + dic = {'domain': items.domain, 'emails': domain.eusers_set.all().count(), + 'monthlyLimit': domainLimits.monthlyLimit, 'monthlyUsed': domainLimits.monthlyUsed, + 'status':domainLimits.limitStatus} + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data +',' + json.dumps(dic) + except BaseException, msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg)) + + json_data = json_data + ']' + final_dic = {'listWebSiteStatus': 1, 'error_message': "None", "data": json_data} + final_json = json.dumps(final_dic) + + + return HttpResponse(final_json) + + except BaseException,msg: + dic = {'listWebSiteStatus': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + + except KeyError,msg: + dic = {'listWebSiteStatus': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + +def enableDisableEmailLimits(request): + try: + val = request.session['userID'] + try: + if request.method == 'POST': + + admin = Administrator.objects.get(pk=request.session['userID']) + data = json.loads(request.body) + operationVal = data['operationVal'] + domainName = data['domainName'] + + domain = Domains.objects.get(domain=domainName) + + domainLimits = DomainLimits.objects.get(domain=domain) + domainLimits.limitStatus = operationVal + domainLimits.save() + + command = 'cyberpanelCleaner purgeLimitDomain ' + domainName + ' ' + str(operationVal) + cacheClient.handleCachePurgeRequest(command) + + + dic = {'status': 1, 'error_message': 'None'} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + except BaseException,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + + except KeyError,msg: + dic = {'statusa': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + +def emailLimits(request,domain): + try: + val = request.session['userID'] + + admin = Administrator.objects.get(pk=val) + + + if Websites.objects.filter(domain=domain).exists(): + if admin.type == 1: + website = Websites.objects.get(domain=domain) + domainEmail = Domains.objects.get(domainOwner=website) + domainLimits = DomainLimits.objects.get(domain=domainEmail) + + Data = {} + Data['domain'] = domain + Data['monthlyLimit'] = domainLimits.monthlyLimit + Data['monthlyUsed'] = domainLimits.monthlyUsed + Data['emailAccounts'] = domainEmail.eusers_set.count() + + if domainLimits.limitStatus == 1: + Data['limitsOn'] = 1 + Data['limitsOff'] = 0 + else: + Data['limitsOn'] = 0 + Data['limitsOff'] = 1 + + + ## Pagination for emails + + + pages = float(Data['emailAccounts']) / float(10) + pagination = [] + + if pages <= 1.0: + pages = 1 + pagination.append('
  • ') + else: + pages = ceil(pages) + finalPages = int(pages) + 1 + + for i in range(1, finalPages): + pagination.append('
  • ' + str(i) + '
  • ') + + Data['pagination'] = pagination + + + return render(request, 'emailPremium/emailLimits.html', Data) + else: + return render(request, 'emailPremium/emailLimits.html', + {"error": 1, "domain": "You do not own this domain."}) + + else: + return render(request, 'emailPremium/emailLimits.html', {"error":1,"domain": "This domain does not exists"}) + except KeyError: + return redirect(loadLoginPage) + +def changeDomainLimit(request): + try: + val = request.session['userID'] + try: + if request.method == 'POST': + + admin = Administrator.objects.get(pk=request.session['userID']) + data = json.loads(request.body) + newLimit = data['newLimit'] + domainName = data['domainName'] + + domain = Domains.objects.get(domain=domainName) + + domainLimits = DomainLimits.objects.get(domain=domain) + domainLimits.monthlyLimit = newLimit + domainLimits.save() + + command = 'cyberpanelCleaner updateDomainLimit ' + domainName + ' ' + str(newLimit) + cacheClient.handleCachePurgeRequest(command) + + dic = {'status': 1, 'error_message': 'None'} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + except BaseException,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + + except KeyError,msg: + dic = {'statusa': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + +def getFurtherEmail(request): + try: + val = request.session['userID'] + try: + if request.method == 'POST': + admin = Administrator.objects.get(pk=request.session['userID']) + data = json.loads(request.body) + status = data['page'] + domainName = data['domainName'] + pageNumber = int(status) + + finalPageNumber = ((pageNumber * 10)) - 10 + endPageNumber = finalPageNumber + 10 + domain = Domains.objects.get(domain=domainName) + emails = domain.eusers_set.all()[finalPageNumber:endPageNumber] + + json_data = "[" + checker = 0 + + for item in emails: + + try: + emailLts = EmailLimits.objects.get(email=item) + + dic = {'email': item.email, 'monthlyLimit': emailLts.monthlyLimits, + 'monthlyUsed': emailLts.monthlyUsed, 'hourlyLimit': emailLts.hourlyLimit, + 'hourlyUsed':emailLts.hourlyUsed,'status': emailLts.limitStatus} + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data +',' + json.dumps(dic) + except BaseException, msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg)) + + json_data = json_data + ']' + final_dic = {'status': 1, 'error_message': "None", "data": json_data} + final_json = json.dumps(final_dic) + + + return HttpResponse(final_json) + + except BaseException,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + + except KeyError,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + +def enableDisableIndividualEmailLimits(request): + try: + val = request.session['userID'] + try: + if request.method == 'POST': + + data = json.loads(request.body) + operationVal = data['operationVal'] + emailAddress = data['emailAddress'] + + email = EUsers.objects.get(email=emailAddress) + emailtLts = EmailLimits.objects.get(email=email) + emailtLts.limitStatus = operationVal + emailtLts.save() + + command = 'cyberpanelCleaner purgeLimit ' + emailAddress + ' ' + str(operationVal) + cacheClient.handleCachePurgeRequest(command) + + dic = {'status': 1, 'error_message': 'None'} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + except BaseException,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + except KeyError,msg: + dic = {'statusa': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + +def emailPage(request, emailAddress): + try: + val = request.session['userID'] + + admin = Administrator.objects.get(pk=val) + + Data = {} + Data['emailAddress'] = emailAddress + + email = EUsers.objects.get(email=emailAddress) + logEntries = email.emaillogs_set.all().count() + + pages = float(logEntries) / float(10) + pagination = [] + + if pages <= 1.0: + pages = 1 + pagination.append('
  • ') + else: + pages = ceil(pages) + finalPages = int(pages) + 1 + + for i in range(1, finalPages): + pagination.append('
  • ' + str(i) + '
  • ') + + Data['pagination'] = pagination + + return render(request, 'emailPremium/emailPage.html', Data) + except KeyError: + return redirect(loadLoginPage) + +def getEmailStats(request): + try: + val = request.session['userID'] + try: + if request.method == 'POST': + admin = Administrator.objects.get(pk=request.session['userID']) + data = json.loads(request.body) + emailAddress = data['emailAddress'] + + email = EUsers.objects.get(email=emailAddress) + emailLTS = EmailLimits.objects.get(email=email) + + + final_dic = {'status': 1, 'error_message': "None", "monthlyLimit": emailLTS.monthlyLimits, + 'monthlyUsed': emailLTS.monthlyUsed, 'hourlyLimit': emailLTS.hourlyLimit, + 'hourlyUsed': emailLTS.hourlyUsed, + 'limitStatus': emailLTS.limitStatus, 'logsStatus': emailLTS.emailLogs} + + final_json = json.dumps(final_dic) + + + return HttpResponse(final_json) + + except BaseException,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + + except KeyError,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + +def enableDisableIndividualEmailLogs(request): + try: + val = request.session['userID'] + try: + if request.method == 'POST': + + data = json.loads(request.body) + operationVal = data['operationVal'] + emailAddress = data['emailAddress'] + + email = EUsers.objects.get(email=emailAddress) + emailtLts = EmailLimits.objects.get(email=email) + emailtLts.emailLogs = operationVal + emailtLts.save() + + command = 'cyberpanelCleaner purgeLog ' + emailAddress + ' ' + str(operationVal) + cacheClient.handleCachePurgeRequest(command) + + dic = {'status': 1, 'error_message': 'None'} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + except BaseException,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + except KeyError,msg: + dic = {'statusa': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + +def changeDomainEmailLimitsIndividual(request): + try: + val = request.session['userID'] + try: + if request.method == 'POST': + + admin = Administrator.objects.get(pk=request.session['userID']) + data = json.loads(request.body) + emailAddress = data['emailAddress'] + monthlyLimit = data['monthlyLimit'] + hourlyLimit = data['hourlyLimit'] + + ## Limits Check + + if monthlyLimit < hourlyLimit: + dic = {'status': 0, 'error_message': 'Monthly limit should be greater then hourly limit.'} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + domainName = emailAddress.split('@')[1] + dbDomain = Domains.objects.get(domain=domainName) + + domainLimit = DomainLimits.objects.get(domain=dbDomain) + + allEmails = dbDomain.eusers_set.all() + currentEmailConsumption = 0 + + for email in allEmails: + emailLTS = EmailLimits.objects.get(email=email) + currentEmailConsumption = emailLTS.monthlyLimits + currentEmailConsumption + + + allowedLimit = domainLimit.monthlyLimit - currentEmailConsumption + + if monthlyLimit > allowedLimit: + dic = {'status': 0, 'error_message': 'You can not set this monthly limit, first increase limits for this domain.'} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + ## Limits Check End + + email = EUsers.objects.get(email=emailAddress) + emailLTS = EmailLimits.objects.get(email=email) + + emailLTS.monthlyLimits = monthlyLimit + emailLTS.hourlyLimit = hourlyLimit + + emailLTS.save() + + command = 'cyberpanelCleaner purgeLimitEmail ' + emailAddress + ' ' + str(monthlyLimit) + ' ' + str(hourlyLimit) + cacheClient.handleCachePurgeRequest(command) + + dic = {'status': 1, 'error_message': 'None'} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + except BaseException,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + + except KeyError,msg: + dic = {'statusa': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + +def getEmailLogs(request): + try: + val = request.session['userID'] + try: + if request.method == 'POST': + + admin = Administrator.objects.get(pk=request.session['userID']) + data = json.loads(request.body) + status = data['page'] + emailAddress = data['emailAddress'] + pageNumber = int(status) + + finalPageNumber = ((pageNumber * 10)) - 10 + endPageNumber = finalPageNumber + 10 + email = EUsers.objects.get(email=emailAddress) + logEntries = email.emaillogs_set.all()[finalPageNumber:endPageNumber] + + json_data = "[" + checker = 0 + + for item in logEntries: + + dic = {'id': item.id, 'source': emailAddress, 'destination':item.destination, + 'time': item.timeStamp} + + if checker == 0: + json_data = json_data + json.dumps(dic) + checker = 1 + else: + json_data = json_data + ',' + json.dumps(dic) + + json_data = json_data + ']' + final_dic = {'status': 1, 'error_message': "None", "data": json_data} + final_json = json.dumps(final_dic) + + + return HttpResponse(final_json) + + except BaseException,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + + except KeyError,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + +def flushEmailLogs(request): + try: + val = request.session['userID'] + try: + if request.method == 'POST': + + data = json.loads(request.body) + emailAddress = data['emailAddress'] + + email = EUsers.objects.get(email=emailAddress) + + for logEntry in email.emaillogs_set.all(): + logEntry.delete() + + dic = {'status': 1, 'error_message': 'None'} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + except BaseException,msg: + dic = {'status': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) + + except KeyError,msg: + dic = {'statusa': 0, 'error_message': str(msg)} + json_data = json.dumps(dic) + return HttpResponse(json_data) \ No newline at end of file diff --git a/filemanager/__init__.pyc b/filemanager/__init__.pyc index 6951e53e3ddb9ce33675a8b435219d0070605826..d0a0bb55b1fbc5862f1bb415a665c32e69272b35 100644 GIT binary patch delta 32 ncmeBWoWjV#{F#@l(pNKjB8MrX?L<3C_JE?)+|1J4iQ#4dkhKYW delta 24 fcmbQj*vrVl{F#^Qh^0!@L=IC%vx#<+6XVPPQ{x84 diff --git a/filemanager/admin.pyc b/filemanager/admin.pyc index df5374762e7cff1e64b439a84d150704ccaade8b..86509b43e0b69e5ed5cc81ed0f8ad1a74d510b65 100644 GIT binary patch delta 53 zcmZo;>Sf|!{>;l&>8lw%kz>806$1l;mD#8M?{BFB0uV+IBW{fzwFRQ=N8+{8S6=gOqiqJYG_)SQVoOaVM( B4;laf diff --git a/filemanager/models.pyc b/filemanager/models.pyc index 2f5b0f19809b20b8a650f0fd916941c50f5c6452..2340adb68920100015016f57b3b78b012056b21d 100644 GIT binary patch delta 53 zcmZo>>SE$x{>;l&>8lw%kz=)@H3I{Kenx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!>cZ0Hz}m!vFvP delta 46 zcmeBTYG&eK{>;mD#8M?{BFAbe69xtb{fzwFRQ=N8+{8S6=gOqiqJYG_)SQV|%m6y@ B4-NnT diff --git a/firewall/__init__.pyc b/firewall/__init__.pyc index b3cebf7032b969c3984b9bd952694fc9df50a4dc..1f20018be08be1a2073856cf907d8f57e289ca65 100644 GIT binary patch delta 32 ncmeBToXE(*{F#@l%2zXbB8MrX)kHf<_JE?)+|1J4iQ&cokKze% delta 24 gcmbQp*u}`f{F#^QanriUi5#Yk#uM!%C&n2A0AL0Os{jB1 diff --git a/firewall/admin.pyc b/firewall/admin.pyc index 4a7e86e1f27232781fae2234e6c1a1e9f52c7325..ecf710338fba7943bd58f0088ddbfaf9b827d209 100644 GIT binary patch delta 53 zcmX@ic#4sO`7M2X*~^fU5vQ}s)Wa})FQohy@4ivkk!QgbHGG5`Q- CpAY{4 diff --git a/firewall/models.pyc b/firewall/models.pyc index 31f9975ea6e299c74a99d9f2a211d12436132035..dbee7d1de00f9a7bcc04dc7d37dff694f13d912b 100644 GIT binary patch delta 57 ycmey%(#^`j{F#@l%2zXbBgaxkMvKXYOp@#YMX9-&rMZ*6n4~8^V)VlhH3k6iHW3{F delta 41 qcmeBX{ma6^{F#?)nc}a=jT}oE84V||W0ahHjxiI?lAc`5Bmn>^Qw^d3 diff --git a/firewall/templates/firewall/spamassassin.html b/firewall/templates/firewall/spamassassin.html new file mode 100644 index 000000000..ac0b19c47 --- /dev/null +++ b/firewall/templates/firewall/spamassassin.html @@ -0,0 +1,200 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "SpamAssassin - CyberPanel" %}{% endblock %} +{% block content %} + +{% load static %} +{% get_current_language as LANGUAGE_CODE %} + + + +
    +
    +

    {% trans "SpamAssassin Configurations!" %}

    +

    {% trans "On this page you can configure SpamAssassin settings." %}

    +
    + +
    +
    +

    + {% trans "SpamAssassin" %} +

    + +
    +
    + + {% if modSecInstalled == 0 %} + +
    +

    {% trans "ModSecurity is not installed " %} +

    +
    + + + +
    + +
    + +
    +

    {% trans "Failed to start installation, Error message: " %} {$ errorMessage $}

    +
    + +
    +

    {% trans "Could not connect. Please refresh this page." %}

    +
    + +
    +

    {% trans "Installation failed." %} {$ errorMessage $}

    +
    + +
    +

    {% trans "ModSecurity successfully installed, refreshing page in 3 seconds.." %}

    +
    +
    +
    + + +
    + +
    +
    +
    +

    {% trans "Winter is coming, but so is ModSecurity." %}

    +
    +
    + +
    +
    +
    +
    + + + + {% else %} + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    {$ SecDebugLogLevel $}
    +
    +
    + +
    + +
    +
    {$ SecAuditLogParts $}
    +
    +
    + + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + + + +
    + +
    + + +
    +
    + + + +
    + +
    + +
    +

    {% trans "Failed to save ModSecurity configurations. Error message: " %} {$ errorMessage $}

    +
    + +
    +

    {% trans "ModSecurity configurations successfully saved." %}

    +
    + +
    +

    {% trans "Could not connect. Please refresh this page." %}

    +
    + +
    +
    + + +
    +
    + + {% endif %} + + + +
    +
    +
    +
    + + +
    + + +{% endblock %} \ No newline at end of file diff --git a/firewall/urls.py b/firewall/urls.py index d580b7632..aede4bf14 100644 --- a/firewall/urls.py +++ b/firewall/urls.py @@ -40,5 +40,10 @@ urlpatterns = [ url(r'^enableDisableRuleFile', views.enableDisableRuleFile, name='enableDisableRuleFile'), + ## SpamAssassin + + url(r'^spamAssassin', views.spamAssassin, name='spamAssassin'), + + ] \ No newline at end of file diff --git a/firewall/views.py b/firewall/views.py index 81d6269db..be753b042 100644 --- a/firewall/views.py +++ b/firewall/views.py @@ -37,6 +37,19 @@ def firewallHome(request): except KeyError: return redirect(loadLoginPage) +def spamAssassin(request): + try: + userID = request.session['userID'] + + admin = Administrator.objects.get(pk=userID) + + if admin.type == 3: + return HttpResponse("You don't have enough priviliges to access this page.") + + return render(request,'firewall/spamassassin.html') + except KeyError: + return redirect(loadLoginPage) + def getCurrentRules(request): diff --git a/ftp/__init__.pyc b/ftp/__init__.pyc index d4609ae24a709c6f1ce286b3a3d68dd41f62a40f..c8cd50973f0d690f42e9c14da554bd410cb314e8 100644 GIT binary patch delta 32 ncmZo=>|x|!{>;l&<*OMzk;9bHbfTRkdq7cYZf0rj#Be` delta 24 fcmeBSY-QwN{>;l|bg4OVB8MrX-b6deiE(-WR>}tp diff --git a/ftp/admin.pyc b/ftp/admin.pyc index c33a0295de6a5ec06851409e82832a66fe643b82..c961647096a5cea09fb4a85f76f5dda00d9eedc7 100644 GIT binary patch delta 54 zcmX@ZbeV~R`7M2??|MhpxL`WgATsrseGxrurD&Xq~2MFEL6x}^fU5vQ}s)Wa})FQohy@4ivkk!QgbFNF&Y8@ DcpeXt diff --git a/ftp/models.pyc b/ftp/models.pyc index 64b88c626ff63b8f35ae264405022cc96517de66..abf4d6b2aa1ce75334407d7f5342a1672622ef7e 100644 GIT binary patch delta 72 zcmbQqy^foM`7Mh+upM&ro=tdi^jMX9-&rMa6!m^~O#g(h!fnTaNn$!Y)q D?aLKs delta 56 wcmZ3-J(HV*`7I*0NA$>ApigX diff --git a/loginSystem/__init__.pyc b/loginSystem/__init__.pyc index f65734b5913e78a255201c8c2cf23843a9842169..01cc4906980fadbf17ca6859cbcc23f81e05c434 100644 GIT binary patch delta 32 ncmeBWoWjV#{F#@l%2zXbB8MrX?L<3C_JE?)+|1J4iQ#4dkjx2u delta 24 fcmbQj*vrVl{F#?4^i^r(L=IC%vx#<+6XVPPTOkKn diff --git a/loginSystem/admin.pyc b/loginSystem/admin.pyc index f852b0ed2d35a2b71234f7e5c389a029c0f9f527..aa96d38dcded643a3c576fac1c705b5f16a12577 100644 GIT binary patch delta 55 zcmcb^^q7f*`7Mh-?sMJomd2K|iu+*JM2;@reMedo%g)S`gIywse4qSV~X K(%i|)jFte(;1Ngw delta 48 zcmaFNbccz9`7Mvh5LjMkIwnI+i+ic)hkOLHejFw0H8#FT>}Y5@S?!4VGt delta 41 qcmbQoK7pNs`7V6W|Ew|o2d)VlAGMZECm1&*bMdn diff --git a/mailServer/__init__.pyc b/mailServer/__init__.pyc index 49c4c226aa61f43b8189508eeb5409137b717bfc..b3308106c332a944c72f71de75324e7f393eda2f 100644 GIT binary patch delta 32 ncmeBSoXp6<{F#@l%2zXbB8MrX%|ts%_JE?)+|1J4iQ%RIkbVhx delta 24 gcmbQt*u%)d{F#@lS5ww{>;l&<*OMzkz>80B?AM4enx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!=2G0H<{k%m4rY delta 46 zcmeBSYGvYJ{>;nOadcwjM2_`RMhpxL`WgATsrseGxrurD&Xq~2MFELUjHI0sR~lS6 zz>O1F;=q3~apB0B6MqJGE{Mx`&+XbxVG_jhi~Zhb`};oo!|d-y)Bag2S7GVdCX7ED z|Epj@_U(Q1)78+1Z4NyKvIcJf-T*ueDj-k5v~Y4#sDkvM7GU%(V_@!ZK0OQ1Z7D^xSFb!Gm8C;)3z%usC#lRU#$7Z&q2u4G4Ma)nj!^A9wc?#z+ zC|YvZqfE3ZO^db$!}P$p@?`!`#?75a{1xmOoq1p!nYZTG^j9}(3bIxZY7y@Oq8C*9IU~+@l_flqw(ZGCdtW#Ol#pR zxy`Z6ya)-U$!l3E5R#KqSoOGAfkrujjIy7c!LF*z#?Z{b5XH`r!pxAu%8Tv|2}rOpY5++F4bI7p95R!)v)REF$q9%8CFFp( z7-Rw)qr_wv_7`wzB}T2u1stJpzMPmOP?Z{zaz-I0KMn55!aSLR5IcZ!3}99<%+s=y WukZ*7@BqaH7=e&kl0%YHk^=yK_JE?)+|1J4iQy&ykQoVc delta 24 gcmbQl*v-hn{F#?a`{%*Pi5#YkCKK%>C&rlo09@?{fdBvi diff --git a/managePHP/admin.pyc b/managePHP/admin.pyc index 272a18a6d5f403bc2479a17cdeb1cad2663676e1..40627624a770cc524c38851feda4b41872f7f044 100644 GIT binary patch delta 55 zcmey()Wpoe{F#@l(pNKjBZmT`q6Gs3gMLPSZmNE1ac*LszH?<#YEeL9UTRK2QEF~x KY3^hvMoR#~Wf4LE delta 48 zcmZo-{>{X}{F#^Qn*5>2jT{P$Qico+4Eh=QxvBc4#kq-j`p%U}sYL;ad8s**JsB+l DX($gO diff --git a/managePHP/models.pyc b/managePHP/models.pyc index ea173e7115e537c225147471c014507e3005c1d8..6a3913048ecceb100b503f7fa2d4346df066a4d8 100644 GIT binary patch delta 76 zcmX@aex03z`7
    - +
    diff --git a/manageSSL/__init__.pyc b/manageSSL/__init__.pyc index 9919c9f70652e72e74e3d921c8221ca00c56cb7a..db3dce59cf781ed810335c9b3363ae098f8cf2f2 100644 GIT binary patch delta 32 ncmeBXoW#h%{F#@l%2zXbB8MrX^+Y>K_JE?)+|1J4iQy&ykT3~! delta 24 gcmbQl*v-hn{F#^Qh2E*ii5#YkCKK%>C&rlo09{)Ld;kCd diff --git a/manageSSL/admin.pyc b/manageSSL/admin.pyc index 3fe69d414f44aacbe964793d8a9f73aed950c890..dcae0c444dfe16b057fc244c1327c9b46f0331ef 100644 GIT binary patch delta 53 zcmZo+>Sp3#{>;l&<*OMzkz>801p@$N&HU delta 46 zcmeBXYGLAF{>;nuLhn@MM2_`Rh71f0`WgATsrseGxrurD&Xq~2MFELR{qv{>;l&<*OMzkz=)@B?AM4enx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!>bu0Hrk%yZ`_I delta 46 zcmeBRYGmSI{>;nuLhn@MM2^)`MhpxL`WgATsrseGxrurD&Xq~2MFELMhJe%H delta 48 zcmaFE^puH%`7Mvm1?j24sgnI+i+ic)hkOLHfmWm7)z8J_?B@p@xBiIcdA2oX`_% z%{T8n-~apneZJJ&oBhYnznD|bD9T@y9X}oP*YNnLP=q4Xx?(49)mHgiv$Y$F(1iY2 z5&DK^>q5Pw6pSZmuaqiOZv8rA{T_&;P=8w!s?Z)Qw(b~07sg{{L$yuNrm&c{K&M2S z=@jUU$TFP<-6L{LXF&IgJkwdw`$QkpJ)rx=0Mj|p`^5pKdqE!*gG}c^9}p)*LqMi+P(G&(o%0)ekmM}L|F}!5Rh1Ky*&CN4r0Xq)t1B{afuDYKwo&r7s z{KF_K^d(Jx*s1>$*QZf`0`$lBkP)Sf4J2X8H=ePO{?BeRfWC;XjR!%n*W?lzH{9*?v)+A&92_~YWG%~W9Uua zN$*b0o}5&$fAEyo_ETPUFIN2$R;|fL-~sVHL;G?+;o3ZEPw}39$DGhw+0}9Pmt40G zb*H)RQ(!-4tPj}BjQtJR_ZaI3_6pCS0DHvP0I&jM2Y@|bY(KCwjJ*P^#Ml8~XBoQ! zY@D%!z|Ju?4eT^ygTRW6319<^9RhZqu}7;(&%;1Q8ToD-IRfMYBR^~-LqIMv@=+Uk z0mv95AGeXCKrS)zhcg%CVyjm=xoZxbj%PB6eb7>cgv6>Bs-+b;bw8k!6 z7atV#!&(?bK_PV%R&m zAmNRQ)6!c*LmIp4V59HVFk)`5cz1F_daLk+)U>_kne~P<{^URSNpdj%x1!J^$py!G z>68We=(pWlH9v?Aui?0{wIb{F+JiW?;x<>jz=`%Yz^{I}ibtpw960Zmcz`cXLtWPdDl_fh3tW81SOvNS^w(Q%f0G;m6OmUP*iWF`4 zXw?ZS3m9_+_5KvZ^$jfcj#Hua9Y72J7bp}xtKv^H)b^j22i>RTRZGnSv(!N@iKedv z>(i)LUhPAf1D#M=b8D0|u)cPW2ASj**ifCF3smCH>8X^+n8RD^C3P;|5f9;!Bi*~sfUMRkC|JxVOjkTg3z}e5$ zk%As;(uq@~B;|TNHWs~_3y_3I43ACJl&}+p5ydsQGE(t2Gvy%WD42F{9ftmHwT;F-$>*#mg>PqA zGVBR-2u&VAm)%=F)jbP$q-m&EXITG7=;`NCC^{KHR?9(Q(^`0`n=fB#tPaaat{s*Q z<74e`q=Hp_&{Jg*4B^~MX?`oP_}?DN*Vi_4vSk^D_Z4#8B8D15LnOA4ot2Pb zadybLmPy&6sx(hyG%Et#vZy{ne%M{l5jjN>nImzkBr{k;XeBXKQtlfLJv+e492#&m zDx_JtB*{{~Ld8BR_ESL~Q=X*a5Q;)7&eYsS;_Txr+o1FPBd9%cCdp5b+x``%_DQ!D16rnM+4Uwan4EBU zyjyxt_3ucG43e0{2Kg-z>!ko^6Uae@9Igdw;u9Bjk_{whK!U2!524K=rDZ?^%?MdM z?SCcP7$Zp9VKktaN{{%`b3 zcx()4+gyfT?#lk2H%NupOF#1eL^GSuBPS$Jm)u;ipQC#XzQ5R1*DN~uZz}h{Xr-ex zydPL7df^do;&#A<_e&#MA^yMzrkW$%f^H@9XtDUr7IZJM4=uj`%ocPz(T5fv^N4gO z(Z6KCErU&U9LpYr5t zSqevtkg|onUE%i$iRAg`zd|;Ny=?Iuk0}bn86uNzBsPA92DwB9djSs1S$T#43K8-R zDy~v7h9cIzMpd4pPtJ;1DPN_}T~YUV1?R*7;d}ewgi~$>{?g&o<34B*--P1m1mibw zV9Kip-~f_m81FuO?}gRlNfcr|#Z$b@-8F`GkBIDOITC>&A+PT)*dnnc^SbF{YS zXPwwi&#qy0i88PrSay=0RT1p%c6vs1k|2ywV^)BdiQ1(A14!jKH}Ge?JA82SFA={e zGvVVhc!pyz%7Lc><2l&gm6huhJ28$EE7pTx1|zPLpd|)X~m@es?PR&lYqsW4 zyO`ufJ)xpV-iybvIaWf?9<_$aRtuMgF#wAR)@;=r4zBjPOLa zp6@Y2M_8nPIvy6*0}vg{gDAF6F|a{mzKJ*8Xj`b!kT1i}t_?;egqMeiQb_3#0ifoW zXBFUdv)ql}Lb#?AoL-VQFjJ_lp2g9PIeru0oc$IuHZBw-Zig&fH+il|PUv4peXLc- zY*S$WSCiL-tyM4WnF$}Nc+0pxa<<~_%xaPizekKql3=d(4N{%NywTo$ck5DQc zpno=y%bA~#v-9)G|0O`@=I5I$<$6*h)3o56ACw`oWhYqhgrxhJSnWEf^a~Yb|A3>4U(%IZ{t`~p(xt`o1l>6{EkQ>ff nDEql}!AR~y$lh_Rs4Y85LbS)|ar#QK(YL_C -1: + logging.writeToFile(dataComplete) + cacheManager.handlePurgeRequest(dataComplete) + else: + self.manageRequest(dataComplete) + + dataComplete = '' + else: + dataComplete = dataComplete + Data + else: + self.connection.close() + finally: + # Clean up the connection + self.connection.close() + + finally: + limitThreads.release() + + def manageRequest(self, completeData): + try: + completeData = completeData.split('\n') + + for items in completeData: + tempData = items.split('=') + if tempData[0] == 'client_name': + domainName = tempData[1] + elif tempData[0] == 'sender': + emailAddress = tempData[1] + elif tempData[0] == 'recipient': + destination = tempData[1] + + if domainName in cacheManager.domains: + domainObj = cacheManager.domains[domainName] + emailObj = domainObj.findEmailOBJ(emailAddress) + else: + domain = Domains.objects.get(domain=domainName) + domainLTS = DomainLimits.objects.get(domain=domain) + + newDomain = policyConstraints(domainName, domainLTS.monthlyLimit, domainLTS.monthlyUsed, domainLTS.limitStatus) + cacheManager.domains[domainName] = newDomain + domainObj = newDomain + + emailObj = newDomain.findEmailOBJ(emailAddress) + + #logging.writeToFile('Domain Limit Status: ' + str(domainObj.limitStatus)) + #logging.writeToFile('Email Limit Status: ' + str(domainObj.limitStatus)) + #logging.writeToFile('Email Monthly Limit: ' + str(emailObj.monthlyLimits)) + #logging.writeToFile('Email Monthly Used: ' + str(emailObj.monthlyUsed)) + + if domainObj.limitStatus == 1 and emailObj.limitStatus == 1: + if emailObj.monthlyLimits < emailObj.monthlyUsed or emailObj.hourlyLimits < emailObj.hourlyUsed: + logging.writeToFile(emailAddress + ' either exceeded monthly or hourly sending limit.') + self.connection.sendall('action=defer_if_permit Service temporarily unavailable\n\n') + else: + email = EUsers.objects.get(email=emailAddress) + if emailObj.logStatus == 1: + logEntry = EmailLogs(email=email, destination=destination, timeStamp=time.strftime("%I-%M-%S-%a-%b-%Y")) + logEntry.save() + emailObj.monthlyUsed = emailObj.monthlyUsed + 1 + emailObj.hourlyUsed = emailObj.hourlyUsed + 1 + self.connection.sendall('action=dunno\n\n') + else: + email = EUsers.objects.get(email=emailAddress) + if emailObj.logStatus == 1: + logEntry = EmailLogs(email=email, destination=destination, + timeStamp=time.strftime("%I-%M-%S-%a-%b-%Y")) + logEntry.save() + emailObj.monthlyUsed = emailObj.monthlyUsed + 1 + emailObj.hourlyUsed = emailObj.hourlyUsed + 1 + self.connection.sendall('action=dunno\n\n') + + + except BaseException, msg: + self.connection.sendall('action=dunno\n\n') + logging.writeToFile(str(msg)) diff --git a/postfixSenderPolicy/cacheManager.py b/postfixSenderPolicy/cacheManager.py new file mode 100755 index 000000000..a0bb00edd --- /dev/null +++ b/postfixSenderPolicy/cacheManager.py @@ -0,0 +1,198 @@ +#!/usr/bin/env python2.7 +import os,sys +sys.path.append('/usr/local/CyberCP') +import django +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") +django.setup() +sys.path.append('/usr/local/CyberCP') +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +from emailPremium.models import EmailLimits, DomainLimits, Domains, EUsers + +class cacheManager: + domains = {} + + @staticmethod + def flushCache(): + try: + + for domain, domainOBJ in cacheManager.domains.iteritems(): + domaindb = Domains.objects.get(domain=domain) + dbDomain = DomainLimits.objects.get(domain=domaindb) + + totalDomainUsed = 0 + + for email, emailOBJ in domainOBJ.emails.iteritems(): + emailID = EUsers.objects.get(email=email) + dbEmail = EmailLimits.objects.get(email=emailID) + + dbEmail.monthlyUsed = emailOBJ.monthlyUsed + dbEmail.hourlyUsed = emailOBJ.hourlyUsed + + totalDomainUsed = totalDomainUsed + emailOBJ.monthlyUsed + dbEmail.save() + + dbDomain.monthlyUsed = totalDomainUsed + dbDomain.save() + + except BaseException, msg: + logging.writeToFile(str(msg)) + + @staticmethod + def disableEnableLogs(self, emailAddress, operationValue): + try: + domainName = emailAddress.split('@')[1] + + if domainName in cacheManager.domains: + domainOBJ = cacheManager.domains[domainName] + if emailAddress in domainOBJ.emails: + emailOBJ = domainOBJ.emails[emailAddress] + emailOBJ.logStatus = operationValue + + except BaseException, msg: + logging.writeToFile(str(msg)) + + @staticmethod + def purgeLog(command): + try: + email = command[2] + operationVal = int(command[3]) + domain = email.split('@')[1] + + if domain in cacheManager.domains: + domainOBJ = cacheManager.domains[domain] + emailOBJ = domainOBJ.emails[email] + emailOBJ.logStatus = operationVal + + except BaseException, msg: + logging.writeToFile(str(msg)) + + @staticmethod + def purgeLimit(command): + try: + email = command[2] + operationVal = int(command[3]) + domain = email.split('@')[1] + + if domain in cacheManager.domains: + domainOBJ = cacheManager.domains[domain] + emailOBJ = domainOBJ.emails[email] + emailOBJ.limitStatus = operationVal + + except BaseException, msg: + logging.writeToFile(str(msg)) + + @staticmethod + def purgeLimitDomain(command): + try: + domain = command[2] + operationVal = int(command[3]) + + if domain in cacheManager.domains: + domainOBJ = cacheManager.domains[domain] + domainOBJ.limitStatus = operationVal + + except BaseException, msg: + logging.writeToFile(str(msg)) + + @staticmethod + def updateDomainLimit(command): + try: + domain = command[2] + newLimit = int(command[3]) + + if domain in cacheManager.domains: + domainOBJ = cacheManager.domains[domain] + domainOBJ.monthlyLimits = newLimit + + except BaseException, msg: + logging.writeToFile(str(msg)) + + @staticmethod + def purgeLimitEmail(command): + try: + email = command[2] + monthlyLimit = int(command[3]) + hourlyLimit = int(command[4]) + domain = email.split('@')[1] + + if domain in cacheManager.domains: + domainOBJ = cacheManager.domains[domain] + emailOBJ = domainOBJ.emails[email] + emailOBJ.monthlyLimits = monthlyLimit + emailOBJ.hourlyLimits = hourlyLimit + + except BaseException, msg: + logging.writeToFile(str(msg)) + + @staticmethod + def hourlyCleanUP(): + try: + + for domain, domainOBJ in cacheManager.domains.iteritems(): + for email, emailOBJ in domainOBJ.emails.iteritems(): + emailID = EUsers.objects.get(email=email) + dbEmail = EmailLimits.objects.get(email=emailID) + + dbEmail.hourlyUsed = 0 + emailOBJ.hourlyUsed = 0 + dbEmail.save() + + except BaseException, msg: + logging.writeToFile(str(msg)) + + @staticmethod + def monthlyCleanUP(): + try: + + for domain, domainOBJ in cacheManager.domains.iteritems(): + domaindb = Domains.objects.get(domain=domain) + dbDomain = DomainLimits.objects.get(domain=domaindb) + + + for email, emailOBJ in domainOBJ.emails.iteritems(): + emailID = EUsers.objects.get(email=email) + dbEmail = EmailLimits.objects.get(email=emailID) + + dbEmail.monthlyUsed = 0 + emailOBJ.monthlyUsed = 0 + dbEmail.hourlyUsed = 0 + emailOBJ.hourlyUsed = 0 + dbEmail.save() + + dbDomain.monthlyUsed = 0 + dbDomain.save() + + except BaseException, msg: + logging.writeToFile(str(msg)) + + + @staticmethod + def cleanUP(*args): + cacheManager.flushCache() + logging.writeToFile('Email Cleanup Service') + os._exit(0) + + @staticmethod + def handlePurgeRequest(command): + try: + finalCommand = command.split(' ') + + if finalCommand[1] == 'purgeLog': + cacheManager.purgeLog(finalCommand) + elif finalCommand[1] == 'purgeLimit': + cacheManager.purgeLimit(finalCommand) + elif finalCommand[1] == 'purgeLimitDomain': + cacheManager.purgeLimitDomain(finalCommand) + elif finalCommand[1] == 'updateDomainLimit': + cacheManager.updateDomainLimit(finalCommand) + elif finalCommand[1] == 'purgeLimitEmail': + cacheManager.purgeLimitEmail(finalCommand) + elif finalCommand[1] == 'hourlyCleanup': + cacheManager.hourlyCleanUP() + elif finalCommand[1] == 'monthlyCleanup': + cacheManager.monthlyCleanUP() + + + except BaseException, msg: + logging.writeToFile(str(msg)) + diff --git a/postfixSenderPolicy/client.py b/postfixSenderPolicy/client.py new file mode 100755 index 000000000..98763768d --- /dev/null +++ b/postfixSenderPolicy/client.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python2.7 +import socket +import sys +sys.path.append('/usr/local/CyberCP') +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +import argparse + +class cacheClient: + def __init__(self, serverAddr): + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.serverAddr = serverAddr + self.sock.connect(self.serverAddr) + + def sendData(self, data): + self.sock.sendall(data) + + def __del__(self): + self.sock.close() + + + @staticmethod + def handleCachePurgeRequest(command): + try: + serverAddr = ('localhost', 1089) + cachePurger = cacheClient(serverAddr) + cachePurger.sendData(command) + except BaseException, msg: + logging.writeToFile(str(msg)) + + +def main(): + + parser = argparse.ArgumentParser(description='CyberPanel Email Policy Cache Cleaner') + parser.add_argument('function', help='Specific a function to call!') + + + args = parser.parse_args() + + if args.function == "hourlyCleanup": + command = 'cyberpanelCleaner hourlyCleanup' + cacheClient.handleCachePurgeRequest(command) + elif args.function == 'monthlyCleanup': + command = 'cyberpanelCleaner monthlyCleanup' + cacheClient.handleCachePurgeRequest(command) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/postfixSenderPolicy/cpecs.service b/postfixSenderPolicy/cpecs.service new file mode 100755 index 000000000..27bb40665 --- /dev/null +++ b/postfixSenderPolicy/cpecs.service @@ -0,0 +1,12 @@ +[Unit] +Description = CyberPanel Email Policy Control Daemon + +[Service] +Type=forking +ExecStart = /usr/local/CyberCP/postfixSenderPolicy/policyCTRL.py start +ExecStop = /usr/local/CyberCP/postfixSenderPolicy/policyCTRL.py stop +Restart= /usr/local/CyberCP/postfixSenderPolicy/policyCTRL.py restart +Restart=on-abnormal + +[Install] +WantedBy=default.target diff --git a/postfixSenderPolicy/policyCTRL.py b/postfixSenderPolicy/policyCTRL.py new file mode 100755 index 000000000..d80a9fda1 --- /dev/null +++ b/postfixSenderPolicy/policyCTRL.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python2.7 +import subprocess, signal +import shlex +import argparse +import os +import sys +sys.path.append('/usr/local/CyberCP') +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging + + +class policyCTRL: + applicationPath = '/usr/local/CyberCP/postfixSenderPolicy/pid' + + def prepareArguments(self): + + parser = argparse.ArgumentParser(description='CyberPanel Policy Control Parser!') + parser.add_argument('function', help='Specific a operation to perform!') + + return parser.parse_args() + + def start(self): + + if os.path.exists(policyCTRL.applicationPath): + self.stop() + + command = '/usr/local/CyberCP/postfixSenderPolicy/startServer.py' + subprocess.Popen(shlex.split(command)) + + def stop(self): + path = policyCTRL.applicationPath + pid = open(path, "r").readlines()[0] + try: + os.kill(int(pid), signal.SIGTERM) + except BaseException, msg: + logging.writeToFile(str(msg)) + + + +def main(): + + policy = policyCTRL() + args = policy.prepareArguments() + + ## Website functions + + if args.function == "start": + policy.start() + elif args.function == "stop": + policy.stop() + elif args.function == "restart": + policy.stop() + policy.start() + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/postfixSenderPolicy/policyConstraint.py b/postfixSenderPolicy/policyConstraint.py new file mode 100644 index 000000000..f5ed2ef99 --- /dev/null +++ b/postfixSenderPolicy/policyConstraint.py @@ -0,0 +1,33 @@ +from emailPremium.models import DomainLimits, EmailLimits, EmailLogs +from mailServer.models import Domains, EUsers + +class emailConstraints: + def __init__(self, emailAddress, monthlyLimits, monthlyUsed, hourlyLimits, hourlyUsed, limitStatus, logStatus): + self.emailAddress = emailAddress + self.monthlyLimits = monthlyLimits + self.monthlyUsed = monthlyUsed + self.hourlyLimits = hourlyLimits + self.hourlyUsed = hourlyUsed + self.limitStatus = limitStatus + self.logStatus = logStatus + +class policyConstraints: + def __init__(self, domain, monthlyLimits, monthlyUsed, limitStatus): + self.domain = domain + self.emails = {} + self.monthlyLimits = monthlyLimits + self.monthlyUsed = monthlyUsed + self.limitStatus = limitStatus + + + def findEmailOBJ(self, emailAddress): + if emailAddress in self.emails: + return self.emails[emailAddress] + + else: + email = EUsers.objects.get(email=emailAddress) + emailLTS = EmailLimits.objects.get(email=email) + newEmail = emailConstraints(emailAddress, emailLTS.monthlyLimits, emailLTS.monthlyUsed, emailLTS.hourlyLimit, + emailLTS.hourlyUsed, emailLTS.limitStatus, emailLTS.emailLogs) + self.emails[emailAddress] = newEmail + return newEmail \ No newline at end of file diff --git a/postfixSenderPolicy/startServer.py b/postfixSenderPolicy/startServer.py new file mode 100755 index 000000000..ed4156ef9 --- /dev/null +++ b/postfixSenderPolicy/startServer.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python2.7 +import os,sys +sys.path.append('/usr/local/CyberCP') +import django +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") +django.setup() +import socket +import os +import accept_traffic as handle +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +from signal import * +from cacheManager import cacheManager + + +class SetupConn: + server_address = ('localhost', 1089) + applicationPath = '/usr/local/CyberCP/postfixSenderPolicy/pid' + + + def __init__(self, serv_addr): + self.server_addr = serv_addr + self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + def setup_conn(self): + + logging.writeToFile('Starting CyberPanel Email Policy Server!') + self.sock.bind(SetupConn.server_address) + logging.writeToFile('CyberPanel Email Policy Server Successfully started!') + + def start_listening(self): + self.sock.listen(1) + while True: + # Wait for a connection + logging.writeToFile('Waiting For Connection!') + connection, client_address = self.sock.accept() + background = handle.HandleRequest(connection) + background.start() + def __del__(self): + self.sock.close() + logging.writeToFile('Closing open connections!') + + + +def Main(): + writeToFile = open(SetupConn.applicationPath, 'w') + writeToFile.write(str(os.getpid())) + writeToFile.close() + + for sig in (SIGABRT, SIGINT, SIGTERM): + signal(sig, cacheManager.cleanUP) + + listenConn = SetupConn(SetupConn.server_address) + listenConn.setup_conn() + listenConn.start_listening() + + +if __name__ == "__main__": + Main() + diff --git a/serverLogs/__init__.pyc b/serverLogs/__init__.pyc index 7010da2d8f11551a48e275a7a50c0313d19fd1e2..18b20daef852d5463a5ed9e6e67cee86639d4ffa 100644 GIT binary patch delta 32 ncmeBSoXp6<{F#@l%2zXbB8MrX%|ts%_JE?)+|1J4iQ%RIkbVhx delta 24 gcmbQt*u%)d{F#?)SL?jUi5#YkrW5TXC&rlq09|DVeES5ww{>;l&<*OMzkz>80B?AM4enx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!=2G0H<{k%m4rY delta 46 zcmeBSYGvYJ{>;m@t94%FM2_`RMhpxL`WgATsrseGxrurD&Xq~2MFELSW?z{>;l&<*OMzkz=)@6$1ldE0HwkazyJUM delta 46 zcmeBVYGUGG{>;m@t94%FM2^)`#taM$`WgATsrseGxrurD&Xq~2MFELSN+y{>;l&<*OMzkz>80H3I{Kenx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!=2`0H}`<)Bpeg delta 46 zcmeBUYG>kL{>;mz{kbl3BFB0u69xtb{fzwFRQ=N8+{8S6=gOqiqJYG_)SQVo%m7Uj B510S| diff --git a/serverStatus/models.pyc b/serverStatus/models.pyc index 3e99fa5f0ac627867a1ed580b14fddebccd8a810..0cde4036035bfb241b6d7846b89b12176ce6620e 100644 GIT binary patch delta 53 zcmZo+>Sp3#{>;l&<*OMzkz=)@4Fdy%enx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!>d^0H)j#$N&HU delta 46 zcmeBXYGLAF{>;mz{kbl3BFAbeQw9bG{fzwFRQ=N8+{8S6=gOqiqJYG_)SQV|%mGWE B4~zf+ diff --git a/static/emailPremium/emailPremium.js b/static/emailPremium/emailPremium.js new file mode 100644 index 000000000..37b118fd1 --- /dev/null +++ b/static/emailPremium/emailPremium.js @@ -0,0 +1,199 @@ +/** + * Created by usman on 6/22/18. + */ + +/* Java script code to list accounts */ + +app.controller('listDomains', function($scope,$http) { + + $scope.listFail = true; + $scope.emailLimitsLoading = true; + + // Global page number, to be used in later function to refresh the domains + var globalPageNumber; + + + $scope.getFurtherWebsitesFromDB = function(pageNumber) { + + globalPageNumber = pageNumber; + $scope.emailLimitsLoading = false; + + url = "/emailPremium/getFurtherDomains"; + + var data = {page: pageNumber}; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + + $scope.emailLimitsLoading = true; + + if (response.data.listWebSiteStatus === 1) { + + $scope.WebSitesList = JSON.parse(response.data.data); + $scope.listFail = true; + } + else + { + $scope.listFail = false; + $scope.errorMessage = response.data.error_message; + + } + } + function cantLoadInitialData(response) { + $scope.emailLimitsLoading = true; + $scope.listFail = false; + } + + + }; + $scope.getFurtherWebsitesFromDB(1); + + $scope.enableDisableEmailLimits = function (operationVal, domainName) { + + $scope.emailLimitsLoading = false; + + + url = "/emailPremium/enableDisableEmailLimits"; + + var data = { + operationVal: operationVal, + domainName: domainName + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.emailLimitsLoading = true; + + if (response.data.status === 1) { + + $scope.getFurtherWebsitesFromDB(globalPageNumber); + $scope.listFail = true; + } + else + { + $scope.listFail = false; + $scope.errorMessage = response.data.error_message; + + } + } + function cantLoadInitialData(response) { + $scope.emailLimitsLoading = true; + $scope.listFail = false; + } + } +}); + +/* Java script code to list accounts ends here */ + + + +/* Java script code for email domain page */ + +app.controller('emailDomainPage', function($scope,$http, $timeout, $window) { + + $scope.listFail = true; + $scope.emailLimitsLoading = true; + + // Global page number, to be used in later function to refresh the domains + var globalPageNumber; + + + $scope.getFurtherWebsitesFromDB = function(pageNumber) { + + globalPageNumber = pageNumber; + $scope.emailLimitsLoading = false; + + url = "/emailPremium/getFurtherDomains"; + + var data = {page: pageNumber}; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + + $scope.emailLimitsLoading = true; + + if (response.data.listWebSiteStatus === 1) { + + $scope.WebSitesList = JSON.parse(response.data.data); + $scope.listFail = true; + } + else + { + $scope.listFail = false; + $scope.errorMessage = response.data.error_message; + + } + } + function cantLoadInitialData(response) { + $scope.emailLimitsLoading = true; + $scope.listFail = false; + } + + + }; + $scope.getFurtherWebsitesFromDB(1); + + $scope.enableDisableEmailLimits = function (operationVal, domainName) { + + $scope.emailLimitsLoading = false; + + + url = "/emailPremium/enableDisableEmailLimits"; + + var data = { + operationVal: operationVal, + domainName: domainName + }; + + var config = { + headers : { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data,config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + $scope.emailLimitsLoading = true; + + if (response.data.status === 1) { + + $timeout(function() { $window.location.reload(); }, 3000); + } + else + { + $timeout(function() { $window.location.reload(); }, 3000); + } + } + function cantLoadInitialData(response) { + $timeout(function() { $window.location.reload(); }, 3000); + } + } +}); + +/* Java script code for email domain page */ \ No newline at end of file diff --git a/static/emailPremium/settings-gears.png b/static/emailPremium/settings-gears.png new file mode 100644 index 0000000000000000000000000000000000000000..34a6f5b0a71fe8a1f387016c6c141c4ecc796b30 GIT binary patch literal 1228 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZk1_s9E0X`wFKm`m1?-_DG zfKc9hhWvLRvf)2N9$2LK6GP5BhMW%!`5&QbAS!b{f&_CvGGu>35`WK-@fmE+M~2Y< z47m_v--A_t0GSEV3)fQi8YBfY3Zjw$q5!DtJww`mkT}pK5G^1QXd{>lav01pKoN*L zAtc0{Y_Q9LT0ky@D+W6is0=CyW&q6xSphRG7wpr*A0RWc-oo@kTmp0q&?vCtv}Xuc zWrO`&2sZ)j*{oMkGa+^XH3Dq`268sgU+)+SzJkn20{b26JD^>k847{s0~tUo;NAo> zz~%!ZU1#-sU`%zF1o;IsC|tN7sOQMmen3Rm$^6UvAK$aeHVFTFbUa9`Dx2AGr~Z?B zOf&wd?JebPiE6&Zc>CF8)>{8e<#)aL*HgSdoJn;4TRpd6t?Tn0>t;uv%CX#){OLt_ z(_*v7r+q_}rpmtE$R3lMb|jMP)#q*6KZSmuYrMvD_~Y`gVMPY={E|m`+kU-~5mn+_ zGG)cmt6EL0f{%dCVodUOcVXyYmGuB}I14-?i-Ae@ItVj5Y0Rzw3bL1Y`ns||Vin=h z(zwiiNFAsr(9^{+MB{vJV0bi>p+Ha50;TlhT@4&vtfB|+?VcmLdr`y&^N<7gc7I-e z_xC#%zPZzV(l*_^*<#4Z*~z8)yIEzbm86H~)g>oOb=yk>jEp9#8gCMG>^pPf>clD2 z^(9z0RwW8*9<2&H#K@N1lc==!iqDdsj-yhhE!wA8gA@&PH;0CGx|Q-SSls+AYQegD z2c;4Utzr*}_Fmbua_7>i=eBPxFX{TZ>%@z9ok!lj{hg|1^lNc34-b>G-g5(kMTtJ| z%|0wPIXUCDfgPjIrIg?XcOL`ZGZ&1!LyNbZW9ANeadc_wd#=afjQ6FYmj|9*ly~pO zm&51tfl<5LX`k)N16rl`?I(128u9fP)Ce(@SCz@}92DNSL*%PA>yGTQ!C8<`)MX5lF!N|bSLf61l*T^8m(8$UJhzzt1jI0a{{5FIF z3lJm?x%nxXX_dG&*uQ=I7pOrJWJ7R%T1k0gQ7S`udAVL@UUqSEVnM22eo^}DcQ#T$ OMGT&T{=WcZNB_SR1L6W17i0ck0t&{0WuaVSFQ8(e2vALoDUf{u!~iNw$^;v7DJCHu ztN>^T$Q-cVOEDG!N&Yc$mj1~m-f`innGva35EIZyhlniuh%6upL=Y(xkaaOY(!xK< zArc}O`~Onh|4Rw~FD3rJoc#Yr>HnLR|8Ld)zg_?TPRswhZU66e|9>#y|D);uAI<## zc=rD%^Zq|s`2Xpm|4$eHf41!Zv*nYo|Na9EP`8pGzhDMNCT0#EUOs+)0XYpVZCyhP zCpVvfknqTajI4svvWm+3hW44W=gwQSc*Tm9>o)J$dHD4CD_5`GxOL~j<0tPwfBW|1 z=dXYNn!{gK08RYr>Eak7A(?xy)BaEb1KWe^-;P=>3Fvw%@ia~){ppG&<>z8HPWu0U z|Azbix$?I^J4`yOG$TdR+}WLdjEBx7xM;rcn0qPE*HK^NgGRQ@tuV#t zCE1dbPFltGYF6-gg&BzOCH4ymFEo(pj8ZM~`Ly?U>h0J`>Jz!wHe9H5wDSY!P=5EQ^RPS&0Xu_GvZzeKN;-0V~srgUMj@J`sJGFX?eEn!_w{LGr z#M}$rOv*3!biK^x`z4mX@Y&@b$$LvmB5pPHm)$Fi$@p+{f1%6)_uVr8&=m`1OC hrp0vR)KiHV`=S+groof literal 0 HcmV?d00001 diff --git a/static/emailPremium/vpsOff.png b/static/emailPremium/vpsOff.png new file mode 100644 index 0000000000000000000000000000000000000000..e511e68de738c23a52a8a08a4dd8a7a254dcba99 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk5Uj7}P}D}aLRC7!;n?2lMQc+A;8>|OkYfq^m8)5S5w;`H3h_SqqhB5fb% zONE79+}d%PcZnd=O*H{-&s(`>jvIocbzOERbiH-eIntk?xTsa&l6va`h0Gvr#~Y8# zgp|A%H8#}G(m9@#e`xRS>d6mgrky+U`P`iEJcmDIWb@yb&=fo~ZH@I?`{Xm+(~E!h z%#4{Bs8QDPL!;uiMeK+H6zwwiqpO8?ijEBG=XrE97Ti2w-1b_sElxUwgs2 zM5ZXG8zGLXls~TZpRgz?xMSX8&CACQT0abzm%G74roSssPvHfPe#ua!&x`QT^OE}MTxDXf*swJ)wB`Jv|saDBFsX&Us$iUD-*T7WQ$RNbf$ja2z%D_z9z{twL zpsQk)1&W5;{FKbJO57TLs|o=V3WFrbhT#0PlJdl&REF~Ma=pyF?Be9af>gcyqV(DC SY@~pS7(8A5T-G@yGywq4iU$1v literal 0 HcmV?d00001 diff --git a/static/mailServer/settings-gears.png b/static/mailServer/settings-gears.png new file mode 100644 index 0000000000000000000000000000000000000000..34a6f5b0a71fe8a1f387016c6c141c4ecc796b30 GIT binary patch literal 1228 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZk1_s9E0X`wFKm`m1?-_DG zfKc9hhWvLRvf)2N9$2LK6GP5BhMW%!`5&QbAS!b{f&_CvGGu>35`WK-@fmE+M~2Y< z47m_v--A_t0GSEV3)fQi8YBfY3Zjw$q5!DtJww`mkT}pK5G^1QXd{>lav01pKoN*L zAtc0{Y_Q9LT0ky@D+W6is0=CyW&q6xSphRG7wpr*A0RWc-oo@kTmp0q&?vCtv}Xuc zWrO`&2sZ)j*{oMkGa+^XH3Dq`268sgU+)+SzJkn20{b26JD^>k847{s0~tUo;NAo> zz~%!ZU1#-sU`%zF1o;IsC|tN7sOQMmen3Rm$^6UvAK$aeHVFTFbUa9`Dx2AGr~Z?B zOf&wd?JebPiE6&Zc>CF8)>{8e<#)aL*HgSdoJn;4TRpd6t?Tn0>t;uv%CX#){OLt_ z(_*v7r+q_}rpmtE$R3lMb|jMP)#q*6KZSmuYrMvD_~Y`gVMPY={E|m`+kU-~5mn+_ zGG)cmt6EL0f{%dCVodUOcVXyYmGuB}I14-?i-Ae@ItVj5Y0Rzw3bL1Y`ns||Vin=h z(zwiiNFAsr(9^{+MB{vJV0bi>p+Ha50;TlhT@4&vtfB|+?VcmLdr`y&^N<7gc7I-e z_xC#%zPZzV(l*_^*<#4Z*~z8)yIEzbm86H~)g>oOb=yk>jEp9#8gCMG>^pPf>clD2 z^(9z0RwW8*9<2&H#K@N1lc==!iqDdsj-yhhE!wA8gA@&PH;0CGx|Q-SSls+AYQegD z2c;4Utzr*}_Fmbua_7>i=eBPxFX{TZ>%@z9ok!lj{hg|1^lNc34-b>G-g5(kMTtJ| z%|0wPIXUCDfgPjIrIg?XcOL`ZGZ&1!LyNbZW9ANeadc_wd#=afjQ6FYmj|9*ly~pO zm&51tfl<5LX`k)N16rl`?I(128u9fP)Ce(@SCz@}92DNSL*%PA>yGTQ!C8<`)MX5lF!N|bSLf61l*T^8m(8$UJhzzt1jI0a{{5FIF z3lJm?x%nxXX_dG&*uQ=I7pOrJWJ7R%T1k0gQ7S`udAVL@UUqSEVnM22eo^}DcQ#T$ OMGT&T{=WcZNB_SR1L6W17i0ck0t&{0WuaVSFQ8(e2vALoDUf{u!~iNw$^;v7DJCHu ztN>^T$Q-cVOEDG!N&Yc$mj1~m-f`innGva35EIZyhlniuh%6upL=Y(xkaaOY(!xK< zArc}O`~Onh|4Rw~FD3rJoc#Yr>HnLR|8Ld)zg_?TPRswhZU66e|9>#y|D);uAI<## zc=rD%^Zq|s`2Xpm|4$eHf41!Zv*nYo|Na9EP`8pGzhDMNCT0#EUOs+)0XYpVZCyhP zCpVvfknqTajI4svvWm+3hW44W=gwQSc*Tm9>o)J$dHD4CD_5`GxOL~j<0tPwfBW|1 z=dXYNn!{gK08RYr>Eak7A(?xy)BaEb1KWe^-;P=>3Fvw%@ia~){ppG&<>z8HPWu0U z|Azbix$?I^J4`yOG$TdR+}WLdjEBx7xM;rcn0qPE*HK^NgGRQ@tuV#t zCE1dbPFltGYF6-gg&BzOCH4ymFEo(pj8ZM~`Ly?U>h0J`>Jz!wHe9H5wDSY!P=5EQ^RPS&0Xu_GvZzeKN;-0V~srgUMj@J`sJGFX?eEn!_w{LGr z#M}$rOv*3!biK^x`z4mX@Y&@b$$LvmB5pPHm)$Fi$@p+{f1%6)_uVr8&=m`1OC hrp0vR)KiHV`=S+groof literal 0 HcmV?d00001 diff --git a/static/mailServer/vpsOff.png b/static/mailServer/vpsOff.png new file mode 100644 index 0000000000000000000000000000000000000000..e511e68de738c23a52a8a08a4dd8a7a254dcba99 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VW5Sk5Uj7}P}D}aLRC7!;n?2lMQc+A;8>|OkYfq^m8)5S5w;`H3h_SqqhB5fb% zONE79+}d%PcZnd=O*H{-&s(`>jvIocbzOERbiH-eIntk?xTsa&l6va`h0Gvr#~Y8# zgp|A%H8#}G(m9@#e`xRS>d6mgrky+U`P`iEJcmDIWb@yb&=fo~ZH@I?`{Xm+(~E!h z%#4{Bs8QDPL!;uiMeK+H6zwwiqpO8?ijEBG=XrE97Ti2w-1b_sElxUwgs2 zM5ZXG8zGLXls~TZpRgz?xMSX8&CACQT0abzm%G74roSssPvHfPe#ua!&x`QT^OE}MTxDXf*swJ)wB`Jv|saDBFsX&Us$iUD-*T7WQ$RNbf$ja2z%D_z9z{twL zpsQk)1&W5;{FKbJO57TLs|o=V3WFrbhT#0PlJdl&REF~Ma=pyF?Be9af>gcyqV(DC SY@~pS7(8A5T-G@yGywq4iU$1v literal 0 HcmV?d00001 diff --git a/tuning/__init__.pyc b/tuning/__init__.pyc index 4d8b43840146df738d0e0304b3901807e8fdc278..4d15ebb46a784319cce94067ad02a4f37f8727be 100644 GIT binary patch delta 32 ncmeBR>}TX){>;l&<*OMzk;9bHVxpZSdq7cYZf0rj#Bf6Zk46b- delta 24 fcmeBY>|o?z{>;mjo>3Dyk;9bHaH5^$#5h9$RA2_% diff --git a/tuning/admin.pyc b/tuning/admin.pyc index 6f8b7d940dad90d9e6c0b0faf77d9d675fae910b..f8978efb66895ff8e2446222c7e111aa5f737dcb 100644 GIT binary patch delta 53 zcmZo<>R{qv{>;l&<*OMzkz>80DFXw8enx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!=1*0Hr|@yZ`_I delta 46 zcmeBRYGmSI{>;mjo>3Dykz>7-9s>h|enx(7s(xv4ZepIkb7fL$Q9xo|YR<$P1^_=D B4=(@! diff --git a/tuning/models.pyc b/tuning/models.pyc index ac677029400cd0c37ee68872bf89af46b86f5025..e883471939aa8c2f0bf8c8778e47a773dbe7ff18 100644 GIT binary patch delta 53 zcmeyz*viDg{F#@l%2zXbBFAb)GX@3*{fzwFRQ=N8+{8S6=gOqiqJYG_)SQ5#)ZEO{ I+=*um0lnH1F8}}l delta 46 zcmZo=`p3w@{F#?4J)w{fzwFRQ=N8+{8S6=gOqiqJYG_)SQV|3;|Pq B52647 diff --git a/userManagment/__init__.pyc b/userManagment/__init__.pyc index 932555a1f4694124307a1c37a2c9e2b35e5e311d..5567b8f6aaaa9131deb8908a3d71893b1c4f6b48 100644 GIT binary patch delta 32 ncmeBYoW{t({F#@l%2zXbB8MrX{X{!S_JE?)+|1J4iQyIik!T5o delta 24 gcmbQn*w4tp{F#^Q=$4kqi5#Yk78C6xC&pO-0AK6}sQ>@~ diff --git a/userManagment/admin.pyc b/userManagment/admin.pyc index 0f08cf20cde77126424fc01e968060038cb648d4..a7b5d4f7ae184ce860f581cc8f5185d0bbdc245d 100644 GIT binary patch delta 53 zcmeBR>Sy9${>;l&<*OMzkz>804Fdy%enx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!=4c0I3`i*Z=?k delta 46 zcmeBY>R{qv{>;mDbW2O*M2_`RrVI=W`WgATsrseGxrurD&Xq~2MFELxc diff --git a/userManagment/models.pyc b/userManagment/models.pyc index b8e02570959e852af66b50547f96068e60e081b9..484042ae91762e61a18d7b16af45a058e3f6157a 100644 GIT binary patch delta 53 zcmZo=>S5ww{>;l&<*OMzkz=)@Edv9Cenx(7s(xv4ZepIkb7fL$Q9xo|YED2=YHns} I?!>be0H;mDbW2O*M2^)`W(*7r`WgATsrseGxrurD&Xq~2MFEL|` diff --git a/websiteFunctions/__init__.pyc b/websiteFunctions/__init__.pyc index 6cdcdddf3da17eba9bae42e2aa55b479ef1bd0dc..a4774f24489d01a60580cd8496c520e7ed4681b9 100644 GIT binary patch delta 32 ncmbQlIFpfs`7L=IC%r-^ow>;XloxtXQ86T__ml2Qqf delta 24 fcmbQqIEj&i`7xp)f6XUD_T6+gc diff --git a/websiteFunctions/admin.pyc b/websiteFunctions/admin.pyc index a7f1d7fa013b324cbd6e389d12497fbc6d4120c9..3685ce5ea32e6ade7af72269b0903e44c1ec05db 100644 GIT binary patch delta 54 zcmcb^^q7f*`7M2?EvSe5+?uv delta 47 zcmaFNbccz9`7Mh+fkMu$o4lI#IRskxb@xtsNv>lsl*ChIY)Y<|sRgef{X anr#V&(#f{$n=l1+IhLUdDo+;RR09BTizyla delta 95 zcmaDLv`vVE`7