Files
CyberPanel/mailServer/mailserverManager.py

821 lines
32 KiB
Python
Raw Normal View History

2019-12-10 23:04:24 +05:00
#!/usr/local/CyberCP/bin/python
# coding=utf-8
2018-10-08 22:12:05 +05:00
import os.path
import sys
import django
sys.path.append('/usr/local/CyberCP')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
django.setup()
from django.shortcuts import render,redirect
from django.http import HttpResponse
2019-12-11 10:40:35 +05:00
from .models import Domains,EUsers
2018-10-08 22:12:05 +05:00
from loginSystem.views import loadLoginPage
import plogical.CyberCPLogFileWriter as logging
import json
import shlex
import subprocess
from plogical.virtualHostUtilities import virtualHostUtilities
from plogical.mailUtilities import mailUtilities
2019-12-10 15:09:10 +05:00
import _thread
2018-10-08 22:12:05 +05:00
from dns.models import Domains as dnsDomains
from dns.models import Records as dnsRecords
from mailServer.models import Forwardings, Pipeprograms
2018-10-08 22:12:05 +05:00
from plogical.acl import ACLManager
import os
2018-11-21 14:50:27 +05:00
from plogical.dnsUtilities import DNS
from loginSystem.models import Administrator
2019-03-26 16:19:03 +05:00
from plogical.processUtilities import ProcessUtilities
import bcrypt
from websiteFunctions.models import Websites
2018-10-08 22:12:05 +05:00
class MailServerManager:
def __init__(self, request = None):
self.request = request
def loadEmailHome(self):
try:
val = self.request.session['userID']
return render(self.request, 'mailServer/index.html')
except KeyError:
return redirect(loadLoginPage)
def createEmailAccount(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'createEmail') == 0:
return ACLManager.loadError()
if not os.path.exists('/home/cyberpanel/postfix'):
return render(self.request, "mailServer/createEmailAccount.html", {"status": 0})
websitesName = ACLManager.findAllSites(currentACL, userID)
2019-06-08 21:41:43 +00:00
websitesName = websitesName + ACLManager.findChildDomains(websitesName)
2018-10-08 22:12:05 +05:00
return render(self.request, 'mailServer/createEmailAccount.html',
{'websiteList': websitesName, "status": 1})
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2019-11-08 22:22:11 +05:00
return redirect(loadLoginPage)
2018-10-08 22:12:05 +05:00
2019-08-13 16:27:56 +05:00
def listEmails(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'listEmails') == 0:
return ACLManager.loadError()
if not os.path.exists('/home/cyberpanel/postfix'):
return render(self.request, "mailServer/listEmails.html", {"status": 0})
websitesName = ACLManager.findAllSites(currentACL, userID)
websitesName = websitesName + ACLManager.findChildDomains(websitesName)
return render(self.request, 'mailServer/listEmails.html',
{'websiteList': websitesName, "status": 1})
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2019-08-13 16:27:56 +05:00
return redirect(loadLoginPage)
2018-10-08 22:12:05 +05:00
def submitEmailCreation(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'createEmail') == 0:
return ACLManager.loadErrorJson('createEmailStatus', 0)
data = json.loads(self.request.body)
domainName = data['domain']
userName = data['username'].lower()
password = data['passwordByPass']
2018-10-08 22:12:05 +05:00
2019-08-25 05:25:48 +05:00
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(domainName, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
2018-10-08 22:12:05 +05:00
2019-08-25 05:25:48 +05:00
## Create email entry
2018-10-08 22:12:05 +05:00
result = mailUtilities.createEmailAccount(domainName, userName.lower(), password)
2018-10-08 22:12:05 +05:00
if result[0] == 1:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 1, 'createEmailStatus': 1, 'error_message': "None"}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
else:
data_ret = {'status': 0, 'createEmailStatus': 0, 'error_message': result[1]}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'createEmailStatus': 0, 'error_message': str(msg)}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def deleteEmailAccount(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'deleteEmail') == 0:
return ACLManager.loadError()
if not os.path.exists('/home/cyberpanel/postfix'):
return render(self.request, "mailServer/deleteEmailAccount.html", {"status": 0})
websitesName = ACLManager.findAllSites(currentACL, userID)
2019-06-08 21:41:43 +00:00
websitesName = websitesName + ACLManager.findChildDomains(websitesName)
2018-10-08 22:12:05 +05:00
return render(self.request, 'mailServer/deleteEmailAccount.html',
{'websiteList': websitesName, "status": 1})
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2019-11-08 22:22:11 +05:00
return redirect(loadLoginPage)
2018-10-08 22:12:05 +05:00
def getEmailsForDomain(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'deleteEmail') == 0:
return ACLManager.loadErrorJson('fetchStatus', 0)
data = json.loads(self.request.body)
domain = data['domain']
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(domain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
2018-10-08 22:12:05 +05:00
try:
domain = Domains.objects.get(domain=domain)
except:
2018-11-08 13:19:36 +05:00
final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': "No email accounts exists!"}
2018-10-08 22:12:05 +05:00
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
emails = domain.eusers_set.all()
if emails.count() == 0:
2018-11-08 13:19:36 +05:00
final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': "No email accounts exists!"}
2018-10-08 22:12:05 +05:00
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
json_data = "["
checker = 0
2018-11-08 13:19:36 +05:00
count = 1
2018-10-08 22:12:05 +05:00
for items in emails:
2018-11-08 13:19:36 +05:00
dic = {'id': count, 'email': items.email}
count = count + 1
2018-10-08 22:12:05 +05:00
if checker == 0:
json_data = json_data + json.dumps(dic)
checker = 1
else:
json_data = json_data + ',' + json.dumps(dic)
json_data = json_data + ']'
2018-11-08 13:19:36 +05:00
final_dic = {'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}
2018-10-08 22:12:05 +05:00
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def submitEmailDeletion(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'deleteEmail') == 0:
return ACLManager.loadErrorJson('deleteEmailStatus', 0)
2018-10-08 22:12:05 +05:00
data = json.loads(self.request.body)
email = data['email']
eUser = EUsers.objects.get(email=email)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(eUser.emailOwner.domainOwner.domain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
2018-10-08 22:12:05 +05:00
mailUtilities.deleteEmailAccount(email)
2018-11-08 13:19:36 +05:00
data_ret = {'status': 1, 'deleteEmailStatus': 1, 'error_message': "None"}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'deleteEmailStatus': 0, 'error_message': str(msg)}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2020-05-10 03:15:33 +05:00
def fixMailSSL(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
data = json.loads(self.request.body)
selectedDomain = data['selectedDomain']
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(selectedDomain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson('status', 0)
website = Websites.objects.get(domain=selectedDomain)
execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py"
execPath = '%s setupAutoDiscover --virtualHostName %s --websiteOwner %s' % (execPath, selectedDomain, website.admin.userName)
ProcessUtilities.executioner(execPath)
data_ret = {'status': 1, 'error_message': "None"}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
except BaseException as msg:
data_ret = {'status': 0, 'error_message': str(msg)}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2018-10-08 22:12:05 +05:00
def emailForwarding(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'emailForwarding') == 0:
return ACLManager.loadError()
if not os.path.exists('/home/cyberpanel/postfix'):
return render(self.request, "mailServer/emailForwarding.html", {"status": 0})
websitesName = ACLManager.findAllSites(currentACL, userID)
2019-06-08 21:41:43 +00:00
websitesName = websitesName + ACLManager.findChildDomains(websitesName)
2018-10-08 22:12:05 +05:00
return render(self.request, 'mailServer/emailForwarding.html', {'websiteList': websitesName, "status": 1})
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2019-11-08 22:22:11 +05:00
return redirect(loadLoginPage)
2018-10-08 22:12:05 +05:00
def fetchCurrentForwardings(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'emailForwarding') == 0:
return ACLManager.loadErrorJson('fetchStatus', 0)
data = json.loads(self.request.body)
emailAddress = data['emailAddress']
forwardingOption = data['forwardingOption']
2018-10-08 22:12:05 +05:00
if forwardingOption != "Pipe to program":
eUser = EUsers.objects.get(email=emailAddress)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(eUser.emailOwner.domainOwner.domain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
currentForwardings = Forwardings.objects.filter(source=emailAddress)
json_data = "["
checker = 0
id = 1
for items in currentForwardings:
if items.source == items.destination:
continue
dic = {'id': id,
'source': items.source,
'destination': items.destination}
id = id + 1
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, 'fetchStatus': 1, 'error_message': "None", "data": json_data}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
else:
currentForwardings = Pipeprograms.objects.filter(source=emailAddress)
2018-10-08 22:12:05 +05:00
json_data = "["
checker = 0
id = 1
for items in currentForwardings:
if items.source == items.destination:
continue
dic = {'id': id,
'source': items.source,
'destination': items.destination}
2018-10-08 22:12:05 +05:00
id = id + 1
2018-10-08 22:12:05 +05:00
if checker == 0:
json_data = json_data + json.dumps(dic)
checker = 1
else:
json_data = json_data + ',' + json.dumps(dic)
2018-10-08 22:12:05 +05:00
json_data = json_data + ']'
final_dic = {'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}
final_json = json.dumps(final_dic)
2018-10-08 22:12:05 +05:00
return HttpResponse(final_json)
2018-10-08 22:12:05 +05:00
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def submitForwardDeletion(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'emailForwarding') == 0:
return ACLManager.loadErrorJson('deleteForwardingStatus', 0)
data = json.loads(self.request.body)
destination = data['destination']
source = data['source']
forwardingOption = data['forwardingOption']
2018-10-08 22:12:05 +05:00
eUser = EUsers.objects.get(email=source)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(eUser.emailOwner.domainOwner.domain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
if forwardingOption == 'Forward to email':
for items in Forwardings.objects.filter(destination=destination, source=source):
items.delete()
else:
for items in Pipeprograms.objects.filter(destination=destination, source=source):
items.delete()
## Delete Email PIPE
sourceusername = source.split("@")[0]
virtualfilter = '%s FILTER %spipe:dummy' % (source, sourceusername)
command = "sed -i 's/^" + source + ".*//g' /etc/postfix/script_filter"
ProcessUtilities.executioner(command)
command = "sed -i 's/^" + sourceusername + "pipe.*//g' /etc/postfix/master.cf"
ProcessUtilities.executioner(command)
#### Hashing filter Reloading Postfix
command = "postmap /etc/postfix/script_filter"
ProcessUtilities.executioner(command)
command = "postfix reload"
ProcessUtilities.executioner(command)
##
2018-10-08 22:12:05 +05:00
2018-11-08 13:19:36 +05:00
data_ret = {'status': 1, 'deleteForwardingStatus': 1, 'error_message': "None",
2018-10-08 22:12:05 +05:00
'successMessage': 'Successfully deleted!'}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'deleteForwardingStatus': 0, 'error_message': str(msg)}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def submitEmailForwardingCreation(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'emailForwarding') == 0:
return ACLManager.loadErrorJson('createStatus', 0)
data = json.loads(self.request.body)
source = data['source']
destination = data['destination']
forwardingOption = data['forwardingOption']
2018-10-08 22:12:05 +05:00
eUser = EUsers.objects.get(email=source)
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(eUser.emailOwner.domainOwner.domain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
2018-10-08 22:12:05 +05:00
if Forwardings.objects.filter(source=source, destination=destination).count() > 0:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'createStatus': 0,
'error_message': "You have already forwarded to this destination."}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
if forwardingOption == 'Forward to email':
if Forwardings.objects.filter(source=source).count() == 0:
forwarding = Forwardings(source=source, destination=source)
forwarding.save()
forwarding = Forwardings(source=source, destination=destination)
forwarding.save()
else:
forwarding = Pipeprograms(source=source, destination=destination)
2018-10-08 22:12:05 +05:00
forwarding.save()
## Create Email PIPE filter
## example@domain.com FILTER support:dummy
sourceusername = source.split("@")[0]
virtualfilter = '%s FILTER %spipe:dummy' % (source, sourceusername)
command = "echo '" + virtualfilter + "' >> /etc/postfix/script_filter"
ProcessUtilities.executioner(command)
## support unix - n n - - pipe flags=Rq user=domain argv=/usr/bin/php -q /home/domain.com/public_html/ticket/api/pipe.php
## Find Unix file owner of provided pipe
domainName = source.split("@")[1]
website = Websites.objects.get(domain=domainName)
externalApp = website.externalApp
pipeowner = externalApp
## Add Filter pipe to postfix /etc/postfix/master.cf
filterpipe = '%spipe unix - n n - - pipe flags=Rq user=%s argv=%s -f $(sender) -- $(recipient)' % (sourceusername, pipeowner, destination)
command = "echo '" + filterpipe + "' >> /etc/postfix/master.cf"
ProcessUtilities.executioner(command)
## Add Check Recipient Hash to postfix /etc/postfix/main.cf
command = "sed -i 's|^smtpd_recipient_restrictions =.*|smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_recipient_access hash:/etc/postfix/script_filter, permit|' /etc/postfix/main.cf"
ProcessUtilities.executioner(command)
#### Hashing filter Reloading Postfix
command = "postmap /etc/postfix/script_filter"
ProcessUtilities.executioner(command)
command = "postfix reload"
ProcessUtilities.executioner(command)
##
2018-10-08 22:12:05 +05:00
2018-11-08 13:19:36 +05:00
data_ret = {'status': 1, 'createStatus': 1, 'error_message': "None", 'successMessage': 'Successfully Created!'}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'createStatus': 0, 'error_message': str(msg)}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2019-08-13 16:27:56 +05:00
def fetchEmails(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'listEmails') == 0:
return ACLManager.loadErrorJson('status', 0)
data = json.loads(self.request.body)
selectedDomain = data['selectedDomain']
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(selectedDomain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
try:
emailDomain = Domains.objects.get(domain=selectedDomain)
except:
raise BaseException('No emails exist for this domain.')
2020-05-10 03:15:33 +05:00
postfixMapPath = '/etc/postfix/vmail_ssl.map'
if os.path.exists(postfixMapPath):
postfixMapData = open(postfixMapPath, 'r').read()
if postfixMapData.find(selectedDomain) == -1:
mailConfigured = 0
else:
mailConfigured = 1
else:
mailConfigured = 0
2019-08-13 16:27:56 +05:00
records = emailDomain.eusers_set.all()
json_data = "["
checker = 0
for items in records:
dic = {'email': items.email,
}
if checker == 0:
json_data = json_data + json.dumps(dic)
checker = 1
else:
json_data = json_data + ',' + json.dumps(dic)
json_data = json_data + ']'
2020-05-10 23:38:59 +05:00
final_json = json.dumps({'status': 1, 'fetchStatus': 1,'serverHostname': 'mail.%s' % (selectedDomain), 'mailConfigured': mailConfigured, 'error_message': "None", "data": json_data})
2019-08-13 16:27:56 +05:00
return HttpResponse(final_json)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2019-08-13 16:27:56 +05:00
final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
2018-10-08 22:12:05 +05:00
#######
def changeEmailAccountPassword(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'changeEmailPassword') == 0:
return ACLManager.loadError()
if not os.path.exists('/home/cyberpanel/postfix'):
return render(self.request, "mailServer/changeEmailPassword.html", {"status": 0})
websitesName = ACLManager.findAllSites(currentACL, userID)
2019-06-08 21:41:43 +00:00
websitesName = websitesName + ACLManager.findChildDomains(websitesName)
2018-10-08 22:12:05 +05:00
return render(self.request, 'mailServer/changeEmailPassword.html',
{'websiteList': websitesName, "status": 1})
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2019-11-08 22:22:11 +05:00
return redirect(loadLoginPage)
2018-10-08 22:12:05 +05:00
def submitPasswordChange(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'changeEmailPassword') == 0:
return ACLManager.loadErrorJson('passChangeStatus', 0)
data = json.loads(self.request.body)
email = data['email']
2019-07-24 22:37:37 +05:00
password = data['passwordByPass']
2018-10-08 22:12:05 +05:00
emailDB = EUsers.objects.get(email=email)
admin = Administrator.objects.get(pk=userID)
try:
if ACLManager.checkOwnership(emailDB.emailOwner.domainOwner.domain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
except:
if ACLManager.checkOwnership(emailDB.emailOwner.childOwner.domain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
2019-07-03 13:15:26 +05:00
CentOSPath = '/etc/redhat-release'
if os.path.exists(CentOSPath):
2019-12-16 15:48:45 +05:00
password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
password = '{CRYPT}%s' % (password.decode())
2019-07-03 13:15:26 +05:00
emailDB.password = password
else:
2019-12-16 15:48:45 +05:00
password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt())
password = '{CRYPT}%s' % (password.decode())
2019-07-03 13:15:26 +05:00
emailDB.password = password
emailDB.save()
2018-10-08 22:12:05 +05:00
2018-11-08 13:19:36 +05:00
data_ret = {'status': 1, 'passChangeStatus': 1, 'error_message': "None"}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'passChangeStatus': 0, 'error_message': str(msg)}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
#######
def dkimManager(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'dkimManager') == 0:
return ACLManager.loadError()
2019-04-01 15:19:54 +05:00
openDKIMInstalled = 1
2018-10-08 22:12:05 +05:00
2019-04-01 15:19:54 +05:00
websitesName = ACLManager.findAllSites(currentACL, userID)
2019-06-08 21:41:43 +00:00
websitesName = websitesName + ACLManager.findChildDomains(websitesName)
2018-10-08 22:12:05 +05:00
return render(self.request, 'mailServer/dkimManager.html',
2019-04-01 15:19:54 +05:00
{'websiteList': websitesName, 'openDKIMInstalled': openDKIMInstalled})
2018-10-08 22:12:05 +05:00
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2019-11-08 22:22:11 +05:00
return redirect(loadLoginPage)
2018-10-08 22:12:05 +05:00
def fetchDKIMKeys(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'dkimManager') == 0:
return ACLManager.loadErrorJson('fetchStatus', 0)
data = json.loads(self.request.body)
domainName = data['domainName']
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(domainName, admin, currentACL) == 1:
pass
else:
return ACLManager.loadError()
2018-10-12 18:18:10 +05:00
try:
import tldextract
extractDomain = tldextract.extract(domainName)
domainName = extractDomain.domain + '.' + extractDomain.suffix
2018-10-12 18:18:10 +05:00
path = "/etc/opendkim/keys/" + domainName + "/default.txt"
command = "sudo cat " + path
output = ProcessUtilities.outputExecutioner(command, 'opendkim')
2018-11-07 22:50:14 +05:00
leftIndex = output.index('(') + 2
rightIndex = output.rindex(')') - 1
2018-10-08 22:12:05 +05:00
2018-10-12 18:18:10 +05:00
path = "/etc/opendkim/keys/" + domainName + "/default.private"
command = "sudo cat " + path
privateKey = ProcessUtilities.outputExecutioner(command, 'opendkim')
2018-10-08 22:12:05 +05:00
DNS.createDKIMRecords(domainName)
2018-11-08 13:19:36 +05:00
data_ret = {'status': 1, 'fetchStatus': 1, 'keysAvailable': 1, 'publicKey': output[leftIndex:rightIndex],
2018-10-12 18:18:10 +05:00
'privateKey': privateKey, 'dkimSuccessMessage': 'Keys successfully fetched!',
'error_message': "None"}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 1, 'fetchStatus': 1, 'keysAvailable': 0, 'error_message': str(msg)}
2018-10-12 18:18:10 +05:00
json_data = json.dumps(data_ret)
2018-10-08 22:12:05 +05:00
return HttpResponse(json_data)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def generateDKIMKeys(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'dkimManager') == 0:
return ACLManager.loadErrorJson('generateStatus', 0)
data = json.loads(self.request.body)
domainName = data['domainName']
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(domainName, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
2019-12-10 23:04:24 +05:00
execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/mailUtilities.py"
2018-10-08 22:12:05 +05:00
execPath = execPath + " generateKeys --domain " + domainName
2019-03-26 16:19:03 +05:00
output = ProcessUtilities.outputExecutioner(execPath)
2018-10-08 22:12:05 +05:00
2018-11-21 14:50:27 +05:00
admin = Administrator.objects.get(pk=userID)
DNS.dnsTemplate(domainName, admin)
2018-10-08 22:12:05 +05:00
if output.find("1,None") > -1:
2018-11-21 14:50:27 +05:00
import tldextract
extractDomain = tldextract.extract(domainName)
topLevelDomain = extractDomain.domain + '.' + extractDomain.suffix
2018-10-08 22:12:05 +05:00
2018-11-21 14:50:27 +05:00
zone = dnsDomains.objects.get(name=topLevelDomain)
2018-10-08 22:12:05 +05:00
zone.save()
path = "/etc/opendkim/keys/" + domainName + "/default.txt"
2020-01-30 17:58:56 +05:00
command = "cat " + path
2019-03-26 16:19:03 +05:00
output = ProcessUtilities.outputExecutioner(command)
2018-11-07 22:50:14 +05:00
leftIndex = output.index('(') + 2
rightIndex = output.rindex(')') - 1
2018-10-08 22:12:05 +05:00
2018-11-21 14:50:27 +05:00
DNS.createDKIMRecords(domainName)
2018-10-08 22:12:05 +05:00
record = dnsRecords(domainOwner=zone,
domain_id=zone.id,
name="default._domainkey." + domainName,
type="TXT",
2018-11-07 22:50:14 +05:00
content=output[leftIndex:rightIndex],
2018-10-08 22:12:05 +05:00
ttl=3600,
prio=0,
disabled=0,
auth=1)
record.save()
2018-11-08 13:19:36 +05:00
data_ret = {'status': 1, 'generateStatus': 1, 'error_message': "None"}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
else:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'generateStatus': 0, 'error_message': output}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-11-08 13:19:36 +05:00
data_ret = {'status': 0, 'generateStatus': 0, 'error_message': str(msg)}
2018-10-08 22:12:05 +05:00
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
def installOpenDKIM(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'dkimManager') == 0:
return ACLManager.loadErrorJson('installOpenDKIM', 0)
2019-12-10 15:09:10 +05:00
_thread.start_new_thread(mailUtilities.installOpenDKIM, ('Install', 'openDKIM'))
2018-10-08 22:12:05 +05:00
final_json = json.dumps({'installOpenDKIM': 1, 'error_message': "None"})
return HttpResponse(final_json)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-10-08 22:12:05 +05:00
final_dic = {'installOpenDKIM': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
def installStatusOpenDKIM(self):
try:
command = "sudo cat " + mailUtilities.installLogPath
2019-12-15 13:30:40 +05:00
installStatus = subprocess.check_output(shlex.split(command)).decode("utf-8")
2018-10-08 22:12:05 +05:00
if installStatus.find("[200]") > -1:
2019-12-10 23:04:24 +05:00
execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/mailUtilities.py"
2018-10-08 22:12:05 +05:00
execPath = execPath + " configureOpenDKIM"
2019-03-26 16:19:03 +05:00
output = ProcessUtilities.outputExecutioner(execPath)
2018-10-08 22:12:05 +05:00
if output.find("1,None") > -1:
pass
else:
final_json = json.dumps({
'error_message': "Failed to install OpenDKIM configurations.",
'requestStatus': installStatus,
'abort': 1,
'installed': 0,
})
return HttpResponse(final_json)
final_json = json.dumps({
'error_message': "None",
'requestStatus': installStatus,
'abort': 1,
'installed': 1,
})
return HttpResponse(final_json)
elif installStatus.find("[404]") > -1:
final_json = json.dumps({
'abort': 1,
'installed': 0,
'error_message': "None",
'requestStatus': installStatus,
})
return HttpResponse(final_json)
else:
final_json = json.dumps({
'abort': 0,
'error_message': "None",
'requestStatus': installStatus,
})
return HttpResponse(final_json)
2019-12-10 15:09:10 +05:00
except BaseException as msg:
2018-10-08 22:12:05 +05:00
final_dic = {'abort': 1, 'installed': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)