mirror of
				https://github.com/usmannasir/cyberpanel.git
				synced 2025-11-03 20:05:58 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			1432 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			1432 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/usr/local/CyberCP/bin/python
 | 
						|
import os,sys
 | 
						|
import random
 | 
						|
import string
 | 
						|
 | 
						|
from ApachController.ApacheVhosts import ApacheVhost
 | 
						|
from manageServices.models import PDNSStatus
 | 
						|
from .processUtilities import ProcessUtilities
 | 
						|
 | 
						|
sys.path.append('/usr/local/CyberCP')
 | 
						|
import django
 | 
						|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings")
 | 
						|
django.setup()
 | 
						|
from loginSystem.models import Administrator, ACL
 | 
						|
from django.shortcuts import HttpResponse
 | 
						|
from packages.models import Package
 | 
						|
from websiteFunctions.models import Websites, ChildDomains, aliasDomains, DockerSites, WPSites
 | 
						|
import json
 | 
						|
from subprocess import call, CalledProcessError
 | 
						|
from shlex import split
 | 
						|
from .CyberCPLogFileWriter import CyberCPLogFileWriter as logging
 | 
						|
from dockerManager.models import Containers
 | 
						|
from re import compile
 | 
						|
 | 
						|
class ACLManager:
 | 
						|
 | 
						|
 | 
						|
    AdminACL = '{"adminStatus":1, "versionManagement": 1, "createNewUser": 1, "listUsers": 1, "deleteUser":1 , "resellerCenter": 1, ' \
 | 
						|
               '"changeUserACL": 1, "createWebsite": 1, "modifyWebsite": 1, "suspendWebsite": 1, "deleteWebsite": 1, ' \
 | 
						|
               '"createPackage": 1, "listPackages": 1, "deletePackage": 1, "modifyPackage": 1, "createDatabase": 1, "deleteDatabase": 1, ' \
 | 
						|
               '"listDatabases": 1, "createNameServer": 1, "createDNSZone": 1, "deleteZone": 1, "addDeleteRecords": 1, ' \
 | 
						|
               '"createEmail": 1, "listEmails": 1, "deleteEmail": 1, "emailForwarding": 1, "changeEmailPassword": 1, ' \
 | 
						|
               '"dkimManager": 1, "createFTPAccount": 1, "deleteFTPAccount": 1, "listFTPAccounts": 1, "createBackup": 1,' \
 | 
						|
               ' "restoreBackup": 1, "addDeleteDestinations": 1, "scheduleBackups": 1, "remoteBackups": 1, "googleDriveBackups": 1, "manageSSL": 1, ' \
 | 
						|
               '"hostnameSSL": 1, "mailServerSSL": 1 }'
 | 
						|
 | 
						|
    ResellerACL = '{"adminStatus":0, "versionManagement": 1, "createNewUser": 1, "listUsers": 1, "deleteUser": 1 , "resellerCenter": 1, ' \
 | 
						|
                  '"changeUserACL": 0, "createWebsite": 1, "modifyWebsite": 1, "suspendWebsite": 1, "deleteWebsite": 1, ' \
 | 
						|
                  '"createPackage": 1, "listPackages": 1, "deletePackage": 1, "modifyPackage": 1, "createDatabase": 1, "deleteDatabase": 1, ' \
 | 
						|
                  '"listDatabases": 1, "createNameServer": 1, "createDNSZone": 1, "deleteZone": 1, "addDeleteRecords": 1, ' \
 | 
						|
                  '"createEmail": 1, "listEmails": 1, "deleteEmail": 1, "emailForwarding": 1, "changeEmailPassword": 1, ' \
 | 
						|
                  '"dkimManager": 1, "createFTPAccount": 1, "deleteFTPAccount": 1, "listFTPAccounts": 1, "createBackup": 1,' \
 | 
						|
                  ' "restoreBackup": 1, "addDeleteDestinations": 0, "scheduleBackups": 0, "remoteBackups": 0, "googleDriveBackups": 1, "manageSSL": 1, ' \
 | 
						|
                  '"hostnameSSL": 0, "mailServerSSL": 0 }'
 | 
						|
 | 
						|
    UserACL = '{"adminStatus":0, "versionManagement": 1, "createNewUser": 0, "listUsers": 0, "deleteUser": 0 , "resellerCenter": 0, ' \
 | 
						|
              '"changeUserACL": 0, "createWebsite": 0, "modifyWebsite": 0, "suspendWebsite": 0, "deleteWebsite": 0, ' \
 | 
						|
              '"createPackage": 0, "listPackages": 0, "deletePackage": 0, "modifyPackage": 0, "createDatabase": 1, "deleteDatabase": 1, ' \
 | 
						|
              '"listDatabases": 1, "createNameServer": 0, "createDNSZone": 1, "deleteZone": 1, "addDeleteRecords": 1, ' \
 | 
						|
              '"createEmail": 1, "listEmails": 1, "deleteEmail": 1, "emailForwarding": 1, "changeEmailPassword": 1, ' \
 | 
						|
              '"dkimManager": 1, "createFTPAccount": 1, "deleteFTPAccount": 1, "listFTPAccounts": 1, "createBackup": 1,' \
 | 
						|
              ' "restoreBackup": 0, "addDeleteDestinations": 0, "scheduleBackups": 0, "remoteBackups": 0, "googleDriveBackups": 1, "manageSSL": 1, ' \
 | 
						|
              '"hostnameSSL": 0, "mailServerSSL": 0 }'
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def VerifySMTPHost(currentACL, owner, user):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return 1
 | 
						|
        elif owner == user:
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def VerifyRecordOwner(currentACL, record, domain):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return 1
 | 
						|
        elif record.domainOwner.name == domain:
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def AliasDomainCheck(currentACL, aliasDomain, master):
 | 
						|
        aliasOBJ = aliasDomains.objects.get(aliasDomain=aliasDomain)
 | 
						|
        masterOBJ = Websites.objects.get(domain=master)
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return 1
 | 
						|
        elif aliasOBJ.master == masterOBJ:
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def CheckPackageOwnership(package, admin, currentACL):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return 1
 | 
						|
        elif package.admin == admin:
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def CheckRegEx(RegexCheck, value):
 | 
						|
        import re
 | 
						|
        if re.match(RegexCheck, value):
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def FindIfChild():
 | 
						|
        try:
 | 
						|
            ipFile = "/etc/cyberpanel/machineIP"
 | 
						|
            f = open(ipFile)
 | 
						|
            ipData = f.read()
 | 
						|
            ipAddress = ipData.split('\n', 1)[0]
 | 
						|
 | 
						|
            config = json.loads(open('/home/cyberpanel/cluster', 'r').read())
 | 
						|
            if config['failoverServerIP'] == ipAddress:
 | 
						|
                return 1
 | 
						|
            else:
 | 
						|
                return 0
 | 
						|
        except:
 | 
						|
            return 0
 | 
						|
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def fetchIP():
 | 
						|
        try:
 | 
						|
            ipFile = "/etc/cyberpanel/machineIP"
 | 
						|
            f = open(ipFile)
 | 
						|
            ipData = f.read()
 | 
						|
            return ipData.split('\n', 1)[0]
 | 
						|
        except BaseException:
 | 
						|
            return "192.168.100.1"
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def validateInput(value, regex = None):
 | 
						|
        if regex == None:
 | 
						|
            verifier = compile(r'[\sa-zA-Z0-9_-]+')
 | 
						|
        else:
 | 
						|
            verifier = regex
 | 
						|
 | 
						|
        if verifier.fullmatch(value):
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def commandInjectionCheck(value):
 | 
						|
        try:
 | 
						|
            if value.find(';') > -1 or value.find('&&') > -1 or value.find('|') > -1 or value.find('...') > -1 \
 | 
						|
                    or value.find("`") > -1 or value.find("$") > -1 or value.find("(") > -1 or value.find(")") > -1 \
 | 
						|
                    or value.find("'") > -1 or value.find("[") > -1 or value.find("]") > -1 or value.find(
 | 
						|
                "{") > -1 or value.find("}") > -1 \
 | 
						|
                    or value.find(":") > -1 or value.find("<") > -1 or value.find(">") > -1 or value.find("&") > -1:
 | 
						|
                return 1
 | 
						|
            else:
 | 
						|
                return 0
 | 
						|
        except BaseException as msg:
 | 
						|
            logging.writeToFile('%s. [32:commandInjectionCheck]' % (str(msg)))
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def loadedACL(val):
 | 
						|
 | 
						|
        admin = Administrator.objects.get(pk=val)
 | 
						|
        finalResponse = {}
 | 
						|
        finalResponse['firstName'] = admin.firstName
 | 
						|
        finalResponse['lastName'] = admin.lastName
 | 
						|
 | 
						|
        try:
 | 
						|
            ipFile = "/etc/cyberpanel/machineIP"
 | 
						|
            f = open(ipFile)
 | 
						|
            ipData = f.read()
 | 
						|
            serverIPAddress = ipData.split('\n', 1)[0]
 | 
						|
        except BaseException as msg:
 | 
						|
            serverIPAddress = "192.168.100.1"
 | 
						|
 | 
						|
        finalResponse['serverIPAddress'] = serverIPAddress
 | 
						|
        finalResponse['adminName'] = admin.firstName
 | 
						|
 | 
						|
        config = json.loads(admin.acl.config)
 | 
						|
 | 
						|
        if config['adminStatus']:
 | 
						|
            finalResponse['admin'] = 1
 | 
						|
        else:
 | 
						|
            finalResponse['admin'] = 0
 | 
						|
            finalResponse['versionManagement'] = config['versionManagement']
 | 
						|
 | 
						|
            ## User Management
 | 
						|
 | 
						|
            finalResponse['createNewUser'] = config['createNewUser']
 | 
						|
            finalResponse['listUsers'] = config['listUsers']
 | 
						|
            finalResponse['deleteUser'] = config['deleteUser']
 | 
						|
            finalResponse['changeUserACL'] = config['changeUserACL']
 | 
						|
            finalResponse['resellerCenter'] = config['resellerCenter']
 | 
						|
 | 
						|
            ## Website Management
 | 
						|
 | 
						|
            finalResponse['createWebsite'] = config['createWebsite']
 | 
						|
            finalResponse['modifyWebsite'] = config['modifyWebsite']
 | 
						|
            finalResponse['suspendWebsite'] = config['suspendWebsite']
 | 
						|
            finalResponse['deleteWebsite'] = config['deleteWebsite']
 | 
						|
 | 
						|
            ## Package Management
 | 
						|
 | 
						|
 | 
						|
            finalResponse['createPackage'] = config['createPackage']
 | 
						|
            finalResponse['listPackages'] = config['listPackages']
 | 
						|
            finalResponse['deletePackage'] = config['deletePackage']
 | 
						|
            finalResponse['modifyPackage'] = config['modifyPackage']
 | 
						|
 | 
						|
            ## Database Management
 | 
						|
 | 
						|
            finalResponse['createDatabase'] = config['createDatabase']
 | 
						|
            finalResponse['deleteDatabase'] = config['deleteDatabase']
 | 
						|
            finalResponse['listDatabases'] = config['listDatabases']
 | 
						|
 | 
						|
            ## DNS Management
 | 
						|
 | 
						|
            finalResponse['createNameServer'] = config['createNameServer']
 | 
						|
            finalResponse['createDNSZone'] = config['createDNSZone']
 | 
						|
            finalResponse['deleteZone'] = config['deleteZone']
 | 
						|
            finalResponse['addDeleteRecords'] = config['addDeleteRecords']
 | 
						|
 | 
						|
            ## Email Management
 | 
						|
 | 
						|
            finalResponse['createEmail'] = config['createEmail']
 | 
						|
            finalResponse['listEmails'] = config['listEmails']
 | 
						|
            finalResponse['deleteEmail'] = config['deleteEmail']
 | 
						|
            finalResponse['emailForwarding'] = config['emailForwarding']
 | 
						|
            finalResponse['changeEmailPassword'] = config['changeEmailPassword']
 | 
						|
            finalResponse['dkimManager'] = config['dkimManager']
 | 
						|
 | 
						|
            ## FTP Management
 | 
						|
 | 
						|
            finalResponse['createFTPAccount'] = config['createFTPAccount']
 | 
						|
            finalResponse['deleteFTPAccount'] = config['deleteFTPAccount']
 | 
						|
            finalResponse['listFTPAccounts'] = config['listFTPAccounts']
 | 
						|
 | 
						|
            ## Backup Management
 | 
						|
 | 
						|
            finalResponse['createBackup'] = config['createBackup']
 | 
						|
            finalResponse['googleDriveBackups'] = config['googleDriveBackups']
 | 
						|
            finalResponse['restoreBackup'] = config['restoreBackup']
 | 
						|
            finalResponse['addDeleteDestinations'] = config['addDeleteDestinations']
 | 
						|
            finalResponse['scheduleBackups'] = config['scheduleBackups']
 | 
						|
            finalResponse['remoteBackups'] = config['remoteBackups']
 | 
						|
 | 
						|
            ## SSL Management
 | 
						|
 | 
						|
            finalResponse['manageSSL'] = config['manageSSL']
 | 
						|
            finalResponse['hostnameSSL'] = config['hostnameSSL']
 | 
						|
            finalResponse['mailServerSSL'] = config['mailServerSSL']
 | 
						|
 | 
						|
        return finalResponse
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def checkUserOwnerShip(currentACL, owner, user):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return 1
 | 
						|
        elif owner == user:
 | 
						|
            return 1
 | 
						|
        elif owner.pk == user.owner:
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def currentContextPermission(currentACL, context):
 | 
						|
        try:
 | 
						|
            if currentACL['admin'] == 1:
 | 
						|
                return 1
 | 
						|
            elif currentACL[context] == 1:
 | 
						|
                return 1
 | 
						|
            else:
 | 
						|
                return 0
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def createDefaultACLs():
 | 
						|
        try:
 | 
						|
 | 
						|
            ## Admin ACL
 | 
						|
 | 
						|
            newACL = ACL(name='admin', adminStatus=1, config=ACLManager.AdminACL)
 | 
						|
            newACL.save()
 | 
						|
 | 
						|
            ## Reseller ACL
 | 
						|
 | 
						|
            newACL = ACL(name='reseller',
 | 
						|
                         createNewUser=1,
 | 
						|
                         deleteUser=1,
 | 
						|
                         createWebsite=1,
 | 
						|
                         resellerCenter=1,
 | 
						|
                         modifyWebsite=1,
 | 
						|
                         suspendWebsite=1,
 | 
						|
                         deleteWebsite=1,
 | 
						|
                         createPackage=1,
 | 
						|
                         deletePackage=1,
 | 
						|
                         modifyPackage=1,
 | 
						|
                         createNameServer=1,
 | 
						|
                         restoreBackup=1,
 | 
						|
                         config=ACLManager.ResellerACL
 | 
						|
                         )
 | 
						|
            newACL.save()
 | 
						|
 | 
						|
            ## User ACL
 | 
						|
            newACL = ACL(name='user', config=ACLManager.UserACL)
 | 
						|
            newACL.save()
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def loadError():
 | 
						|
        try:
 | 
						|
            return HttpResponse('You are not authorized to access this resource.')
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def loadErrorJson(additionalParameter = None, additionalParameterValue = None):
 | 
						|
        try:
 | 
						|
            if additionalParameter == None:
 | 
						|
                finalJson = {"status": 0, "errorMessage": 'You are not authorized to access this resource.',
 | 
						|
                        'error_message': 'You are not authorized to access this resource.',
 | 
						|
                        }
 | 
						|
            else:
 | 
						|
                finalJson = {"status": 0, "errorMessage": 'You are not authorized to access this resource.',
 | 
						|
                        'error_message': 'You are not authorized to access this resource.',
 | 
						|
                        additionalParameter: additionalParameterValue
 | 
						|
                        }
 | 
						|
 | 
						|
            json_data = json.dumps(finalJson)
 | 
						|
            return HttpResponse(json_data)
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findAllUsers():
 | 
						|
        userNames = []
 | 
						|
        allUsers = Administrator.objects.all()
 | 
						|
        for items in allUsers:
 | 
						|
            if items.userName == 'admin':
 | 
						|
                continue
 | 
						|
            userNames.append(items.userName)
 | 
						|
        return userNames
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findAllACLs():
 | 
						|
        aclNames = []
 | 
						|
        allACLs = ACL.objects.all()
 | 
						|
 | 
						|
        for items in allACLs:
 | 
						|
            if items.name == 'admin' or items.name == 'reseller' or items.name == 'user':
 | 
						|
                continue
 | 
						|
            else:
 | 
						|
                aclNames.append(items.name)
 | 
						|
        return aclNames
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def unFileteredACLs():
 | 
						|
        aclNames = []
 | 
						|
        allACLs = ACL.objects.all()
 | 
						|
 | 
						|
        for items in allACLs:
 | 
						|
            aclNames.append(items.name)
 | 
						|
 | 
						|
        return aclNames
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def loadAllUsers(userID):
 | 
						|
        admin = Administrator.objects.get(pk=userID)
 | 
						|
        adminNames = []
 | 
						|
 | 
						|
        finalResponse = ACLManager.loadedACL(userID)
 | 
						|
 | 
						|
        if finalResponse['admin'] == 1:
 | 
						|
            admins = Administrator.objects.all()
 | 
						|
            for items in admins:
 | 
						|
                if items.userName == admin.userName:
 | 
						|
                    continue
 | 
						|
                adminNames.append(items.userName)
 | 
						|
        else:
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
            for items in admins:
 | 
						|
                adminNames.append(items.userName)
 | 
						|
 | 
						|
        adminNames.append(admin.userName)
 | 
						|
        return adminNames
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def loadUserObjects(userID):
 | 
						|
        admin = Administrator.objects.get(pk=userID)
 | 
						|
        adminObjects = []
 | 
						|
 | 
						|
        finalResponse = ACLManager.loadedACL(userID)
 | 
						|
 | 
						|
        if finalResponse['admin'] == 1:
 | 
						|
            return Administrator.objects.all()
 | 
						|
        else:
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
            for items in admins:
 | 
						|
                adminObjects.append(items)
 | 
						|
 | 
						|
                adminObjects.append(admin)
 | 
						|
 | 
						|
        return adminObjects
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def fetchTableUserObjects(userID):
 | 
						|
        admin = Administrator.objects.get(pk=userID)
 | 
						|
        adminObjects = []
 | 
						|
 | 
						|
        finalResponse = ACLManager.loadedACL(userID)
 | 
						|
 | 
						|
        if finalResponse['admin'] == 1:
 | 
						|
            return Administrator.objects.all().exclude(pk=userID).order_by('userName')
 | 
						|
        else:
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk).order_by('userName')
 | 
						|
            for items in admins:
 | 
						|
                adminObjects.append(items)
 | 
						|
 | 
						|
        return adminObjects
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def loadDeletionUsers(userID, finalResponse):
 | 
						|
        admin = Administrator.objects.get(pk=userID)
 | 
						|
        adminNames = []
 | 
						|
 | 
						|
        if finalResponse['admin'] == 1:
 | 
						|
            admins = Administrator.objects.all()
 | 
						|
            for items in admins:
 | 
						|
                if items.userName == admin.userName:
 | 
						|
                    continue
 | 
						|
                adminNames.append(items.userName)
 | 
						|
        else:
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
            for items in admins:
 | 
						|
                adminNames.append(items.userName)
 | 
						|
 | 
						|
        return adminNames
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def userWithResellerPriv(userID):
 | 
						|
        admin = Administrator.objects.get(pk=userID)
 | 
						|
        adminNames = []
 | 
						|
 | 
						|
        finalResponse = ACLManager.loadedACL(userID)
 | 
						|
 | 
						|
        if finalResponse['admin'] == 1:
 | 
						|
            admins = Administrator.objects.all()
 | 
						|
            for items in admins:
 | 
						|
                if items.acl.resellerCenter == 1:
 | 
						|
                    if items.userName == admin.userName:
 | 
						|
                        continue
 | 
						|
                    adminNames.append(items.userName)
 | 
						|
        else:
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
            for items in admins:
 | 
						|
                if items.acl.resellerCenter == 1:
 | 
						|
                    adminNames.append(items.userName)
 | 
						|
 | 
						|
        adminNames.append(admin.userName)
 | 
						|
        return adminNames
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def websitesLimitCheck(currentAdmin, websitesLimit, userToBeModified = None):
 | 
						|
        if currentAdmin.acl.adminStatus != 1:
 | 
						|
 | 
						|
            if currentAdmin.initWebsitesLimit != 0:
 | 
						|
                webLimits = 0
 | 
						|
                allUsers = Administrator.objects.filter(owner=currentAdmin.pk)
 | 
						|
                for items in allUsers:
 | 
						|
                    webLimits = webLimits + items.initWebsitesLimit
 | 
						|
 | 
						|
                if userToBeModified != None:
 | 
						|
                    webLimits = webLimits - userToBeModified.initWebsitesLimit
 | 
						|
 | 
						|
                webLimits = webLimits + websitesLimit + currentAdmin.websites_set.all().count()
 | 
						|
 | 
						|
                if webLimits <= currentAdmin.initWebsitesLimit:
 | 
						|
                    return 1
 | 
						|
                else:
 | 
						|
                    return 0
 | 
						|
            else:
 | 
						|
                return 1
 | 
						|
        else:
 | 
						|
            return 1
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def loadPackages(userID, finalResponse):
 | 
						|
        admin = Administrator.objects.get(pk=userID)
 | 
						|
        packNames = []
 | 
						|
 | 
						|
        if finalResponse['admin'] == 1:
 | 
						|
            packs = Package.objects.all()
 | 
						|
            for items in packs:
 | 
						|
                packNames.append(items.packageName)
 | 
						|
        else:
 | 
						|
            packs = admin.package_set.all()
 | 
						|
            for items in packs:
 | 
						|
                packNames.append(items.packageName)
 | 
						|
 | 
						|
        return packNames
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def loadPackageObjects(userID, finalResponse):
 | 
						|
        admin = Administrator.objects.get(pk=userID)
 | 
						|
 | 
						|
        if finalResponse['admin'] == 1:
 | 
						|
            return Package.objects.all()
 | 
						|
        else:
 | 
						|
            return admin.package_set.all()
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findAllSites(currentACL, userID, fetchChilds = 0):
 | 
						|
        websiteNames = []
 | 
						|
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            allWebsites = Websites.objects.all().order_by('domain')
 | 
						|
 | 
						|
            for items in allWebsites:
 | 
						|
                websiteNames.append(items.domain)
 | 
						|
 | 
						|
                if fetchChilds:
 | 
						|
                    for child in items.childdomains_set.all().order_by('domain'):
 | 
						|
                        websiteNames.append(child.domain)
 | 
						|
        else:
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
 | 
						|
            websites = admin.websites_set.all().order_by('domain')
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
 | 
						|
            for items in websites:
 | 
						|
                websiteNames.append(items.domain)
 | 
						|
 | 
						|
                if fetchChilds:
 | 
						|
                    for child in items.childdomains_set.all().order_by('domain'):
 | 
						|
                        websiteNames.append(child.domain)
 | 
						|
 | 
						|
            for items in admins:
 | 
						|
                webs = items.websites_set.all().order_by('domain')
 | 
						|
                for web in webs:
 | 
						|
                    websiteNames.append(web.domain)
 | 
						|
 | 
						|
                    if fetchChilds:
 | 
						|
                        for child in web.childdomains_set.all().order_by('domain'):
 | 
						|
                            websiteNames.append(child.domain)
 | 
						|
 | 
						|
 | 
						|
        return websiteNames
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def getPHPString(phpVersion):
 | 
						|
 | 
						|
        if phpVersion == "PHP 5.3":
 | 
						|
            php = "53"
 | 
						|
        elif phpVersion == "PHP 5.4":
 | 
						|
            php = "54"
 | 
						|
        elif phpVersion == "PHP 5.5":
 | 
						|
            php = "55"
 | 
						|
        elif phpVersion == "PHP 5.6":
 | 
						|
            php = "56"
 | 
						|
        elif phpVersion == "PHP 7.0":
 | 
						|
            php = "70"
 | 
						|
        elif phpVersion == "PHP 7.1":
 | 
						|
            php = "71"
 | 
						|
        elif phpVersion == "PHP 7.2":
 | 
						|
            php = "72"
 | 
						|
        elif phpVersion == "PHP 7.3":
 | 
						|
            php = "73"
 | 
						|
        elif phpVersion == "PHP 7.4":
 | 
						|
            php = "74"
 | 
						|
        elif phpVersion == "PHP 8.0":
 | 
						|
            php = "80"
 | 
						|
        elif phpVersion == "PHP 8.1":
 | 
						|
            php = "81"
 | 
						|
        elif phpVersion == "PHP 8.2":
 | 
						|
            php = "82"
 | 
						|
        elif phpVersion == "PHP 8.3":
 | 
						|
            php = "83"
 | 
						|
        elif phpVersion == "PHP 8.4":
 | 
						|
            php = "84"
 | 
						|
 | 
						|
        return php
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def searchWebsiteObjects(currentACL, userID, searchTerm):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            # Get websites that match the search term
 | 
						|
            websites = Websites.objects.filter(domain__istartswith=searchTerm)
 | 
						|
            # Get WordPress sites that match the search term
 | 
						|
            wp_sites = WPSites.objects.filter(title__icontains=searchTerm)
 | 
						|
            # Add WordPress sites' parent websites to the results
 | 
						|
            for wp in wp_sites:
 | 
						|
                if wp.owner not in websites:
 | 
						|
                    websites = websites | Websites.objects.filter(pk=wp.owner.pk)
 | 
						|
            return websites
 | 
						|
        else:
 | 
						|
            websiteList = []
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
 | 
						|
            # Get websites that match the search term
 | 
						|
            websites = admin.websites_set.filter(domain__istartswith=searchTerm)
 | 
						|
            for items in websites:
 | 
						|
                websiteList.append(items)
 | 
						|
 | 
						|
            # Get WordPress sites that match the search term
 | 
						|
            wp_sites = WPSites.objects.filter(title__icontains=searchTerm)
 | 
						|
            for wp in wp_sites:
 | 
						|
                if wp.owner.admin == admin and wp.owner not in websiteList:
 | 
						|
                    websiteList.append(wp.owner)
 | 
						|
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
            for items in admins:
 | 
						|
                # Get websites that match the search term
 | 
						|
                webs = items.websites_set.filter(domain__istartswith=searchTerm)
 | 
						|
                for web in webs:
 | 
						|
                    if web not in websiteList:
 | 
						|
                        websiteList.append(web)
 | 
						|
                
 | 
						|
                # Get WordPress sites that match the search term
 | 
						|
                wp_sites = WPSites.objects.filter(title__icontains=searchTerm)
 | 
						|
                for wp in wp_sites:
 | 
						|
                    if wp.owner.admin == items and wp.owner not in websiteList:
 | 
						|
                        websiteList.append(wp.owner)
 | 
						|
 | 
						|
            return websiteList
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findWebsiteObjects(currentACL, userID):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return Websites.objects.all().order_by('domain')
 | 
						|
        else:
 | 
						|
 | 
						|
            websiteList = []
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
 | 
						|
            websites = admin.websites_set.all().order_by('domain')
 | 
						|
 | 
						|
            for items in websites:
 | 
						|
                websiteList.append(items)
 | 
						|
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
 | 
						|
            for items in admins:
 | 
						|
                webs = items.websites_set.all().order_by('domain')
 | 
						|
                for web in webs:
 | 
						|
                    websiteList.append(web)
 | 
						|
 | 
						|
            return websiteList
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findDockersiteObjects(currentACL, userID):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return DockerSites.objects.all()
 | 
						|
        else:
 | 
						|
 | 
						|
            DockersiteList = []
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
 | 
						|
            websites = admin.DockerSites_set.all()
 | 
						|
 | 
						|
            for items in websites:
 | 
						|
                DockersiteList.append(items)
 | 
						|
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
 | 
						|
            for items in admins:
 | 
						|
                webs = items.DockerSites_set.all()
 | 
						|
                for web in webs:
 | 
						|
                    DockersiteList.append(web)
 | 
						|
 | 
						|
            return DockersiteList
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findAllDomains(currentACL, userID):
 | 
						|
        domainsList = []
 | 
						|
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            domains = Websites.objects.all().order_by('domain')
 | 
						|
            for items in domains:
 | 
						|
                domainsList.append(items.domain)
 | 
						|
 | 
						|
                for childs in items.childdomains_set.all():
 | 
						|
                    domainsList.append(childs.domain)
 | 
						|
 | 
						|
        else:
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
            domains = admin.websites_set.all().order_by('domain')
 | 
						|
 | 
						|
            for items in domains:
 | 
						|
                domainsList.append(items.domain)
 | 
						|
                for childs in items.childdomains_set.all():
 | 
						|
                    domainsList.append(childs.domain)
 | 
						|
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
 | 
						|
            for items in admins:
 | 
						|
                doms = items.websites_set.all().order_by('domain')
 | 
						|
                for dom in doms:
 | 
						|
                    domainsList.append(dom.domain)
 | 
						|
                    for childs in dom.childdomains_set.all():
 | 
						|
                        domainsList.append(childs.domain)
 | 
						|
 | 
						|
        return domainsList
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findAllWebsites(currentACL, userID):
 | 
						|
        domainsList = []
 | 
						|
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            domains = Websites.objects.all().order_by('domain')
 | 
						|
            for items in domains:
 | 
						|
                domainsList.append(items.domain)
 | 
						|
        else:
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
            domains = admin.websites_set.all().order_by('domain')
 | 
						|
 | 
						|
            for items in domains:
 | 
						|
                domainsList.append(items.domain)
 | 
						|
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
 | 
						|
            for items in admins:
 | 
						|
                doms = items.websites_set.all().order_by('domain')
 | 
						|
                for dom in doms:
 | 
						|
                    domainsList.append(dom.domain)
 | 
						|
        return domainsList
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findAllDNSZones(currentACL, userID):
 | 
						|
        from dns.models import Domains
 | 
						|
        zonesList = []
 | 
						|
        
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            zones = Domains.objects.all().order_by('name')
 | 
						|
            for zone in zones:
 | 
						|
                zonesList.append(zone.name)
 | 
						|
        else:
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
            zones = Domains.objects.filter(admin=admin).order_by('name')
 | 
						|
            
 | 
						|
            for zone in zones:
 | 
						|
                zonesList.append(zone.name)
 | 
						|
            
 | 
						|
            # Include zones from owned admins
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
            for item in admins:
 | 
						|
                owned_zones = Domains.objects.filter(admin=item).order_by('name')
 | 
						|
                for zone in owned_zones:
 | 
						|
                    zonesList.append(zone.name)
 | 
						|
        
 | 
						|
        return list(set(zonesList))  # Remove duplicates
 | 
						|
    
 | 
						|
    @staticmethod
 | 
						|
    def checkOwnership(domain, admin, currentACL):
 | 
						|
        try:
 | 
						|
            childDomain = ChildDomains.objects.get(domain=domain)
 | 
						|
 | 
						|
            if currentACL['admin'] == 1:
 | 
						|
                return 1
 | 
						|
            elif childDomain.master.admin == admin:
 | 
						|
                return 1
 | 
						|
            else:
 | 
						|
                if childDomain.master.admin.owner == admin.pk:
 | 
						|
                    return 1
 | 
						|
 | 
						|
        except:
 | 
						|
            domainName = Websites.objects.get(domain=domain)
 | 
						|
 | 
						|
            if currentACL['admin'] == 1:
 | 
						|
                return 1
 | 
						|
            elif  domainName.admin == admin:
 | 
						|
                return 1
 | 
						|
            else:
 | 
						|
                if domainName.admin.owner == admin.pk:
 | 
						|
                    return 1
 | 
						|
                else:
 | 
						|
                    return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def checkGDriveOwnership(gD, admin, currentACL):
 | 
						|
 | 
						|
        try:
 | 
						|
            if currentACL['admin'] == 1:
 | 
						|
                return 1
 | 
						|
            elif gD.owner == admin:
 | 
						|
                return 1
 | 
						|
            elif gD.owner.owner == admin.pk:
 | 
						|
                    return 1
 | 
						|
 | 
						|
            return 0
 | 
						|
        except:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def checkOwnershipZone(domain, admin, currentACL):
 | 
						|
        # First check if user is admin
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return 1
 | 
						|
            
 | 
						|
        # Try to find domain in Websites table
 | 
						|
        try:
 | 
						|
            websiteDomain = Websites.objects.get(domain=domain)
 | 
						|
            if websiteDomain.admin == admin or websiteDomain.admin.owner == admin.pk:
 | 
						|
                return 1
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
            
 | 
						|
        # Try to find domain in ChildDomains table
 | 
						|
        try:
 | 
						|
            childDomain = ChildDomains.objects.get(domain=domain)
 | 
						|
            if childDomain.master.admin == admin or childDomain.master.admin.owner == admin.pk:
 | 
						|
                return 1
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
            
 | 
						|
        # Try to find domain in DNS Domains table (for standalone DNS zones)
 | 
						|
        try:
 | 
						|
            from dns.models import Domains
 | 
						|
            dnsDomain = Domains.objects.get(name=domain)
 | 
						|
            if dnsDomain.admin == admin:
 | 
						|
                return 1
 | 
						|
            # Check if the DNS zone is owned by a user owned by current admin
 | 
						|
            if dnsDomain.admin.owner == admin.pk:
 | 
						|
                return 1
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
            
 | 
						|
        return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def executeCall(command):
 | 
						|
        try:
 | 
						|
            result = call(split(command))
 | 
						|
            if result == 1:
 | 
						|
                return 0, 'Something bad happened'
 | 
						|
            else:
 | 
						|
                return 1, 'None'
 | 
						|
        except CalledProcessError as msg:
 | 
						|
            logging.writeToFile(str(msg) + ' [ACLManager.executeCall]')
 | 
						|
            return 0, str(msg)
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def checkContainerOwnership(name, userID):
 | 
						|
        try:
 | 
						|
            container = Containers.objects.get(name=name)
 | 
						|
            currentACL = ACLManager.loadedACL(userID)
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
 | 
						|
            if currentACL['admin'] == 1:
 | 
						|
                return 1
 | 
						|
            elif container.admin == admin:
 | 
						|
                return 1
 | 
						|
            else:
 | 
						|
                return 0
 | 
						|
        except:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findAllContainers(currentACL, userID):
 | 
						|
        containerName = []
 | 
						|
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            allContainers = Containers.objects.all()
 | 
						|
            for items in allContainers:
 | 
						|
                containerName.append(items.name)
 | 
						|
        else:
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
 | 
						|
            containers = admin.containers_set.all()
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
 | 
						|
            for items in containers:
 | 
						|
                containerName.append(items.name)
 | 
						|
 | 
						|
            for items in admins:
 | 
						|
                cons = items.containers_set.all()
 | 
						|
                for con in cons:
 | 
						|
                    containerName.append(con.name)
 | 
						|
 | 
						|
 | 
						|
        return containerName
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findContainersObjects(currentACL, userID):
 | 
						|
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return Containers.objects.all()
 | 
						|
        else:
 | 
						|
 | 
						|
            containerList = []
 | 
						|
            admin = Administrator.objects.get(pk=userID)
 | 
						|
 | 
						|
            containers = admin.containers_set.all()
 | 
						|
 | 
						|
            for items in containers:
 | 
						|
                containerList.append(items)
 | 
						|
 | 
						|
            admins = Administrator.objects.filter(owner=admin.pk)
 | 
						|
 | 
						|
            for items in admins:
 | 
						|
                cons = items.containers_set.all()
 | 
						|
                for con in cons:
 | 
						|
                    containerList.append(con)
 | 
						|
 | 
						|
            return containerList
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def findChildDomains(websiteNames):
 | 
						|
        childDomains = []
 | 
						|
 | 
						|
        for items in websiteNames:
 | 
						|
            website = Websites.objects.get(domain = items)
 | 
						|
            for childDomain in website.childdomains_set.all().order_by('domain'):
 | 
						|
                childDomains.append(childDomain.domain)
 | 
						|
 | 
						|
        return childDomains
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def checkOwnerProtection(currentACL, owner, child):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return 1
 | 
						|
        elif child.owner == owner.pk:
 | 
						|
            return 1
 | 
						|
        elif child == owner:
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def CheckDomainBlackList(domain):
 | 
						|
        import socket
 | 
						|
 | 
						|
        BlackList = [ socket.gethostname(), 'hotmail.com', 'gmail.com', 'yandex.com', 'yahoo.com', 'localhost', 'aol.com', 'apple.com',
 | 
						|
                     'cloudlinux.com', 'email.com', 'facebook.com', 'gmx.de', 'gmx.com', 'google.com',
 | 
						|
                     'hushmail.com', 'icloud.com', 'inbox.com', 'imunify360.com', 'juno.com', 'live.com', 'localhost.localdomain',
 | 
						|
                     'localhost4.localdomain4', 'localhost6.localdomain6','mail.com', 'mail.ru', 'me.com',
 | 
						|
                     'microsoft.com', 'mxlogic.net', 'outlook.com', 'protonmail.com', 'twitter.com', 'yandex.ru']
 | 
						|
 | 
						|
        DotsCounter = domain.count('.')
 | 
						|
 | 
						|
        for black in BlackList:
 | 
						|
            if DotsCounter == 1:
 | 
						|
                if domain == black:
 | 
						|
                    return 0
 | 
						|
            else:
 | 
						|
                if domain.endswith(black):
 | 
						|
                    logging.writeToFile(black)
 | 
						|
                    return 0
 | 
						|
 | 
						|
        return 1
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def CheckStatusFilleLoc(statusFile, domain=None):
 | 
						|
        if statusFile.find('panel/') > -1:
 | 
						|
            TemFilePath = statusFile.split('panel/')[1]
 | 
						|
        else:
 | 
						|
            TemFilePath = statusFile.split('tmp/')[1]
 | 
						|
 | 
						|
        try:
 | 
						|
            value = int(TemFilePath)
 | 
						|
            print(value)
 | 
						|
        except:
 | 
						|
            if domain != None:
 | 
						|
                value = statusFile.split('cyberpanel/')[1]
 | 
						|
                #logging.writeToFile(f'value of log file {value}')
 | 
						|
                if value == f'{domain}_rustic_backup_log':
 | 
						|
                    return 1
 | 
						|
            return 0
 | 
						|
 | 
						|
        if (statusFile[:18] != "/home/cyberpanel/." or statusFile[:16] == "/home/cyberpanel" or statusFile[:4] == '/tmp' or statusFile[
 | 
						|
                                                                                                                 :18] == '/usr/local/CyberCP') \
 | 
						|
                and statusFile != '/usr/local/CyberCP/CyberCP/settings.py' and statusFile.find(
 | 
						|
            '..') == -1 and statusFile != '/home/cyberpanel/.my.cnf' and statusFile != '/home/cyberpanel/.bashrc' and statusFile != '/home/cyberpanel/.bash_logout' and statusFile != '/home/cyberpanel/.profile':
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def FetchExternalApp(domain):
 | 
						|
        try:
 | 
						|
            childDomain = ChildDomains.objects.get(domain=domain)
 | 
						|
 | 
						|
            return childDomain.master.externalApp
 | 
						|
 | 
						|
        except:
 | 
						|
            domainName = Websites.objects.get(domain=domain)
 | 
						|
            return domainName.externalApp
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def CreateSecureDir():
 | 
						|
        ### Check if upload path tmp dir is not available
 | 
						|
 | 
						|
        UploadPath = '/usr/local/CyberCP/tmp/'
 | 
						|
 | 
						|
        if not os.path.exists(UploadPath):
 | 
						|
            command = 'mkdir %s' % (UploadPath)
 | 
						|
            ProcessUtilities.executioner(command)
 | 
						|
 | 
						|
        command = 'chown cyberpanel:cyberpanel %s' % (UploadPath)
 | 
						|
        ProcessUtilities.executioner(command)
 | 
						|
 | 
						|
        command = 'chmod 711 %s' % (UploadPath)
 | 
						|
        ProcessUtilities.executioner(command)
 | 
						|
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def GetServiceStatus(dic):
 | 
						|
        if os.path.exists('/home/cyberpanel/postfix'):
 | 
						|
            dic['emailAsWhole'] = 1
 | 
						|
        else:
 | 
						|
            dic['emailAsWhole'] = 0
 | 
						|
 | 
						|
        if os.path.exists('/home/cyberpanel/pureftpd'):
 | 
						|
            dic['ftpAsWhole'] = 1
 | 
						|
        else:
 | 
						|
            dic['ftpAsWhole'] = 0
 | 
						|
 | 
						|
        try:
 | 
						|
            pdns = PDNSStatus.objects.get(pk=1)
 | 
						|
            dic['dnsAsWhole'] = pdns.serverStatus
 | 
						|
        except:
 | 
						|
            if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20:
 | 
						|
                pdnsPath = '/etc/powerdns'
 | 
						|
            else:
 | 
						|
                pdnsPath = '/etc/pdns'
 | 
						|
 | 
						|
            if os.path.exists(pdnsPath):
 | 
						|
                PDNSStatus(serverStatus=1).save()
 | 
						|
                dic['dnsAsWhole'] = 1
 | 
						|
            else:
 | 
						|
                dic['dnsAsWhole'] = 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def GetALLWPObjects(currentACL, userID):
 | 
						|
        from websiteFunctions.models import WPSites
 | 
						|
 | 
						|
        wpsites = WPSites.objects.none()
 | 
						|
        websites = ACLManager.findWebsiteObjects(currentACL, userID)
 | 
						|
 | 
						|
        for website in websites:
 | 
						|
            wpsites |= website.wpsites_set.all()
 | 
						|
 | 
						|
        return wpsites
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def GetServerIP():
 | 
						|
        ipFile = "/etc/cyberpanel/machineIP"
 | 
						|
        f = open(ipFile)
 | 
						|
        ipData = f.read()
 | 
						|
        return ipData.split('\n', 1)[0]
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def CheckForPremFeature(feature):
 | 
						|
        try:
 | 
						|
 | 
						|
            if ProcessUtilities.decideServer() == ProcessUtilities.ent:
 | 
						|
                return 1
 | 
						|
 | 
						|
            url = "https://platform.cyberpersons.com/CyberpanelAdOns/Adonpermission"
 | 
						|
            data = {
 | 
						|
                "name": feature,
 | 
						|
                "IP": ACLManager.GetServerIP()
 | 
						|
            }
 | 
						|
 | 
						|
            import requests
 | 
						|
            response = requests.post(url, data=json.dumps(data))
 | 
						|
            return response.json()['status']
 | 
						|
        except:
 | 
						|
            return 1
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def CheckIPBackupObjectOwner(currentACL, backupobj, user):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return 1
 | 
						|
        elif backupobj.owner == user:
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def CheckIPPluginObjectOwner(currentACL, backupobj, user):
 | 
						|
        if currentACL['admin'] == 1:
 | 
						|
            return 1
 | 
						|
        elif backupobj.owner == user:
 | 
						|
            return 1
 | 
						|
        else:
 | 
						|
            return 0
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def FetchCloudFlareAPIKeyFromAcme():
 | 
						|
        try:
 | 
						|
 | 
						|
            command = 'grep SAVED_CF_Key= /root/.acme.sh/account.conf | cut -d= -f2 | tr -d "\'"'
 | 
						|
            SAVED_CF_Key = ProcessUtilities.outputExecutioner(command).rstrip('\n')
 | 
						|
 | 
						|
            command = 'grep SAVED_CF_Email= /root/.acme.sh/account.conf | cut -d= -f2 | tr -d "\'"'
 | 
						|
            SAVED_CF_Email = ProcessUtilities.outputExecutioner(command).rstrip('\n')
 | 
						|
 | 
						|
            if len(SAVED_CF_Key) > 3 and len(SAVED_CF_Email) > 3:
 | 
						|
                return 1, SAVED_CF_Key, SAVED_CF_Email
 | 
						|
            else:
 | 
						|
                return 0, 'Key not defined', SAVED_CF_Email
 | 
						|
 | 
						|
        except BaseException as msg:
 | 
						|
            return 0, str(msg), None
 | 
						|
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def FindDocRootOfSite(vhostConf,domainName):
 | 
						|
        try:
 | 
						|
            if vhostConf == None:
 | 
						|
                vhostConf = f'/usr/local/lsws/conf/vhosts/{domainName}/vhost.conf'
 | 
						|
 | 
						|
            if ProcessUtilities.decideServer() == ProcessUtilities.OLS:
 | 
						|
                command = "awk '/docRoot/ {print $2}' " + vhostConf
 | 
						|
                docRoot = ProcessUtilities.outputExecutioner(command, 'root', True).rstrip('\n')
 | 
						|
                #docRoot = docRoot.replace('$VH_ROOT', f'/home/{domainName}')
 | 
						|
                return docRoot
 | 
						|
            else:
 | 
						|
                command = "awk '/DocumentRoot/ {print $2; exit}' " + vhostConf
 | 
						|
                docRoot = ProcessUtilities.outputExecutioner(command, 'root', True).rstrip('\n')
 | 
						|
                return docRoot
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def ReplaceDocRoot(vhostConf, domainName, NewDocRoot):
 | 
						|
        try:
 | 
						|
            if vhostConf == None:
 | 
						|
                vhostConf = f'/usr/local/lsws/conf/vhosts/{domainName}/vhost.conf'
 | 
						|
 | 
						|
            if ProcessUtilities.decideServer() == ProcessUtilities.OLS:
 | 
						|
                #command = f"sed -i 's/docRoot\s\s*.*/docRoot                   {NewDocRoot}/g " + vhostConf
 | 
						|
                command = f"sed -i 's#docRoot\s\s*.*#docRoot                   {NewDocRoot}#g' " + vhostConf
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
            else:
 | 
						|
                command = f"sed -i 's#DocumentRoot\s\s*[^[:space:]]*#DocumentRoot {NewDocRoot}#g' " + vhostConf
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
                
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def FindDocRootOfSiteApache(vhostConf, domainName):
 | 
						|
        try:
 | 
						|
            finalConfPath = ApacheVhost.configBasePath + domainName + '.conf'
 | 
						|
 | 
						|
            if ProcessUtilities.decideServer() == ProcessUtilities.OLS:
 | 
						|
 | 
						|
                if os.path.exists(finalConfPath):
 | 
						|
                    command = "awk '/DocumentRoot/ {print $2; exit}' " + finalConfPath
 | 
						|
                    docRoot = ProcessUtilities.outputExecutioner(command, 'root', True).rstrip('\n')
 | 
						|
                    return docRoot
 | 
						|
                else:
 | 
						|
                    return None
 | 
						|
            else:
 | 
						|
                return None
 | 
						|
 | 
						|
        except:
 | 
						|
            return None
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def ReplaceDocRootApache(vhostConf, domainName, NewDocRoot):
 | 
						|
        try:
 | 
						|
            finalConfPath = ApacheVhost.configBasePath + domainName + '.conf'
 | 
						|
 | 
						|
            if ProcessUtilities.decideServer() == ProcessUtilities.OLS:
 | 
						|
                command = f"sed -i 's#DocumentRoot\s\s*[^[:space:]]*#DocumentRoot {NewDocRoot}#g' " + finalConfPath
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
 | 
						|
 | 
						|
    @staticmethod
 | 
						|
    def ISARM():
 | 
						|
 | 
						|
        command = 'uname -a'
 | 
						|
        result = ProcessUtilities.outputExecutioner(command)
 | 
						|
 | 
						|
        if result.find('aarch64') > -1:
 | 
						|
            return True
 | 
						|
        else:
 | 
						|
            return False
 | 
						|
 | 
						|
    #### if you update this function needs to update this function on plogical.acl.py as well
 | 
						|
    @staticmethod
 | 
						|
    def fixPermissions():
 | 
						|
        try:
 | 
						|
 | 
						|
            try:
 | 
						|
                def generate_pass(length=14):
 | 
						|
                    chars = string.ascii_uppercase + string.ascii_lowercase + string.digits
 | 
						|
                    size = length
 | 
						|
                    return ''.join(random.choice(chars) for x in range(size))
 | 
						|
 | 
						|
                content = """<?php
 | 
						|
$_ENV['snappymail_INCLUDE_AS_API'] = true;
 | 
						|
include '/usr/local/CyberCP/public/snappymail/index.php';
 | 
						|
 | 
						|
$oConfig = \snappymail\Api::Config();
 | 
						|
$oConfig->SetPassword('%s');
 | 
						|
echo $oConfig->Save() ? 'Done' : 'Error';
 | 
						|
 | 
						|
?>""" % (generate_pass())
 | 
						|
 | 
						|
                writeToFile = open('/usr/local/CyberCP/public/snappymail.php', 'w')
 | 
						|
                writeToFile.write(content)
 | 
						|
                writeToFile.close()
 | 
						|
 | 
						|
                command = "chown -R lscpd:lscpd /usr/local/lscp/cyberpanel/snappymail/data"
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            except:
 | 
						|
                pass
 | 
						|
 | 
						|
 | 
						|
            command = "usermod -G lscpd,lsadm,nobody lscpd"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "usermod -G lscpd,lsadm,nogroup lscpd"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            ###### fix Core CyberPanel permissions
 | 
						|
 | 
						|
            command = "find /usr/local/CyberCP -type d -exec chmod 0755 {} \;"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "find /usr/local/CyberCP -type f -exec chmod 0644 {} \;"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chmod -R 755 /usr/local/CyberCP/bin"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            ## change owner
 | 
						|
 | 
						|
            command = "chown -R root:root /usr/local/CyberCP"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            ########### Fix LSCPD
 | 
						|
 | 
						|
            command = "find /usr/local/lscp -type d -exec chmod 0755 {} \;"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "find /usr/local/lscp -type f -exec chmod 0644 {} \;"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chmod -R 755 /usr/local/lscp/bin"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chmod -R 755 /usr/local/lscp/fcgi-bin"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chown -R lscpd:lscpd /usr/local/CyberCP/public/phpmyadmin/tmp"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            ## change owner
 | 
						|
 | 
						|
            command = "chown -R root:root /usr/local/lscp"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chown -R lscpd:lscpd /usr/local/lscp/cyberpanel/rainloop"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chmod 700 /usr/local/CyberCP/cli/cyberPanel.py"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chmod 700 /usr/local/CyberCP/plogical/upgradeCritical.py"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chmod 755 /usr/local/CyberCP/postfixSenderPolicy/client.py"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chmod 640 /usr/local/CyberCP/CyberCP/settings.py"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "chown root:cyberpanel /usr/local/CyberCP/CyberCP/settings.py"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod +x /usr/local/CyberCP/CLManager/CLPackages.py'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            files = ['/etc/yum.repos.d/MariaDB.repo', '/etc/pdns/pdns.conf', '/etc/systemd/system/lscpd.service',
 | 
						|
                     '/etc/pure-ftpd/pure-ftpd.conf', '/etc/pure-ftpd/pureftpd-pgsql.conf',
 | 
						|
                     '/etc/pure-ftpd/pureftpd-mysql.conf', '/etc/pure-ftpd/pureftpd-ldap.conf',
 | 
						|
                     '/etc/dovecot/dovecot.conf', '/usr/local/lsws/conf/httpd_config.xml',
 | 
						|
                     '/usr/local/lsws/conf/modsec.conf', '/usr/local/lsws/conf/httpd.conf']
 | 
						|
 | 
						|
            for items in files:
 | 
						|
                command = 'chmod 644 %s' % (items)
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            impFile = ['/etc/pure-ftpd/pure-ftpd.conf', '/etc/pure-ftpd/pureftpd-pgsql.conf',
 | 
						|
                       '/etc/pure-ftpd/pureftpd-mysql.conf', '/etc/pure-ftpd/pureftpd-ldap.conf',
 | 
						|
                       '/etc/dovecot/dovecot.conf', '/etc/pdns/pdns.conf', '/etc/pure-ftpd/db/mysql.conf',
 | 
						|
                       '/etc/powerdns/pdns.conf']
 | 
						|
 | 
						|
            for items in impFile:
 | 
						|
                command = 'chmod 600 %s' % (items)
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 640 /etc/postfix/*.cf'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 640 /etc/dovecot/*.conf'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 640 /etc/dovecot/dovecot-sql.conf.ext'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            fileM = ['/usr/local/lsws/FileManager/', '/usr/local/CyberCP/install/FileManager',
 | 
						|
                     '/usr/local/CyberCP/serverStatus/litespeed/FileManager',
 | 
						|
                     '/usr/local/lsws/Example/html/FileManager']
 | 
						|
 | 
						|
            import shutil
 | 
						|
            for items in fileM:
 | 
						|
                try:
 | 
						|
                    shutil.rmtree(items)
 | 
						|
                except:
 | 
						|
                    pass
 | 
						|
 | 
						|
            command = 'chmod 755 /etc/pure-ftpd/'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 644 /etc/dovecot/dovecot.conf'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 644 /etc/postfix/main.cf'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 644 /etc/postfix/dynamicmaps.cf'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod +x /usr/local/CyberCP/plogical/renew.py'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod +x /usr/local/CyberCP/CLManager/CLPackages.py'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            clScripts = ['/usr/local/CyberCP/CLScript/panel_info.py',
 | 
						|
                         '/usr/local/CyberCP/CLScript/CloudLinuxPackages.py',
 | 
						|
                         '/usr/local/CyberCP/CLScript/CloudLinuxUsers.py',
 | 
						|
                         '/usr/local/CyberCP/CLScript/CloudLinuxDomains.py'
 | 
						|
                , '/usr/local/CyberCP/CLScript/CloudLinuxResellers.py',
 | 
						|
                         '/usr/local/CyberCP/CLScript/CloudLinuxAdmins.py',
 | 
						|
                         '/usr/local/CyberCP/CLScript/CloudLinuxDB.py', '/usr/local/CyberCP/CLScript/UserInfo.py']
 | 
						|
 | 
						|
            for items in clScripts:
 | 
						|
                command = 'chmod +x %s' % (items)
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 600 /usr/local/CyberCP/plogical/adminPass.py'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 600 /etc/cagefs/exclude/cyberpanelexclude'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = "find /usr/local/CyberCP/ -name '*.pyc' -delete"
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8:
 | 
						|
                command = 'chown root:pdns /etc/pdns/pdns.conf'
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
                command = 'chmod 640 /etc/pdns/pdns.conf'
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
            else:
 | 
						|
                command = 'chown root:pdns /etc/powerdns/pdns.conf'
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
                command = 'chmod 640 /etc/powerdns/pdns.conf'
 | 
						|
                ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 640 /usr/local/lscp/cyberpanel/logs/access.log'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = '/usr/local/lsws/lsphp72/bin/php /usr/local/CyberCP/public/snappymail.php'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 600 /usr/local/CyberCP/public/snappymail.php'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            ###
 | 
						|
 | 
						|
            WriteToFile = open('/etc/fstab', 'a')
 | 
						|
            WriteToFile.write('proc    /proc        proc        defaults,hidepid=2    0 0\n')
 | 
						|
            WriteToFile.close()
 | 
						|
 | 
						|
            command = 'mount -o remount,rw,hidepid=2 /proc'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            ###
 | 
						|
 | 
						|
            CentOSPath = '/etc/redhat-release'
 | 
						|
            openEulerPath = '/etc/openEuler-release'
 | 
						|
 | 
						|
            if not os.path.exists(CentOSPath) or not os.path.exists(openEulerPath):
 | 
						|
                group = 'nobody'
 | 
						|
            else:
 | 
						|
                group = 'nogroup'
 | 
						|
 | 
						|
            command = 'chown root:%s /usr/local/lsws/logs' % (group)
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 750 /usr/local/lsws/logs'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            ## symlink protection
 | 
						|
 | 
						|
            writeToFile = open('/usr/lib/sysctl.d/50-default.conf', 'a')
 | 
						|
            writeToFile.writelines('fs.protected_hardlinks = 1\n')
 | 
						|
            writeToFile.writelines('fs.protected_symlinks = 1\n')
 | 
						|
            writeToFile.close()
 | 
						|
 | 
						|
            command = 'sysctl --system'
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            command = 'chmod 700 %s' % ('/home/cyberpanel')
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
            destPrivKey = "/usr/local/lscp/conf/key.pem"
 | 
						|
 | 
						|
            command = 'chmod 600 %s' % (destPrivKey)
 | 
						|
            ProcessUtilities.executioner(command, 'root', True)
 | 
						|
 | 
						|
 | 
						|
 | 
						|
        except BaseException as msg:
 | 
						|
            logging.writeToFile(str(msg) + " [fixPermissions]")
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |