mirror of
https://github.com/usmannasir/cyberpanel.git
synced 2025-10-26 07:46:35 +01:00
142 lines
5.7 KiB
Python
142 lines
5.7 KiB
Python
#!/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
|
|
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):
|
|
cleaningPath = '/home/cyberpanel/purgeCache'
|
|
def __init__(self, conn):
|
|
multi.Thread.__init__(self)
|
|
self.connection = conn
|
|
|
|
def __del__(self):
|
|
try:
|
|
self.connection.close()
|
|
except BaseException as msg:
|
|
logging.writeToFile(str(msg) + ' [HandleRequest.__del__]')
|
|
|
|
def run(self):
|
|
limitThreads.acquire()
|
|
dataComplete = ""
|
|
|
|
try:
|
|
while True:
|
|
|
|
Data = self.connection.recv(64)
|
|
# Wait for a connection
|
|
|
|
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
|
|
|
|
if Data:
|
|
if len(Data) < 64:
|
|
dataComplete = dataComplete + Data
|
|
self.manageRequest(dataComplete)
|
|
dataComplete = ''
|
|
else:
|
|
dataComplete = dataComplete + Data
|
|
else:
|
|
self.connection.close()
|
|
break
|
|
|
|
except BaseException as msg:
|
|
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('=')
|
|
if tempData[0] == 'sasl_username':
|
|
if len(tempData[1]) == 0:
|
|
self.connection.sendall('action=dunno\n\n')
|
|
return
|
|
emailAddress = tempData[1]
|
|
domainName = emailAddress.split('@')[1]
|
|
elif tempData[0] == 'recipient':
|
|
if len(tempData[1]) == 0:
|
|
self.connection.sendall('action=dunno\n\n')
|
|
return
|
|
destination = tempData[1]
|
|
|
|
|
|
|
|
if domainName in cacheManager.domains:
|
|
domainObj = cacheManager.domains[domainName]
|
|
emailObj = domainObj.findEmailOBJ(emailAddress)
|
|
else:
|
|
try:
|
|
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)
|
|
except:
|
|
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:
|
|
|
|
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')
|
|
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
|
|
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()
|
|
|
|
emailObj.monthlyUsed = emailObj.monthlyUsed + 1
|
|
emailObj.hourlyUsed = emailObj.hourlyUsed + 1
|
|
domainObj.monthlyUsed = domainObj.monthlyUsed + 1
|
|
self.connection.sendall('action=dunno\n\n')
|
|
|
|
|
|
except BaseException as msg:
|
|
logging.writeToFile(str(msg) + " [HandleRequest.manageRequest]")
|
|
self.connection.sendall('action=defer_if_permit Service temporarily unavailable\n\n')
|