HEX
Server: LiteSpeed
System: Linux php-prod-1.spaceapp.ru 5.15.0-157-generic #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025 x86_64
User: xnsbb3110 (1041)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //usr/local/CyberCP/plogical/acl.py
#!/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]")