Files
CyberPanel/postfixSenderPolicy/accept_traffic.py

142 lines
5.7 KiB
Python
Raw Normal View History

2019-12-10 23:04:24 +05:00
#!/usr/local/CyberCP/bin/python
import os,sys
sys.path.append('/usr/local/CyberCP')
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
django.setup()
import threading as multi
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
from policyConstraint import policyConstraints
2018-07-05 15:22:48 +05:00
from emailPremium.models import DomainLimits, EmailLogs
from mailServer.models import Domains, EUsers
import time
from cacheManager import cacheManager
limitThreads = multi.BoundedSemaphore(10)
class HandleRequest(multi.Thread):
2018-06-30 15:29:56 +05:00
cleaningPath = '/home/cyberpanel/purgeCache'
def __init__(self, conn):
multi.Thread.__init__(self)
self.connection = conn
2018-07-05 15:22:48 +05:00
def __del__(self):
try:
self.connection.close()
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-07-05 15:22:48 +05:00
logging.writeToFile(str(msg) + ' [HandleRequest.__del__]')
def run(self):
limitThreads.acquire()
dataComplete = ""
2018-07-05 15:22:48 +05:00
try:
2018-07-05 15:22:48 +05:00
while True:
Data = self.connection.recv(64)
# Wait for a connection
2018-07-19 22:38:37 +05:00
try:
if os.path.exists(HandleRequest.cleaningPath):
readFromFile = open(HandleRequest.cleaningPath, 'r')
command = readFromFile.read()
cacheManager.handlePurgeRequest(command)
readFromFile.close()
os.remove(HandleRequest.cleaningPath)
cacheManager.flushCache()
except:
pass
2018-07-05 15:22:48 +05:00
if Data:
if len(Data) < 64:
dataComplete = dataComplete + Data
self.manageRequest(dataComplete)
dataComplete = ''
else:
2018-07-05 15:22:48 +05:00
dataComplete = dataComplete + Data
else:
self.connection.close()
break
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-07-07 02:21:06 +05:00
logging.writeToFile( str(msg) + ' [HandleRequest.run]')
finally:
limitThreads.release()
def manageRequest(self, completeData):
try:
completeData = completeData.split('\n')
for items in completeData:
tempData = items.split('=')
2018-07-19 22:38:37 +05:00
if tempData[0] == 'sasl_username':
if len(tempData[1]) == 0:
self.connection.sendall('action=dunno\n\n')
return
emailAddress = tempData[1]
2018-06-30 15:29:56 +05:00
domainName = emailAddress.split('@')[1]
elif tempData[0] == 'recipient':
2018-10-12 18:18:10 +05:00
if len(tempData[1]) == 0:
self.connection.sendall('action=dunno\n\n')
return
destination = tempData[1]
2018-07-19 22:38:37 +05:00
if domainName in cacheManager.domains:
domainObj = cacheManager.domains[domainName]
emailObj = domainObj.findEmailOBJ(emailAddress)
else:
2018-07-05 15:22:48 +05:00
try:
domain = Domains.objects.get(domain=domainName)
domainLTS = DomainLimits.objects.get(domain=domain)
2018-07-05 15:22:48 +05:00
newDomain = policyConstraints(domainName, domainLTS.monthlyLimit, domainLTS.monthlyUsed, domainLTS.limitStatus)
cacheManager.domains[domainName] = newDomain
domainObj = newDomain
2018-07-05 15:22:48 +05:00
emailObj = newDomain.findEmailOBJ(emailAddress)
except:
2018-07-08 19:09:22 +05:00
self.connection.sendall('action=dunno\n\n')
return
#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:
2018-07-19 22:38:37 +05:00
2018-07-05 15:22:48 +05:00
if domainObj.monthlyLimits <= domainObj.monthlyUsed or 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')
2018-07-19 22:38:37 +05:00
return
else:
email = EUsers.objects.get(email=emailAddress)
if emailObj.logStatus == 1:
logEntry = EmailLogs(email=email, destination=destination, timeStamp=time.strftime("%m.%d.%Y_%H-%M-%S"))
logEntry.save()
emailObj.monthlyUsed = emailObj.monthlyUsed + 1
emailObj.hourlyUsed = emailObj.hourlyUsed + 1
2018-06-30 15:29:56 +05:00
domainObj.monthlyUsed = domainObj.monthlyUsed + 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("%m.%d.%Y_%H-%M-%S"))
logEntry.save()
2018-07-19 22:38:37 +05:00
emailObj.monthlyUsed = emailObj.monthlyUsed + 1
emailObj.hourlyUsed = emailObj.hourlyUsed + 1
2018-07-19 22:38:37 +05:00
domainObj.monthlyUsed = domainObj.monthlyUsed + 1
self.connection.sendall('action=dunno\n\n')
2019-12-10 15:09:10 +05:00
except BaseException as msg:
logging.writeToFile(str(msg) + " [HandleRequest.manageRequest]")
2018-07-07 02:21:06 +05:00
self.connection.sendall('action=defer_if_permit Service temporarily unavailable\n\n')