Files
CyberPanel/mailServer/mailserverManager.py

607 lines
24 KiB
Python
Raw Normal View History

2018-10-08 22:12:05 +05:00
#!/usr/local/CyberCP/bin/python2
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
from models import Domains,EUsers
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
import thread
from dns.models import Domains as dnsDomains
from dns.models import Records as dnsRecords
from mailServer.models import Forwardings
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
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})
except BaseException, msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg))
return HttpResponse(str(msg))
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']
password = data['passwordByPass']
2018-10-08 22:12:05 +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
## Create email entry
2018-10-08 22:12:05 +05:00
result = mailUtilities.createEmailAccount(domainName, userName, 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)
except BaseException, 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})
except BaseException, msg:
logging.CyberCPLogFileWriter.writeToFile(str(msg))
return HttpResponse(str(msg))
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)
except BaseException, 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)
except BaseException, 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)
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})
except BaseException, msg:
return HttpResponse(str(msg))
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']
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()
2018-10-08 22:12:05 +05:00
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 + ']'
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)
except BaseException, 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']
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()
2019-06-08 21:41:43 +00:00
for items in Forwardings.objects.filter(destination=destination, source=source):
items.delete()
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)
except BaseException, 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']
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,
2018-10-08 22:12:05 +05:00
'error_message': "You have already forwared to this destination."}
json_data = json.dumps(data_ret)
return HttpResponse(json_data)
if Forwardings.objects.filter(source=source).count() == 0:
forwarding = Forwardings(source=source, destination=source)
forwarding.save()
forwarding = Forwardings(source=source, destination=destination)
forwarding.save()
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)
except BaseException, 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)
#######
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})
except BaseException, msg:
return HttpResponse(str(msg))
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)
if ACLManager.checkOwnership(emailDB.emailOwner.domainOwner.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):
password = bcrypt.hashpw(str(password), bcrypt.gensalt())
password = '{CRYPT}%s' % (password)
2019-07-03 13:15:26 +05:00
emailDB.password = password
else:
2019-07-24 22:37:37 +05:00
password = bcrypt.hashpw(str(password), bcrypt.gensalt())
password = '{CRYPT}%s' % (password)
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)
except BaseException, 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
except BaseException, msg:
return HttpResponse(str(msg))
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:
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
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)
except BaseException, 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)
except BaseException, 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()
2018-10-08 22:12:05 +05:00
execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/mailUtilities.py"
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"
command = "sudo 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)
except BaseException, 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)
thread.start_new_thread(mailUtilities.installOpenDKIM, ('Install', 'openDKIM'))
final_json = json.dumps({'installOpenDKIM': 1, 'error_message': "None"})
return HttpResponse(final_json)
except BaseException, msg:
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-03-26 16:19:03 +05:00
installStatus = subprocess.check_output(shlex.split(command))
2018-10-08 22:12:05 +05:00
if installStatus.find("[200]") > -1:
execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/mailUtilities.py"
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)
except BaseException, msg:
final_dic = {'abort': 1, 'installed': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)