From 5da6200d7c367647bb14f3d96d0b9add5fb1d59f Mon Sep 17 00:00:00 2001 From: usmannasir Date: Fri, 19 Sep 2025 15:04:25 +0500 Subject: [PATCH] debian 12: add missing views to views.py in websitefunctions --- manageSSL/views.py | 442 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 442 insertions(+) diff --git a/manageSSL/views.py b/manageSSL/views.py index bdd494bb6..e67db2610 100644 --- a/manageSSL/views.py +++ b/manageSSL/views.py @@ -132,4 +132,446 @@ def fixACMEContexts(request): logging.writeToFile(str(msg) + " [fixACMEContexts]") data_ret = {'reconcileStatus': 0, 'error_message': str(msg)} json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + +# -*- coding: utf-8 -*- + +from plogical.httpProc import httpProc +from websiteFunctions.models import Websites, ChildDomains +from loginSystem.models import Administrator +from plogical.virtualHostUtilities import virtualHostUtilities +from django.http import HttpResponse +import json +from plogical.acl import ACLManager +from plogical.processUtilities import ProcessUtilities + + +# Create your views here. + +def loadSSLHome(request): + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + proc = httpProc(request, 'manageSSL/index.html', + currentACL, 'admin') + return proc.render() + + +def manageSSL(request): + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID) + proc = httpProc(request, 'manageSSL/manageSSL.html', + {'websiteList': websitesName}, 'manageSSL') + return proc.render() + + +def v2ManageSSL(request): + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID) + + data = {} + + if ACLManager.CheckForPremFeature('all'): + data['PremStat'] = 1 + else: + data['PremStat'] = 0 + + if request.method == 'POST': + SAVED_CF_Key = request.POST.get('SAVED_CF_Key') + SAVED_CF_Email = request.POST.get('SAVED_CF_Email') + from plogical.dnsUtilities import DNS + DNS.ConfigureCloudflareInAcme(SAVED_CF_Key, SAVED_CF_Email) + data['SaveSuccess'] = 1 + + RetStatus, SAVED_CF_Key, SAVED_CF_Email = ACLManager.FetchCloudFlareAPIKeyFromAcme() + from plogical.dnsUtilities import DNS + DNS.ConfigurePowerDNSInAcme() + + data['SAVED_CF_Key'] = SAVED_CF_Key + data['SAVED_CF_Email'] = SAVED_CF_Email + data['websiteList'] = websitesName + + proc = httpProc(request, 'manageSSL/v2ManageSSL.html', + data, 'manageSSL') + return proc.render() + + +def v2IssueSSL(request): + try: + userID = request.session['userID'] + admin = Administrator.objects.get(pk=userID) + try: + if ACLManager.CheckForPremFeature('all'): + if request.method == 'POST': + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + elif currentACL['manageSSL'] == 1: + pass + else: + return ACLManager.loadErrorJson('SSL', 0) + + data = json.loads(request.body) + virtualHost = data['virtualHost'] + + if ACLManager.checkOwnership(virtualHost, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() + + try: + website = ChildDomains.objects.get(domain=virtualHost) + adminEmail = website.master.adminEmail + path = website.path + except: + website = Websites.objects.get(domain=virtualHost) + adminEmail = website.adminEmail + path = "/home/" + virtualHost + "/public_html" + + ## ssl issue + + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" + execPath = execPath + " issueSSLv2 --virtualHostName " + virtualHost + " --administratorEmail " + adminEmail + " --path " + path + output = ProcessUtilities.outputExecutioner(execPath) + + if output.find("1,") > -1: + ## ssl issue ends + + website.ssl = 1 + website.save() + + # Extract detailed logs from output + logs = output.split("1,", 1)[1] if "1," in output else output + + data_ret = {'status': 1, "SSL": 1, + 'error_message': "None", 'sslLogs': logs, 'fullOutput': output} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + else: + # Parse error details from output + error_message = output + detailed_error = "SSL issuance failed" + + # Check for common ACME errors + if "Rate limit" in output or "rate limit" in output: + detailed_error = "Let's Encrypt rate limit exceeded. Please wait before retrying." + elif "DNS problem" in output or "NXDOMAIN" in output: + detailed_error = "DNS validation failed. Please ensure your domain points to this server." + elif "Connection refused" in output or "Connection timeout" in output: + detailed_error = "Could not connect to ACME server. Check your firewall settings." + elif "Unauthorized" in output or "authorization" in output: + detailed_error = "Domain authorization failed. Verify domain ownership and DNS settings." + elif "CAA record" in output: + detailed_error = "CAA record prevents issuance. Check your DNS CAA records." + elif "Challenge failed" in output or "challenge failed" in output: + detailed_error = "ACME challenge failed. Ensure port 80 is accessible and .well-known path is not blocked." + elif "Invalid response" in output: + detailed_error = "Invalid response from ACME challenge. Check your web server configuration." + else: + # Try to extract the actual error message + if "0," in output: + error_parts = output.split("0,", 1) + if len(error_parts) > 1: + detailed_error = error_parts[1].strip() + + data_ret = {'status': 0, "SSL": 0, + 'error_message': detailed_error, + 'sslLogs': output, + 'fullOutput': output, + 'technicalDetails': error_message} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + except BaseException as msg: + data_ret = {'status': 0, "SSL": 0, + 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + except KeyError: + data_ret = {'status': 0, "SSL": 0, + 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + +def issueSSL(request): + try: + userID = request.session['userID'] + admin = Administrator.objects.get(pk=userID) + try: + if request.method == 'POST': + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + elif currentACL['manageSSL'] == 1: + pass + else: + return ACLManager.loadErrorJson('SSL', 0) + + data = json.loads(request.body) + virtualHost = data['virtualHost'] + + if ACLManager.checkOwnership(virtualHost, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() + + try: + website = ChildDomains.objects.get(domain=virtualHost) + adminEmail = website.master.adminEmail + path = website.path + except: + website = Websites.objects.get(domain=virtualHost) + adminEmail = website.adminEmail + path = "/home/" + virtualHost + "/public_html" + + ## ssl issue + + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" + execPath = execPath + " issueSSL --virtualHostName " + virtualHost + " --administratorEmail " + adminEmail + " --path " + path + output = ProcessUtilities.outputExecutioner(execPath) + + if output.find("1,None") > -1: + pass + else: + data_ret = {'status': 0, "SSL": 0, + 'error_message': output} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + ## ssl issue ends + + website.ssl = 1 + website.save() + + data_ret = {'status': 1, "SSL": 1, + 'error_message': "None"} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + except BaseException as msg: + data_ret = {'status': 0, "SSL": 0, + 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + except KeyError: + data_ret = {'status': 0, "SSL": 0, + 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + +def sslForHostName(request): + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID, 1) + proc = httpProc(request, 'manageSSL/sslForHostName.html', + {'websiteList': websitesName}, 'hostnameSSL') + return proc.render() + + +def obtainHostNameSSL(request): + try: + userID = request.session['userID'] + try: + if request.method == 'POST': + + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + elif currentACL['hostnameSSL'] == 1: + pass + else: + return ACLManager.loadErrorJson('SSL', 0) + + data = json.loads(request.body) + virtualHost = data['virtualHost'] + + try: + website = Websites.objects.get(domain=virtualHost) + path = "/home/" + virtualHost + "/public_html" + except: + website = ChildDomains.objects.get(domain=virtualHost) + path = website.path + + admin = Administrator.objects.get(pk=userID) + + if ACLManager.checkOwnership(virtualHost, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() + + ## ssl issue + + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" + execPath = execPath + " issueSSLForHostName --virtualHostName " + virtualHost + " --path " + path + output = ProcessUtilities.outputExecutioner(execPath) + + if output.find("1,None") > -1: + data_ret = {"status": 1, "SSL": 1, + 'error_message': "None"} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + else: + data_ret = {"status": 0, "SSL": 0, + 'error_message': output} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + ## ssl issue ends + + except BaseException as msg: + data_ret = {"status": 0, "SSL": 0, + 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + except KeyError: + data_ret = {"status": 0, "SSL": 0, + 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + +def sslForMailServer(request): + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + + websitesName = ACLManager.findAllSites(currentACL, userID) + websitesName = websitesName + ACLManager.findChildDomains(websitesName) + + proc = httpProc(request, 'manageSSL/sslForMailServer.html', + {'websiteList': websitesName}, 'mailServerSSL') + return proc.render() + + +def obtainMailServerSSL(request): + try: + userID = request.session['userID'] + try: + if request.method == 'POST': + + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + elif currentACL['mailServerSSL'] == 1: + pass + else: + return ACLManager.loadErrorJson('SSL', 0) + + data = json.loads(request.body) + virtualHost = data['virtualHost'] + + admin = Administrator.objects.get(pk=userID) + if ACLManager.checkOwnership(virtualHost, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() + + path = "/home/" + virtualHost + "/public_html" + + ## ssl issue + + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" + execPath = execPath + " issueSSLForMailServer --virtualHostName " + virtualHost + " --path " + path + output = ProcessUtilities.outputExecutioner(execPath) + + if output.find("1,None") > -1: + data_ret = {"status": 1, "SSL": 1, + 'error_message': "None"} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + else: + data_ret = {"status": 0, "SSL": 0, + 'error_message': output} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + ## ssl issue ends + + + except BaseException as msg: + data_ret = {"status": 0, "SSL": 0, + 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + except KeyError as msg: + data_ret = {"status": 0, "SSL": 0, + 'error_message': str(msg)} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + +def getSSLDetails(request): + try: + userID = request.session['userID'] + admin = Administrator.objects.get(pk=userID) + try: + if request.method == 'POST': + currentACL = ACLManager.loadedACL(userID) + + if currentACL['admin'] == 1: + pass + elif currentACL['manageSSL'] == 1: + pass + else: + return ACLManager.loadErrorJson('SSL', 0) + + data = json.loads(request.body) + virtualHost = data['virtualHost'] + + if ACLManager.checkOwnership(virtualHost, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() + + try: + website = ChildDomains.objects.get(domain=virtualHost) + except: + website = Websites.objects.get(domain=virtualHost) + + try: + import OpenSSL + from datetime import datetime + filePath = '/etc/letsencrypt/live/%s/fullchain.pem' % (virtualHost) + x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, + open(filePath, 'r').read()) + expireData = x509.get_notAfter().decode('ascii') + finalDate = datetime.strptime(expireData, '%Y%m%d%H%M%SZ') + + now = datetime.now() + diff = finalDate - now + + data_ret = { + 'status': 1, + 'hasSSL': True, + 'days': str(diff.days), + 'authority': x509.get_issuer().get_components()[1][1].decode('utf-8'), + 'expiryDate': finalDate.strftime('%Y-%m-%d %H:%M:%S') + } + + if data_ret['authority'] == 'Denial': + data_ret['authority'] = 'SELF-SIGNED SSL' + + except BaseException as msg: + data_ret = { + 'status': 1, + 'hasSSL': False, + 'error_message': str(msg) + } + + 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) + except KeyError: + data_ret = {'status': 0, 'error_message': 'Not logged in'} + json_data = json.dumps(data_ret) return HttpResponse(json_data) \ No newline at end of file