From a2cabda371e97ede140567cc6b87ef6d2bd8fdf9 Mon Sep 17 00:00:00 2001 From: Istiak Ferdous <30789544+istiak101@users.noreply.github.com> Date: Sat, 12 Dec 2020 13:16:47 -0800 Subject: [PATCH 001/107] typo fix --- plogical/dnsUtilities.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plogical/dnsUtilities.py b/plogical/dnsUtilities.py index e63f66e9e..417860b05 100755 --- a/plogical/dnsUtilities.py +++ b/plogical/dnsUtilities.py @@ -41,7 +41,7 @@ class DNS: self.status = data[2].rstrip('\n') return 1 else: - logging.CyberCPLogFileWriter.writeToFile('User %s does not have CoudFlare configured.' % (self.admin.userName)) + logging.CyberCPLogFileWriter.writeToFile('User %s does not have CloudFlare configured.' % (self.admin.userName)) return 0 def cfTemplate(self, zoneDomain, admin, enableCheck=None): From de02d683dda895748fdfc2b2bacc0b46c34b3562 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 14 Dec 2020 15:33:59 +0500 Subject: [PATCH 002/107] bug fix: endpoint on aws backups --- cloudAPI/cloudManager.py | 37 +++++++++++++++++++++++++++---------- plogical/IncScheduler.py | 39 ++++++++++++++++++++++++++++----------- s3Backups/s3Backups.py | 19 +++++++++++++------ 3 files changed, 68 insertions(+), 27 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index 656290782..ef37bfdcd 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -1813,11 +1813,19 @@ class CloudManager: aws_access_key_id, aws_secret_access_key, region = self.fetchAWSKeys() - s3 = boto3.resource( - 's3', - aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key - ) + if region.find('http') > -1: + s3 = boto3.resource( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + endpoint_url=region + ) + else: + s3 = boto3.resource( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + ) bucket = s3.Bucket(plan.bucket) key = '%s/%s/' % (plan.name, self.data['domainName']) @@ -1861,11 +1869,20 @@ class CloudManager: aws_access_key_id, aws_secret_access_key, region = self.fetchAWSKeys() - s3 = boto3.resource( - 's3', - aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key - ) + if region.find('http') > -1: + s3 = boto3.resource( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + endpoint_url = region + ) + else: + s3 = boto3.resource( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + ) + s3.Object(plan.bucket, self.data['backupFile']).delete() final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None"}) diff --git a/plogical/IncScheduler.py b/plogical/IncScheduler.py index 4fd07d81c..0f3b4a2ef 100644 --- a/plogical/IncScheduler.py +++ b/plogical/IncScheduler.py @@ -625,11 +625,21 @@ Automatic backup failed for %s on %s. ts = time.time() retentionSeconds = 86400 * plan.retention - s3 = boto3.resource( - 's3', - aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key - ) + + if region.find('http') > -1: + s3 = boto3.resource( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + endpoint_url=region + ) + else: + s3 = boto3.resource( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + ) + bucket = s3.Bucket(plan.bucket) for file in bucket.objects.all(): @@ -642,12 +652,19 @@ Automatic backup failed for %s on %s. ### - client = boto3.client( - 's3', - aws_access_key_id = aws_access_key_id, - aws_secret_access_key = aws_secret_access_key, - #region_name=region - ) + if region.find('http') > -1: + client = boto3.client( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + endpoint_url=region + ) + else: + client = boto3.client( + 's3', + aws_access_key_id = aws_access_key_id, + aws_secret_access_key = aws_secret_access_key, + ) ## diff --git a/s3Backups/s3Backups.py b/s3Backups/s3Backups.py index 12036eac4..9b2c56d9e 100755 --- a/s3Backups/s3Backups.py +++ b/s3Backups/s3Backups.py @@ -151,12 +151,19 @@ class S3Backups(multi.Thread): aws_access_key_id, aws_secret_access_key, region = self.fetchAWSKeys() - s3 = boto3.resource( - 's3', - aws_access_key_id = aws_access_key_id, - aws_secret_access_key = aws_secret_access_key, - region_name=region - ) + if region.find('http') > -1: + s3 = boto3.resource( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + endpoint_url=region + ) + else: + s3 = boto3.resource( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + ) json_data = "[" checker = 0 From 46ea3766aa3d793b7c1f28b666b9ceefbc283ea0 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 16 Dec 2020 20:24:01 +0500 Subject: [PATCH 003/107] feature: enable cloudlinux reseller limits --- CLScript/CloudLinuxResellers.py | 11 ++++++++++- CLScript/CloudLinuxUsers.py | 6 +++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/CLScript/CloudLinuxResellers.py b/CLScript/CloudLinuxResellers.py index 0f93d04a6..c5a1e3683 100755 --- a/CLScript/CloudLinuxResellers.py +++ b/CLScript/CloudLinuxResellers.py @@ -23,17 +23,26 @@ class CloudLinuxResellers(CLMain): self.name = name def listAll(self, owner=None): + import pwd users = [] acl = ACL.objects.get(name='reseller') + from plogical.vhost import vhost for items in Administrator.objects.filter(acl=acl): if self.name != None: if self.name != items.userName: continue + + try: + uid = pwd.getpwnam(items.userName).pw_uid + except: + vhost.addUser(items.userName, '/home/%s' % (items.userName)) + uid = pwd.getpwnam(items.userName).pw_uid + user = {'name': items.userName, "locale_code": "EN_us", "email": items.email, - "id": None + "id": uid } users.append(user) diff --git a/CLScript/CloudLinuxUsers.py b/CLScript/CloudLinuxUsers.py index bdc984655..1ae5b725b 100755 --- a/CLScript/CloudLinuxUsers.py +++ b/CLScript/CloudLinuxUsers.py @@ -81,7 +81,7 @@ class CloudLinuxUsers(CLMain): for webs in websites: try: itemPackage = webs.package - package = {'name': itemPackage.packageName, 'owner': webs.externalApp} + package = {'name': itemPackage.packageName, 'owner': webs.admin.userName} user = {} @@ -92,7 +92,7 @@ class CloudLinuxUsers(CLMain): user['username'] = webs.externalApp if self.ow: - user['owner'] = webs.externalApp + user['owner'] = webs.admin.userName if self.domain: user['domain'] = webs.domain @@ -133,7 +133,7 @@ class CloudLinuxUsers(CLMain): if self.owner == None: websites = Websites.objects.all() else: - websites = Websites.objects.filter(externalApp=self.owner) + websites = Websites.objects.filter(admin__userName=self.owner) if self.username != None: websites = websites.filter(externalApp=self.username) From e36b6b8a6a3ca362d06e9ebdf829f81eefbb62b3 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 17 Dec 2020 14:20:54 +0500 Subject: [PATCH 004/107] fix further minor issues in cloudlinux --- CLScript/CloudLinuxUsers.py | 13 +++++++++++-- CLScript/UserInfo.py | 7 ++++++- plogical/virtualHostUtilities.py | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/CLScript/CloudLinuxUsers.py b/CLScript/CloudLinuxUsers.py index 1ae5b725b..a26d2e9e5 100755 --- a/CLScript/CloudLinuxUsers.py +++ b/CLScript/CloudLinuxUsers.py @@ -92,7 +92,12 @@ class CloudLinuxUsers(CLMain): user['username'] = webs.externalApp if self.ow: - user['owner'] = webs.admin.userName + if webs.admin.owner == 1: + user['owner'] = webs.admin.userName + else: + from loginSystem.models import Administrator + oAdmin = Administrator.objects.get(pk=webs.admin.owner) + user['owner'] = oAdmin.userName if self.domain: user['domain'] = webs.domain @@ -133,7 +138,11 @@ class CloudLinuxUsers(CLMain): if self.owner == None: websites = Websites.objects.all() else: - websites = Websites.objects.filter(admin__userName=self.owner) + from loginSystem.models import Administrator + from plogical.acl import ACLManager + oAdmin = Administrator.objects.get(userName=self.owner) + currentACL = ACLManager.loadedACL(oAdmin.pk) + websites = ACLManager.findWebsiteObjects(currentACL, oAdmin.pk) if self.username != None: websites = websites.filter(externalApp=self.username) diff --git a/CLScript/UserInfo.py b/CLScript/UserInfo.py index 472b614f3..55b266be9 100755 --- a/CLScript/UserInfo.py +++ b/CLScript/UserInfo.py @@ -2,10 +2,15 @@ import getpass def main(): + import pwd if getpass.getuser() == 'root': userType = "admin" else: - userType = "user" + try: + uid = pwd.getpwnam(getpass.getuser()).pw_uid + userType = 'reseller' + except: + userType = 'user' data = """{ "userName": "%s", diff --git a/plogical/virtualHostUtilities.py b/plogical/virtualHostUtilities.py index 899814849..09d28eb9c 100755 --- a/plogical/virtualHostUtilities.py +++ b/plogical/virtualHostUtilities.py @@ -261,7 +261,7 @@ class virtualHostUtilities: CLPath = '/etc/sysconfig/cloudlinux' if os.path.exists(CLPath): - command = '/usr/share/cloudlinux/hooks/post_modify_user.py create --username %s --owner %s' % (virtualHostUser, virtualHostUser) + command = '/usr/share/cloudlinux/hooks/post_modify_user.py create --username %s --owner %s' % (virtualHostUser, admin.userName) ProcessUtilities.executioner(command) ### For autodiscover of mail clients. From 68a7c8c18a4ed0447e8f859ffff57572acd9d6bd Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 17 Dec 2020 21:09:50 +0500 Subject: [PATCH 005/107] feature: allow imunify install without cloudlinux' --- firewall/firewallManager.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/firewall/firewallManager.py b/firewall/firewallManager.py index 7c51b7213..821b6a4fb 100755 --- a/firewall/firewallManager.py +++ b/firewall/firewallManager.py @@ -1567,10 +1567,7 @@ class FirewallManager: data = {} data['ipAddress'] = fullAddress - if os.path.exists(FirewallManager.CLPath): - data['CL'] = 1 - else: - data['CL'] = 0 + data['CL'] = 1 if os.path.exists(FirewallManager.imunifyPath): data['imunify'] = 1 From 4380adb751804421d1f5f934ebe1961c04080a74 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 18 Dec 2020 00:01:01 +0500 Subject: [PATCH 006/107] bug fix: imunif360 access url --- firewall/templates/firewall/imunify.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firewall/templates/firewall/imunify.html b/firewall/templates/firewall/imunify.html index d599ed09b..02e663ad2 100755 --- a/firewall/templates/firewall/imunify.html +++ b/firewall/templates/firewall/imunify.html @@ -27,7 +27,7 @@

{% trans "Imunify is now integrated via their new API. You can manage Imunify by clicking below. You can use your server root credentials to access Imunify." %}


- + From db83fb9530e117c4dc5cd30ef526b9a10811b9eb Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 18 Dec 2020 01:02:49 +0500 Subject: [PATCH 007/107] refactor: install code for dovecot/postfix on ubuntu20 --- CLScript/CloudLinuxResellers.py | 1 - install/install.py | 170 ++++++++++++-------------------- 2 files changed, 65 insertions(+), 106 deletions(-) diff --git a/CLScript/CloudLinuxResellers.py b/CLScript/CloudLinuxResellers.py index c5a1e3683..c64509b33 100755 --- a/CLScript/CloudLinuxResellers.py +++ b/CLScript/CloudLinuxResellers.py @@ -14,7 +14,6 @@ import argparse import json from CLScript.CLMain import CLMain - class CloudLinuxResellers(CLMain): def __init__(self, id, name): diff --git a/install/install.py b/install/install.py index 89823b25f..b3e00ac97 100755 --- a/install/install.py +++ b/install/install.py @@ -766,28 +766,21 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; command = 'dnf install --enablerepo=gf-plus postfix3 postfix3-mysql -y' else: - command = 'apt-get -y debconf-utils' - preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) - file_name = self.cwd + '/pf.unattend.text' - pf = open(file_name, 'w') - pf.write('postfix postfix/mailname string ' + str(socket.getfqdn() + '\n')) - pf.write('postfix postfix/main_mailer_type string "Internet Site"\n') - pf.close() - command = 'debconf-set-selections ' + file_name - preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) + # command = 'apt-get -y debconf-utils' + # preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) + # file_name = self.cwd + '/pf.unattend.text' + # pf = open(file_name, 'w') + # pf.write('postfix postfix/mailname string ' + str(socket.getfqdn() + '\n')) + # pf.write('postfix postfix/main_mailer_type string "Internet Site"\n') + # pf.close() + # command = 'debconf-set-selections ' + file_name + # preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) - command = 'apt-get -y install postfix' + command = 'apt-get -y install postfix postfix-mysql' # os.remove(file_name) preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - if self.distro == centos or self.distro == cent8: - pass - else: - command = 'apt-get -y install dovecot-imapd dovecot-pop3d postfix-mysql' - - preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - ## if self.distro == centos: @@ -795,42 +788,42 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; elif self.distro == cent8: command = 'dnf install --enablerepo=gf-plus dovecot23 dovecot23-mysql -y' else: - command = 'apt-get -y install dovecot-mysql' + command = 'apt-get -y install dovecot-mysql dovecot-imapd dovecot-pop3d' preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) - if self.distro != centos: - command = 'curl https://repo.dovecot.org/DOVECOT-REPO-GPG | gpg --import' - subprocess.call(command, shell=True) - - command = 'gpg --export ED409DA1 > /etc/apt/trusted.gpg.d/dovecot.gpg' - subprocess.call(command, shell=True) - - debPath = '/etc/apt/sources.list.d/dovecot.list' - writeToFile = open(debPath, 'w') - writeToFile.write('deb https://repo.dovecot.org/ce-2.3-latest/ubuntu/bionic bionic main\n') - writeToFile.close() - - try: - command = 'apt update -y' - subprocess.call(command, shell=True) - except: - pass - - try: - command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y' - subprocess.call(command, shell=True) - - command = 'dpkg --configure -a' - subprocess.call(command, shell=True) - - command = 'apt --fix-broken install -y' - subprocess.call(command, shell=True) - - command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y' - subprocess.call(command, shell=True) - except: - pass + # if self.distro != centos: + # command = 'curl https://repo.dovecot.org/DOVECOT-REPO-GPG | gpg --import' + # subprocess.call(command, shell=True) + # + # command = 'gpg --export ED409DA1 > /etc/apt/trusted.gpg.d/dovecot.gpg' + # subprocess.call(command, shell=True) + # + # debPath = '/etc/apt/sources.list.d/dovecot.list' + # writeToFile = open(debPath, 'w') + # writeToFile.write('deb https://repo.dovecot.org/ce-2.3-latest/ubuntu/bionic bionic main\n') + # writeToFile.close() + # + # try: + # command = 'apt update -y' + # subprocess.call(command, shell=True) + # except: + # pass + # + # try: + # command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y' + # subprocess.call(command, shell=True) + # + # command = 'dpkg --configure -a' + # subprocess.call(command, shell=True) + # + # command = 'apt --fix-broken install -y' + # subprocess.call(command, shell=True) + # + # command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y' + # subprocess.call(command, shell=True) + # except: + # pass except BaseException as msg: logging.InstallLog.writeToFile('[ERROR] ' + str(msg) + " [install_postfix_davecot]") @@ -845,20 +838,14 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; os.chdir(self.cwd) - if mysql == 'Two': - mysql_virtual_domains = "email-configs/mysql-virtual_domains.cf" - mysql_virtual_forwardings = "email-configs/mysql-virtual_forwardings.cf" - mysql_virtual_mailboxes = "email-configs/mysql-virtual_mailboxes.cf" - mysql_virtual_email2email = "email-configs/mysql-virtual_email2email.cf" - davecotmysql = "email-configs/dovecot-sql.conf.ext" - else: - mysql_virtual_domains = "email-configs-one/mysql-virtual_domains.cf" - mysql_virtual_forwardings = "email-configs-one/mysql-virtual_forwardings.cf" - mysql_virtual_mailboxes = "email-configs-one/mysql-virtual_mailboxes.cf" - mysql_virtual_email2email = "email-configs-one/mysql-virtual_email2email.cf" - davecotmysql = "email-configs-one/dovecot-sql.conf.ext" + mysql_virtual_domains = "email-configs-one/mysql-virtual_domains.cf" + mysql_virtual_forwardings = "email-configs-one/mysql-virtual_forwardings.cf" + mysql_virtual_mailboxes = "email-configs-one/mysql-virtual_mailboxes.cf" + mysql_virtual_email2email = "email-configs-one/mysql-virtual_email2email.cf" + davecotmysql = "email-configs-one/dovecot-sql.conf.ext" - ### update password: + + ### update password: data = open(davecotmysql, "r").readlines() @@ -875,8 +862,6 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; else: writeDataToFile.writelines(items) - # if self.distro == ubuntu: - # os.fchmod(writeDataToFile.fileno(), stat.S_IRUSR | stat.S_IWUSR) writeDataToFile.close() @@ -894,9 +879,6 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; else: writeDataToFile.writelines(items) - # if self.distro == ubuntu: - # os.fchmod(writeDataToFile.fileno(), stat.S_IRUSR | stat.S_IWUSR) - writeDataToFile.close() ### update password: @@ -913,9 +895,6 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; else: writeDataToFile.writelines(items) - # if self.distro == ubuntu: - # os.fchmod(writeDataToFile.fileno(), stat.S_IRUSR | stat.S_IWUSR) - writeDataToFile.close() ### update password: @@ -932,9 +911,6 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; else: writeDataToFile.writelines(items) - # if self.distro == ubuntu: - # os.fchmod(writeDataToFile.fileno(), stat.S_IRUSR | stat.S_IWUSR) - writeDataToFile.close() ### update password: @@ -951,9 +927,6 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; else: writeDataToFile.writelines(items) - # if self.distro == ubuntu: - # os.fchmod(writeDataToFile.fileno(), stat.S_IRUSR | stat.S_IWUSR) - writeDataToFile.close() @@ -1060,37 +1033,24 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; # Cleanup config files for ubuntu if self.distro == ubuntu: preFlightsChecks.stdOut("Cleanup postfix/dovecot config files", 1) - if mysql == 'Two': - self.centos_lib_dir_to_ubuntu("email-configs/master.cf", "/usr/libexec/", "/usr/lib/") - self.centos_lib_dir_to_ubuntu("email-configs/main.cf", "/usr/libexec/postfix", - "/usr/lib/postfix/sbin") - else: - self.centos_lib_dir_to_ubuntu("email-configs-one/master.cf", "/usr/libexec/", "/usr/lib/") - self.centos_lib_dir_to_ubuntu("email-configs-one/main.cf", "/usr/libexec/postfix", - "/usr/lib/postfix/sbin") + + self.centos_lib_dir_to_ubuntu("email-configs-one/master.cf", "/usr/libexec/", "/usr/lib/") + self.centos_lib_dir_to_ubuntu("email-configs-one/main.cf", "/usr/libexec/postfix", + "/usr/lib/postfix/sbin") ########### Copy config files - if mysql == 'Two': - shutil.copy("email-configs/mysql-virtual_domains.cf", "/etc/postfix/mysql-virtual_domains.cf") - shutil.copy("email-configs/mysql-virtual_forwardings.cf", "/etc/postfix/mysql-virtual_forwardings.cf") - shutil.copy("email-configs/mysql-virtual_mailboxes.cf", "/etc/postfix/mysql-virtual_mailboxes.cf") - shutil.copy("email-configs/mysql-virtual_email2email.cf", "/etc/postfix/mysql-virtual_email2email.cf") - shutil.copy("email-configs/main.cf", main) - shutil.copy("email-configs/master.cf", master) - shutil.copy("email-configs/dovecot.conf", davecot) - shutil.copy("email-configs/dovecot-sql.conf.ext", davecotmysql) - else: - shutil.copy("email-configs-one/mysql-virtual_domains.cf", "/etc/postfix/mysql-virtual_domains.cf") - shutil.copy("email-configs-one/mysql-virtual_forwardings.cf", - "/etc/postfix/mysql-virtual_forwardings.cf") - shutil.copy("email-configs-one/mysql-virtual_mailboxes.cf", "/etc/postfix/mysql-virtual_mailboxes.cf") - shutil.copy("email-configs-one/mysql-virtual_email2email.cf", - "/etc/postfix/mysql-virtual_email2email.cf") - shutil.copy("email-configs-one/main.cf", main) - shutil.copy("email-configs-one/master.cf", master) - shutil.copy("email-configs-one/dovecot.conf", davecot) - shutil.copy("email-configs-one/dovecot-sql.conf.ext", davecotmysql) + shutil.copy("email-configs-one/mysql-virtual_domains.cf", "/etc/postfix/mysql-virtual_domains.cf") + shutil.copy("email-configs-one/mysql-virtual_forwardings.cf", + "/etc/postfix/mysql-virtual_forwardings.cf") + shutil.copy("email-configs-one/mysql-virtual_mailboxes.cf", "/etc/postfix/mysql-virtual_mailboxes.cf") + shutil.copy("email-configs-one/mysql-virtual_email2email.cf", + "/etc/postfix/mysql-virtual_email2email.cf") + shutil.copy("email-configs-one/main.cf", main) + shutil.copy("email-configs-one/master.cf", master) + shutil.copy("email-configs-one/dovecot.conf", davecot) + shutil.copy("email-configs-one/dovecot-sql.conf.ext", davecotmysql) + ######################################## Permissions From 82eb1e4d2c593a391d1acccd3f59233067a00f56 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 18 Dec 2020 01:49:25 +0500 Subject: [PATCH 008/107] refactor: install code for dovecot/postfix on ubuntu20 --- install/install.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/install/install.py b/install/install.py index b3e00ac97..fe9c43845 100755 --- a/install/install.py +++ b/install/install.py @@ -766,15 +766,15 @@ $cfg['Servers'][$i]['LogoutURL'] = 'phpmyadminsignin.php?logout'; command = 'dnf install --enablerepo=gf-plus postfix3 postfix3-mysql -y' else: - # command = 'apt-get -y debconf-utils' - # preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) - # file_name = self.cwd + '/pf.unattend.text' - # pf = open(file_name, 'w') - # pf.write('postfix postfix/mailname string ' + str(socket.getfqdn() + '\n')) - # pf.write('postfix postfix/main_mailer_type string "Internet Site"\n') - # pf.close() - # command = 'debconf-set-selections ' + file_name - # preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) + command = 'apt-get -y debconf-utils' + preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) + file_name = self.cwd + '/pf.unattend.text' + pf = open(file_name, 'w') + pf.write('postfix postfix/mailname string ' + str(socket.getfqdn() + '\n')) + pf.write('postfix postfix/main_mailer_type string "Internet Site"\n') + pf.close() + command = 'debconf-set-selections ' + file_name + preFlightsChecks.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) command = 'apt-get -y install postfix postfix-mysql' # os.remove(file_name) From c57fccf1f05c8ee70a805774dcfaa16a73880c64 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 18 Dec 2020 14:05:01 +0500 Subject: [PATCH 009/107] refactor: upgrade code for dovecot/postfix on ubuntu20 --- plogical/upgrade.py | 81 --------------------------------------------- 1 file changed, 81 deletions(-) diff --git a/plogical/upgrade.py b/plogical/upgrade.py index 5ddd6d4d2..ed209b651 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -2061,87 +2061,6 @@ echo $oConfig->Save() ? 'Done' : 'Error'; command = 'systemctl restart postfix' Upgrade.executioner(command, 0) - else: - if Upgrade.installedOutput.find('dovecot-mysql/bionic,now 2:2.3.10-2') == -1: - - command = 'curl https://repo.dovecot.org/DOVECOT-REPO-GPG | gpg --import' - subprocess.call(command, shell=True) - - command = 'gpg --export ED409DA1 > /etc/apt/trusted.gpg.d/dovecot.gpg' - subprocess.call(command, shell=True) - - debPath = '/etc/apt/sources.list.d/dovecot.list' - writeToFile = open(debPath, 'w') - writeToFile.write('deb https://repo.dovecot.org/ce-2.3-latest/ubuntu/bionic bionic main\n') - writeToFile.close() - - try: - command = 'apt update -y' - Upgrade.executioner(command, 0) - except: - pass - - try: - command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y' - subprocess.call(command, shell=True) - - command = 'dpkg --configure -a' - Upgrade.executioner(command, 0) - - command = 'apt --fix-broken install -y' - Upgrade.executioner(command, 0) - - command = 'DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical sudo apt-get -q -y -o "Dpkg::Options::=--force-confdef" -o "Dpkg::Options::=--force-confold" --only-upgrade install dovecot-mysql -y' - subprocess.call(command, shell=True) - except: - pass - - ### Restore dovecot/postfix conf - - command = 'cp -pR %s/dovecot/ /etc/' % (configbackups) - Upgrade.executioner(command, 0) - - command = 'cp -pR %s/postfix/ /etc/' % (configbackups) - Upgrade.executioner(command, 0) - - ## Restored - - ## Remove Default Password Scheme - - path = '/etc/dovecot/dovecot-sql.conf.ext' - - data = open(path, 'r').readlines() - - updatePasswords = 0 - - writeToFile = open(path, 'w') - for items in data: - if items.find('default_pass_scheme') > -1: - updatePasswords = 1 - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - Upgrade.stdOut("Upgrading passwords...") - - import django - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") - django.setup() - from mailServer.models import EUsers - - for items in EUsers.objects.all(): - if items.password.find('CRYPT') > -1: - continue - command = 'doveadm pw -p %s' % (items.password) - items.password = subprocess.check_output(shlex.split(command)).decode("utf-8").strip('\n') - items.save() - - - command = "systemctl restart dovecot" - Upgrade.executioner(command, 0) - dovecotConf = '/etc/dovecot/dovecot.conf' dovecotContent = open(dovecotConf, 'r').read() From d32104337e2d18d8d2b3082478b4952d4bce1f9a Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 20 Dec 2020 05:58:08 +0500 Subject: [PATCH 010/107] bug fix: supply aws region --- plogical/backupUtilities.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index a2654ca8c..d59b9fefe 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -1661,10 +1661,18 @@ class backupUtilities: aws_access_key_id, aws_secret_access_key, region = self.fetchAWSKeys() - s3 = boto3.resource( + if region.find('http') > -1: + s3 = boto3.resource( 's3', aws_access_key_id=aws_access_key_id, - aws_secret_access_key=aws_secret_access_key + aws_secret_access_key=aws_secret_access_key, + endpoint_url=region + ) + else: + s3 = boto3.resource( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, ) self.BackupPath = '/home/cyberpanel/backups/%s/%s' % (self.extraArgs['domain'], self.extraArgs['backupFile'].split('/')[-1]) From c517fb8ce20581128735780ce7103be069fd59b6 Mon Sep 17 00:00:00 2001 From: Jordan Lambrecht Date: Mon, 21 Dec 2020 14:06:45 -0600 Subject: [PATCH 011/107] fixed typo --- .../static/loginSystem/{login-systen.js => login-system.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename loginSystem/static/loginSystem/{login-systen.js => login-system.js} (100%) diff --git a/loginSystem/static/loginSystem/login-systen.js b/loginSystem/static/loginSystem/login-system.js similarity index 100% rename from loginSystem/static/loginSystem/login-systen.js rename to loginSystem/static/loginSystem/login-system.js From e23e48d965c648f82cf2cf74b4b4df859824eb2e Mon Sep 17 00:00:00 2001 From: Jordan Lambrecht Date: Mon, 21 Dec 2020 14:09:28 -0600 Subject: [PATCH 012/107] Cleaned up login page UI --- .../assets/finalLoginPageCSS/allCss.css | 5614 ++++++++++++++-- loginSystem/templates/loginSystem/login.html | 526 +- loginSystem/templates/loginSystem/test.html | 4 +- .../assets/finalLoginPageCSS/allCss.css | 5630 +++++++++++++++-- 4 files changed, 10491 insertions(+), 1283 deletions(-) diff --git a/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/allCss.css b/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/allCss.css index 5c059ba8c..9b03e0ba8 100755 --- a/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/allCss.css +++ b/baseTemplate/static/baseTemplate/assets/finalLoginPageCSS/allCss.css @@ -1,55 +1,4109 @@ -pre,pre code{white-space:pre-wrap}.clear,.form-row:after,.row:after{clear:both}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus,:active,:focus,:visited,a,a:active,a:focus,a:visited{outline:0}.xchart .color0 .line,.xchart .color0 circle,.xchart .color0.comp .line{stroke:#00bca4}.xchart .color0 .line .fill,.xchart .color1 .line .fill{pointer-events:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body,button,figure{margin:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-size:1em}q{quotes:'\201C''\201D''\2018''\2019'}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}button,input,select,textarea{font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}.collapsing,.divider,.overflow-hidden,.sr-only{overflow:hidden}table{border-spacing:0;border-collapse:collapse}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*{color:#000!important;background:0 0!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:' (' attr(href)')'}abbr[title]:after{content:' (' attr(title)')'}.ir a:after,a[href^='javascript:']:after,a[href^='#']:after{content:''}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}@page{margin:2cm .5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.jGrowl{display:none}}small{font-size:85%}a{text-decoration:none}html{font-size:62.5%;-webkit-tap-highlight-color:transparent}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.jqstooltip{box-sizing:content-box}.form-row,.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-right:-10px;margin-left:-10px}.form-row:after,.form-row:before,.row:after,.row:before{display:table;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;content:' '}blockquote small,pre{line-height:1.428571429;display:block}[class*=col-]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:10px;padding-left:10px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.333333333333332%}.col-xs-2{width:16.666666666666664%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333333333%}.col-xs-5{width:41.66666666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333333333336%}.col-xs-8{width:66.66666666666666%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333333334%}.col-xs-11{width:91.66666666666666%}.col-xs-12{width:100%}@media (min-width:768px){.boxed-layout #page-header,.boxed-layout #page-wrapper,.container{max-width:750px}.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media (min-width:992px){.boxed-layout #page-header,.boxed-layout #page-wrapper,.container{max-width:970px}.col-md-1,.col-md-10,.col-md-11,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media (min-width:1200px){.boxed-layout #page-header,.boxed-layout #page-wrapper,.container{max-width:1170px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}.row.no-gutter{margin-left:0;margin-right:0}.no-gutter>[class*=col-]{padding-left:0;padding-right:0}.pad5A{padding:5px!important}.pad5T{padding-top:5px!important}.pad5R{padding-right:5px!important}.pad5B{padding-bottom:5px!important}.pad5L{padding-left:5px!important}.pad10A{padding:10px!important}.pad10T{padding-top:10px!important}.pad10R{padding-right:10px!important}.pad10B{padding-bottom:10px!important}.pad10L{padding-left:10px!important}.pad15A{padding:15px!important}.pad15T{padding-top:15px!important}.pad15R{padding-right:15px!important}.pad15B{padding-bottom:15px!important}.pad15L{padding-left:15px!important}.pad20A{padding:20px!important}.pad20T{padding-top:20px!important}.pad20R{padding-right:20px!important}.pad20B{padding-bottom:20px!important}.pad20L{padding-left:20px!important}.pad25A{padding:25px!important}.pad25T{padding-top:25px!important}.pad25R{padding-right:25px!important}.pad25B{padding-bottom:25px!important}.pad25L{padding-left:25px!important}.pad45A{padding:45px!important}.pad45T{padding-top:45px!important}.pad45R{padding-right:45px!important}.pad45B{padding-bottom:45px!important}.pad45L{padding-left:45px!important}.pad0A{padding:0!important}.pad0T{padding-top:0!important}.pad0R{padding-right:0!important}.pad0B{padding-bottom:0!important}.pad0L{padding-left:0!important}.mrg5A{margin:5px!important}.mrg5T{margin-top:5px!important}.mrg5R{margin-right:5px!important}.mrg5B{margin-bottom:5px!important}.mrg5L{margin-left:5px!important}.mrg10A{margin:10px!important}.mrg10T{margin-top:10px!important}.mrg10R{margin-right:10px!important}.mrg10B{margin-bottom:10px!important}.mrg10L{margin-left:10px!important}.mrg15A{margin:15px!important}.mrg15T{margin-top:15px!important}.mrg15R{margin-right:15px!important}.mrg15B{margin-bottom:15px!important}.mrg15L{margin-left:15px!important}.mrg20A{margin:20px!important}.mrg20T{margin-top:20px!important}.mrg20R{margin-right:20px!important}.mrg20B{margin-bottom:20px!important}.mrg20L{margin-left:20px!important}.mrg25A{margin:25px!important}.mrg25T{margin-top:25px!important}.mrg25R{margin-right:25px!important}.mrg25B{margin-bottom:25px!important}.mrg25L{margin-left:25px!important}.mrg45A{margin:45px!important}.mrg45T{margin-top:45px!important}.mrg45R{margin-right:45px!important}.mrg45B{margin-bottom:45px!important}.mrg45L{margin-left:45px!important}.mrg0A{margin:0!important}.mrg0T{margin-top:0!important}.mrg0R{margin-right:0!important}.mrg0B{margin-bottom:0!important}.mrg0L{margin-left:0!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;margin:0}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400}.h1,h1{font-size:38px}.h2,h2{font-size:26px}.h3,h3{font-size:20px}.h4,h4{font-size:16px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:75%}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:50;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right .small,blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right .small:before,blockquote.pull-right small:before{content:''}blockquote.pull-right .small:after,blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before{content:''}address{font-style:normal;line-height:1.428571429;margin-bottom:20px}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{font-size:90%;padding:0 4px;white-space:nowrap;color:#d05;border:1px solid #dfe8f1;border-radius:3px;background:#fafafa}pre{font-size:13px;margin:0 0 10px;padding:9.5px;word-wrap:break-word;word-break:break-all;color:#333;border:1px solid #ccc;border-radius:4px;background-color:#f5f5f5}pre code{font-size:inherit;padding:0;color:inherit;border-radius:0;background-color:transparent}.btn,.fc-button,.input-group-btn,.text-no-wrap{white-space:nowrap}p{line-height:1.6em;margin:0}.title-hero{margin:0 0 15px;padding:0;text-transform:uppercase;font-size:14px;opacity:.7}h4.title-hero{font-size:15px}.title-lead{color:#3F3F3F}.title-hero .title-lead{font-size:65%;margin:5px 0 0}.title-hero+.title-lead{margin-top:-10px}.jumbotron{font-size:21px;font-weight:200;line-height:2.1428571435;margin-bottom:30px;padding:30px;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.float-left,.pull-left{float:left!important}.float-right,.pull-right{float:right!important}.float-none{float:none!important}.font-size-10{font-size:10px!important}.font-size-11{font-size:11px!important}.font-size-12{font-size:12px!important}.font-size-13{font-size:13px!important}.font-size-14{font-size:14px!important}.font-size-15{font-size:15px!important}.font-size-16{font-size:16px!important}.font-size-17{font-size:17px!important}.font-size-18{font-size:18px!important}.font-size-20{font-size:20px!important}.font-size-23{font-size:23px!important}.font-size-26{font-size:26px!important}.font-size-28{font-size:28px!important}.font-size-35{font-size:35px!important}.font-size-50{font-size:50px!important}.text-center{text-align:center!important}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-justify{text-align:justify}.text-transform-none{text-transform:none}.text-transform-upr{text-transform:uppercase}.text-transform-low{text-transform:lowercase}.text-transform-cap{text-transform:capitalize}.font-bold{font-weight:700!important}.btn,.fc-button,.font-normal{font-weight:400}.font-italic{font-style:italic}.font-none{font-style:none}.clear-none{clear:none!important}#page-wrapper:after,.btn-group:after,.btn-toolbar:after,.button-pane:after,.chat-box li:after,.clearfix:after,.comments-list li .panel-body:after,.container:after,.content-box-header:after,.example-box-wrapper:after,.files-box li:after,.form-horizontal .form-group:after,.form-input-prepend:after,.form-row:after,.info-box:after,.messages-box li:after,.nav-list li:after,.nav:after,.notifications-box li:after,.pager:after,.posts-list li:after,.tl-item:after,.tl-row:after,.todo-box li:after,.ui-datepicker-buttonpane:after,.ui-helper-clearfix:after{clear:both}.ui-front{z-index:100}.wrapper-sticky{z-index:15}.hide,.lazy,.mix,.tab-pane,[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.tab-pane{padding:15px}.hidden,.ui-helper-hidden-accessible{display:none!important}.display-block{position:relative!important;display:block!important}.display-block .button-content{float:none}.display-block.dropdown-menu{position:static!important}.display-inline{display:inline-block}.no-border{border-color:transparent!important}.dropdown-menu.pad0A .hasDatepicker .ui-datepicker,.remove-border{border:0!important}.border-top{border-top-width:3px!important;border-top-style:solid!important}.width-100{box-sizing:border-box;width:100%}.center-margin{float:none!important;margin:0 auto}.center-block,.container{display:block;margin-right:auto;margin-left:auto}.center-vertical{position:relative;z-index:15;top:0;left:0;display:table;width:100%;height:100%}.center-vertical .center-content{display:table-cell;vertical-align:middle}.position-absolute{position:absolute}.show{display:block!important}.hidden{display:none!important;visibility:hidden!important}.invisible{visibility:hidden}.center-div{float:none!important;margin-right:auto!important;margin-left:auto!important;text-align:center!important}.btn-group>.btn-group,.btn-toolbar .btn-group,.btn-toolbar .input-group,.demo-icon{float:left}.divider,.nav-divider{ityity:.7;-moz-opacity:.7;filter:alpha(opacity: 70)}.divider{height:1px;margin:10px 0;padding:0}.divider-header{font-size:11px;padding:10px 15px;text-transform:uppercase;opacity:.2;color:#fff}.width-reset{width:auto!important}.opacity-10{opacity:.1!important;-moz-opacity:.1!important;filter:alpha(opacity: 10)!important}.info-box b,.info-box.icon-wrapper .icon-large,.opacity-30{opacity:.3!important;-moz-opacity:.3!important;filter:alpha(opacity: 30)!important}.opacity-40{opacity:.4!important;-moz-opacity:.4!important;filter:alpha(opacity: 40)!important}.info-box b,.label-description span,.opacity-60,.opacity-hover{opacity:.6!important;-moz-opacity:.6!important;filter:alpha(opacity: 60)!important}.no-shadow.transparent.btn:hover i,.opacity-80,.ui-datepicker-current.ui-priority-secondary{opacity:.8!important;-moz-opacity:.8!important;filter:alpha(opacity: 80)!important}.opacity-100,.opacity-hover:hover{opacity:1!important;-moz-opacity:1!important;filter:alpha(opacity: 100)!important}.btn-link .glyph-icon.opacity-hover{margin:0 -5px}.transparent{border-color:transparent!important;background:0 0!important;box-shadow:0 0 0 0 transparent!important}.no-shadow{box-shadow:0 0 0 transparent!important}.remove-bg{background:0 0}.nicescroll-rails{background:0 0!important}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}#loading,.login-img,.ui-widget-overlay{width:100%;height:100%}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:'';border-top:0;border-bottom:4px solid}.chosen-results,.form-wizard>ul,.nav-list ul,.nav-list-horizontal ul,.parsley-errors-list,.reset-ul,.tabs-navigation>ul,ul.messages-box,ul.notifications-box,ul.progress-box{margin:0;padding:0;list-style:none}#page-wrapper:after,#page-wrapper:before,.btn-group:after,.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.button-pane:after,.button-pane:before,.chat-box li:after,.chat-box li:before,.clearfix:after,.clearfix:before,.comments-list li .panel-body:after,.comments-list li .panel-body:before,.container:after,.container:before,.content-box-header:after,.content-box-header:before,.example-box-wrapper:after,.example-box-wrapper:before,.files-box li:after,.files-box li:before,.form-input-prepend:after,.form-input-prepend:before,.form-row:after,.form-row:before,.info-box:after,.info-box:before,.messages-box li:after,.messages-box li:before,.nav-list li:after,.nav-list li:before,.nav:after,.nav:before,.notifications-box li:after,.notifications-box li:before,.pager:after,.pager:before,.posts-list li:after,.posts-list li:before,.tl-item:after,.tl-item:before,.tl-row:after,.tl-row:before,.todo-box li:after,.todo-box li:before,.ui-datepicker-buttonpane:after,.ui-datepicker-buttonpane:before,.ui-helper-clearfix:after,.ui-helper-clearfix:before{display:table;content:''}.ui-sortable-placeholder{visibility:visible!important;border:1px dashed #efda2c!important;background:#fffce5!important}.daterangepicker td.available.in-range:hover,.daterangepicker td.in-range{background:#fffce5}.checker.disabled,.checker.disabled span,.chosen-disabled,.disabled,.radio.disabled,.radio.disabled span,.ui-rangeSlider-disabled .ui-rangeSlider-arrow,.ui-rangeSlider-disabled .ui-rangeSlider-container,.ui-rangeSlider-disabled .ui-rangeSlider-label,.ui-state-disabled,button[disabled]{cursor:not-allowed!important;opacity:.65;filter:alpha(opacity: 65)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control,input[disabled],select[disabled],textarea[disabled]{cursor:not-allowed;opacity:.65;background:#fafafa;filter:alpha(opacity: 65)}input[readonly],select[readonly],textarea[readonly]{opacity:.8;background:#fdfdfd;-moz-opacity:.8;filter:alpha(opacity: 80)}.login-img{position:fixed!important;top:0;left:0}.fixed-bg{background-repeat:no-repeat;background-attachment:fixed;background-position:center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}.ui-widget-overlay{position:fixed;left:0;top:0;bottom:0;right:0;text-align:center;z-index:16}.ui-widget-overlay img{position:absolute;top:50%;left:50%;margin:-26px 0 0 -26px}#loading{z-index:5555;position:fixed;left:0;top:0;background:#fff}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.collapse{display:none}.collapse.in,.tab-pane.active{display:block}.collapsing{position:relative;height:0;-webkit-transition:height .35s ease;transition:height .35s ease}.small-padding{padding:25px 0}.medium-padding{padding:55px 0}.large-padding{padding:85px 0}.xlarge-padding{padding:115px 0}.glyph-icon{text-align:center}#page-sidebar li a.sf-with-ul:after,#page-sidebar li ul li a:before,.dataTables_paginate a i:before,.fc-icon,.glyph-icon:before,.search-choice-close:before,.ui-dialog-titlebar-close:before,.ui-icon:before{font-family:FontAwesome;font-weight:400;font-style:normal;display:inline-block;text-align:center;text-decoration:none;background:0 0;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{cursor:not-allowed;text-decoration:none;background-color:transparent;background-image:none;filter:progid: DXImageTransform.Microsoft.gradient(enabled=false)}.sr-only{position:absolute;clip:rect(0,0,0,0);width:1px;height:1px;margin:-1px;padding:0;border:0}.rm-transition{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important}.btn,a,button,div[id^=uniform-] span{-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-ms-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out}#page-header,#page-sidebar,.main-header,.top-bar{-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-ms-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out}.example-box-wrapper{margin-bottom:15px;position:relative}.example-box-wrapper .ui-datepicker-inline{position:relative;width:100%}.panel-body .col-md-6 .example-box-wrapper:last-child,.panel-body .example-box-wrapper:last-child{margin-bottom:0}.example-box-wrapper .alert,.example-box-wrapper .content-box,.example-box-wrapper .dashboard-box,.example-box-wrapper .dataTables_wrapper,.example-box-wrapper .icon-box,.example-box-wrapper .image-box,.example-box-wrapper .jcrop-holder,.example-box-wrapper .jvectormap-container,.example-box-wrapper .list-group,.example-box-wrapper .loading-spinner,.example-box-wrapper .loading-stick,.example-box-wrapper .minicolors,.example-box-wrapper .nav,.example-box-wrapper .panel-layout,.example-box-wrapper .scrollable-content,.example-box-wrapper .tile-box,.example-box-wrapper .ui-accordion,.example-box-wrapper .ui-rangeSlider,.example-box-wrapper .ui-slider,.example-box-wrapper .ui-tabs,.example-box-wrapper>.btn,.example-box-wrapper>.btn-group,.example-box-wrapper>.btn-group-vertical,.example-box-wrapper>.btn-toolbar,.example-box-wrapper>.display-block.dropdown-menu,.example-box-wrapper>.dropdown,.example-box-wrapper>.dropup,.example-box-wrapper>.hasDatepicker,.example-box-wrapper>.img-humbnail,.example-box-wrapper>.minicolors,.example-box-wrapper>.pagination,.example-box-wrapper>.panel-layout,.example-box-wrapper>.progressbar,.example-box-wrapper>.thumbnail,.example-box-wrapper>form,.example-box-wrapper>h6,.example-box-wrapper>img{margin-bottom:20px}.demo-icon{font-size:22px;line-height:40px;width:40px;height:40px;margin:10px;text-align:center;color:#92A0B3;border:1px solid rgba(220,233,255,.54);border-radius:3px}.btn-block,.btn-group-justified,.btn-group-justified>.btn-group .btn,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.demo-icon:hover{color:#59606c;border-color:#92A0B3}.font-black{color:#464646!important}.font-blue{color:#1f6dca!important}.font-blue-alt{color:#65a6ff!important}.font-azure{color:#41e5c0!important}.font-gray,.text-muted{color:#c2c2c2!important}.font-gray-dark,.text-info{color:#828282!important}.font-green,.text-success{color:#2ecc71!important}.font-orange,.text-warning{color:#fa7753!important}.font-yellow{color:#fc0!important}.font-purple{color:#984dff!important}.font-red,.has-error .help-block,.parsley-required,.text-danger{color:#ff5757!important}.font-white{color:#fff!important}.alert-info,.alert-info a{color:#6c6c6c;border-color:#c9c9c9;background:#dfe8f1}.alert-notice,.alert-notice a{color:#0f2c62;border-color:#62baf6;background:#c6e8ff}.alert-success,.alert-success a,.parsley-success{color:#1e620f;border-color:#7cd362;background:#d3ffc6}.parsley-success{background:#fff}.alert-warning,.alert-warning a,.warning{color:#624b0f;border-color:#ebc875;background:#ffeec6}.alert-danger,.alert-danger a,.danger,.parsley-error{color:#620f0f;border-color:#db6a6a;background:#ffc6c6}.bg-facebook,.bg-google,.bg-twitter{color:#fff!important}.parsley-error{background:#fff}.bg-facebook{background:#3b5998}.btn.bg-facebook:hover{background:#304b85}.bg-twitter{background:#3a92c8}.btn.bg-twitter:hover{background:#2b80b4}.bg-google{background:#dd4b39}.btn.bg-google:hover{background:#c93b2a}.badge-info,.bg-blue,.bootstrap-switch-info,.btn-info,.checkbox-info div[id^=uniform-] span.checked,.hover-blue:hover,.hover-info:hover,.label-info,.progress-bar-info,.radio-info div[id^=uniform-] span.checked{color:#fff;border-color:#308dcc;background:#3498db}.btn-info.active,.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info:active,.btn-info:focus,.btn-info:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,.label-info[href]:focus,.label-info[href]:hover,.open .dropdown-toggle.btn-info{color:#fff;border-color:#308dcc;background:#52a7e0}.badge-danger,.bg-danger,.bg-red,.bootstrap-switch-danger,.btn-danger,.checkbox-danger div[id^=uniform-] span.checked,.hover-danger:hover,.hover-red:hover,.label-danger,.progress-bar-danger,.radio-danger div[id^=uniform-] span.checked{color:#fff;border-color:#cf4436;background:#e74c3c}.btn-danger.active,.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,.label-danger[href]:focus,.label-danger[href]:hover,.open .dropdown-toggle.btn-danger{color:#fff;border-color:#cf4436;background:#eb6759}.badge-gray,.bg-gray,.btn-gray,.hover-gray:hover,.label-gray{color:#666;background:#efefef}.btn-gray.active,.btn-gray.disabled,.btn-gray.disabled.active,.btn-gray.disabled:active,.btn-gray.disabled:focus,.btn-gray.disabled:hover,.btn-gray:active,.btn-gray:focus,.btn-gray:hover,.btn-gray[disabled],.btn-gray[disabled].active,.btn-gray[disabled]:active,.btn-gray[disabled]:focus,.btn-gray[disabled]:hover,.label-gray[href]:focus,.label-gray[href]:hover,.open .dropdown-toggle.btn-gray{color:#333;background:#e7e7e7}.badge-gray-alt,.bg-gray-alt,.btn-gray-alt,.hover-gray-alt:hover,.label-gray-alt{color:#888;background:#f6f6f6}.btn-gray-alt.active,.btn-gray-alt.disabled,.btn-gray-alt.disabled.active,.btn-gray-alt.disabled:active,.btn-gray-alt.disabled:focus,.btn-gray-alt.disabled:hover,.btn-gray-alt:active,.btn-gray-alt:focus,.btn-gray-alt:hover,.btn-gray-alt[disabled],.btn-gray-alt[disabled].active,.btn-gray-alt[disabled]:active,.btn-gray-alt[disabled]:focus,.btn-gray-alt[disabled]:hover,.label-gray-alt[href]:focus,.label-gray-alt[href]:hover,.open .dropdown-toggle.btn-gray-alt{color:#444;background:#ededed}.badge-black,.bg-black,.btn-black,.hover-black:hover,.label-black{color:#ccc;border-color:#000;background:#2d2d2d}.boxed-layout.bg-black{background:#2d2d2d}.btn-black.active,.btn-black.disabled,.btn-black.disabled.active,.btn-black.disabled:active,.btn-black.disabled:focus,.btn-black.disabled:hover,.btn-black:active,.btn-black:focus,.btn-black:hover,.btn-black[disabled],.btn-black[disabled].active,.btn-black[disabled]:active,.btn-black[disabled]:focus,.btn-black[disabled]:hover,.label-black[href]:focus,.label-black[href]:hover,.open .dropdown-toggle.btn-black{color:#fdfdfd;background:#151515}.badge-black-opacity,.bg-black-opacity,.btn-black-opacity,.hover-black-opacity:hover,.label-black-opacity{color:#a9b3bb;background:#2b323d}.btn-black-opacity.active,.btn-black-opacity.disabled,.btn-black-opacity.disabled.active,.btn-black-opacity.disabled:active,.btn-black-opacity.disabled:focus,.btn-black-opacity.disabled:hover,.btn-black-opacity:active,.btn-black-opacity:focus,.btn-black-opacity:hover,.btn-black-opacity[disabled],.btn-black-opacity[disabled].active,.btn-black-opacity[disabled]:active,.btn-black-opacity[disabled]:focus,.btn-black-opacity[disabled]:hover,.label-black-opacity[href]:focus,.label-black-opacity[href]:hover,.open .dropdown-toggle.btn-black-opacity{color:#fff;background:#14171c}.badge-black-opacity-alt,.bg-black-opacity-alt,.btn-black-opacity-alt,.hover-black-opacity-alt:hover,.label-black-opacity-alt{color:#fff;background:rgba(0,0,0,.2);border-color:transparent}.btn-black-opacity-alt.active,.btn-black-opacity-alt.disabled,.btn-black-opacity-alt.disabled.active,.btn-black-opacity-alt.disabled:active,.btn-black-opacity-alt.disabled:focus,.btn-black-opacity-alt.disabled:hover,.btn-black-opacity-alt:active,.btn-black-opacity-alt:focus,.btn-black-opacity-alt:hover,.btn-black-opacity-alt[disabled],.btn-black-opacity-alt[disabled].active,.btn-black-opacity-alt[disabled]:active,.btn-black-opacity-alt[disabled]:focus,.btn-black-opacity-alt[disabled]:hover,.label-black-opacity-alt[href]:focus,.label-black-opacity-alt[href]:hover,.open .dropdown-toggle.btn-black-opacity-alt{color:#fff;background:rgba(0,0,0,.3)}.badge-success,.bg-green,.bootstrap-switch-success,.btn-success,.checkbox-success div[id^=uniform-] span.checked,.hover-green:hover,.hover-success:hover,.label-success,.progress-bar-success,.radio-success div[id^=uniform-] span.checked{color:#fff;border-color:#29b765;background:#2ecc71}.btn-success.active,.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success:active,.btn-success:focus,.btn-success:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,.label-success[href]:focus,.label-success[href]:hover,.open .dropdown-toggle.btn-success{color:#fff;border-color:#29b765;background:#58d68d}.badge-warning,.bg-orange,.bg-warning,.bootstrap-switch-warning,.btn-warning,.checkbox-warning div[id^=uniform-] span.checked,.hover-orange:hover,.hover-warning:hover,.label-warning,.progress-bar-warning,.radio-warning div[id^=uniform-] span.checked{color:#fff;border-color:#d67520;background:#e67e22}.btn-warning.active,.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,.label-warning[href]:focus,.label-warning[href]:hover,.open .dropdown-toggle.btn-warning{color:#fff;border-color:#d67520;background:#ea9143}.bg-white,.label-white,.table{background:#fff}.bg-white-opacity{background:rgba(255,255,255,.85)}.hover-white:hover{background:#fafafa}.badge-yellow,.bg-yellow,.btn-yellow,.hover-yellow:hover,.label-yellow{color:#fff;background:#fc0;border-color:#deb200}.btn-yellow.active,.btn-yellow.disabled,.btn-yellow.disabled.active,.btn-yellow.disabled:active,.btn-yellow.disabled:focus,.btn-yellow.disabled:hover,.btn-yellow:active,.btn-yellow:focus,.btn-yellow:hover,.btn-yellow[disabled],.btn-yellow[disabled].active,.btn-yellow[disabled]:active,.btn-yellow[disabled]:focus,.btn-yellow[disabled]:hover,.label-yellow[href]:focus,.label-yellow[href]:hover,.open .dropdown-toggle.btn-yellow{color:#fff;background:#e1b400;border-color:#c59e00}.badge-purple,.bg-purple,.btn-purple,.hover-purple:hover,.label-purple{color:#fff;background:#984dff;border-color:#7a3ecc}.btn-purple.active,.btn-purple.disabled,.btn-purple.disabled.active,.btn-purple.disabled:active,.btn-purple.disabled:focus,.btn-purple.disabled:hover,.btn-purple:active,.btn-purple:focus,.btn-purple:hover,.btn-purple[disabled],.btn-purple[disabled].active,.btn-purple[disabled]:active,.btn-purple[disabled]:focus,.btn-purple[disabled]:hover,.label-purple[href]:focus,.label-purple[href]:hover,.open .dropdown-toggle.btn-purple{color:#fff;background:#8134eb;border-color:#752fd6}.badge-blue-alt,.bg-blue-alt,.btn-blue-alt,.hover-blue-alt:hover,.label-blue-alt{color:#fff;background:#65a6ff;border-color:#5388d1}.btn-blue-alt.active,.btn-blue-alt.disabled,.btn-blue-alt.disabled.active,.btn-blue-alt.disabled:active,.btn-blue-alt.disabled:focus,.btn-blue-alt.disabled:hover,.btn-blue-alt:active,.btn-blue-alt:focus,.btn-blue-alt:hover,.btn-blue-alt[disabled],.btn-blue-alt[disabled].active,.btn-blue-alt[disabled]:active,.btn-blue-alt[disabled]:focus,.btn-blue-alt[disabled]:hover,.label-blue-alt[href]:focus,.label-blue-alt[href]:hover,.open .dropdown-toggle.btn-blue-alt{color:#fff;background:#478ded;border-color:#4c7ec1}.badge-azure,.bg-azure,.btn-azure,.hover-azure:hover,.label-azure{color:#fff;background:#41e5c0;border-color:#3acead}.btn-azure.active,.btn-azure.disabled,.btn-azure.disabled.active,.btn-azure.disabled:active,.btn-azure.disabled:focus,.btn-azure.disabled:hover,.btn-azure:active,.btn-azure:focus,.btn-azure:hover,.btn-azure[disabled],.btn-azure[disabled].active,.btn-azure[disabled]:active,.btn-azure[disabled]:focus,.btn-azure[disabled]:hover,.label-azure[href]:focus,.label-azure[href]:hover,.open .dropdown-toggle.btn-azure{color:#fff;background:#27d1ab;border-color:#24c19e}.border-black{border-color:#212121!important}.border-blue{border-color:#5bccf6!important}.border-blue-alt{border-color:#65a6ff!important}.border-azure{border-color:#41e5c0!important}.border-gray{border-color:#c2c2c2!important}.border-gray-dark{border-color:#828282!important}.border-green{border-color:#2ecc71!important}.border-orange{border-color:#fa7753!important}.border-yellow{border-color:#fc0!important}.border-purple{border-color:#984dff!important}.border-red{border-color:#ff5757!important}.parsley-success{border-color:#77e038!important}.parsley-error{border-color:#e03838!important}.btn,.fc-button{font-size:14px;position:relative;display:inline-block;padding:0 12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;border-width:1px;border-style:solid;border-color:transparent;background-image:none;-o-user-select:none}.btn-alt,.content-box-header-alt{font-weight:700;text-transform:uppercase}.btn,.fc-button,.size-md{line-height:32px;height:34px;min-width:34px}.btn-abs{position:absolute;top:50%;right:0;margin-top:-17px}.btn.hover-round:hover{border-radius:100px}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-link{border-radius:0}.btn.active,.btn:active,.fc-state-active,.fc-state-down,.ui-datepicker .ui-datepicker-buttonpane button:active,.ui-datepicker .ui-datepicker-next:active,.ui-datepicker .ui-datepicker-prev:active,.ui-dialog .ui-dialog-titlebar-close:active,.ui-dialog-buttonset button:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],.disabled,.fc-state-disabled,fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;-webkit-box-shadow:none;box-shadow:none;filter:alpha(opacity=65)}.btn-link{cursor:pointer}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:focus,.btn-link:hover{text-decoration:underline;background-color:transparent}.btn-border:hover,.pager li>a:focus,.pager li>a:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg,.size-lg{line-height:44px;min-width:56px;height:46px}.btn-lg-abs{margin-top:-23px}.btn-group-lg>.btn,.btn-lg{font-size:18px;padding:0 16px}.btn-group-sm>.btn,.btn-sm,.size-sm{line-height:28px;height:30px}.btn-sm-abs{margin-top:-15px}.btn-group-sm>.btn,.btn-sm{font-size:13px;padding:0 10px}.btn-group-xs>.btn,.btn-xs,.size-xs{line-height:20px;min-width:22px;height:22px}.btn-xs-abs{margin-top:-11px}.btn-group-xs>.btn,.btn-xs{font-size:11px;padding:0 5px}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-block{display:block;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:10px}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-justified{display:table;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:3px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.pagination{display:inline-block;padding-left:0}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{line-height:1.42857143;position:relative;float:left;margin-left:-1px;padding:6px 12px;text-decoration:none;border-width:1px;border-style:solid}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0}.pagination-lg>li>a,.pagination-lg>li>span{font-size:18px;padding:10px 16px}.pagination-sm>li>a,.pagination-sm>li>span{font-size:12px;padding:5px 10px}.pager{margin-top:0;padding-left:0;list-style:none;text-align:center}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;border:1px solid #ddd;border-radius:15px;background-color:#fff}.btn>.icon-separator,.icon-separator.float-right{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span,.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{cursor:not-allowed;color:#999;background-color:#fff}.btn>.icon-separator{position:absolute;top:0;left:0;width:32px;height:100%;border-top-right-radius:0!important}.icon-separator+.button-content{margin-left:32px}.btn-xs .icon-separator{width:22px}.btn-xs .icon-separator+.button-content{margin-left:22px}.btn-sm .icon-separator{width:25px}.btn-sm .icon-separator+.button-content{margin-left:25px}.btn-lg .icon-separator{width:44px}.btn-lg .icon-separator+.button-content{margin-left:44px}.icon-separator.float-right{border-top-left-radius:0!important}.vertical-button{line-height:1.6em;height:auto;padding:10px 0 5px}.vertical-button .button-content{opacity:.7;filter:alpha(opacity=70)}.icon-separator-vertical{font-size:25px;display:block;margin:5px auto}.dashboard-buttons .btn{width:93px;margin:5px 3px}.btn-outline,.btn-outline-inverse{display:inline-block;text-align:center;color:#fff;box-sizing:initial;border-width:2px;border-style:solid;text-transform:uppercase}.btn-outline-inverse{border-color:rgba(255,255,255,.47)}.btn-outline-inverse:hover{background:rgba(255,255,255,.2);border-color:#fff}.btn-outline-inverse.hero-btn{color:#fff}.btn-outline{color:rgba(0,0,0,.8);border-color:rgba(0,0,0,.6)}.btn-outline:hover{color:#fff;border-color:rgba(0,0,0,.8);background:rgba(0,0,0,.8)}.btn.btn-round{border-radius:150px;padding:0}.btn-round.btn-lg{width:46px;min-width:46px}.btn-round.btn-xlg{width:66px;min-width:66px;height:66px;line-height:66px}.btn-round.btn-xlg .glyph-icon{font-size:24px}.btn-round.btn-md{width:34px}.btn-round.btn-sm{width:30px}.btn-round.btn-xs{width:22px}.btn-alt{font-size:12px}.btn-hover span{padding:0 20px;left:0;position:relative;transition:opacity .2s ease-out,left .2s ease-out;-webkit-transition:opacity .2s ease-out,left .2s ease-out}.btn-hover .glyph-icon{opacity:0;-ms-filter:"alpha(opacity=0)";position:absolute;right:20px;transition:all .2s ease-out;-webkit-transition:all .2s ease-out}.btn-hover:hover .glyph-icon{opacity:1;right:15px;-ms-filter:"alpha(opacity=100)"}.btn-hover:hover span{left:-15px}.btn-border{border-width:2px;border-style:solid}.btn-border span{opacity:.75;filter:alpha(opacity=75)}.btn-border:hover span{opacity:1;filter:alpha(opacity=100)}.btn-group-justified>.btn,.btn-group-justified>.btn-group{width:auto}.demo-margin .btn{margin-bottom:10px}.content-box{background:#fff;margin-bottom:20px}.content-box,.content-box-header{position:relative;border-width:1px;border-style:solid}.content-box-header{font-size:14px;text-transform:uppercase;margin:-1px -1px 0;padding:15px;border-color:transparent}.content-box-header small+.font-size-11.float-right{position:absolute;top:14px;right:10px}.content-box-header-alt{padding:15px 10px 14px;font-size:12px}.content-box-header-alt small{font-size:13px;font-weight:400;display:block;padding:5px 0 0;text-transform:none;opacity:.7;filter:alpha(opacity: 70)}.content-box .ui-widget-overlay{position:absolute}.content-box .ui-widget-overlay img{position:absolute;top:50%;left:50%;margin:-27px 0 0 -27px}.content-box .content-box-wrapper{line-height:1.6em;padding:15px}.content-box .content-box-wrapper .scrollable-content,.content-box .content-box-wrapper p:last-child{margin-bottom:0}.content-box .content-box-header>.glyph-icon{margin-right:5px;opacity:.7;filter:alpha(opacity: 70)}.content-box-header-alt .icon-separator .glyph-icon,.content-box-header-alt>.glyph-icon{font-size:22px;line-height:30px;position:absolute;top:50%;left:15px;width:30px;height:30px;margin-top:-15px}.content-box-header>.icon-separator{position:relative;top:1px;left:-15px;padding:18px 15px 16px;text-align:center}.content-box-header>.icon-separator .glyph-icon{margin-left:3px}.content-box-header-alt>.header-wrapper{overflow:hidden;display:block;margin-left:40px}.content-box-header-alt>.icon-separator+.header-wrapper{margin-left:65px}.content-box-header-alt>.icon-separator{position:absolute;top:0;left:0;width:60px;height:100%}.content-box-header-alt>.icon-separator .glyph-icon{left:50%;margin-left:-15px}.header-buttons{position:absolute;top:0;right:10px;height:100%;display:block}.header-buttons .btn-xs{top:13px}.header-buttons .btn-sm{top:10px}.header-buttons .btn-sm:last-child{margin-right:0}.header-buttons>.btn-group:last-child{margin-right:-2px}.content-box-header-alt .header-buttons .btn-xs{top:24px}.content-box-header-alt .header-buttons .btn-sm{top:20px}.content-box-header-alt .header-buttons .btn-sm:last-child{margin-right:5px}.header-buttons-separator{position:absolute;top:0;right:0;height:100%}.header-buttons-separator .icon-separator{top:0;left:0;display:block;float:left;min-width:20px;height:100%;padding:0 10px}.header-buttons-separator .icon-separator .glyph-icon{line-height:30px;position:relative;top:50%;display:block;min-width:30px;height:30px;margin:-15px 0 0;text-align:center}.header-buttons>.btn-group{margin-top:8px}.header-buttons .btn-group-xs{margin-top:14px}.header-buttons .btn-group-xs:last-child{margin-right:0}.ui-dialog-buttonpane,body .button-pane{padding:10px;text-align:center;border-width:1px 0 0;border-style:solid;border-top-left-radius:0;border-top-right-radius:0}body .button-pane-top{border-width:0 0 1px;border-radius:0}.scrollable-content{overflow-y:scroll;overflow-x:hidden;height:300px;padding-right:0}.scrollable-xs{overflow-y:scroll;height:200px}.scrollable-sm{overflow-y:scroll;height:400px}.scrollable-lg{overflow-y:scroll;height:500px}.toggle-button .glyph-icon{-webkit-transition-duration:.5s;-moz-transition-duration:.5s;-o-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform}.hidden-button .content-box-header .btn,.hidden-button .content-box-header a,.hidden-button .content-box-header button{display:none}.content-box.border-top .content-box-header{font-size:18px;margin:0}.content-box.border-top .content-box-header small{opacity:.8;-moz-opacity:.8;filter:alpha(opacity: 80)}.content-box.border-top .content-box-header+.content-box-wrapper{padding-top:0}.box-xs{width:200px}.box-sm{width:324px}.box-md{width:400px}.box-lg{width:500px}.content-box-header>.ui-tabs-nav{position:absolute;top:2px;right:0;padding:0;list-style:none;border:0}.content-box-header>.ui-tabs-nav li>a{line-height:49px;height:49px;margin:0 2px;color:rgba(255,255,255,.7);border:0;background:0 0}.content-box-header>.ui-tabs-nav li>a:hover{color:#fff;background:rgba(255,255,255,.2)}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>a{color:inherit}.content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active>a,.content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active>a,.content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active>a{line-height:46px;height:46px;background:#F6F6F9}.content-box-header.bg-default>.ui-tabs-nav li>a,.content-box-header.bg-gray>.ui-tabs-nav li>a,.content-box-header.bg-white>.ui-tabs-nav li>a{line-height:50px;height:50px;margin:0;border-radius:0}.content-box-header.bg-default>.ui-tabs-nav,.content-box-header.bg-gray>.ui-tabs-nav,.content-box-header.bg-white>.ui-tabs-nav{top:0}.content-box-header>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header>.ui-tabs-nav li.ui-tabs-active>a{line-height:47px;height:49px;background:#fff}.panel{margin-bottom:20px;border-width:1px;border-style:solid;border-radius:4px;background-color:#fff;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group{margin-bottom:0}.panel-body{padding:15px 20px;position:relative}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent}.panel-title{font-size:16px;margin-top:0}.panel-footer{padding:10px 15px;border-top:1px solid transparent}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel-group{margin-bottom:20px}.panel-group .panel{overflow:hidden;margin-bottom:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid transparent}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid transparent}fieldset,legend{padding:0;border:0}fieldset{margin:0}legend{font-size:21px;line-height:inherit;display:block;width:100%;margin-bottom:20px;color:#333;border-bottom:1px solid #dfe8f1}label{font-weight:700;display:inline-block}.checkbox,.radio,input[type=file],output{display:block}input[type=checkbox],input[type=radio]{line-height:normal}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:#333 dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}output{font-size:14px;line-height:1.428571429;padding-top:7px;vertical-align:middle;color:#555}.bootstrap-timepicker-widget table td input,.chosen-container-multi,.chosen-container-single .chosen-search input,.dataTables_length select,.form-control,.input,.ui-toolbar input,.ui-toolbar select,div.dataTables_filter input{font-size:13px;display:block;float:none;background:#fff;width:100%;height:34px;padding:6px 12px;color:#2b2f33;border:1px solid #dfe8f1;-webkit-box-shadow:inset 1px 1px 3px #f6f6f6;-moz-box-shadow:inset 1px 1px 3px #f6f6f6;box-shadow:inset 1px 1px 3px #f6f6f6}.chosen-container-multi.chosen-with-drop.chosen-container-active{border:1px solid #ddd;border-bottom-right-radius:0;border-bottom-left-radius:0;box-shadow:0 0 0 transparent}.bootstrap-timepicker-widget table td input:focus,.chosen-container-active,.chosen-container-multi.chosen-container-active,.form-control:focus,.input:focus,.selector.focus,.ui-toolbar input:focus,.ui-toolbar select:focus,div.dataTables_filter input:focus{color:#333;border-color:#3da6ff}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.form-group label{margin-bottom:5px}.form-group .switch-toggle{margin-top:6px}.checkbox,.radio{min-height:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.checkbox label,.radio label{font-weight:400;display:inline;margin-bottom:0;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{float:left}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{font-weight:400;line-height:19px;display:inline-block;height:19px;margin-bottom:0;cursor:pointer;vertical-align:middle}.checkbox-inline label,.radio-inline label{font-weight:400;line-height:17px}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline[disabled],.checkbox[disabled],.radio-inline[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.input-sm{font-size:12px;line-height:1.5;height:30px;padding:5px 10px;border-radius:3px}select.input-sm{line-height:30px;height:30px}textarea.input-sm{height:auto}.input-lg{font-size:18px;line-height:1.33;height:45px;padding:10px 16px;border-radius:6px}select.input-lg{line-height:45px;height:45px}textarea.input-lg{height:auto}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:0;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}.form-horizontal .control-label{text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal>.form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:after,.form-horizontal .form-group:before{display:table;content:' '}.form-horizontal .form-control-static{padding-top:7px}.input-group{position:relative;display:table;width:100%;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{font-size:18px;line-height:1.33;height:45px;padding:10px 16px;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{line-height:45px;height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{font-size:12px;line-height:1.5;height:30px;padding:5px 10px;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{line-height:30px;height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon div[id^=uniform-]{margin:0 -3px}.input-group-addon,.input-group-btn{width:1%;vertical-align:middle;white-space:nowrap}.input-group-addon{font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center;color:#2b2f33;background-color:rgba(239,244,246,.36);border:1px solid #dfe8f1;border-radius:4px}body,label{color:#3e4855}.input-group-addon .glyph-icon{display:block;min-width:20px;margin:0 -4px;text-align:center}.input-group-addon.addon-inside{line-height:24px;position:absolute;top:5px;left:6px;display:block;width:32px;height:24px;padding:0;border-width:1px;border-style:solid}.input-group-btn,.input-group-btn>.btn,.ui-spinner{position:relative}.input-group-lg .input-group-addon.addon-inside{top:10px;left:10px;z-index:999}.input-group-addon.addon-inside .glyph-icon{margin:0}.input-group-addon.addon-inside+input{padding-left:48px}.input-group-addon.input-sm{font-size:12px;padding:5px 10px;border-radius:3px}.input-group-addon.input-lg{font-size:18px;padding:10px 16px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group-addon.addon-inside:first-child{border-right-width:1px;border-right-style:solid;border-color:transparent;z-index:999}.input-group-addon+.form-control,.input-group-addon:last-child,.input-group-btn+.form-control,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:active,.input-group-btn>.btn:hover{z-index:2}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}textarea.textarea-autoresize,textarea.textarea-no-resize{resize:none}.textarea-autosize{transition:height .3s;-webkit-transition:height .3s;-moz-transition:height .3s}textarea.form-control{line-height:1.6em;padding:8px 12px}textarea.textarea-xs{height:50px}textarea.textarea-sm{height:125px}textarea.textarea-md{height:200px}textarea.textarea-lg{height:275px}.ui-spinner{display:block}.xchart .color0.comp .fill,.xchart .color1.comp .fill{display:none}.ui-spinner .ui-spinner-button{font-size:9px;line-height:17px;position:absolute;right:0;width:17px;height:17px;cursor:pointer;text-align:center;border-width:1px;border-style:solid}.ui-spinner .ui-spinner-up{top:0}.ui-spinner .ui-spinner-down{bottom:0}.parsley-errors-list li{font-size:12px;padding-top:5px}.bordered-row>.form-group{padding:20px 0;margin-bottom:0;border-top-width:1px;border-top-style:dashed}.bordered-row>.form-group:last-child{padding-bottom:0}.form-group .ui-slider{margin-top:14px}.form-group .ui-slider+.input-group{margin-top:20px}body{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;background-color:#fff;line-height:1.42857143}#page-title>h2,#page-title>p,h1,h2,h3,h4,h5,h6{font-family:Raleway,"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}#page-header .user-account-btn>a.user-profile .glyph-icon,.logo-bg{background-color:rgba(255,255,255,.1);color:#fff}#page-header .user-account-btn>a.user-profile{color:#fff}#header-nav-right .dropdown>a .glyph-icon,#header-nav-right .header-btn .glyph-icon{color:rgba(255,255,255,.8)}#header-nav-right .dropdown>a:hover .glyph-icon,#header-nav-right .header-btn:hover .glyph-icon{color:rgba(255,255,255,.95)}#header-nav-right .dropdown>a,#header-nav-right .header-btn{border-color:rgba(255,255,255,.2)}#header-nav-right .dropdown>a:hover,#header-nav-right .header-btn:hover{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.25)}#page-content{background:#fafcfe}#page-sidebar ul li.header{color:#000}#page-sidebar ul li a .glyph-icon{color:#0093d9}#page-sidebar ul li a:hover,#page-sidebar ul li.sfHover>a.sf-with-ul{border-color:#d1d9dd}#sidebar-menu li .sidebar-submenu{border-color:#f6f7f8}#sidebar-menu li .sidebar-submenu ul li{border-color:#f8f9fa}#sidebar-menu li .sidebar-submenu ul li a.sfActive,#sidebar-menu li .sidebar-submenu ul li a:hover{background:#fcfdfe}#sidebar-menu li .sidebar-submenu ul li a.sfActive{color:#1c82e1}#page-sidebar.font-inverse ul li.header{color:rgba(255,255,255,.95)}#page-sidebar.font-inverse ul li.divider{background:rgba(255,255,255,.1)}#page-sidebar.font-inverse #sidebar-menu>li>a{color:rgba(255,255,255,.62)}#page-sidebar.font-inverse #sidebar-menu li a:hover,#page-sidebar.font-inverse #sidebar-menu li.sfHover>a.sf-with-ul{border-color:rgba(255,255,255,.26);color:rgba(255,255,255,.96)}#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu{border-color:rgba(255,255,255,.08);background:rgba(255,255,255,.05)}#page-sidebar.font-inverse #sidebar-menu li a{color:rgba(255,255,255,.62)}#page-sidebar.font-inverse #sidebar-menu li a:hover{color:rgba(255,255,255,.96)}#page-sidebar.font-inverse#page-sidebar ul li a .glyph-icon{color:rgba(255,255,255,.8)}#page-sidebar.font-inverse#page-sidebar ul li a:hover .glyph-icon{color:rgba(255,255,255,1);opacity:.9;-moz-opacity:.9;filter:alpha(opacity: 90)}#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li{border-color:rgba(255,255,255,.07)}#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li a:hover{background:rgba(255,255,255,.05)}.btn-link,.chosen-disabled .chosen-single,.content-box-header.bg-default>.ui-tabs-nav li>a,.content-box-header.bg-gray>.ui-tabs-nav li>a,.content-box-header.bg-white>.ui-tabs-nav li>a,.content-box-header>.ui-tabs-nav li.ui-tabs-active>a,.pagination>li>a,.pagination>li>span,.table,a,body .content-box-header>.ui-tabs-nav li.ui-tabs-active>a:hover,div.selector{color:#8da0aa}#page-sidebar ul li.sfHover>a.sf-with-ul,.btn-link:hover,.content-box-header.bg-default>.ui-tabs-nav li>a:hover,.content-box-header.bg-gray>.ui-tabs-nav li>a:hover,.content-box-header.bg-white>.ui-tabs-nav li>a:hover,.features-tour-box h3,.font-primary,.tabs-nav li a:hover,.tabs-nav li.active a,a:hover,table.dataTable thead th.sorting_asc:after,table.dataTable thead th.sorting_desc:after{color:#1c82e1}.border-primary,.btn-primary,.nav>li.active>a,.nav>li.active>a:focus,.nav>li.active>a:hover,.ui-accordion .ui-accordion-header.ui-accordion-header-active,.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev,.ui-dialog-buttonset button,.ui-spinner .ui-spinner-button:hover,a.list-group-item.active,a.list-group-item.active:focus,a.list-group-item.active:hover,a.thumbnail:hover,div[id^=uniform-] span.checked,li.active a.list-group-item,li.active a.list-group-item:focus,li.active a.list-group-item:hover{border-color:#00a792}a:focus{outline:0!important}#loadingbar,#nav-toggle span:after,#nav-toggle span:before,#nav-toggle.collapsed span,.badge-primary,.bg-primary,.bootstrap-switch-primary,.btn-primary,.chosen-container .chosen-results li.active-result.highlighted,.daterangepicker .ranges li.active,.daterangepicker .ranges li.active:hover,.fc-event,.form-wizard>ul>li.active .wizard-step,.irs-line-left,.irs-line-mid,.irs-line-right,.label-primary,.ms-hover.ui-state-focus,.ms-list .ms-hover,.nav>li.active>a,.nav>li.active>a:focus,.nav>li.active>a:hover,.owl-controls .owl-page span,.ui-accordion-header.ui-accordion-header-active,.ui-datepicker .ui-datepicker-current-day a,.ui-datepicker .ui-datepicker-current-day span,.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev,.ui-dialog-buttonset button,.ui-menu li>a:hover,.ui-rangeSlider-bar,.ui-slider-handle,.ui-spinner .ui-spinner-button:hover,.ui-tabs-nav li.ui-state-active.ui-state-hover>a,.ui-tabs-nav li.ui-state-active>a,a.list-group-item.active,a.list-group-item.active:focus,a.list-group-item.active:hover,div.switch-toggle.switch-on,div[id^=uniform-] span.checked,li.active a.list-group-item,li.active a.list-group-item:focus,li.active a.list-group-item:hover{color:#fff;background:#00bca4}.font-secondary,.inverse.carousel-wrapper .owl-controls .owl-buttons .owl-next,.inverse.carousel-wrapper .owl-controls .owl-buttons .owl-prev,.post-box .post-title{color:#00bca4}.post-box .post-title:hover{color:#3e4855}.bg-default,.bg-white.dashboard-box .button-pane,.bg-white.tile-box .tile-footer,.border-default,.bordered-row .form-group,.btn-default,.button-pane,.chosen-container,.chosen-container .chosen-drop,.chosen-container-active.chosen-with-drop .chosen-single div,.chosen-container-multi .chosen-choices li.search-choice,.chosen-container-single .chosen-single div,.content-box,.content-box-header.bg-default,.content-box-header.bg-gray,.content-box-header.bg-white,.dashboard-buttons .btn,.daterangepicker .calendar-date,.dropdown-menu,.email-body,.fc-state-default,.fc-widget-content,.fc-widget-header,.img-thumbnail,.jvectormap-label,.jvectormap-zoomin,.jvectormap-zoomout,.list-group-item,.mail-toolbar,.mailbox-wrapper .nav-list li a,.minicolors-panel,.ms-container .ms-list,.ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection,.nav .open>a,.nav .open>a:focus,.nav .open>a:hover,.nav-tabs,.nav-tabs>li>a:focus,.nav-tabs>li>a:hover,.pagination>li>a,.pagination>li>span,.panel,.panel-box.bg-default,.panel-box.bg-gray,.panel-box.bg-white,.panel-content.bg-default,.panel-content.bg-gray,.panel-content.bg-white,.panel-footer,.panel-group .panel-footer+.panel-collapse .panel-body,.panel-group .panel-heading+.panel-collapse .panel-body,.panel-heading,.popover,.popover-title,.posts-list li,.selector i,.table-bordered,.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th,.tabs-navigation>ul,.tabs-navigation>ul li.ui-state-hover>a,.tabs-navigation>ul li>a,.thumb-pane,.thumbnail,.timeline-box .tl-item .popover,.timeline-box:before,.ui-accordion .ui-accordion-header,.ui-datepicker,.ui-datepicker .ui-datepicker-buttonpane button,.ui-datepicker-buttonpane,.ui-dialog,.ui-dialog .ui-dialog-titlebar,.ui-dialog-buttonpane,.ui-menu,.ui-spinner .ui-spinner-button,.ui-tabs-nav,div.selector,div[id^=uniform-] span{border-color:#dfe8f1}.divider,.nav-divider,.timeline-horizontal.timeline-box:before{background:#dfe8f1}.content-box.border-top{border-right-color:#dfe8f1!important;border-bottom-color:#dfe8f1!important;border-left-color:#dfe8f1!important}.bg-default,.bg-white.dashboard-box .button-pane,.bg-white.tile-box .tile-footer,.bootstrap-switch-default,.btn-default,.button-pane,.jvectormap-label,.jvectormap-zoomin,.jvectormap-zoomout,.label-default,.mail-toolbar,.panel-footer,.panel-heading,.popover-title,.ui-accordion-header,.ui-datepicker td a,.ui-datepicker td span,.ui-dialog .ui-dialog-titlebar,.ui-spinner .ui-spinner-button,div[id^=uniform-] span{color:#555a60;background-color:#FEFEFF}.irs-diapason,.ui-datepicker-buttonpane,.ui-dialog-buttonpane,.ui-rangeSlider-container,.ui-slider-range{background-color:#FEFEFF}.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>th{color:#4b5056;background-color:#f9fafe}.btn-default.active,.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default:active,.btn-default:focus,.btn-default:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover,.jvectormap-zoomin:hover,.jvectormap-zoomout:hover,.open .dropdown-toggle.btn-default,.open.dropdown-submenu a,.ui-accordion-header.ui-state-hover,.ui-datepicker .ui-datepicker-buttonpane button:hover,.ui-tabs-nav>li.ui-state-hover>a{color:#2b2f33;border-color:#bfc8d1;background-color:#f3f3f9}.btn-default.active .glyph-icon{color:#2b2f33!important}.bsdatepicker td span:hover,.bsdatepicker td.active,.bsdatepicker td.day.active:hover,.bsdatepicker th.next:hover,.bsdatepicker th.prev:hover,.btn-primary.active,.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,.daterangepicker .calendar th.next:hover,.daterangepicker .calendar th.prev:hover,.daterangepicker td.active,.daterangepicker td.available.active:hover,.hover-primary:hover,.label-primary[href]:focus,.label-primary[href]:hover,.open .dropdown-toggle.btn-primary,.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover,.ui-accordion-header.ui-accordion-header-active.ui-state-hover,.ui-datepicker .ui-datepicker-next.ui-state-hover,.ui-datepicker .ui-datepicker-prev.ui-state-hover,.ui-datepicker td a:hover,.ui-dialog-buttonset button:hover,.ui-rangeSlider-bar:active,.ui-rangeSlider-bar:hover,.ui-slider-handle.ui-state-active,.ui-slider-handle.ui-state-hover{color:#fff;border-color:#00b19b;background-color:#00ceb4}.bsdatepicker td span,.bsdatepicker td.day:hover,.bsdatepicker thead tr:first-child th.switch:hover,.chosen-container-multi .chosen-choices li.search-choice,.chosen-container-single .chosen-single div,.daterangepicker .ranges li:hover,.daterangepicker td.available:hover,.nav>li>a:focus,.nav>li>a:hover,.pager li>a:focus,.pager li>a:hover,.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover,.selector i,.ui-datepicker-title,a.list-group-item:focus,a.list-group-item:hover{color:#2b2f33;background:#eff4f6}.pager li>a:focus,.pager li>a:hover,.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#2b2f33;background-color:#f3f3f9}.dropdown-menu .active>a,.dropdown-menu .active>a:focus,.dropdown-menu .active>a:hover,.dropdown-menu li>a:hover{color:#2b2f33;background:#eff4f6}.active>.badge,.active>.bs-badge,.active>.bs-label{color:#666!important;background:#fff!important}.active>.glyph-icon,a.list-group-item.active>.glyph-icon,li.active a.list-group-item>.glyph-icon{color:#fff!important}.icon-separator{border-right:rgba(255,255,255,.21) solid 1px;background:rgba(255,255,255,.2)}.content-box-header.bg-default .icon-separator,.content-box-header.bg-gray .icon-separator,.content-box-header.bg-white .icon-separator,.tile-box.bg-default .tile-header,.tile-box.bg-gray .tile-header,.tile-box.bg-white .tile-header,.tile-box.btn-default .tile-header{border-right:#dfe8f1 solid 1px;background:rgba(255,255,255,.1)}.content-box-header .header-buttons-separator .icon-separator{border-right:0;border-left:rgba(255,255,255,.21) solid 1px}.header-buttons-separator .icon-separator{color:rgba(255,255,255,.8)}.header-buttons-separator .icon-separator:hover{color:#fff;background:rgba(255,255,255,.3)}.content-box-header.bg-default .header-buttons-separator .icon-separator,.content-box-header.bg-gray .header-buttons-separator .icon-separator,.content-box-header.bg-white .header-buttons-separator .icon-separator{border-right:0;border-left:#dfe8f1 solid 1px;color:rgba(0,0,0,.6)}.content-box-header.bg-default .header-buttons-separator .icon-separator:hover,.content-box-header.bg-gray .header-buttons-separator .icon-separator:hover,.content-box-header.bg-white .header-buttons-separator .icon-separator:hover{color:rgba(0,0,0,.9)}.dashboard-panel .button-pane{background:rgba(0,0,0,.1)!important}.xchart .color0 rect{fill:#00bca4}.xchart .color0 circle{fill:#fff}.xchart .color0 .fill{fill:rgba(0,188,164,.06)}.xchart .color0.comp .pointer,.xchart .color0.comp circle,.xchart .color0.comp rect{fill:#00bca4}.xchart .color1 .line,.xchart .color1 circle,.xchart .color1.comp .line{stroke:#52a7e0}.xchart .color1 rect{fill:#52a7e0}.xchart .color1 circle{fill:#fff}.xchart .color1 .fill{fill:rgba(82,167,224,.06)}.xchart .color1.comp .pointer,.xchart .color1.comp circle,.xchart .color1.comp rect{fill:#52a7e0}body .popover.top .arrow:after{border-top-color:#fff}body .popover.right .arrow:after{border-right-color:#fff}body .popover.bottom .arrow:after{border-bottom-color:#fff}body .popover.left .arrow:after{border-left-color:#fff} +pre, pre code { + white-space: pre-wrap +} + +.clear, .form-row:after, .row:after { + clear: both +} + +.btn-group-vertical>.btn:focus, .btn-group>.btn:focus, :active, :focus, :visited, a, a:active, a:focus, a:visited { + outline: 0 +} + +.xchart .color0 .line, .xchart .color0 circle, .xchart .color0.comp .line { + stroke: #00bca4 +} + +.xchart .color0 .line .fill, .xchart .color1 .line .fill { + pointer-events: none +} + +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { + display: block +} + +audio, canvas, video { + display: inline-block +} + +audio:not([controls]) { + display: none; + height: 0 +} + +[hidden] { + display: none +} + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100% +} + +body, button, figure { + margin: 0 +} + +abbr[title] { + border-bottom: 1px dotted +} + +b, strong { + font-weight: 700 +} + +dfn { + font-style: italic +} + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0 +} + +mark { + color: #000; + background: #ff0 +} + +code, kbd, pre, samp { + font-size: 1em +} + +q { + quotes: '\201C''\201D''\2018''\2019' +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sup { + top: -.5em +} + +sub { + bottom: -.25em +} + +img { + border: 0 +} + +svg:not(:root) { + overflow: hidden +} + +button, input, select, textarea { + font-family: inherit; + font-size: 100% +} + +button, input { + line-height: normal +} + +button, select { + text-transform: none +} + +button, html input[type=button], input[type=reset], input[type=submit] { + cursor: pointer; + -webkit-appearance: button +} + +input[type=checkbox], input[type=radio] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0 +} + +input[type=search] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield +} + +input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +button::-moz-focus-inner, input::-moz-focus-inner { + padding: 0; + border: 0 +} + +textarea { + overflow: auto; + vertical-align: top +} + +.collapsing, .divider, .overflow-hidden, .sr-only { + overflow: hidden +} + +table { + border-spacing: 0; + border-collapse: collapse +} + +@media print { + blockquote, img, pre, tr { + page-break-inside: avoid + } + + * { + color: #000 !important; + background: 0 0 !important; + box-shadow: none !important; + text-shadow: none !important + } + + a, a:visited { + text-decoration: underline + } + + a[href]:after { + content: ' ('attr(href)')' + } + + abbr[title]:after { + content: ' ('attr(title)')' + } + + .ir a:after, a[href^='javascript:']:after, a[href^='#']:after { + content: '' + } + + blockquote, pre { + border: 1px solid #999 + } + + thead { + display: table-header-group + } + + img { + max-width: 100% !important + } + + @page { + margin: 2cm .5cm + } + + h2, h3, p { + orphans: 3; + widows: 3 + } + + h2, h3 { + page-break-after: avoid + } + + .jGrowl { + display: none + } +} + +small { + font-size: 85% +} + +a { + text-decoration: none +} + +html { + font-size: 62.5%; + -webkit-tap-highlight-color: transparent +} + +*, :after, :before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.jqstooltip { + box-sizing: content-box +} + +.form-row, .row { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-right: -10px; + margin-left: -10px +} + +.form-row:after, .form-row:before, .row:after, .row:before { + display: table; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + content: ' ' +} + +blockquote small, pre { + line-height: 1.428571429; + display: block +} + +[class*=col-] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { + position: relative; + min-height: 1px; + padding-right: 10px; + padding-left: 10px +} + +.col-xs-1, .col-xs-10, .col-xs-11, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { + float: left +} + +.col-xs-1 { + width: 8.333333333333332% +} + +.col-xs-2 { + width: 16.666666666666664% +} + +.col-xs-3 { + width: 25% +} + +.col-xs-4 { + width: 33.33333333333333% +} + +.col-xs-5 { + width: 41.66666666666667% +} + +.col-xs-6 { + width: 50% +} + +.col-xs-7 { + width: 58.333333333333336% +} + +.col-xs-8 { + width: 66.66666666666666% +} + +.col-xs-9 { + width: 75% +} + +.col-xs-10 { + width: 83.33333333333334% +} + +.col-xs-11 { + width: 91.66666666666666% +} + +.col-xs-12 { + width: 100% +} + +@media (min-width:768px) { + .boxed-layout #page-header, .boxed-layout #page-wrapper, .container { + max-width: 750px + } + + .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9 { + float: left + } + + .col-sm-1 { + width: 8.333333333333332% + } + + .col-sm-2 { + width: 16.666666666666664% + } + + .col-sm-3 { + width: 25% + } + + .col-sm-4 { + width: 33.33333333333333% + } + + .col-sm-5 { + width: 41.66666666666667% + } + + .col-sm-6 { + width: 50% + } + + .col-sm-7 { + width: 58.333333333333336% + } + + .col-sm-8 { + width: 66.66666666666666% + } + + .col-sm-9 { + width: 75% + } + + .col-sm-10 { + width: 83.33333333333334% + } + + .col-sm-11 { + width: 91.66666666666666% + } + + .col-sm-12 { + width: 100% + } + + .col-sm-push-1 { + left: 8.333333333333332% + } + + .col-sm-push-2 { + left: 16.666666666666664% + } + + .col-sm-push-3 { + left: 25% + } + + .col-sm-push-4 { + left: 33.33333333333333% + } + + .col-sm-push-5 { + left: 41.66666666666667% + } + + .col-sm-push-6 { + left: 50% + } + + .col-sm-push-7 { + left: 58.333333333333336% + } + + .col-sm-push-8 { + left: 66.66666666666666% + } + + .col-sm-push-9 { + left: 75% + } + + .col-sm-push-10 { + left: 83.33333333333334% + } + + .col-sm-push-11 { + left: 91.66666666666666% + } + + .col-sm-pull-1 { + right: 8.333333333333332% + } + + .col-sm-pull-2 { + right: 16.666666666666664% + } + + .col-sm-pull-3 { + right: 25% + } + + .col-sm-pull-4 { + right: 33.33333333333333% + } + + .col-sm-pull-5 { + right: 41.66666666666667% + } + + .col-sm-pull-6 { + right: 50% + } + + .col-sm-pull-7 { + right: 58.333333333333336% + } + + .col-sm-pull-8 { + right: 66.66666666666666% + } + + .col-sm-pull-9 { + right: 75% + } + + .col-sm-pull-10 { + right: 83.33333333333334% + } + + .col-sm-pull-11 { + right: 91.66666666666666% + } + + .col-sm-offset-1 { + margin-left: 8.333333333333332% + } + + .col-sm-offset-2 { + margin-left: 16.666666666666664% + } + + .col-sm-offset-3 { + margin-left: 25% + } + + .col-sm-offset-4 { + margin-left: 33.33333333333333% + } + + .col-sm-offset-5 { + margin-left: 41.66666666666667% + } + + .col-sm-offset-6 { + margin-left: 50% + } + + .col-sm-offset-7 { + margin-left: 58.333333333333336% + } + + .col-sm-offset-8 { + margin-left: 66.66666666666666% + } + + .col-sm-offset-9 { + margin-left: 75% + } + + .col-sm-offset-10 { + margin-left: 83.33333333333334% + } + + .col-sm-offset-11 { + margin-left: 91.66666666666666% + } +} + +@media (min-width:992px) { + .boxed-layout #page-header, .boxed-layout #page-wrapper, .container { + max-width: 970px + } + + .col-md-1, .col-md-10, .col-md-11, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9 { + float: left + } + + .col-md-1 { + width: 8.333333333333332% + } + + .col-md-2 { + width: 16.666666666666664% + } + + .col-md-3 { + width: 25% + } + + .col-md-4 { + width: 33.33333333333333% + } + + .col-md-5 { + width: 41.66666666666667% + } + + .col-md-6 { + width: 50% + } + + .col-md-7 { + width: 58.333333333333336% + } + + .col-md-8 { + width: 66.66666666666666% + } + + .col-md-9 { + width: 75% + } + + .col-md-10 { + width: 83.33333333333334% + } + + .col-md-11 { + width: 91.66666666666666% + } + + .col-md-12 { + width: 100% + } + + .col-md-push-0 { + left: auto + } + + .col-md-push-1 { + left: 8.333333333333332% + } + + .col-md-push-2 { + left: 16.666666666666664% + } + + .col-md-push-3 { + left: 25% + } + + .col-md-push-4 { + left: 33.33333333333333% + } + + .col-md-push-5 { + left: 41.66666666666667% + } + + .col-md-push-6 { + left: 50% + } + + .col-md-push-7 { + left: 58.333333333333336% + } + + .col-md-push-8 { + left: 66.66666666666666% + } + + .col-md-push-9 { + left: 75% + } + + .col-md-push-10 { + left: 83.33333333333334% + } + + .col-md-push-11 { + left: 91.66666666666666% + } + + .col-md-pull-0 { + right: auto + } + + .col-md-pull-1 { + right: 8.333333333333332% + } + + .col-md-pull-2 { + right: 16.666666666666664% + } + + .col-md-pull-3 { + right: 25% + } + + .col-md-pull-4 { + right: 33.33333333333333% + } + + .col-md-pull-5 { + right: 41.66666666666667% + } + + .col-md-pull-6 { + right: 50% + } + + .col-md-pull-7 { + right: 58.333333333333336% + } + + .col-md-pull-8 { + right: 66.66666666666666% + } + + .col-md-pull-9 { + right: 75% + } + + .col-md-pull-10 { + right: 83.33333333333334% + } + + .col-md-pull-11 { + right: 91.66666666666666% + } + + .col-md-offset-0 { + margin-left: 0 + } + + .col-md-offset-1 { + margin-left: 8.333333333333332% + } + + .col-md-offset-2 { + margin-left: 16.666666666666664% + } + + .col-md-offset-3 { + margin-left: 25% + } + + .col-md-offset-4 { + margin-left: 33.33333333333333% + } + + .col-md-offset-5 { + margin-left: 41.66666666666667% + } + + .col-md-offset-6 { + margin-left: 50% + } + + .col-md-offset-7 { + margin-left: 58.333333333333336% + } + + .col-md-offset-8 { + margin-left: 66.66666666666666% + } + + .col-md-offset-9 { + margin-left: 75% + } + + .col-md-offset-10 { + margin-left: 83.33333333333334% + } + + .col-md-offset-11 { + margin-left: 91.66666666666666% + } +} + +@media (min-width:1200px) { + .boxed-layout #page-header, .boxed-layout #page-wrapper, .container { + max-width: 1170px + } + + .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9 { + float: left + } + + .col-lg-1 { + width: 8.333333333333332% + } + + .col-lg-2 { + width: 16.666666666666664% + } + + .col-lg-3 { + width: 25% + } + + .col-lg-4 { + width: 33.33333333333333% + } + + .col-lg-5 { + width: 41.66666666666667% + } + + .col-lg-6 { + width: 50% + } + + .col-lg-7 { + width: 58.333333333333336% + } + + .col-lg-8 { + width: 66.66666666666666% + } + + .col-lg-9 { + width: 75% + } + + .col-lg-10 { + width: 83.33333333333334% + } + + .col-lg-11 { + width: 91.66666666666666% + } + + .col-lg-12 { + width: 100% + } + + .col-lg-push-0 { + left: auto + } + + .col-lg-push-1 { + left: 8.333333333333332% + } + + .col-lg-push-2 { + left: 16.666666666666664% + } + + .col-lg-push-3 { + left: 25% + } + + .col-lg-push-4 { + left: 33.33333333333333% + } + + .col-lg-push-5 { + left: 41.66666666666667% + } + + .col-lg-push-6 { + left: 50% + } + + .col-lg-push-7 { + left: 58.333333333333336% + } + + .col-lg-push-8 { + left: 66.66666666666666% + } + + .col-lg-push-9 { + left: 75% + } + + .col-lg-push-10 { + left: 83.33333333333334% + } + + .col-lg-push-11 { + left: 91.66666666666666% + } + + .col-lg-pull-0 { + right: auto + } + + .col-lg-pull-1 { + right: 8.333333333333332% + } + + .col-lg-pull-2 { + right: 16.666666666666664% + } + + .col-lg-pull-3 { + right: 25% + } + + .col-lg-pull-4 { + right: 33.33333333333333% + } + + .col-lg-pull-5 { + right: 41.66666666666667% + } + + .col-lg-pull-6 { + right: 50% + } + + .col-lg-pull-7 { + right: 58.333333333333336% + } + + .col-lg-pull-8 { + right: 66.66666666666666% + } + + .col-lg-pull-9 { + right: 75% + } + + .col-lg-pull-10 { + right: 83.33333333333334% + } + + .col-lg-pull-11 { + right: 91.66666666666666% + } + + .col-lg-offset-0 { + margin-left: 0 + } + + .col-lg-offset-1 { + margin-left: 8.333333333333332% + } + + .col-lg-offset-2 { + margin-left: 16.666666666666664% + } + + .col-lg-offset-3 { + margin-left: 25% + } + + .col-lg-offset-4 { + margin-left: 33.33333333333333% + } + + .col-lg-offset-5 { + margin-left: 41.66666666666667% + } + + .col-lg-offset-6 { + margin-left: 50% + } + + .col-lg-offset-7 { + margin-left: 58.333333333333336% + } + + .col-lg-offset-8 { + margin-left: 66.66666666666666% + } + + .col-lg-offset-9 { + margin-left: 75% + } + + .col-lg-offset-10 { + margin-left: 83.33333333333334% + } + + .col-lg-offset-11 { + margin-left: 91.66666666666666% + } +} + +.row.no-gutter { + margin-left: 0; + margin-right: 0 +} + +.no-gutter>[class*=col-] { + padding-left: 0; + padding-right: 0 +} + +.pad5A { + padding: 5px !important +} + +.pad5T { + padding-top: 5px !important +} + +.pad5R { + padding-right: 5px !important +} + +.pad5B { + padding-bottom: 5px !important +} + +.pad5L { + padding-left: 5px !important +} + +.pad10A { + padding: 10px !important +} + +.pad10T { + padding-top: 10px !important +} + +.pad10R { + padding-right: 10px !important +} + +.pad10B { + padding-bottom: 10px !important +} + +.pad10L { + padding-left: 10px !important +} + +.pad15A { + padding: 15px !important +} + +.pad15T { + padding-top: 15px !important +} + +.pad15R { + padding-right: 15px !important +} + +.pad15B { + padding-bottom: 15px !important +} + +.pad15L { + padding-left: 15px !important +} + +.pad20A { + padding: 20px !important +} + +.pad20T { + padding-top: 20px !important +} + +.pad20R { + padding-right: 20px !important +} + +.pad20B { + padding-bottom: 20px !important +} + +.pad20L { + padding-left: 20px !important +} + +.pad25A { + padding: 25px !important +} + +.pad25T { + padding-top: 25px !important +} + +.pad25R { + padding-right: 25px !important +} + +.pad25B { + padding-bottom: 25px !important +} + +.pad25L { + padding-left: 25px !important +} + +.pad45A { + padding: 45px !important +} + +.pad45T { + padding-top: 45px !important +} + +.pad45R { + padding-right: 45px !important +} + +.pad45B { + padding-bottom: 45px !important +} + +.pad45L { + padding-left: 45px !important +} + +.pad0A { + padding: 0 !important +} + +.pad0T { + padding-top: 0 !important +} + +.pad0R { + padding-right: 0 !important +} + +.pad0B { + padding-bottom: 0 !important +} + +.pad0L { + padding-left: 0 !important +} + +.mrg5A { + margin: 5px !important +} + +.mrg5T { + margin-top: 5px !important +} + +.mrg5R { + margin-right: 5px !important +} + +.mrg5B { + margin-bottom: 5px !important +} + +.mrg5L { + margin-left: 5px !important +} + +.mrg10A { + margin: 10px !important +} + +.mrg10T { + margin-top: 10px !important +} + +.mrg10R { + margin-right: 10px !important +} + +.mrg10B { + margin-bottom: 10px !important +} + +.mrg10L { + margin-left: 10px !important +} + +.mrg15A { + margin: 15px !important +} + +.mrg15T { + margin-top: 15px !important +} + +.mrg15R { + margin-right: 15px !important +} + +.mrg15B { + margin-bottom: 15px !important +} + +.mrg15L { + margin-left: 15px !important +} + +.mrg20A { + margin: 20px !important +} + +.mrg20T { + margin-top: 20px !important +} + +.mrg20R { + margin-right: 20px !important +} + +.mrg20B { + margin-bottom: 20px !important +} + +.mrg20L { + margin-left: 20px !important +} + +.mrg25A { + margin: 25px !important +} + +.mrg25T { + margin-top: 25px !important +} + +.mrg25R { + margin-right: 25px !important +} + +.mrg25B { + margin-bottom: 25px !important +} + +.mrg25L { + margin-left: 25px !important +} + +.mrg45A { + margin: 45px !important +} + +.mrg45T { + margin-top: 45px !important +} + +.mrg45R { + margin-right: 45px !important +} + +.mrg45B { + margin-bottom: 45px !important +} + +.mrg45L { + margin-left: 45px !important +} + +.mrg0A { + margin: 0 !important +} + +.mrg0T { + margin-top: 0 !important +} + +.mrg0R { + margin-right: 0 !important +} + +.mrg0B { + margin-bottom: 0 !important +} + +.mrg0L { + margin-left: 0 !important +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-weight: 500; + margin: 0 +} + +.h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { + font-weight: 400 +} + +.h1, h1 { + font-size: 38px +} + +.h2, h2 { + font-size: 26px +} + +.h3, h3 { + font-size: 20px +} + +.h4, h4 { + font-size: 16px +} + +.h5, h5 { + font-size: 14px +} + +.h6, h6 { + font-size: 12px +} + +.h1 small, h1 small { + font-size: 24px +} + +.h2 small, h2 small { + font-size: 18px +} + +.h3 small, .h4 small, h3 small, h4 small { + font-size: 14px +} + +h1 .small, h1 small, h2 .small, h2 small, h3 .small, h3 small { + font-size: 75% +} + +blockquote { + margin: 0 0 20px; + padding: 10px 20px; + border-left: 5px solid #eee +} + +blockquote p { + font-size: 17.5px; + font-weight: 50; + line-height: 1.25 +} + +blockquote p:last-child { + margin-bottom: 0 +} + +blockquote small { + color: #999 +} + +blockquote small:before { + content: '\2014 \00A0' +} + +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eee; + border-left: 0 +} + +blockquote.pull-right .small, blockquote.pull-right p, blockquote.pull-right small { + text-align: right +} + +blockquote.pull-right .small:before, blockquote.pull-right small:before { + content: '' +} + +blockquote.pull-right .small:after, blockquote.pull-right small:after { + content: '\00A0 \2014' +} + +blockquote:after, blockquote:before { + content: '' +} + +address { + font-style: normal; + line-height: 1.428571429; + margin-bottom: 20px +} + +code, kbd, pre, samp { + font-family: Menlo, Monaco, Consolas, 'Courier New', monospace +} + +code { + font-size: 90%; + padding: 0 4px; + white-space: nowrap; + color: #d05; + border: 1px solid #dfe8f1; + border-radius: 3px; + background: #fafafa +} + +pre { + font-size: 13px; + margin: 0 0 10px; + padding: 9.5px; + word-wrap: break-word; + word-break: break-all; + color: #333; + border: 1px solid #ccc; + border-radius: 4px; + background-color: #f5f5f5 +} + +pre code { + font-size: inherit; + padding: 0; + color: inherit; + border-radius: 0; + background-color: transparent +} + +.btn, .fc-button, .input-group-btn, .text-no-wrap { + white-space: nowrap +} + +p { + line-height: 1.6em; + margin: 0 +} + +.title-hero { + margin: 0 0 15px; + padding: 0; + text-transform: uppercase; + font-size: 14px; + opacity: .7 +} + +h4.title-hero { + font-size: 15px +} + +.title-lead { + color: #3F3F3F +} + +.title-hero .title-lead { + font-size: 65%; + margin: 5px 0 0 +} + +.title-hero+.title-lead { + margin-top: -10px +} + +.jumbotron { + font-size: 21px; + font-weight: 200; + line-height: 2.1428571435; + margin-bottom: 30px; + padding: 30px; + color: inherit; + background-color: #eee +} + +.jumbotron h1 { + line-height: 1; + color: inherit +} + +.jumbotron p { + line-height: 1.4 +} + +.container .jumbotron { + border-radius: 6px +} + +@media screen and (min-width:768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px + } + + .container .jumbotron { + padding-right: 60px; + padding-left: 60px + } + + .jumbotron h1 { + font-size: 63px + } +} + +.float-left, .pull-left { + float: left !important +} + +.float-right, .pull-right { + float: right !important +} + +.float-none { + float: none !important +} + +.font-size-10 { + font-size: 10px !important +} + +.font-size-11 { + font-size: 11px !important +} + +.font-size-12 { + font-size: 12px !important +} + +.font-size-13 { + font-size: 13px !important +} + +.font-size-14 { + font-size: 14px !important +} + +.font-size-15 { + font-size: 15px !important +} + +.font-size-16 { + font-size: 16px !important +} + +.font-size-17 { + font-size: 17px !important +} + +.font-size-18 { + font-size: 18px !important +} + +.font-size-20 { + font-size: 20px !important +} + +.font-size-23 { + font-size: 23px !important +} + +.font-size-26 { + font-size: 26px !important +} + +.font-size-28 { + font-size: 28px !important +} + +.font-size-35 { + font-size: 35px !important +} + +.font-size-50 { + font-size: 50px !important +} + +.text-center { + text-align: center !important +} + +.text-left { + text-align: left !important +} + +.text-right { + text-align: right !important +} + +.text-justify { + text-align: justify +} + +.text-transform-none { + text-transform: none +} + +.text-transform-upr { + text-transform: uppercase +} + +.text-transform-low { + text-transform: lowercase +} + +.text-transform-cap { + text-transform: capitalize +} + +.font-bold { + font-weight: 700 !important +} + +.btn, .fc-button, .font-normal { + font-weight: 400 +} + +.font-italic { + font-style: italic +} + +.font-none { + font-style: none +} + +.clear-none { + clear: none !important +} + +#page-wrapper:after, .btn-group:after, .btn-toolbar:after, .button-pane:after, .chat-box li:after, .clearfix:after, .comments-list li .panel-body:after, .container:after, .content-box-header:after, .example-box-wrapper:after, .files-box li:after, .form-horizontal .form-group:after, .form-input-prepend:after, .form-row:after, .info-box:after, .messages-box li:after, .nav-list li:after, .nav:after, .notifications-box li:after, .pager:after, .posts-list li:after, .tl-item:after, .tl-row:after, .todo-box li:after, .ui-datepicker-buttonpane:after, .ui-helper-clearfix:after { + clear: both +} + +.ui-front { + z-index: 100 +} + +.wrapper-sticky { + z-index: 15 +} + +.hide, .lazy, .mix, .tab-pane, [data-toggle=buttons]>.btn>input[type=checkbox], [data-toggle=buttons]>.btn>input[type=radio] { + display: none +} + +.tab-pane { + padding: 15px +} + +.hidden, .ui-helper-hidden-accessible { + display: none !important +} + +.display-block { + position: relative !important; + display: block !important +} + +.display-block .button-content { + float: none +} + +.display-block.dropdown-menu { + position: static !important +} + +.display-inline { + display: inline-block +} + +.no-border { + border-color: transparent !important +} + +.dropdown-menu.pad0A .hasDatepicker .ui-datepicker, .remove-border { + border: 0 !important +} + +.border-top { + border-top-width: 3px !important; + border-top-style: solid !important +} + +.width-100 { + box-sizing: border-box; + width: 100% +} + +.center-margin { + float: none !important; + margin: 0 auto +} + +.center-block, .container { + display: block; + margin-right: auto; + margin-left: auto +} + +.center-vertical { + position: relative; + z-index: 15; + top: 0; + left: 0; + display: table; + width: 100%; + height: 100% +} + +.center-vertical .center-content { + display: table-cell; + vertical-align: middle +} + +.position-absolute { + position: absolute +} + +.show { + display: block !important +} + +.hidden { + display: none !important; + visibility: hidden !important +} + +.invisible { + visibility: hidden +} + +.center-div { + float: none !important; + margin-right: auto !important; + margin-left: auto !important; + text-align: center !important +} + +.btn-group>.btn-group, .btn-toolbar .btn-group, .btn-toolbar .input-group, .demo-icon { + float: left +} + +.divider, .nav-divider { + ityity: .7; + -moz-opacity: .7; + filter: alpha(opacity: 70) +} + +.divider { + height: 1px; + margin: 10px 0; + padding: 0 +} + +.divider-header { + font-size: 11px; + padding: 10px 15px; + text-transform: uppercase; + opacity: .2; + color: #fff +} + +.width-reset { + width: auto !important +} + +.opacity-10 { + opacity: .1 !important; + -moz-opacity: .1 !important; + filter: alpha(opacity: 10) !important +} + +.info-box b, .info-box.icon-wrapper .icon-large, .opacity-30 { + opacity: .3 !important; + -moz-opacity: .3 !important; + filter: alpha(opacity: 30) !important +} + +.opacity-40 { + opacity: .4 !important; + -moz-opacity: .4 !important; + filter: alpha(opacity: 40) !important +} + +.info-box b, .label-description span, .opacity-60, .opacity-hover { + opacity: .6 !important; + -moz-opacity: .6 !important; + filter: alpha(opacity: 60) !important +} + +.no-shadow.transparent.btn:hover i, .opacity-80, .ui-datepicker-current.ui-priority-secondary { + opacity: .8 !important; + -moz-opacity: .8 !important; + filter: alpha(opacity: 80) !important +} + +.opacity-100, .opacity-hover:hover { + opacity: 1 !important; + -moz-opacity: 1 !important; + filter: alpha(opacity: 100) !important +} + +.btn-link .glyph-icon.opacity-hover { + margin: 0 -5px +} + +.transparent { + border-color: transparent !important; + background: 0 0 !important; + box-shadow: 0 0 0 0 transparent !important +} + +.no-shadow { + box-shadow: 0 0 0 transparent !important +} + +.remove-bg { + background: 0 0 +} + +.nicescroll-rails { + background: 0 0 !important +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent +} + +#loading, .login-img, .ui-widget-overlay { + width: 100%; + height: 100% +} + +.dropup .caret, .navbar-fixed-bottom .dropdown .caret { + content: ''; + border-top: 0; + border-bottom: 4px solid +} + +.chosen-results, .form-wizard>ul, .nav-list ul, .nav-list-horizontal ul, .parsley-errors-list, .reset-ul, .tabs-navigation>ul, ul.messages-box, ul.notifications-box, ul.progress-box { + margin: 0; + padding: 0; + list-style: none +} + +#page-wrapper:after, #page-wrapper:before, .btn-group:after, .btn-group:before, .btn-toolbar:after, .btn-toolbar:before, .button-pane:after, .button-pane:before, .chat-box li:after, .chat-box li:before, .clearfix:after, .clearfix:before, .comments-list li .panel-body:after, .comments-list li .panel-body:before, .container:after, .container:before, .content-box-header:after, .content-box-header:before, .example-box-wrapper:after, .example-box-wrapper:before, .files-box li:after, .files-box li:before, .form-input-prepend:after, .form-input-prepend:before, .form-row:after, .form-row:before, .info-box:after, .info-box:before, .messages-box li:after, .messages-box li:before, .nav-list li:after, .nav-list li:before, .nav:after, .nav:before, .notifications-box li:after, .notifications-box li:before, .pager:after, .pager:before, .posts-list li:after, .posts-list li:before, .tl-item:after, .tl-item:before, .tl-row:after, .tl-row:before, .todo-box li:after, .todo-box li:before, .ui-datepicker-buttonpane:after, .ui-datepicker-buttonpane:before, .ui-helper-clearfix:after, .ui-helper-clearfix:before { + display: table; + content: '' +} + +.ui-sortable-placeholder { + visibility: visible !important; + border: 1px dashed #efda2c !important; + background: #fffce5 !important +} + +.daterangepicker td.available.in-range:hover, .daterangepicker td.in-range { + background: #fffce5 +} + +.checker.disabled, .checker.disabled span, .chosen-disabled, .disabled, .radio.disabled, .radio.disabled span, .ui-rangeSlider-disabled .ui-rangeSlider-arrow, .ui-rangeSlider-disabled .ui-rangeSlider-container, .ui-rangeSlider-disabled .ui-rangeSlider-label, .ui-state-disabled, button[disabled] { + cursor: not-allowed !important; + opacity: .65; + filter: alpha(opacity: 65) +} + +.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control, input[disabled], select[disabled], textarea[disabled] { + cursor: not-allowed; + opacity: .65; + background: #fafafa; + filter: alpha(opacity: 65) +} + +input[readonly], select[readonly], textarea[readonly] { + opacity: .8; + background: #fdfdfd; + -moz-opacity: .8; + filter: alpha(opacity: 80) +} + +.login-img { + position: fixed !important; + top: 0; + left: 0 +} + +.fixed-bg { + background-repeat: no-repeat; + background-attachment: fixed; + background-position: center center; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover +} + +.ui-widget-overlay { + position: fixed; + left: 0; + top: 0; + bottom: 0; + right: 0; + text-align: center; + z-index: 16 +} + +.ui-widget-overlay img { + position: absolute; + top: 50%; + left: 50%; + margin: -26px 0 0 -26px +} + +#loading { + z-index: 5555; + position: fixed; + left: 0; + top: 0; + background: #fff +} + +.fade { + -webkit-transition: opacity .15s linear; + transition: opacity .15s linear +} + +.collapse { + display: none +} + +.collapse.in, .tab-pane.active { + display: block +} + +.collapsing { + position: relative; + height: 0; + -webkit-transition: height .35s ease; + transition: height .35s ease +} + +.small-padding { + padding: 25px 0 +} + +.medium-padding { + padding: 55px 0 +} + +.large-padding { + padding: 85px 0 +} + +.xlarge-padding { + padding: 115px 0 +} + +.glyph-icon { + text-align: center +} + +#page-sidebar li a.sf-with-ul:after, #page-sidebar li ul li a:before, .dataTables_paginate a i:before, .fc-icon, .glyph-icon:before, .search-choice-close:before, .ui-dialog-titlebar-close:before, .ui-icon:before { + font-family: FontAwesome; + font-weight: 400; + font-style: normal; + display: inline-block; + text-align: center; + text-decoration: none; + background: 0 0; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.dropdown-menu>.disabled>a:focus, .dropdown-menu>.disabled>a:hover { + cursor: not-allowed; + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid: DXImageTransform.Microsoft.gradient(enabled=false) +} + +.sr-only { + position: absolute; + clip: rect(0, 0, 0, 0); + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + border: 0 +} + +.rm-transition { + -webkit-transition: none !important; + -moz-transition: none !important; + -ms-transition: none !important; + -o-transition: none !important +} + +.btn, a, button, div[id^=uniform-] span { + -webkit-transition: all .1s ease-in-out; + -moz-transition: all .1s ease-in-out; + -ms-transition: all .1s ease-in-out; + -o-transition: all .1s ease-in-out +} + +#page-header, #page-sidebar, .main-header, .top-bar { + -webkit-transition: all .5s ease-in-out; + -moz-transition: all .5s ease-in-out; + -ms-transition: all .5s ease-in-out; + -o-transition: all .5s ease-in-out +} + +.example-box-wrapper { + margin-bottom: 15px; + position: relative +} + +.example-box-wrapper .ui-datepicker-inline { + position: relative; + width: 100% +} + +.panel-body .col-md-6 .example-box-wrapper:last-child, .panel-body .example-box-wrapper:last-child { + margin-bottom: 0 +} + +.example-box-wrapper .alert, .example-box-wrapper .content-box, .example-box-wrapper .dashboard-box, .example-box-wrapper .dataTables_wrapper, .example-box-wrapper .icon-box, .example-box-wrapper .image-box, .example-box-wrapper .jcrop-holder, .example-box-wrapper .jvectormap-container, .example-box-wrapper .list-group, .example-box-wrapper .loading-spinner, .example-box-wrapper .loading-stick, .example-box-wrapper .minicolors, .example-box-wrapper .nav, .example-box-wrapper .panel-layout, .example-box-wrapper .scrollable-content, .example-box-wrapper .tile-box, .example-box-wrapper .ui-accordion, .example-box-wrapper .ui-rangeSlider, .example-box-wrapper .ui-slider, .example-box-wrapper .ui-tabs, .example-box-wrapper>.btn, .example-box-wrapper>.btn-group, .example-box-wrapper>.btn-group-vertical, .example-box-wrapper>.btn-toolbar, .example-box-wrapper>.display-block.dropdown-menu, .example-box-wrapper>.dropdown, .example-box-wrapper>.dropup, .example-box-wrapper>.hasDatepicker, .example-box-wrapper>.img-humbnail, .example-box-wrapper>.minicolors, .example-box-wrapper>.pagination, .example-box-wrapper>.panel-layout, .example-box-wrapper>.progressbar, .example-box-wrapper>.thumbnail, .example-box-wrapper>form, .example-box-wrapper>h6, .example-box-wrapper>img { + margin-bottom: 20px +} + +.demo-icon { + font-size: 22px; + line-height: 40px; + width: 40px; + height: 40px; + margin: 10px; + text-align: center; + color: #92A0B3; + border: 1px solid rgba(220, 233, 255, .54); + border-radius: 3px +} + +.btn-block, .btn-group-justified, .btn-group-justified>.btn-group .btn, input[type=button].btn-block, input[type=reset].btn-block, input[type=submit].btn-block { + width: 100% +} + +.demo-icon:hover { + color: #59606c; + border-color: #92A0B3 +} + +.font-black { + color: #464646 !important +} + +.font-blue { + color: #1f6dca !important +} + +.font-blue-alt { + color: #65a6ff !important +} + +.font-azure { + color: #41e5c0 !important +} + +.font-gray, .text-muted { + color: #c2c2c2 !important +} + +.font-gray-dark, .text-info { + color: #828282 !important +} + +.font-green, .text-success { + color: #2ecc71 !important +} + +.font-orange, .text-warning { + color: #fa7753 !important +} + +.font-yellow { + color: #fc0 !important +} + +.font-purple { + color: #984dff !important +} + +.font-red, .has-error .help-block, .parsley-required, .text-danger { + color: #ff5757 !important +} + +.font-white { + color: #fff !important +} + +.alert-info, .alert-info a { + color: #6c6c6c; + border-color: #c9c9c9; + background: #dfe8f1 +} + +.alert-notice, .alert-notice a { + color: #0f2c62; + border-color: #62baf6; + background: #c6e8ff +} + +.alert-success, .alert-success a, .parsley-success { + color: #1e620f; + border-color: #7cd362; + background: #d3ffc6 +} + +.parsley-success { + background: #fff +} + +.alert-warning, .alert-warning a, .warning { + color: #624b0f; + border-color: #ebc875; + background: #ffeec6 +} + +.alert-danger, .alert-danger a, .danger, .parsley-error { + color: #620f0f; + border-color: #db6a6a; + background: #ffc6c6 +} + +.bg-facebook, .bg-google, .bg-twitter { + color: #fff !important +} + +.parsley-error { + background: #fff +} + +.bg-facebook { + background: #3b5998 +} + +.btn.bg-facebook:hover { + background: #304b85 +} + +.bg-twitter { + background: #3a92c8 +} + +.btn.bg-twitter:hover { + background: #2b80b4 +} + +.bg-google { + background: #dd4b39 +} + +.btn.bg-google:hover { + background: #c93b2a +} + +.badge-info, .bg-blue, .bootstrap-switch-info, .btn-info, .checkbox-info div[id^=uniform-] span.checked, .hover-blue:hover, .hover-info:hover, .label-info, .progress-bar-info, .radio-info div[id^=uniform-] span.checked { + color: #fff; + border-color: #308dcc; + background: #3498db +} + +.btn-info.active, .btn-info.disabled, .btn-info.disabled.active, .btn-info.disabled:active, .btn-info.disabled:focus, .btn-info.disabled:hover, .btn-info:active, .btn-info:focus, .btn-info:hover, .btn-info[disabled], .btn-info[disabled].active, .btn-info[disabled]:active, .btn-info[disabled]:focus, .btn-info[disabled]:hover, .label-info[href]:focus, .label-info[href]:hover, .open .dropdown-toggle.btn-info { + color: #fff; + border-color: #308dcc; + background: #52a7e0 +} + +.badge-danger, .bg-danger, .bg-red, .bootstrap-switch-danger, .btn-danger, .checkbox-danger div[id^=uniform-] span.checked, .hover-danger:hover, .hover-red:hover, .label-danger, .progress-bar-danger, .radio-danger div[id^=uniform-] span.checked { + color: #fff; + border-color: #cf4436; + background: #e74c3c +} + +.btn-danger.active, .btn-danger.disabled, .btn-danger.disabled.active, .btn-danger.disabled:active, .btn-danger.disabled:focus, .btn-danger.disabled:hover, .btn-danger:active, .btn-danger:focus, .btn-danger:hover, .btn-danger[disabled], .btn-danger[disabled].active, .btn-danger[disabled]:active, .btn-danger[disabled]:focus, .btn-danger[disabled]:hover, .label-danger[href]:focus, .label-danger[href]:hover, .open .dropdown-toggle.btn-danger { + color: #fff; + border-color: #cf4436; + background: #eb6759 +} + +.badge-gray, .bg-gray, .btn-gray, .hover-gray:hover, .label-gray { + color: #666; + background: #efefef +} + +.btn-gray.active, .btn-gray.disabled, .btn-gray.disabled.active, .btn-gray.disabled:active, .btn-gray.disabled:focus, .btn-gray.disabled:hover, .btn-gray:active, .btn-gray:focus, .btn-gray:hover, .btn-gray[disabled], .btn-gray[disabled].active, .btn-gray[disabled]:active, .btn-gray[disabled]:focus, .btn-gray[disabled]:hover, .label-gray[href]:focus, .label-gray[href]:hover, .open .dropdown-toggle.btn-gray { + color: #333; + background: #e7e7e7 +} + +.badge-gray-alt, .bg-gray-alt, .btn-gray-alt, .hover-gray-alt:hover, .label-gray-alt { + color: #888; + background: #f6f6f6 +} + +.btn-gray-alt.active, .btn-gray-alt.disabled, .btn-gray-alt.disabled.active, .btn-gray-alt.disabled:active, .btn-gray-alt.disabled:focus, .btn-gray-alt.disabled:hover, .btn-gray-alt:active, .btn-gray-alt:focus, .btn-gray-alt:hover, .btn-gray-alt[disabled], .btn-gray-alt[disabled].active, .btn-gray-alt[disabled]:active, .btn-gray-alt[disabled]:focus, .btn-gray-alt[disabled]:hover, .label-gray-alt[href]:focus, .label-gray-alt[href]:hover, .open .dropdown-toggle.btn-gray-alt { + color: #444; + background: #ededed +} + +.badge-black, .bg-black, .btn-black, .hover-black:hover, .label-black { + color: #ccc; + border-color: #000; + background: #2d2d2d +} + +.boxed-layout.bg-black { + background: #2d2d2d +} + +.btn-black.active, .btn-black.disabled, .btn-black.disabled.active, .btn-black.disabled:active, .btn-black.disabled:focus, .btn-black.disabled:hover, .btn-black:active, .btn-black:focus, .btn-black:hover, .btn-black[disabled], .btn-black[disabled].active, .btn-black[disabled]:active, .btn-black[disabled]:focus, .btn-black[disabled]:hover, .label-black[href]:focus, .label-black[href]:hover, .open .dropdown-toggle.btn-black { + color: #fdfdfd; + background: #151515 +} + +.badge-black-opacity, .bg-black-opacity, .btn-black-opacity, .hover-black-opacity:hover, .label-black-opacity { + color: #a9b3bb; + background: #2b323d +} + +.btn-black-opacity.active, .btn-black-opacity.disabled, .btn-black-opacity.disabled.active, .btn-black-opacity.disabled:active, .btn-black-opacity.disabled:focus, .btn-black-opacity.disabled:hover, .btn-black-opacity:active, .btn-black-opacity:focus, .btn-black-opacity:hover, .btn-black-opacity[disabled], .btn-black-opacity[disabled].active, .btn-black-opacity[disabled]:active, .btn-black-opacity[disabled]:focus, .btn-black-opacity[disabled]:hover, .label-black-opacity[href]:focus, .label-black-opacity[href]:hover, .open .dropdown-toggle.btn-black-opacity { + color: #fff; + background: #14171c +} + +.badge-black-opacity-alt, .bg-black-opacity-alt, .btn-black-opacity-alt, .hover-black-opacity-alt:hover, .label-black-opacity-alt { + color: #fff; + background: rgba(0, 0, 0, .2); + border-color: transparent +} + +.btn-black-opacity-alt.active, .btn-black-opacity-alt.disabled, .btn-black-opacity-alt.disabled.active, .btn-black-opacity-alt.disabled:active, .btn-black-opacity-alt.disabled:focus, .btn-black-opacity-alt.disabled:hover, .btn-black-opacity-alt:active, .btn-black-opacity-alt:focus, .btn-black-opacity-alt:hover, .btn-black-opacity-alt[disabled], .btn-black-opacity-alt[disabled].active, .btn-black-opacity-alt[disabled]:active, .btn-black-opacity-alt[disabled]:focus, .btn-black-opacity-alt[disabled]:hover, .label-black-opacity-alt[href]:focus, .label-black-opacity-alt[href]:hover, .open .dropdown-toggle.btn-black-opacity-alt { + color: #fff; + background: rgba(0, 0, 0, .3) +} + +.badge-success, .bg-green, .bootstrap-switch-success, .btn-success, .checkbox-success div[id^=uniform-] span.checked, .hover-green:hover, .hover-success:hover, .label-success, .progress-bar-success, .radio-success div[id^=uniform-] span.checked { + color: #fff; + border-color: #29b765; + background: #2ecc71 +} + +.btn-success.active, .btn-success.disabled, .btn-success.disabled.active, .btn-success.disabled:active, .btn-success.disabled:focus, .btn-success.disabled:hover, .btn-success:active, .btn-success:focus, .btn-success:hover, .btn-success[disabled], .btn-success[disabled].active, .btn-success[disabled]:active, .btn-success[disabled]:focus, .btn-success[disabled]:hover, .label-success[href]:focus, .label-success[href]:hover, .open .dropdown-toggle.btn-success { + color: #fff; + border-color: #29b765; + background: #58d68d +} + +.badge-warning, .bg-orange, .bg-warning, .bootstrap-switch-warning, .btn-warning, .checkbox-warning div[id^=uniform-] span.checked, .hover-orange:hover, .hover-warning:hover, .label-warning, .progress-bar-warning, .radio-warning div[id^=uniform-] span.checked { + color: #fff; + border-color: #d67520; + background: #e67e22 +} + +.btn-warning.active, .btn-warning.disabled, .btn-warning.disabled.active, .btn-warning.disabled:active, .btn-warning.disabled:focus, .btn-warning.disabled:hover, .btn-warning:active, .btn-warning:focus, .btn-warning:hover, .btn-warning[disabled], .btn-warning[disabled].active, .btn-warning[disabled]:active, .btn-warning[disabled]:focus, .btn-warning[disabled]:hover, .label-warning[href]:focus, .label-warning[href]:hover, .open .dropdown-toggle.btn-warning { + color: #fff; + border-color: #d67520; + background: #ea9143 +} + +.bg-white, .label-white, .table { + background: #fff +} + +.bg-white-opacity { + background: rgba(255, 255, 255, .85) +} + +.hover-white:hover { + background: #fafafa +} + +.badge-yellow, .bg-yellow, .btn-yellow, .hover-yellow:hover, .label-yellow { + color: #fff; + background: #fc0; + border-color: #deb200 +} + +.btn-yellow.active, .btn-yellow.disabled, .btn-yellow.disabled.active, .btn-yellow.disabled:active, .btn-yellow.disabled:focus, .btn-yellow.disabled:hover, .btn-yellow:active, .btn-yellow:focus, .btn-yellow:hover, .btn-yellow[disabled], .btn-yellow[disabled].active, .btn-yellow[disabled]:active, .btn-yellow[disabled]:focus, .btn-yellow[disabled]:hover, .label-yellow[href]:focus, .label-yellow[href]:hover, .open .dropdown-toggle.btn-yellow { + color: #fff; + background: #e1b400; + border-color: #c59e00 +} + +.badge-purple, .bg-purple, .btn-purple, .hover-purple:hover, .label-purple { + color: #fff; + background: #984dff; + border-color: #7a3ecc +} + +.btn-purple.active, .btn-purple.disabled, .btn-purple.disabled.active, .btn-purple.disabled:active, .btn-purple.disabled:focus, .btn-purple.disabled:hover, .btn-purple:active, .btn-purple:focus, .btn-purple:hover, .btn-purple[disabled], .btn-purple[disabled].active, .btn-purple[disabled]:active, .btn-purple[disabled]:focus, .btn-purple[disabled]:hover, .label-purple[href]:focus, .label-purple[href]:hover, .open .dropdown-toggle.btn-purple { + color: #fff; + background: #8134eb; + border-color: #752fd6 +} + +.badge-blue-alt, .bg-blue-alt, .btn-blue-alt, .hover-blue-alt:hover, .label-blue-alt { + color: #fff; + background: #65a6ff; + border-color: #5388d1 +} + +.btn-blue-alt.active, .btn-blue-alt.disabled, .btn-blue-alt.disabled.active, .btn-blue-alt.disabled:active, .btn-blue-alt.disabled:focus, .btn-blue-alt.disabled:hover, .btn-blue-alt:active, .btn-blue-alt:focus, .btn-blue-alt:hover, .btn-blue-alt[disabled], .btn-blue-alt[disabled].active, .btn-blue-alt[disabled]:active, .btn-blue-alt[disabled]:focus, .btn-blue-alt[disabled]:hover, .label-blue-alt[href]:focus, .label-blue-alt[href]:hover, .open .dropdown-toggle.btn-blue-alt { + color: #fff; + background: #478ded; + border-color: #4c7ec1 +} + +.badge-azure, .bg-azure, .btn-azure, .hover-azure:hover, .label-azure { + color: #fff; + background: #41e5c0; + border-color: #3acead +} + +.btn-azure.active, .btn-azure.disabled, .btn-azure.disabled.active, .btn-azure.disabled:active, .btn-azure.disabled:focus, .btn-azure.disabled:hover, .btn-azure:active, .btn-azure:focus, .btn-azure:hover, .btn-azure[disabled], .btn-azure[disabled].active, .btn-azure[disabled]:active, .btn-azure[disabled]:focus, .btn-azure[disabled]:hover, .label-azure[href]:focus, .label-azure[href]:hover, .open .dropdown-toggle.btn-azure { + color: #fff; + background: #27d1ab; + border-color: #24c19e +} + +.border-black { + border-color: #212121 !important +} + +.border-blue { + border-color: #5bccf6 !important +} + +.border-blue-alt { + border-color: #65a6ff !important +} + +.border-azure { + border-color: #41e5c0 !important +} + +.border-gray { + border-color: #c2c2c2 !important +} + +.border-gray-dark { + border-color: #828282 !important +} + +.border-green { + border-color: #2ecc71 !important +} + +.border-orange { + border-color: #fa7753 !important +} + +.border-yellow { + border-color: #fc0 !important +} + +.border-purple { + border-color: #984dff !important +} + +.border-red { + border-color: #ff5757 !important +} + +.parsley-success { + border-color: #77e038 !important +} + +.parsley-error { + border-color: #e03838 !important +} + +.btn, .fc-button { + font-size: 14px; + position: relative; + display: inline-block; + padding: 0 12px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-align: center; + border-width: 1px; + border-style: solid; + border-color: transparent; + background-image: none; + -o-user-select: none +} + +.btn-alt, .content-box-header-alt { + font-weight: 700; + text-transform: uppercase +} + +.btn, .fc-button, .size-md { + line-height: 32px; + height: 34px; + min-width: 34px +} + +.btn-abs { + position: absolute; + top: 50%; + right: 0; + margin-top: -17px +} + +.btn.hover-round:hover { + border-radius: 100px +} + +.btn-group-vertical>.btn:not(:first-child):not(:last-child), .btn-link { + border-radius: 0 +} + +.btn.active, .btn:active, .fc-state-active, .fc-state-down, .ui-datepicker .ui-datepicker-buttonpane button:active, .ui-datepicker .ui-datepicker-next:active, .ui-datepicker .ui-datepicker-prev:active, .ui-dialog .ui-dialog-titlebar-close:active, .ui-dialog-buttonset button:active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) +} + +.btn.disabled, .btn[disabled], .disabled, .fc-state-disabled, fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: .65; + -webkit-box-shadow: none; + box-shadow: none; + filter: alpha(opacity=65) +} + +.btn-link { + cursor: pointer +} + +.btn-link, .btn-link:active, .btn-link[disabled] { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none +} + +.btn-link:focus, .btn-link:hover { + text-decoration: underline; + background-color: transparent +} + +.btn-border:hover, .pager li>a:focus, .pager li>a:hover { + text-decoration: none +} + +.btn-group-lg>.btn, .btn-lg, .size-lg { + line-height: 44px; + min-width: 56px; + height: 46px +} + +.btn-lg-abs { + margin-top: -23px +} + +.btn-group-lg>.btn, .btn-lg { + font-size: 18px; + padding: 0 16px +} + +.btn-group-sm>.btn, .btn-sm, .size-sm { + line-height: 28px; + height: 30px +} + +.btn-sm-abs { + margin-top: -15px +} + +.btn-group-sm>.btn, .btn-sm { + font-size: 13px; + padding: 0 10px +} + +.btn-group-xs>.btn, .btn-xs, .size-xs { + line-height: 20px; + min-width: 22px; + height: 22px +} + +.btn-xs-abs { + margin-top: -11px +} + +.btn-group-xs>.btn, .btn-xs { + font-size: 11px; + padding: 0 5px +} + +.btn .caret { + margin-left: 0 +} + +.btn-lg .caret { + border-width: 5px 5px 0 +} + +.dropup .btn-lg .caret { + border-width: 0 5px 5px +} + +.btn-block { + display: block; + padding-right: 0; + padding-left: 0 +} + +.btn-block+.btn-block { + margin-top: 5px +} + +.btn-group, .btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle +} + +.btn-group-vertical>.btn, .btn-group>.btn { + position: relative; + float: left +} + +.btn-group-vertical>.btn.active, .btn-group-vertical>.btn:active, .btn-group-vertical>.btn:focus, .btn-group-vertical>.btn:hover, .btn-group>.btn.active, .btn-group>.btn:active, .btn-group>.btn:focus, .btn-group>.btn:hover { + z-index: 2 +} + +.btn-group .btn+.btn, .btn-group .btn+.btn-group, .btn-group .btn-group+.btn, .btn-group .btn-group+.btn-group { + margin-left: -1px +} + +.btn-toolbar { + margin-left: -5px +} + +.btn-toolbar>.btn, .btn-toolbar>.btn-group, .btn-toolbar>.input-group { + margin-left: 10px +} + +.btn-group>.btn:first-child { + margin-left: 0 +} + +.btn-group>.btn+.dropdown-toggle { + padding-right: 8px; + padding-left: 8px +} + +.btn-group>.btn-lg+.dropdown-toggle { + padding-right: 12px; + padding-left: 12px +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) +} + +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none +} + +.btn-group-vertical>.btn, .btn-group-vertical>.btn-group, .btn-group-vertical>.btn-group>.btn { + display: block; + float: none; + width: 100%; + max-width: 100% +} + +.btn-group-vertical>.btn-group>.btn { + float: none +} + +.btn-group-vertical>.btn+.btn, .btn-group-vertical>.btn+.btn-group, .btn-group-vertical>.btn-group+.btn, .btn-group-vertical>.btn-group+.btn-group { + margin-top: -1px; + margin-left: 0 +} + +.btn-group-justified { + display: table; + table-layout: fixed; + border-collapse: separate +} + +.btn-group-justified>.btn, .btn-group-justified>.btn-group { + display: table-cell; + float: none +} + +.btn-group-vertical>.btn:first-child:not(:last-child) { + border-top-right-radius: 3px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 3px +} + +.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn, .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn, .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0 +} + +.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child, .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.btn-group>.btn-group:first-child>.btn:last-child, .btn-group>.btn-group:first-child>.dropdown-toggle, .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn-group:last-child>.btn:first-child, .btn-group>.btn:last-child:not(:first-child), .btn-group>.dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.pagination { + display: inline-block; + padding-left: 0 +} + +.pager li, .pagination>li { + display: inline +} + +.pagination>li>a, .pagination>li>span { + line-height: 1.42857143; + position: relative; + float: left; + margin-left: -1px; + padding: 6px 12px; + text-decoration: none; + border-width: 1px; + border-style: solid +} + +.pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover { + z-index: 2 +} + +.pagination>li:first-child>a, .pagination>li:first-child>span { + margin-left: 0 +} + +.pagination-lg>li>a, .pagination-lg>li>span { + font-size: 18px; + padding: 10px 16px +} + +.pagination-sm>li>a, .pagination-sm>li>span { + font-size: 12px; + padding: 5px 10px +} + +.pager { + margin-top: 0; + padding-left: 0; + list-style: none; + text-align: center +} + +.pager li>a, .pager li>span { + display: inline-block; + padding: 5px 14px; + border: 1px solid #ddd; + border-radius: 15px; + background-color: #fff +} + +.btn>.icon-separator, .icon-separator.float-right { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important +} + +.pager .next>a, .pager .next>span { + float: right +} + +.pager .previous>a, .pager .previous>span { + float: left +} + +.pager .disabled>a, .pager .disabled>a:focus, .pager .disabled>a:hover, .pager .disabled>span, .pagination>.disabled>a, .pagination>.disabled>a:focus, .pagination>.disabled>a:hover, .pagination>.disabled>span, .pagination>.disabled>span:focus, .pagination>.disabled>span:hover { + cursor: not-allowed; + color: #999; + background-color: #fff +} + +.btn>.icon-separator { + position: absolute; + top: 0; + left: 0; + width: 32px; + height: 100%; + border-top-right-radius: 0 !important +} + +.icon-separator+.button-content { + margin-left: 32px +} + +.btn-xs .icon-separator { + width: 22px +} + +.btn-xs .icon-separator+.button-content { + margin-left: 22px +} + +.btn-sm .icon-separator { + width: 25px +} + +.btn-sm .icon-separator+.button-content { + margin-left: 25px +} + +.btn-lg .icon-separator { + width: 44px +} + +.btn-lg .icon-separator+.button-content { + margin-left: 44px +} + +.icon-separator.float-right { + border-top-left-radius: 0 !important +} + +.vertical-button { + line-height: 1.6em; + height: auto; + padding: 10px 0 5px +} + +.vertical-button .button-content { + opacity: .7; + filter: alpha(opacity=70) +} + +.icon-separator-vertical { + font-size: 25px; + display: block; + margin: 5px auto +} + +.dashboard-buttons .btn { + width: 93px; + margin: 5px 3px +} + +.btn-outline, .btn-outline-inverse { + display: inline-block; + text-align: center; + color: #fff; + box-sizing: initial; + border-width: 2px; + border-style: solid; + text-transform: uppercase +} + +.btn-outline-inverse { + border-color: rgba(255, 255, 255, .47) +} + +.btn-outline-inverse:hover { + background: rgba(255, 255, 255, .2); + border-color: #fff +} + +.btn-outline-inverse.hero-btn { + color: #fff +} + +.btn-outline { + color: rgba(0, 0, 0, .8); + border-color: rgba(0, 0, 0, .6) +} + +.btn-outline:hover { + color: #fff; + border-color: rgba(0, 0, 0, .8); + background: rgba(0, 0, 0, .8) +} + +.btn.btn-round { + border-radius: 150px; + padding: 0 +} + +.btn-round.btn-lg { + width: 46px; + min-width: 46px +} + +.btn-round.btn-xlg { + width: 66px; + min-width: 66px; + height: 66px; + line-height: 66px +} + +.btn-round.btn-xlg .glyph-icon { + font-size: 24px +} + +.btn-round.btn-md { + width: 34px +} + +.btn-round.btn-sm { + width: 30px +} + +.btn-round.btn-xs { + width: 22px +} + +.btn-alt { + font-size: 12px +} + +.btn-hover span { + padding: 0 20px; + left: 0; + position: relative; + transition: opacity .2s ease-out, left .2s ease-out; + -webkit-transition: opacity .2s ease-out, left .2s ease-out +} + +.btn-hover .glyph-icon { + opacity: 0; + -ms-filter: "alpha(opacity=0)"; + position: absolute; + right: 20px; + transition: all .2s ease-out; + -webkit-transition: all .2s ease-out +} + +.btn-hover:hover .glyph-icon { + opacity: 1; + right: 15px; + -ms-filter: "alpha(opacity=100)" +} + +.btn-hover:hover span { + left: -15px +} + +.btn-border { + border-width: 2px; + border-style: solid +} + +.btn-border span { + opacity: .75; + filter: alpha(opacity=75) +} + +.btn-border:hover span { + opacity: 1; + filter: alpha(opacity=100) +} + +.btn-group-justified>.btn, .btn-group-justified>.btn-group { + width: auto +} + +.demo-margin .btn { + margin-bottom: 10px +} + +.content-box { + background: #fff; + margin-bottom: 20px +} + +.content-box, .content-box-header { + position: relative; + border-width: 1px; + border-style: solid +} + +.content-box-header { + font-size: 14px; + text-transform: uppercase; + margin: -1px -1px 0; + padding: 15px; + border-color: transparent +} + +.content-box-header small+.font-size-11.float-right { + position: absolute; + top: 14px; + right: 10px +} + +.content-box-header-alt { + padding: 15px 10px 14px; + font-size: 12px +} + +.content-box-header-alt small { + font-size: 13px; + font-weight: 400; + display: block; + padding: 5px 0 0; + text-transform: none; + opacity: .7; + filter: alpha(opacity: 70) +} + +.content-box .ui-widget-overlay { + position: absolute +} + +.content-box .ui-widget-overlay img { + position: absolute; + top: 50%; + left: 50%; + margin: -27px 0 0 -27px +} + +.content-box .content-box-wrapper { + line-height: 1.6em; + padding: 15px +} + +.content-box .content-box-wrapper .scrollable-content, .content-box .content-box-wrapper p:last-child { + margin-bottom: 0 +} + +.content-box .content-box-header>.glyph-icon { + margin-right: 5px; + opacity: .7; + filter: alpha(opacity: 70) +} + +.content-box-header-alt .icon-separator .glyph-icon, .content-box-header-alt>.glyph-icon { + font-size: 22px; + line-height: 30px; + position: absolute; + top: 50%; + left: 15px; + width: 30px; + height: 30px; + margin-top: -15px +} + +.content-box-header>.icon-separator { + position: relative; + top: 1px; + left: -15px; + padding: 18px 15px 16px; + text-align: center +} + +.content-box-header>.icon-separator .glyph-icon { + margin-left: 3px +} + +.content-box-header-alt>.header-wrapper { + overflow: hidden; + display: block; + margin-left: 40px +} + +.content-box-header-alt>.icon-separator+.header-wrapper { + margin-left: 65px +} + +.content-box-header-alt>.icon-separator { + position: absolute; + top: 0; + left: 0; + width: 60px; + height: 100% +} + +.content-box-header-alt>.icon-separator .glyph-icon { + left: 50%; + margin-left: -15px +} + +.header-buttons { + position: absolute; + top: 0; + right: 10px; + height: 100%; + display: block +} + +.header-buttons .btn-xs { + top: 13px +} + +.header-buttons .btn-sm { + top: 10px +} + +.header-buttons .btn-sm:last-child { + margin-right: 0 +} + +.header-buttons>.btn-group:last-child { + margin-right: -2px +} + +.content-box-header-alt .header-buttons .btn-xs { + top: 24px +} + +.content-box-header-alt .header-buttons .btn-sm { + top: 20px +} + +.content-box-header-alt .header-buttons .btn-sm:last-child { + margin-right: 5px +} + +.header-buttons-separator { + position: absolute; + top: 0; + right: 0; + height: 100% +} + +.header-buttons-separator .icon-separator { + top: 0; + left: 0; + display: block; + float: left; + min-width: 20px; + height: 100%; + padding: 0 10px +} + +.header-buttons-separator .icon-separator .glyph-icon { + line-height: 30px; + position: relative; + top: 50%; + display: block; + min-width: 30px; + height: 30px; + margin: -15px 0 0; + text-align: center +} + +.header-buttons>.btn-group { + margin-top: 8px +} + +.header-buttons .btn-group-xs { + margin-top: 14px +} + +.header-buttons .btn-group-xs:last-child { + margin-right: 0 +} + +.ui-dialog-buttonpane, body .button-pane { + padding: 10px; + text-align: center; + border-width: 1px 0 0; + border-style: solid; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +body .button-pane-top { + border-width: 0 0 1px; + border-radius: 0 +} + +.scrollable-content { + overflow-y: scroll; + overflow-x: hidden; + height: 300px; + padding-right: 0 +} + +.scrollable-xs { + overflow-y: scroll; + height: 200px +} + +.scrollable-sm { + overflow-y: scroll; + height: 400px +} + +.scrollable-lg { + overflow-y: scroll; + height: 500px +} + +.toggle-button .glyph-icon { + -webkit-transition-duration: .5s; + -moz-transition-duration: .5s; + -o-transition-duration: .5s; + transition-duration: .5s; + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + -o-transition-property: -o-transform; + transition-property: transform +} + +.hidden-button .content-box-header .btn, .hidden-button .content-box-header a, .hidden-button .content-box-header button { + display: none +} + +.content-box.border-top .content-box-header { + font-size: 18px; + margin: 0 +} + +.content-box.border-top .content-box-header small { + opacity: .8; + -moz-opacity: .8; + filter: alpha(opacity: 80) +} + +.content-box.border-top .content-box-header+.content-box-wrapper { + padding-top: 0 +} + +.box-xs { + width: 200px +} + +.box-sm { + width: 324px +} + +.box-md { + width: 400px +} + +.box-lg { + width: 500px +} + +.content-box-header>.ui-tabs-nav { + position: absolute; + top: 2px; + right: 0; + padding: 0; + list-style: none; + border: 0 +} + +.content-box-header>.ui-tabs-nav li>a { + line-height: 49px; + height: 49px; + margin: 0 2px; + color: rgba(255, 255, 255, .7); + border: 0; + background: 0 0 +} + +.content-box-header>.ui-tabs-nav li>a:hover { + color: #fff; + background: rgba(255, 255, 255, .2) +} + +.panel-heading>.dropdown .dropdown-toggle, .panel-title, .panel-title>a { + color: inherit +} + +.content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active>a, .content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active>a, .content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active>a { + line-height: 46px; + height: 46px; + background: #F6F6F9 +} + +.content-box-header.bg-default>.ui-tabs-nav li>a, .content-box-header.bg-gray>.ui-tabs-nav li>a, .content-box-header.bg-white>.ui-tabs-nav li>a { + line-height: 50px; + height: 50px; + margin: 0; + border-radius: 0 +} + +.content-box-header.bg-default>.ui-tabs-nav, .content-box-header.bg-gray>.ui-tabs-nav, .content-box-header.bg-white>.ui-tabs-nav { + top: 0 +} + +.content-box-header>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header>.ui-tabs-nav li.ui-tabs-active>a { + line-height: 47px; + height: 49px; + background: #fff +} + +.panel { + margin-bottom: 20px; + border-width: 1px; + border-style: solid; + border-radius: 4px; + background-color: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, .05) +} + +.panel-title, .panel>.list-group { + margin-bottom: 0 +} + +.panel-body { + padding: 15px 20px; + position: relative +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent +} + +.panel-title { + font-size: 16px; + margin-top: 0 +} + +.panel-footer { + padding: 10px 15px; + border-top: 1px solid transparent +} + +.panel>.list-group .list-group-item { + border-width: 1px 0; + border-radius: 0 +} + +.panel-group .panel-heading, .panel>.list-group:last-child .list-group-item:last-child { + border-bottom: 0 +} + +.panel>.list-group:first-child .list-group-item:first-child { + border-top: 0 +} + +.panel-heading+.list-group .list-group-item:first-child { + border-top-width: 0 +} + +.panel-group { + margin-bottom: 20px +} + +.panel-group .panel { + overflow: hidden; + margin-bottom: 0 +} + +.panel-group .panel+.panel { + margin-top: 5px +} + +.panel-group .panel-heading+.panel-collapse .panel-body { + border-top: 1px solid transparent +} + +.panel-group .panel-footer { + border-top: 0 +} + +.panel-group .panel-footer+.panel-collapse .panel-body { + border-bottom: 1px solid transparent +} + +fieldset, legend { + padding: 0; + border: 0 +} + +fieldset { + margin: 0 +} + +legend { + font-size: 21px; + line-height: inherit; + display: block; + width: 100%; + margin-bottom: 20px; + color: #333; + border-bottom: 1px solid #dfe8f1 +} + +label { + font-weight: 700; + display: inline-block +} + +.checkbox, .radio, input[type=file], output { + display: block +} + +input[type=checkbox], input[type=radio] { + line-height: normal +} + +select[multiple], select[size] { + height: auto +} + +select optgroup { + font-family: inherit; + font-size: inherit; + font-style: inherit +} + +input[type=file]:focus, input[type=checkbox]:focus, input[type=radio]:focus { + outline: #333 dotted thin; + outline: -webkit-focus-ring-color auto 5px; + outline-offset: -2px +} + +input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { + height: auto +} + +output { + font-size: 14px; + line-height: 1.428571429; + padding-top: 7px; + vertical-align: middle; + color: #555 +} + +.bootstrap-timepicker-widget table td input, .chosen-container-multi, .chosen-container-single .chosen-search input, .dataTables_length select, .form-control, .input, .ui-toolbar input, .ui-toolbar select, div.dataTables_filter input { + font-size: 13px; + display: block; + float: none; + background: #fff; + width: 100%; + height: 34px; + padding: 6px 12px; + color: #2b2f33; + border: 1px solid #dfe8f1; + -webkit-box-shadow: inset 1px 1px 3px #f6f6f6; + -moz-box-shadow: inset 1px 1px 3px #f6f6f6; + box-shadow: inset 1px 1px 3px #f6f6f6 +} + +.chosen-container-multi.chosen-with-drop.chosen-container-active { + border: 1px solid #ddd; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + box-shadow: 0 0 0 transparent +} + +.bootstrap-timepicker-widget table td input:focus, .chosen-container-active, .chosen-container-multi.chosen-container-active, .form-control:focus, .input:focus, .selector.focus, .ui-toolbar input:focus, .ui-toolbar select:focus, div.dataTables_filter input:focus { + color: #333; + border-color: #3da6ff +} + +.form-control:-moz-placeholder { + color: #999 +} + +.form-control::-moz-placeholder { + color: #999 +} + +.form-control:-ms-input-placeholder { + color: #999 +} + +.form-control::-webkit-input-placeholder { + color: #999 +} + +textarea.form-control { + height: auto +} + +.form-group { + margin-bottom: 15px +} + +.form-group label { + margin-bottom: 5px +} + +.form-group .switch-toggle { + margin-top: 6px +} + +.checkbox, .radio { + min-height: 20px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: middle +} + +.checkbox label, .radio label { + font-weight: 400; + display: inline; + margin-bottom: 0; + cursor: pointer +} + +.checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], .radio input[type=radio], .radio-inline input[type=radio] { + float: left +} + +.checkbox+.checkbox, .radio+.radio { + margin-top: -5px +} + +.checkbox-inline, .radio-inline { + font-weight: 400; + line-height: 19px; + display: inline-block; + height: 19px; + margin-bottom: 0; + cursor: pointer; + vertical-align: middle +} + +.checkbox-inline label, .radio-inline label { + font-weight: 400; + line-height: 17px +} + +.checkbox-inline+.checkbox-inline, .radio-inline+.radio-inline { + margin-top: 0; + margin-left: 10px +} + +.checkbox-inline[disabled], .checkbox[disabled], .radio-inline[disabled], .radio[disabled], fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline, fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] input[type=checkbox], fieldset[disabled] input[type=radio], input[type=checkbox][disabled], input[type=radio][disabled] { + cursor: not-allowed +} + +.input-sm { + font-size: 12px; + line-height: 1.5; + height: 30px; + padding: 5px 10px; + border-radius: 3px +} + +select.input-sm { + line-height: 30px; + height: 30px +} + +textarea.input-sm { + height: auto +} + +.input-lg { + font-size: 18px; + line-height: 1.33; + height: 45px; + padding: 10px 16px; + border-radius: 6px +} + +select.input-lg { + line-height: 45px; + height: 45px +} + +textarea.input-lg { + height: auto +} + +.form-control-static { + margin-bottom: 0 +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 0; + color: #737373 +} + +@media (min-width:768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle + } + + .form-inline .form-control { + display: inline-block + } + + .form-inline .checkbox, .form-inline .radio { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0 + } + + .form-inline .checkbox input[type=checkbox], .form-inline .radio input[type=radio] { + float: none; + margin-left: 0 + } + + .form-horizontal .control-label { + text-align: right + } +} + +.form-horizontal .checkbox, .form-horizontal .checkbox-inline, .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .radio-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px +} + +.form-horizontal>.form-group { + margin-right: -15px; + margin-left: -15px +} + +.form-horizontal .form-group:after, .form-horizontal .form-group:before { + display: table; + content: ' ' +} + +.form-horizontal .form-control-static { + padding-top: 7px +} + +.input-group { + position: relative; + display: table; + width: 100%; + border-collapse: separate +} + +.input-group.col { + float: none; + padding-right: 0; + padding-left: 0 +} + +.input-group .form-control { + width: 100%; + margin-bottom: 0 +} + +.input-group-lg>.form-control, .input-group-lg>.input-group-addon, .input-group-lg>.input-group-btn>.btn { + font-size: 18px; + line-height: 1.33; + height: 45px; + padding: 10px 16px; + border-radius: 6px +} + +select.input-group-lg>.form-control, select.input-group-lg>.input-group-addon, select.input-group-lg>.input-group-btn>.btn { + line-height: 45px; + height: 45px +} + +textarea.input-group-lg>.form-control, textarea.input-group-lg>.input-group-addon, textarea.input-group-lg>.input-group-btn>.btn { + height: auto +} + +.input-group-sm>.form-control, .input-group-sm>.input-group-addon, .input-group-sm>.input-group-btn>.btn { + font-size: 12px; + line-height: 1.5; + height: 30px; + padding: 5px 10px; + border-radius: 3px +} + +select.input-group-sm>.form-control, select.input-group-sm>.input-group-addon, select.input-group-sm>.input-group-btn>.btn { + line-height: 30px; + height: 30px +} + +textarea.input-group-sm>.form-control, textarea.input-group-sm>.input-group-addon, textarea.input-group-sm>.input-group-btn>.btn { + height: auto +} + +.input-group .form-control, .input-group-addon, .input-group-btn { + display: table-cell +} + +.input-group .form-control:not(:first-child):not(:last-child), .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child) { + border-radius: 0 +} + +.input-group-addon div[id^=uniform-] { + margin: 0 -3px +} + +.input-group-addon, .input-group-btn { + width: 1%; + vertical-align: middle; + white-space: nowrap +} + +.input-group-addon { + font-size: 14px; + font-weight: 400; + line-height: 1; + padding: 6px 12px; + text-align: center; + color: #2b2f33; + background-color: rgba(239, 244, 246, .36); + border: 1px solid #dfe8f1; + border-radius: 4px +} + +body, label { + color: #3e4855 +} + +.input-group-addon .glyph-icon { + display: block; + min-width: 20px; + margin: 0 -4px; + text-align: center +} + +.input-group-addon.addon-inside { + line-height: 24px; + position: absolute; + top: 5px; + left: 6px; + display: block; + width: 32px; + height: 24px; + padding: 0; + border-width: 1px; + border-style: solid +} + +.input-group-btn, .input-group-btn>.btn, .ui-spinner { + position: relative +} + +.input-group-lg .input-group-addon.addon-inside { + top: 10px; + left: 10px; + z-index: 999 +} + +.input-group-addon.addon-inside .glyph-icon { + margin: 0 +} + +.input-group-addon.addon-inside+input { + padding-left: 48px +} + +.input-group-addon.input-sm { + font-size: 12px; + padding: 5px 10px; + border-radius: 3px +} + +.input-group-addon.input-lg { + font-size: 18px; + padding: 10px 16px; + border-radius: 6px +} + +.input-group-addon input[type=checkbox], .input-group-addon input[type=radio] { + margin-top: 0 +} + +.input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child>.btn, .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group-addon:first-child { + border-right: 0 +} + +.input-group-addon.addon-inside:first-child { + border-right-width: 1px; + border-right-style: solid; + border-color: transparent; + z-index: 999 +} + +.input-group-addon+.form-control, .input-group-addon:last-child, .input-group-btn+.form-control, .input-group-btn:first-child>.btn:not(:first-child), .input-group-btn:last-child>.btn, .input-group-btn:last-child>.dropdown-toggle { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group-addon:last-child { + border-left: 0 +} + +.input-group-btn:first-child>.btn { + margin-right: -1px +} + +.input-group-btn:last-child>.btn { + margin-left: -1px +} + +.input-group-btn>.btn+.btn { + margin-left: -4px +} + +.input-group-btn>.btn:active, .input-group-btn>.btn:hover { + z-index: 2 +} + +[data-toggle=buttons]>.btn>input[type=checkbox], [data-toggle=buttons]>.btn>input[type=radio] { + display: none +} + +textarea.textarea-autoresize, textarea.textarea-no-resize { + resize: none +} + +.textarea-autosize { + transition: height .3s; + -webkit-transition: height .3s; + -moz-transition: height .3s +} + +textarea.form-control { + line-height: 1.6em; + padding: 8px 12px +} + +textarea.textarea-xs { + height: 50px +} + +textarea.textarea-sm { + height: 125px +} + +textarea.textarea-md { + height: 200px +} + +textarea.textarea-lg { + height: 275px +} + +.ui-spinner { + display: block +} + +.xchart .color0.comp .fill, .xchart .color1.comp .fill { + display: none +} + +.ui-spinner .ui-spinner-button { + font-size: 9px; + line-height: 17px; + position: absolute; + right: 0; + width: 17px; + height: 17px; + cursor: pointer; + text-align: center; + border-width: 1px; + border-style: solid +} + +.ui-spinner .ui-spinner-up { + top: 0 +} + +.ui-spinner .ui-spinner-down { + bottom: 0 +} + +.parsley-errors-list li { + font-size: 12px; + padding-top: 5px +} + +.bordered-row>.form-group { + padding: 20px 0; + margin-bottom: 0; + border-top-width: 1px; + border-top-style: dashed +} + +.bordered-row>.form-group:last-child { + padding-bottom: 0 +} + +.form-group .ui-slider { + margin-top: 14px +} + +.form-group .ui-slider+.input-group { + margin-top: 20px +} + +body { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + background-color: #fff; + line-height: 1.42857143 +} + +#page-title>h2, #page-title>p, h1, h2, h3, h4, h5, h6 { + font-family: Raleway, "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300 +} + +#page-header .user-account-btn>a.user-profile .glyph-icon, .logo-bg { + background-color: rgba(255, 255, 255, .1); + color: #fff +} + +#page-header .user-account-btn>a.user-profile { + color: #fff +} + +#header-nav-right .dropdown>a .glyph-icon, #header-nav-right .header-btn .glyph-icon { + color: rgba(255, 255, 255, .8) +} + +#header-nav-right .dropdown>a:hover .glyph-icon, #header-nav-right .header-btn:hover .glyph-icon { + color: rgba(255, 255, 255, .95) +} + +#header-nav-right .dropdown>a, #header-nav-right .header-btn { + border-color: rgba(255, 255, 255, .2) +} + +#header-nav-right .dropdown>a:hover, #header-nav-right .header-btn:hover { + background: rgba(255, 255, 255, .05); + border-color: rgba(255, 255, 255, .25) +} + +#page-content { + background: #fafcfe +} + +#page-sidebar ul li.header { + color: #000 +} + +#page-sidebar ul li a .glyph-icon { + color: #0093d9 +} + +#page-sidebar ul li a:hover, #page-sidebar ul li.sfHover>a.sf-with-ul { + border-color: #d1d9dd +} + +#sidebar-menu li .sidebar-submenu { + border-color: #f6f7f8 +} + +#sidebar-menu li .sidebar-submenu ul li { + border-color: #f8f9fa +} + +#sidebar-menu li .sidebar-submenu ul li a.sfActive, #sidebar-menu li .sidebar-submenu ul li a:hover { + background: #fcfdfe +} + +#sidebar-menu li .sidebar-submenu ul li a.sfActive { + color: #1c82e1 +} + +#page-sidebar.font-inverse ul li.header { + color: rgba(255, 255, 255, .95) +} + +#page-sidebar.font-inverse ul li.divider { + background: rgba(255, 255, 255, .1) +} + +#page-sidebar.font-inverse #sidebar-menu>li>a { + color: rgba(255, 255, 255, .62) +} + +#page-sidebar.font-inverse #sidebar-menu li a:hover, #page-sidebar.font-inverse #sidebar-menu li.sfHover>a.sf-with-ul { + border-color: rgba(255, 255, 255, .26); + color: rgba(255, 255, 255, .96) +} + +#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu { + border-color: rgba(255, 255, 255, .08); + background: rgba(255, 255, 255, .05) +} + +#page-sidebar.font-inverse #sidebar-menu li a { + color: rgba(255, 255, 255, .62) +} + +#page-sidebar.font-inverse #sidebar-menu li a:hover { + color: rgba(255, 255, 255, .96) +} + +#page-sidebar.font-inverse#page-sidebar ul li a .glyph-icon { + color: rgba(255, 255, 255, .8) +} + +#page-sidebar.font-inverse#page-sidebar ul li a:hover .glyph-icon { + color: rgba(255, 255, 255, 1); + opacity: .9; + -moz-opacity: .9; + filter: alpha(opacity: 90) +} + +#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li { + border-color: rgba(255, 255, 255, .07) +} + +#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li a:hover { + background: rgba(255, 255, 255, .05) +} + +.btn-link, .chosen-disabled .chosen-single, .content-box-header.bg-default>.ui-tabs-nav li>a, .content-box-header.bg-gray>.ui-tabs-nav li>a, .content-box-header.bg-white>.ui-tabs-nav li>a, .content-box-header>.ui-tabs-nav li.ui-tabs-active>a, .pagination>li>a, .pagination>li>span, .table, a, body .content-box-header>.ui-tabs-nav li.ui-tabs-active>a:hover, div.selector { + color: #8da0aa +} + +#page-sidebar ul li.sfHover>a.sf-with-ul, .btn-link:hover, .content-box-header.bg-default>.ui-tabs-nav li>a:hover, .content-box-header.bg-gray>.ui-tabs-nav li>a:hover, .content-box-header.bg-white>.ui-tabs-nav li>a:hover, .features-tour-box h3, .font-primary, .tabs-nav li a:hover, .tabs-nav li.active a, a:hover, table.dataTable thead th.sorting_asc:after, table.dataTable thead th.sorting_desc:after { + color: #1c82e1 +} + +.border-primary, .btn-primary, .nav>li.active>a, .nav>li.active>a:focus, .nav>li.active>a:hover, .ui-accordion .ui-accordion-header.ui-accordion-header-active, .ui-datepicker .ui-datepicker-next, .ui-datepicker .ui-datepicker-prev, .ui-dialog-buttonset button, .ui-spinner .ui-spinner-button:hover, a.list-group-item.active, a.list-group-item.active:focus, a.list-group-item.active:hover, a.thumbnail:hover, div[id^=uniform-] span.checked, li.active a.list-group-item, li.active a.list-group-item:focus, li.active a.list-group-item:hover { + border-color: #00a792 +} + +a:focus { + outline: 0 !important +} + +#loadingbar, #nav-toggle span:after, #nav-toggle span:before, #nav-toggle.collapsed span, .badge-primary, .bg-primary, .bootstrap-switch-primary, .btn-primary, .chosen-container .chosen-results li.active-result.highlighted, .daterangepicker .ranges li.active, .daterangepicker .ranges li.active:hover, .fc-event, .form-wizard>ul>li.active .wizard-step, .irs-line-left, .irs-line-mid, .irs-line-right, .label-primary, .ms-hover.ui-state-focus, .ms-list .ms-hover, .nav>li.active>a, .nav>li.active>a:focus, .nav>li.active>a:hover, .owl-controls .owl-page span, .ui-accordion-header.ui-accordion-header-active, .ui-datepicker .ui-datepicker-current-day a, .ui-datepicker .ui-datepicker-current-day span, .ui-datepicker .ui-datepicker-next, .ui-datepicker .ui-datepicker-prev, .ui-dialog-buttonset button, .ui-menu li>a:hover, .ui-rangeSlider-bar, .ui-slider-handle, .ui-spinner .ui-spinner-button:hover, .ui-tabs-nav li.ui-state-active.ui-state-hover>a, .ui-tabs-nav li.ui-state-active>a, a.list-group-item.active, a.list-group-item.active:focus, a.list-group-item.active:hover, div.switch-toggle.switch-on, div[id^=uniform-] span.checked, li.active a.list-group-item, li.active a.list-group-item:focus, li.active a.list-group-item:hover { + color: #fff; + background: #00bca4 +} + +.font-secondary, .inverse.carousel-wrapper .owl-controls .owl-buttons .owl-next, .inverse.carousel-wrapper .owl-controls .owl-buttons .owl-prev, .post-box .post-title { + color: #00bca4 +} + +.post-box .post-title:hover { + color: #3e4855 +} + +.bg-default, .bg-white.dashboard-box .button-pane, .bg-white.tile-box .tile-footer, .border-default, .bordered-row .form-group, .btn-default, .button-pane, .chosen-container, .chosen-container .chosen-drop, .chosen-container-active.chosen-with-drop .chosen-single div, .chosen-container-multi .chosen-choices li.search-choice, .chosen-container-single .chosen-single div, .content-box, .content-box-header.bg-default, .content-box-header.bg-gray, .content-box-header.bg-white, .dashboard-buttons .btn, .daterangepicker .calendar-date, .dropdown-menu, .email-body, .fc-state-default, .fc-widget-content, .fc-widget-header, .img-thumbnail, .jvectormap-label, .jvectormap-zoomin, .jvectormap-zoomout, .list-group-item, .mail-toolbar, .mailbox-wrapper .nav-list li a, .minicolors-panel, .ms-container .ms-list, .ms-container .ms-selectable li.ms-elem-selectable, .ms-container .ms-selection li.ms-elem-selection, .nav .open>a, .nav .open>a:focus, .nav .open>a:hover, .nav-tabs, .nav-tabs>li>a:focus, .nav-tabs>li>a:hover, .pagination>li>a, .pagination>li>span, .panel, .panel-box.bg-default, .panel-box.bg-gray, .panel-box.bg-white, .panel-content.bg-default, .panel-content.bg-gray, .panel-content.bg-white, .panel-footer, .panel-group .panel-footer+.panel-collapse .panel-body, .panel-group .panel-heading+.panel-collapse .panel-body, .panel-heading, .popover, .popover-title, .posts-list li, .selector i, .table-bordered, .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, .table>thead>tr>td, .table>thead>tr>th, .tabs-navigation>ul, .tabs-navigation>ul li.ui-state-hover>a, .tabs-navigation>ul li>a, .thumb-pane, .thumbnail, .timeline-box .tl-item .popover, .timeline-box:before, .ui-accordion .ui-accordion-header, .ui-datepicker, .ui-datepicker .ui-datepicker-buttonpane button, .ui-datepicker-buttonpane, .ui-dialog, .ui-dialog .ui-dialog-titlebar, .ui-dialog-buttonpane, .ui-menu, .ui-spinner .ui-spinner-button, .ui-tabs-nav, div.selector, div[id^=uniform-] span { + border-color: #dfe8f1 +} + +.divider, .nav-divider, .timeline-horizontal.timeline-box:before { + background: #dfe8f1 +} + +.content-box.border-top { + border-right-color: #dfe8f1 !important; + border-bottom-color: #dfe8f1 !important; + border-left-color: #dfe8f1 !important +} + +.bg-default, .bg-white.dashboard-box .button-pane, .bg-white.tile-box .tile-footer, .bootstrap-switch-default, .btn-default, .button-pane, .jvectormap-label, .jvectormap-zoomin, .jvectormap-zoomout, .label-default, .mail-toolbar, .panel-footer, .panel-heading, .popover-title, .ui-accordion-header, .ui-datepicker td a, .ui-datepicker td span, .ui-dialog .ui-dialog-titlebar, .ui-spinner .ui-spinner-button, div[id^=uniform-] span { + color: #555a60; + background-color: #FEFEFF +} + +.irs-diapason, .ui-datepicker-buttonpane, .ui-dialog-buttonpane, .ui-rangeSlider-container, .ui-slider-range { + background-color: #FEFEFF +} + +.table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>th { + color: #4b5056; + background-color: #f9fafe +} + +.btn-default.active, .btn-default.disabled, .btn-default.disabled.active, .btn-default.disabled:active, .btn-default.disabled:focus, .btn-default.disabled:hover, .btn-default:active, .btn-default:focus, .btn-default:hover, .btn-default[disabled], .btn-default[disabled].active, .btn-default[disabled]:active, .btn-default[disabled]:focus, .btn-default[disabled]:hover, .fc-state-active, .fc-state-disabled, .fc-state-down, .fc-state-hover, .jvectormap-zoomin:hover, .jvectormap-zoomout:hover, .open .dropdown-toggle.btn-default, .open.dropdown-submenu a, .ui-accordion-header.ui-state-hover, .ui-datepicker .ui-datepicker-buttonpane button:hover, .ui-tabs-nav>li.ui-state-hover>a { + color: #2b2f33; + border-color: #bfc8d1; + background-color: #f3f3f9 +} + +.btn-default.active .glyph-icon { + color: #2b2f33 !important +} + +.bsdatepicker td span:hover, .bsdatepicker td.active, .bsdatepicker td.day.active:hover, .bsdatepicker th.next:hover, .bsdatepicker th.prev:hover, .btn-primary.active, .btn-primary.disabled, .btn-primary.disabled.active, .btn-primary.disabled:active, .btn-primary.disabled:focus, .btn-primary.disabled:hover, .btn-primary:active, .btn-primary:focus, .btn-primary:hover, .btn-primary[disabled], .btn-primary[disabled].active, .btn-primary[disabled]:active, .btn-primary[disabled]:focus, .btn-primary[disabled]:hover, .daterangepicker .calendar th.next:hover, .daterangepicker .calendar th.prev:hover, .daterangepicker td.active, .daterangepicker td.available.active:hover, .hover-primary:hover, .label-primary[href]:focus, .label-primary[href]:hover, .open .dropdown-toggle.btn-primary, .pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover, .ui-accordion-header.ui-accordion-header-active.ui-state-hover, .ui-datepicker .ui-datepicker-next.ui-state-hover, .ui-datepicker .ui-datepicker-prev.ui-state-hover, .ui-datepicker td a:hover, .ui-dialog-buttonset button:hover, .ui-rangeSlider-bar:active, .ui-rangeSlider-bar:hover, .ui-slider-handle.ui-state-active, .ui-slider-handle.ui-state-hover { + color: #fff; + border-color: #00b19b; + background-color: #00ceb4 +} + +.bsdatepicker td span, .bsdatepicker td.day:hover, .bsdatepicker thead tr:first-child th.switch:hover, .chosen-container-multi .chosen-choices li.search-choice, .chosen-container-single .chosen-single div, .daterangepicker .ranges li:hover, .daterangepicker td.available:hover, .nav>li>a:focus, .nav>li>a:hover, .pager li>a:focus, .pager li>a:hover, .pagination>li>a:focus, .pagination>li>a:hover, .pagination>li>span:focus, .pagination>li>span:hover, .selector i, .ui-datepicker-title, a.list-group-item:focus, a.list-group-item:hover { + color: #2b2f33; + background: #eff4f6 +} + +.pager li>a:focus, .pager li>a:hover, .pagination>li>a:focus, .pagination>li>a:hover, .pagination>li>span:focus, .pagination>li>span:hover { + color: #2b2f33; + background-color: #f3f3f9 +} + +.dropdown-menu .active>a, .dropdown-menu .active>a:focus, .dropdown-menu .active>a:hover, .dropdown-menu li>a:hover { + color: #2b2f33; + background: #eff4f6 +} + +.active>.badge, .active>.bs-badge, .active>.bs-label { + color: #666 !important; + background: #fff !important +} + +.active>.glyph-icon, a.list-group-item.active>.glyph-icon, li.active a.list-group-item>.glyph-icon { + color: #fff !important +} + +.icon-separator { + border-right: rgba(255, 255, 255, .21) solid 1px; + background: rgba(255, 255, 255, .2) +} + +.content-box-header.bg-default .icon-separator, .content-box-header.bg-gray .icon-separator, .content-box-header.bg-white .icon-separator, .tile-box.bg-default .tile-header, .tile-box.bg-gray .tile-header, .tile-box.bg-white .tile-header, .tile-box.btn-default .tile-header { + border-right: #dfe8f1 solid 1px; + background: rgba(255, 255, 255, .1) +} + +.content-box-header .header-buttons-separator .icon-separator { + border-right: 0; + border-left: rgba(255, 255, 255, .21) solid 1px +} + +.header-buttons-separator .icon-separator { + color: rgba(255, 255, 255, .8) +} + +.header-buttons-separator .icon-separator:hover { + color: #fff; + background: rgba(255, 255, 255, .3) +} + +.content-box-header.bg-default .header-buttons-separator .icon-separator, .content-box-header.bg-gray .header-buttons-separator .icon-separator, .content-box-header.bg-white .header-buttons-separator .icon-separator { + border-right: 0; + border-left: #dfe8f1 solid 1px; + color: rgba(0, 0, 0, .6) +} + +.content-box-header.bg-default .header-buttons-separator .icon-separator:hover, .content-box-header.bg-gray .header-buttons-separator .icon-separator:hover, .content-box-header.bg-white .header-buttons-separator .icon-separator:hover { + color: rgba(0, 0, 0, .9) +} + +.dashboard-panel .button-pane { + background: rgba(0, 0, 0, .1) !important +} + +.xchart .color0 rect { + fill: #00bca4 +} + +.xchart .color0 circle { + fill: #fff +} + +.xchart .color0 .fill { + fill: rgba(0, 188, 164, .06) +} + +.xchart .color0.comp .pointer, .xchart .color0.comp circle, .xchart .color0.comp rect { + fill: #00bca4 +} + +.xchart .color1 .line, .xchart .color1 circle, .xchart .color1.comp .line { + stroke: #52a7e0 +} + +.xchart .color1 rect { + fill: #52a7e0 +} + +.xchart .color1 circle { + fill: #fff +} + +.xchart .color1 .fill { + fill: rgba(82, 167, 224, .06) +} + +.xchart .color1.comp .pointer, .xchart .color1.comp circle, .xchart .color1.comp rect { + fill: #52a7e0 +} + +body .popover.top .arrow:after { + border-top-color: #fff +} + +body .popover.right .arrow:after { + border-right-color: #fff +} + +body .popover.bottom .arrow:after { + border-bottom-color: #fff +} + +body .popover.left .arrow:after { + border-left-color: #fff +} @font-face { - font-family: 'FontAwesome'; - src: url('fontawesome-webfont.eot?v=4.0.3'); - src: url('fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), - url('fontawesome-webfont.woff?v=4.0.3') format('woff'), - url('fontawesome-webfont.ttf?v=4.0.3') format('truetype'), - url('fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; + font-family: 'FontAwesome'; + src: url('fontawesome-webfont.eot?v=4.0.3'); + src: url('fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), + url('fontawesome-webfont.woff?v=4.0.3') format('woff'), + url('fontawesome-webfont.ttf?v=4.0.3') format('truetype'), + url('fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; } .icon-glass:before { - content: "\f000"; + content: "\f000"; } + .icon-music:before { - content: "\f001"; + content: "\f001"; } + .icon-search:before { - content: "\f002"; + content: "\f002"; } + .icon-envelope-o:before { - content: "\f003"; + content: "\f003"; } + .icon-heart:before { - content: "\f004"; + content: "\f004"; } + .icon-star:before { - content: "\f005"; + content: "\f005"; } + .icon-star-o:before { - content: "\f006"; + content: "\f006"; } + .icon-user:before { - content: "\f007"; + content: "\f007"; } + .icon-film:before { - content: "\f008"; + content: "\f008"; } + .icon-th-large:before { - content: "\f009"; + content: "\f009"; } + .icon-th:before { - content: "\f00a"; + content: "\f00a"; } + .icon-th-list:before { - content: "\f00b"; + content: "\f00b"; } + .icon-check:before { - content: "\f00c"; + content: "\f00c"; } + .icon-times:before, .icon-remove:before, .search-choice-close:before, @@ -57,1589 +4111,2075 @@ pre,pre code{white-space:pre-wrap}.clear,.form-row:after,.row:after{clear:both}. .ui-dialog-titlebar-close:before, .icon-clock-os:before, .icon-close:before { - content: "\f00d"; + content: "\f00d"; } + .icon-search-plus:before { - content: "\f00e"; + content: "\f00e"; } + .icon-search-minus:before { - content: "\f010"; + content: "\f010"; } + .icon-power-off:before { - content: "\f011"; + content: "\f011"; } + .icon-signal:before { - content: "\f012"; + content: "\f012"; } + .icon-gear:before, .icon-cog:before { - content: "\f013"; + content: "\f013"; } + .icon-trash-o:before { - content: "\f014"; + content: "\f014"; } + .icon-home:before { - content: "\f015"; + content: "\f015"; } + .icon-file-o:before { - content: "\f016"; + content: "\f016"; } + .icon-clock-o:before { - content: "\f017"; + content: "\f017"; } + .icon-road:before { - content: "\f018"; + content: "\f018"; } + .icon-download:before { - content: "\f019"; + content: "\f019"; } + .icon-arrow-circle-o-down:before { - content: "\f01a"; + content: "\f01a"; } + .icon-arrow-circle-o-up:before { - content: "\f01b"; + content: "\f01b"; } + .icon-inbox:before { - content: "\f01c"; + content: "\f01c"; } + .icon-play-circle-o:before { - content: "\f01d"; + content: "\f01d"; } + .icon-rotate-right:before, .icon-repeat:before { - content: "\f01e"; + content: "\f01e"; } + .icon-refresh:before { - content: "\f021"; + content: "\f021"; } + .icon-list-alt:before { - content: "\f022"; + content: "\f022"; } + .icon-lock:before { - content: "\f023"; + content: "\f023"; } + .icon-flag:before { - content: "\f024"; + content: "\f024"; } + .icon-headphones:before { - content: "\f025"; + content: "\f025"; } + .icon-volume-off:before { - content: "\f026"; + content: "\f026"; } + .icon-volume-down:before { - content: "\f027"; + content: "\f027"; } + .icon-volume-up:before { - content: "\f028"; + content: "\f028"; } + .icon-qrcode:before { - content: "\f029"; + content: "\f029"; } + .icon-barcode:before { - content: "\f02a"; + content: "\f02a"; } + .icon-tag:before { - content: "\f02b"; + content: "\f02b"; } + .icon-tags:before { - content: "\f02c"; + content: "\f02c"; } + .icon-book:before { - content: "\f02d"; + content: "\f02d"; } + .icon-bookmark:before { - content: "\f02e"; + content: "\f02e"; } + .icon-print:before { - content: "\f02f"; + content: "\f02f"; } + .icon-camera:before { - content: "\f030"; + content: "\f030"; } + .icon-font:before { - content: "\f031"; + content: "\f031"; } + .icon-bold:before { - content: "\f032"; + content: "\f032"; } + .icon-italic:before { - content: "\f033"; + content: "\f033"; } + .icon-text-height:before { - content: "\f034"; + content: "\f034"; } + .icon-text-width:before { - content: "\f035"; + content: "\f035"; } + .icon-align-left:before { - content: "\f036"; + content: "\f036"; } + .icon-align-center:before { - content: "\f037"; + content: "\f037"; } + .icon-align-right:before { - content: "\f038"; + content: "\f038"; } + .icon-align-justify:before { - content: "\f039"; + content: "\f039"; } + .icon-list:before { - content: "\f03a"; + content: "\f03a"; } + .icon-dedent:before, .icon-outdent:before { - content: "\f03b"; + content: "\f03b"; } + .icon-indent:before { - content: "\f03c"; + content: "\f03c"; } + .icon-video-camera:before { - content: "\f03d"; + content: "\f03d"; } + .icon-photo:before, .icon-image:before, .icon-picture-o:before { - content: "\f03e"; + content: "\f03e"; } + .icon-pencil:before { - content: "\f040"; + content: "\f040"; } + .icon-map-marker:before { - content: "\f041"; + content: "\f041"; } + .icon-adjust:before { - content: "\f042"; + content: "\f042"; } + .icon-tint:before { - content: "\f043"; + content: "\f043"; } + .icon-edit:before, .icon-pencil-square-o:before { - content: "\f044"; + content: "\f044"; } + .icon-share-square-o:before { - content: "\f045"; + content: "\f045"; } + .icon-check-square-o:before { - content: "\f046"; + content: "\f046"; } + .icon-arrows:before { - content: "\f047"; + content: "\f047"; } + .icon-step-backward:before { - content: "\f048"; + content: "\f048"; } + .icon-fast-backward:before { - content: "\f049"; + content: "\f049"; } + .icon-backward:before { - content: "\f04a"; + content: "\f04a"; } + .icon-play:before { - content: "\f04b"; + content: "\f04b"; } + .icon-pause:before { - content: "\f04c"; + content: "\f04c"; } + .icon-stop:before { - content: "\f04d"; + content: "\f04d"; } + .icon-forward:before { - content: "\f04e"; + content: "\f04e"; } + .icon-fast-forward:before { - content: "\f050"; + content: "\f050"; } + .icon-step-forward:before { - content: "\f051"; + content: "\f051"; } + .icon-eject:before { - content: "\f052"; + content: "\f052"; } + .icon-chevron-left:before { - content: "\f053"; + content: "\f053"; } + .icon-chevron-right:before { - content: "\f054"; + content: "\f054"; } + .icon-plus-circle:before { - content: "\f055"; + content: "\f055"; } + .icon-minus-circle:before { - content: "\f056"; + content: "\f056"; } + .icon-times-circle:before { - content: "\f057"; + content: "\f057"; } + .icon-check-circle:before { - content: "\f058"; + content: "\f058"; } + .icon-question-circle:before { - content: "\f059"; + content: "\f059"; } + .icon-info-circle:before { - content: "\f05a"; + content: "\f05a"; } + .icon-crosshairs:before { - content: "\f05b"; + content: "\f05b"; } + .icon-times-circle-o:before { - content: "\f05c"; + content: "\f05c"; } + .icon-check-circle-o:before { - content: "\f05d"; + content: "\f05d"; } + .icon-ban:before { - content: "\f05e"; + content: "\f05e"; } + .icon-arrow-left:before { - content: "\f060"; + content: "\f060"; } + .icon-arrow-right:before { - content: "\f061"; + content: "\f061"; } + .icon-arrow-up:before { - content: "\f062"; + content: "\f062"; } + .icon-arrow-down:before { - content: "\f063"; + content: "\f063"; } + .icon-mail-forward:before, .icon-share:before { - content: "\f064"; + content: "\f064"; } + .icon-expand:before { - content: "\f065"; + content: "\f065"; } + .icon-compress:before { - content: "\f066"; + content: "\f066"; } + .icon-plus:before { - content: "\f067"; + content: "\f067"; } + .icon-minus:before { - content: "\f068"; + content: "\f068"; } + .icon-asterisk:before { - content: "\f069"; + content: "\f069"; } + .icon-exclamation-circle:before { - content: "\f06a"; + content: "\f06a"; } + .icon-gift:before { - content: "\f06b"; + content: "\f06b"; } + .icon-leaf:before { - content: "\f06c"; + content: "\f06c"; } + .icon-fire:before { - content: "\f06d"; + content: "\f06d"; } + .icon-eye:before { - content: "\f06e"; + content: "\f06e"; } + .icon-eye-slash:before { - content: "\f070"; + content: "\f070"; } + .icon-warning:before, .icon-exclamation-triangle:before { - content: "\f071"; + content: "\f071"; } + .icon-plane:before { - content: "\f072"; + content: "\f072"; } + .icon-calendar:before { - content: "\f073"; + content: "\f073"; } + .icon-random:before { - content: "\f074"; + content: "\f074"; } + .icon-comment:before { - content: "\f075"; + content: "\f075"; } + .icon-magnet:before { - content: "\f076"; + content: "\f076"; } + .icon-chevron-up:before { - content: "\f077"; + content: "\f077"; } + .icon-chevron-down:before { - content: "\f078"; + content: "\f078"; } + .icon-retweet:before { - content: "\f079"; + content: "\f079"; } + .icon-shopping-cart:before { - content: "\f07a"; + content: "\f07a"; } + .icon-folder:before { - content: "\f07b"; + content: "\f07b"; } + .icon-folder-open:before { - content: "\f07c"; + content: "\f07c"; } + .icon-arrows-v:before { - content: "\f07d"; + content: "\f07d"; } + .icon-arrows-h:before { - content: "\f07e"; + content: "\f07e"; } + .icon-bar-chart-o:before, .icon-bar-chart:before { - content: "\f080"; + content: "\f080"; } + .icon-twitter-square:before { - content: "\f081"; + content: "\f081"; } + .icon-facebook-square:before { - content: "\f082"; + content: "\f082"; } + .icon-camera-retro:before { - content: "\f083"; + content: "\f083"; } + .icon-key:before { - content: "\f084"; + content: "\f084"; } + .icon-gears:before, .icon-cogs:before { - content: "\f085"; + content: "\f085"; } + .icon-comments:before { - content: "\f086"; + content: "\f086"; } + .icon-thumbs-o-up:before { - content: "\f087"; + content: "\f087"; } + .icon-thumbs-o-down:before { - content: "\f088"; + content: "\f088"; } + .icon-star-half:before { - content: "\f089"; + content: "\f089"; } + .icon-heart-o:before { - content: "\f08a"; + content: "\f08a"; } + .icon-sign-out:before { - content: "\f08b"; + content: "\f08b"; } + .icon-linkedin-square:before { - content: "\f08c"; + content: "\f08c"; } + .icon-thumb-tack:before { - content: "\f08d"; + content: "\f08d"; } + .icon-external-link:before { - content: "\f08e"; + content: "\f08e"; } + .icon-sign-in:before { - content: "\f090"; + content: "\f090"; } + .icon-trophy:before { - content: "\f091"; + content: "\f091"; } + .icon-github-square:before { - content: "\f092"; + content: "\f092"; } + .icon-upload:before { - content: "\f093"; + content: "\f093"; } + .icon-lemon-o:before { - content: "\f094"; + content: "\f094"; } + .icon-phone:before { - content: "\f095"; + content: "\f095"; } + .icon-square-o:before { - content: "\f096"; + content: "\f096"; } + .icon-bookmark-o:before { - content: "\f097"; + content: "\f097"; } + .icon-phone-square:before { - content: "\f098"; + content: "\f098"; } + .icon-twitter:before { - content: "\f099"; + content: "\f099"; } + .icon-facebook:before { - content: "\f09a"; + content: "\f09a"; } + .icon-github:before { - content: "\f09b"; + content: "\f09b"; } + .icon-unlock:before { - content: "\f09c"; + content: "\f09c"; } + .icon-credit-card:before { - content: "\f09d"; + content: "\f09d"; } + .icon-rss:before { - content: "\f09e"; + content: "\f09e"; } + .icon-hdd-o:before { - content: "\f0a0"; + content: "\f0a0"; } + .icon-bullhorn:before { - content: "\f0a1"; + content: "\f0a1"; } + .icon-bell:before { - content: "\f0f3"; + content: "\f0f3"; } + .icon-certificate:before { - content: "\f0a3"; + content: "\f0a3"; } + .icon-hand-o-right:before { - content: "\f0a4"; + content: "\f0a4"; } + .icon-hand-o-left:before { - content: "\f0a5"; + content: "\f0a5"; } + .icon-hand-o-up:before { - content: "\f0a6"; + content: "\f0a6"; } + .icon-hand-o-down:before { - content: "\f0a7"; + content: "\f0a7"; } + .icon-arrow-circle-left:before { - content: "\f0a8"; + content: "\f0a8"; } + .icon-arrow-circle-right:before { - content: "\f0a9"; + content: "\f0a9"; } + .icon-arrow-circle-up:before { - content: "\f0aa"; + content: "\f0aa"; } + .icon-arrow-circle-down:before { - content: "\f0ab"; + content: "\f0ab"; } + .icon-globe:before { - content: "\f0ac"; + content: "\f0ac"; } + .icon-wrench:before { - content: "\f0ad"; + content: "\f0ad"; } + .icon-tasks:before { - content: "\f0ae"; + content: "\f0ae"; } + .icon-filter:before { - content: "\f0b0"; + content: "\f0b0"; } + .icon-briefcase:before { - content: "\f0b1"; + content: "\f0b1"; } + .icon-arrows-alt:before { - content: "\f0b2"; + content: "\f0b2"; } + .icon-group:before, .icon-users:before { - content: "\f0c0"; + content: "\f0c0"; } + .icon-chain:before, .icon-link:before { - content: "\f0c1"; + content: "\f0c1"; } + .icon-cloud:before { - content: "\f0c2"; + content: "\f0c2"; } + .icon-flask:before { - content: "\f0c3"; + content: "\f0c3"; } + .icon-cut:before, .icon-scissors:before { - content: "\f0c4"; + content: "\f0c4"; } + .icon-copy:before, .icon-files-o:before { - content: "\f0c5"; + content: "\f0c5"; } + .icon-paperclip:before { - content: "\f0c6"; + content: "\f0c6"; } + .icon-save:before, .icon-floppy-o:before { - content: "\f0c7"; + content: "\f0c7"; } + .icon-square:before { - content: "\f0c8"; + content: "\f0c8"; } + .icon-navicon:before, .icon-reorder:before, .icon-bars:before { - content: "\f0c9"; + content: "\f0c9"; } + .icon-list-ul:before { - content: "\f0ca"; + content: "\f0ca"; } + .icon-list-ol:before { - content: "\f0cb"; + content: "\f0cb"; } + .icon-strikethrough:before { - content: "\f0cc"; + content: "\f0cc"; } + .icon-underline:before { - content: "\f0cd"; + content: "\f0cd"; } + .icon-table:before { - content: "\f0ce"; + content: "\f0ce"; } + .icon-magic:before { - content: "\f0d0"; + content: "\f0d0"; } + .icon-truck:before { - content: "\f0d1"; + content: "\f0d1"; } + .icon-pinterest:before { - content: "\f0d2"; + content: "\f0d2"; } + .icon-pinterest-square:before { - content: "\f0d3"; + content: "\f0d3"; } + .icon-google-plus-square:before { - content: "\f0d4"; + content: "\f0d4"; } + .icon-google-plus:before { - content: "\f0d5"; + content: "\f0d5"; } + .icon-money:before { - content: "\f0d6"; + content: "\f0d6"; } + .ui-accordion-header-icon.ui-icon-triangle-1-s:before, .icon-caret-down:before { - content: "\f0d7"; + content: "\f0d7"; } + .icon-caret-up:before { - content: "\f0d8"; + content: "\f0d8"; } + .icon-caret-left:before { - content: "\f0d9"; + content: "\f0d9"; } + .ui-icon-triangle-1-e:before, .icon-caret-right:before { - content: "\f0da"; + content: "\f0da"; } + .icon-columns:before { - content: "\f0db"; + content: "\f0db"; } + .dataTable .sorting .glyph-icon:before, .dataTable .ui-icon-carat-2-n-s:before, .icon-unsorted:before, .icon-sort:before { - content: "\f0dc"; + content: "\f0dc"; } + .dataTable .sorting_asc .glyph-icon:before, .icon-sort-down:before, .icon-sort-asc:before { - content: "\f0dd"; + content: "\f0dd"; } + .dataTable .sorting_desc .glyph-icon:before, .dataTable .ui-icon-triangle-1-n:before, .icon-sort-up:before, .icon-sort-desc:before { - content: "\f0de"; + content: "\f0de"; } + .icon-envelope:before { - content: "\f0e0"; + content: "\f0e0"; } + .icon-linkedin:before { - content: "\f0e1"; + content: "\f0e1"; } + .icon-rotate-left:before, .icon-undo:before { - content: "\f0e2"; + content: "\f0e2"; } + .icon-legal:before, .icon-gavel:before { - content: "\f0e3"; + content: "\f0e3"; } + .icon-dashboard:before, .icon-tachometer:before { - content: "\f0e4"; + content: "\f0e4"; } + .icon-comment-o:before { - content: "\f0e5"; + content: "\f0e5"; } + .icon-comments-o:before { - content: "\f0e6"; + content: "\f0e6"; } + .icon-flash:before, .icon-bolt:before { - content: "\f0e7"; + content: "\f0e7"; } + .icon-sitemap:before { - content: "\f0e8"; + content: "\f0e8"; } + .icon-umbrella:before { - content: "\f0e9"; + content: "\f0e9"; } + .icon-paste:before, .icon-clipboard:before { - content: "\f0ea"; + content: "\f0ea"; } + .icon-lightbulb-o:before { - content: "\f0eb"; + content: "\f0eb"; } + .icon-exchange:before { - content: "\f0ec"; + content: "\f0ec"; } + .icon-cloud-download:before { - content: "\f0ed"; + content: "\f0ed"; } + .icon-cloud-upload:before { - content: "\f0ee"; + content: "\f0ee"; } + .icon-user-md:before { - content: "\f0f0"; + content: "\f0f0"; } + .icon-stethoscope:before { - content: "\f0f1"; + content: "\f0f1"; } + .icon-suitcase:before { - content: "\f0f2"; + content: "\f0f2"; } + .icon-bell-o:before { - content: "\f0a2"; + content: "\f0a2"; } + .icon-coffee:before { - content: "\f0f4"; + content: "\f0f4"; } + .icon-cutlery:before { - content: "\f0f5"; + content: "\f0f5"; } + .icon-file-text-o:before { - content: "\f0f6"; + content: "\f0f6"; } + .icon-building-o:before { - content: "\f0f7"; + content: "\f0f7"; } + .icon-hospital-o:before { - content: "\f0f8"; + content: "\f0f8"; } + .icon-ambulance:before { - content: "\f0f9"; + content: "\f0f9"; } + .icon-medkit:before { - content: "\f0fa"; + content: "\f0fa"; } + .icon-fighter-jet:before { - content: "\f0fb"; + content: "\f0fb"; } + .icon-beer:before { - content: "\f0fc"; + content: "\f0fc"; } + .icon-h-square:before { - content: "\f0fd"; + content: "\f0fd"; } + .icon-plus-square:before { - content: "\f0fe"; + content: "\f0fe"; } + .icon-angle-double-left:before { - content: "\f100"; + content: "\f100"; } + .icon-angle-double-right:before { - content: "\f101"; + content: "\f101"; } + .icon-angle-double-up:before { - content: "\f102"; + content: "\f102"; } + .icon-angle-double-down:before { - content: "\f103"; + content: "\f103"; } + .icon-angle-left:before { - content: "\f104"; + content: "\f104"; } + #page-sidebar li a.sf-with-ul:after, .icon-angle-right:before { - content: "\f105"; + content: "\f105"; } + .icon-angle-up:before { - content: "\f106"; + content: "\f106"; } + .icon-angle-down:before { - content: "\f107"; + content: "\f107"; } + .icon-desktop:before { - content: "\f108"; + content: "\f108"; } + .icon-laptop:before { - content: "\f109"; + content: "\f109"; } + .icon-tablet:before { - content: "\f10a"; + content: "\f10a"; } + .icon-mobile-phone:before, .icon-mobile:before { - content: "\f10b"; + content: "\f10b"; } + .icon-circle-o:before { - content: "\f10c"; + content: "\f10c"; } + .icon-quote-left:before { - content: "\f10d"; + content: "\f10d"; } + .icon-quote-right:before { - content: "\f10e"; + content: "\f10e"; } + .icon-spinner:before { - content: "\f110"; + content: "\f110"; } + #page-sidebar li ul li a:before, .icon-circle:before { - content: "\f111"; + content: "\f111"; } + .icon-mail-reply:before, .icon-reply:before { - content: "\f112"; + content: "\f112"; } + .icon-github-alt:before { - content: "\f113"; + content: "\f113"; } + .icon-folder-o:before { - content: "\f114"; + content: "\f114"; } + .icon-folder-open-o:before { - content: "\f115"; + content: "\f115"; } + .icon-smile-o:before { - content: "\f118"; + content: "\f118"; } + .icon-frown-o:before { - content: "\f119"; + content: "\f119"; } + .icon-meh-o:before { - content: "\f11a"; + content: "\f11a"; } + .icon-gamepad:before { - content: "\f11b"; + content: "\f11b"; } + .icon-keyboard-o:before { - content: "\f11c"; + content: "\f11c"; } + .icon-flag-o:before { - content: "\f11d"; + content: "\f11d"; } + .icon-flag-checkered:before { - content: "\f11e"; + content: "\f11e"; } + .icon-terminal:before { - content: "\f120"; + content: "\f120"; } + .icon-code:before { - content: "\f121"; + content: "\f121"; } + .icon-mail-reply-all:before, .icon-reply-all:before { - content: "\f122"; + content: "\f122"; } + .icon-star-half-empty:before, .icon-star-half-full:before, .icon-star-half-o:before { - content: "\f123"; + content: "\f123"; } + .icon-location-arrow:before { - content: "\f124"; + content: "\f124"; } + .icon-crop:before { - content: "\f125"; + content: "\f125"; } + .icon-code-fork:before { - content: "\f126"; + content: "\f126"; } + .icon-unlink:before, .icon-chain-broken:before { - content: "\f127"; + content: "\f127"; } + .icon-question:before { - content: "\f128"; + content: "\f128"; } + .icon-info:before { - content: "\f129"; + content: "\f129"; } + .icon-exclamation:before { - content: "\f12a"; + content: "\f12a"; } + .icon-superscript:before { - content: "\f12b"; + content: "\f12b"; } + .icon-subscript:before { - content: "\f12c"; + content: "\f12c"; } + .icon-eraser:before { - content: "\f12d"; + content: "\f12d"; } + .icon-puzzle-piece:before { - content: "\f12e"; + content: "\f12e"; } + .icon-microphone:before { - content: "\f130"; + content: "\f130"; } + .icon-microphone-slash:before { - content: "\f131"; + content: "\f131"; } + .icon-shield:before { - content: "\f132"; + content: "\f132"; } + .icon-calendar-o:before { - content: "\f133"; + content: "\f133"; } + .icon-fire-extinguisher:before { - content: "\f134"; + content: "\f134"; } + .icon-rocket:before { - content: "\f135"; + content: "\f135"; } + .icon-maxcdn:before { - content: "\f136"; + content: "\f136"; } + .ui-icon-circle-triangle-w:before, .icon-chevron-circle-left:before { - content: "\f137"; + content: "\f137"; } + .ui-icon-circle-triangle-e:before, .icon-chevron-circle-right:before { - content: "\f138"; + content: "\f138"; } + .icon-chevron-circle-up:before { - content: "\f139"; + content: "\f139"; } + .icon-chevron-circle-down:before { - content: "\f13a"; + content: "\f13a"; } + .icon-html5:before { - content: "\f13b"; + content: "\f13b"; } + .icon-css3:before { - content: "\f13c"; + content: "\f13c"; } + .icon-anchor:before { - content: "\f13d"; + content: "\f13d"; } + .icon-unlock-alt:before { - content: "\f13e"; + content: "\f13e"; } + .icon-bullseye:before { - content: "\f140"; + content: "\f140"; } + .icon-ellipsis-h:before { - content: "\f141"; + content: "\f141"; } + .icon-ellipsis-v:before { - content: "\f142"; + content: "\f142"; } + .icon-rss-square:before { - content: "\f143"; + content: "\f143"; } + .icon-play-circle:before { - content: "\f144"; + content: "\f144"; } + .icon-ticket:before { - content: "\f145"; + content: "\f145"; } + .icon-minus-square:before { - content: "\f146"; + content: "\f146"; } + .icon-minus-square-o:before { - content: "\f147"; + content: "\f147"; } + .icon-level-up:before { - content: "\f148"; + content: "\f148"; } + .icon-level-down:before { - content: "\f149"; + content: "\f149"; } + .icon-check-square:before { - content: "\f14a"; + content: "\f14a"; } + .icon-pencil-square:before { - content: "\f14b"; + content: "\f14b"; } + .icon-external-link-square:before { - content: "\f14c"; + content: "\f14c"; } + .icon-share-square:before { - content: "\f14d"; + content: "\f14d"; } + .icon-compass:before { - content: "\f14e"; + content: "\f14e"; } + .icon-toggle-down:before, .icon-caret-square-o-down:before { - content: "\f150"; + content: "\f150"; } + .icon-toggle-up:before, .icon-caret-square-o-up:before { - content: "\f151"; + content: "\f151"; } + .icon-toggle-right:before, .icon-caret-square-o-right:before { - content: "\f152"; + content: "\f152"; } + .icon-euro:before, .icon-eur:before { - content: "\f153"; + content: "\f153"; } + .icon-gbp:before { - content: "\f154"; + content: "\f154"; } + .icon-dollar:before, .icon-usd:before { - content: "\f155"; + content: "\f155"; } + .icon-rupee:before, .icon-inr:before { - content: "\f156"; + content: "\f156"; } + .icon-cny:before, .icon-rmb:before, .icon-yen:before, .icon-jpy:before { - content: "\f157"; + content: "\f157"; } + .icon-ruble:before, .icon-rouble:before, .icon-rub:before { - content: "\f158"; + content: "\f158"; } + .icon-won:before, .icon-krw:before { - content: "\f159"; + content: "\f159"; } + .icon-bitcoin:before, .icon-btc:before { - content: "\f15a"; + content: "\f15a"; } + .icon-file:before { - content: "\f15b"; + content: "\f15b"; } + .icon-file-text:before { - content: "\f15c"; + content: "\f15c"; } + .icon-sort-alpha-asc:before { - content: "\f15d"; + content: "\f15d"; } + .icon-sort-alpha-desc:before { - content: "\f15e"; + content: "\f15e"; } + .icon-sort-amount-asc:before { - content: "\f160"; + content: "\f160"; } + .icon-sort-amount-desc:before { - content: "\f161"; + content: "\f161"; } + .icon-sort-numeric-asc:before { - content: "\f162"; + content: "\f162"; } + .icon-sort-numeric-desc:before { - content: "\f163"; + content: "\f163"; } + .icon-thumbs-up:before { - content: "\f164"; + content: "\f164"; } + .icon-thumbs-down:before { - content: "\f165"; + content: "\f165"; } + .icon-youtube-square:before { - content: "\f166"; + content: "\f166"; } + .icon-youtube:before { - content: "\f167"; + content: "\f167"; } + .icon-xing:before { - content: "\f168"; + content: "\f168"; } + .icon-xing-square:before { - content: "\f169"; + content: "\f169"; } + .icon-youtube-play:before { - content: "\f16a"; + content: "\f16a"; } + .icon-dropbox:before { - content: "\f16b"; + content: "\f16b"; } + .icon-stack-overflow:before { - content: "\f16c"; + content: "\f16c"; } + .icon-instagram:before { - content: "\f16d"; + content: "\f16d"; } + .icon-flickr:before { - content: "\f16e"; + content: "\f16e"; } + .icon-adn:before { - content: "\f170"; + content: "\f170"; } + .icon-bitbucket:before { - content: "\f171"; + content: "\f171"; } + .icon-bitbucket-square:before { - content: "\f172"; + content: "\f172"; } + .icon-tumblr:before { - content: "\f173"; + content: "\f173"; } + .icon-tumblr-square:before { - content: "\f174"; + content: "\f174"; } + .icon-long-arrow-down:before { - content: "\f175"; + content: "\f175"; } + .icon-long-arrow-up:before { - content: "\f176"; + content: "\f176"; } + .icon-long-arrow-left:before { - content: "\f177"; + content: "\f177"; } + .icon-long-arrow-right:before { - content: "\f178"; + content: "\f178"; } + .icon-apple:before { - content: "\f179"; + content: "\f179"; } + .icon-windows:before { - content: "\f17a"; + content: "\f17a"; } + .icon-android:before { - content: "\f17b"; + content: "\f17b"; } + .icon-linux:before { - content: "\f17c"; + content: "\f17c"; } + .icon-dribbble:before { - content: "\f17d"; + content: "\f17d"; } + .icon-skype:before { - content: "\f17e"; + content: "\f17e"; } + .icon-foursquare:before { - content: "\f180"; + content: "\f180"; } + .icon-trello:before { - content: "\f181"; + content: "\f181"; } + .icon-female:before { - content: "\f182"; + content: "\f182"; } + .icon-male:before { - content: "\f183"; + content: "\f183"; } + .icon-gittip:before { - content: "\f184"; + content: "\f184"; } + .icon-sun-o:before { - content: "\f185"; + content: "\f185"; } + .icon-moon-o:before { - content: "\f186"; + content: "\f186"; } + .icon-archive:before { - content: "\f187"; + content: "\f187"; } + .icon-bug:before { - content: "\f188"; + content: "\f188"; } + .icon-vk:before { - content: "\f189"; + content: "\f189"; } + .icon-weibo:before { - content: "\f18a"; + content: "\f18a"; } + .icon-renren:before { - content: "\f18b"; + content: "\f18b"; } + .icon-pagelines:before { - content: "\f18c"; + content: "\f18c"; } + .icon-stack-exchange:before { - content: "\f18d"; + content: "\f18d"; } + .icon-arrow-circle-o-right:before { - content: "\f18e"; + content: "\f18e"; } + .icon-arrow-circle-o-left:before { - content: "\f190"; + content: "\f190"; } + .icon-toggle-left:before, .icon-caret-square-o-left:before { - content: "\f191"; + content: "\f191"; } + .icon-dot-circle-o:before { - content: "\f192"; + content: "\f192"; } + .icon-wheelchair:before { - content: "\f193"; + content: "\f193"; } + .icon-vimeo-square:before { - content: "\f194"; + content: "\f194"; } + .icon-turkish-lira:before, .icon-try:before { - content: "\f195"; + content: "\f195"; } + .icon-plus-square-o:before { - content: "\f196"; + content: "\f196"; } + .icon-space-shuttle:before { - content: "\f197"; + content: "\f197"; } + .icon-slack:before { - content: "\f198"; + content: "\f198"; } + .icon-envelope-square:before { - content: "\f199"; + content: "\f199"; } + .icon-wordpress:before { - content: "\f19a"; + content: "\f19a"; } + .icon-openid:before { - content: "\f19b"; + content: "\f19b"; } + .icon-institution:before, .icon-bank:before, .icon-university:before { - content: "\f19c"; + content: "\f19c"; } + .icon-mortar-board:before, .icon-graduation-cap:before { - content: "\f19d"; + content: "\f19d"; } + .icon-yahoo:before { - content: "\f19e"; + content: "\f19e"; } + .icon-google:before { - content: "\f1a0"; + content: "\f1a0"; } + .icon-reddit:before { - content: "\f1a1"; + content: "\f1a1"; } + .icon-reddit-square:before { - content: "\f1a2"; + content: "\f1a2"; } + .icon-stumbleupon-circle:before { - content: "\f1a3"; + content: "\f1a3"; } + .icon-stumbleupon:before { - content: "\f1a4"; + content: "\f1a4"; } + .icon-delicious:before { - content: "\f1a5"; + content: "\f1a5"; } + .icon-digg:before { - content: "\f1a6"; + content: "\f1a6"; } + .icon-pied-piper:before { - content: "\f1a7"; + content: "\f1a7"; } + .icon-pied-piper-alt:before { - content: "\f1a8"; + content: "\f1a8"; } + .icon-drupal:before { - content: "\f1a9"; + content: "\f1a9"; } + .icon-joomla:before { - content: "\f1aa"; + content: "\f1aa"; } + .icon-language:before { - content: "\f1ab"; + content: "\f1ab"; } + .icon-fax:before { - content: "\f1ac"; + content: "\f1ac"; } + .icon-building:before { - content: "\f1ad"; + content: "\f1ad"; } + .icon-child:before { - content: "\f1ae"; + content: "\f1ae"; } + .icon-paw:before { - content: "\f1b0"; + content: "\f1b0"; } + .icon-spoon:before { - content: "\f1b1"; + content: "\f1b1"; } + .icon-cube:before { - content: "\f1b2"; + content: "\f1b2"; } + .icon-cubes:before { - content: "\f1b3"; + content: "\f1b3"; } + .icon-behance:before { - content: "\f1b4"; + content: "\f1b4"; } + .icon-behance-square:before { - content: "\f1b5"; + content: "\f1b5"; } + .icon-steam:before { - content: "\f1b6"; + content: "\f1b6"; } + .icon-steam-square:before { - content: "\f1b7"; + content: "\f1b7"; } + .icon-recycle:before { - content: "\f1b8"; + content: "\f1b8"; } + .icon-automobile:before, .icon-car:before { - content: "\f1b9"; + content: "\f1b9"; } + .icon-cab:before, .icon-taxi:before { - content: "\f1ba"; + content: "\f1ba"; } + .icon-tree:before { - content: "\f1bb"; + content: "\f1bb"; } + .icon-spotify:before { - content: "\f1bc"; + content: "\f1bc"; } + .icon-deviantart:before { - content: "\f1bd"; + content: "\f1bd"; } + .icon-soundcloud:before { - content: "\f1be"; + content: "\f1be"; } + .icon-database:before { - content: "\f1c0"; + content: "\f1c0"; } + .icon-file-pdf-o:before { - content: "\f1c1"; + content: "\f1c1"; } + .icon-file-word-o:before { - content: "\f1c2"; + content: "\f1c2"; } + .icon-file-excel-o:before { - content: "\f1c3"; + content: "\f1c3"; } + .icon-file-powerpoint-o:before { - content: "\f1c4"; + content: "\f1c4"; } + .icon-file-photo-o:before, .icon-file-picture-o:before, .icon-file-image-o:before { - content: "\f1c5"; + content: "\f1c5"; } + .icon-file-zip-o:before, .icon-file-archive-o:before { - content: "\f1c6"; + content: "\f1c6"; } + .icon-file-sound-o:before, .icon-file-audio-o:before { - content: "\f1c7"; + content: "\f1c7"; } + .icon-file-movie-o:before, .icon-file-video-o:before { - content: "\f1c8"; + content: "\f1c8"; } + .icon-file-code-o:before { - content: "\f1c9"; + content: "\f1c9"; } + .icon-vine:before { - content: "\f1ca"; + content: "\f1ca"; } + .icon-codepen:before { - content: "\f1cb"; + content: "\f1cb"; } + .icon-jsfiddle:before { - content: "\f1cc"; + content: "\f1cc"; } + .icon-life-bouy:before, .icon-life-buoy:before, .icon-life-saver:before, .icon-support:before, .icon-life-ring:before { - content: "\f1cd"; + content: "\f1cd"; } + .icon-circle-o-notch:before { - content: "\f1ce"; + content: "\f1ce"; } + .icon-ra:before, .icon-rebel:before { - content: "\f1d0"; + content: "\f1d0"; } + .icon-ge:before, .icon-empire:before { - content: "\f1d1"; + content: "\f1d1"; } + .icon-git-square:before { - content: "\f1d2"; + content: "\f1d2"; } + .icon-git:before { - content: "\f1d3"; + content: "\f1d3"; } + .icon-hacker-news:before { - content: "\f1d4"; + content: "\f1d4"; } + .icon-tencent-weibo:before { - content: "\f1d5"; + content: "\f1d5"; } + .icon-qq:before { - content: "\f1d6"; + content: "\f1d6"; } + .icon-wechat:before, .icon-weixin:before { - content: "\f1d7"; + content: "\f1d7"; } + .icon-send:before, .icon-paper-plane:before { - content: "\f1d8"; + content: "\f1d8"; } + .icon-send-o:before, .icon-paper-plane-o:before { - content: "\f1d9"; + content: "\f1d9"; } + .icon-history:before { - content: "\f1da"; + content: "\f1da"; } + .icon-circle-thin:before { - content: "\f1db"; + content: "\f1db"; } + .icon-header:before { - content: "\f1dc"; + content: "\f1dc"; } + .icon-paragraph:before { - content: "\f1dd"; + content: "\f1dd"; } + .icon-sliders:before { - content: "\f1de"; + content: "\f1de"; } + .icon-share-alt:before { - content: "\f1e0"; + content: "\f1e0"; } + .icon-share-alt-square:before { - content: "\f1e1"; + content: "\f1e1"; } + .icon-bomb:before { - content: "\f1e2"; + content: "\f1e2"; } + .icon-soccer-ball-o:before, .icon-futbol-o:before { - content: "\f1e3"; + content: "\f1e3"; } + .icon-tty:before { - content: "\f1e4"; + content: "\f1e4"; } + .icon-binoculars:before { - content: "\f1e5"; + content: "\f1e5"; } + .icon-plug:before { - content: "\f1e6"; + content: "\f1e6"; } + .icon-slideshare:before { - content: "\f1e7"; + content: "\f1e7"; } + .icon-twitch:before { - content: "\f1e8"; + content: "\f1e8"; } + .icon-yelp:before { - content: "\f1e9"; + content: "\f1e9"; } + .icon-newspaper-o:before { - content: "\f1ea"; + content: "\f1ea"; } + .icon-wifi:before { - content: "\f1eb"; + content: "\f1eb"; } + .icon-calculator:before { - content: "\f1ec"; + content: "\f1ec"; } + .icon-paypal:before { - content: "\f1ed"; + content: "\f1ed"; } + .icon-google-wallet:before { - content: "\f1ee"; + content: "\f1ee"; } + .icon-cc-visa:before { - content: "\f1f0"; + content: "\f1f0"; } + .icon-cc-mastercard:before { - content: "\f1f1"; + content: "\f1f1"; } + .icon-cc-discover:before { - content: "\f1f2"; + content: "\f1f2"; } + .icon-cc-amex:before { - content: "\f1f3"; + content: "\f1f3"; } + .icon-cc-paypal:before { - content: "\f1f4"; + content: "\f1f4"; } + .icon-cc-stripe:before { - content: "\f1f5"; + content: "\f1f5"; } + .icon-bell-slash:before { - content: "\f1f6"; + content: "\f1f6"; } + .icon-bell-slash-o:before { - content: "\f1f7"; + content: "\f1f7"; } + .icon-trash:before { - content: "\f1f8"; + content: "\f1f8"; } + .icon-copyright:before { - content: "\f1f9"; + content: "\f1f9"; } + .icon-at:before { - content: "\f1fa"; + content: "\f1fa"; } + .icon-eyedropper:before { - content: "\f1fb"; + content: "\f1fb"; } + .icon-paint-brush:before { - content: "\f1fc"; + content: "\f1fc"; } + .icon-birthday-cake:before { - content: "\f1fd"; + content: "\f1fd"; } + .icon-area-chart:before { - content: "\f1fe"; + content: "\f1fe"; } + .icon-pie-chart:before { - content: "\f200"; + content: "\f200"; } + .icon-line-chart:before { - content: "\f201"; + content: "\f201"; } + .icon-lastfm:before { - content: "\f202"; + content: "\f202"; } + .icon-lastfm-square:before { - content: "\f203"; + content: "\f203"; } + .icon-toggle-off:before { - content: "\f204"; + content: "\f204"; } + .icon-toggle-on:before { - content: "\f205"; + content: "\f205"; } + .icon-bicycle:before { - content: "\f206"; + content: "\f206"; } + .icon-bus:before { - content: "\f207"; + content: "\f207"; } + .icon-ioxhost:before { - content: "\f208"; + content: "\f208"; } + .icon-angellist:before { - content: "\f209"; + content: "\f209"; } + .icon-cc:before { - content: "\f20a"; + content: "\f20a"; } + .icon-shekel:before, .icon-sheqel:before, .icon-ils:before { - content: "\f20b"; + content: "\f20b"; } + .icon-meanpath:before { - content: "\f20c"; + content: "\f20c"; } /*customized mzou*/ .text-white { - color: #FFFFFF; + color: #FFFFFF; } + .mt-5 { - margin-top: 5px; + margin-top: 5px; } + .mt-10 { - margin-top: 10px; + margin-top: 10px; } + .mt-20 { - margin-top: 20px; + margin-top: 20px; } + .mt-30 { - margin-top: 30px; + margin-top: 30px; } + .mr-10 { - margin-right: 10px; + margin-right: 10px; } + .mb-10 { - margin-bottom: 10px; + margin-bottom: 10px; } + .mb-20 { - margin-bottom: 20px; + margin-bottom: 20px; } + .mb-30 { - margin-bottom: 30px; + margin-bottom: 30px; } + .ml-10 { - margin-left: 10px; + margin-left: 10px; } + .my-10 { - margin-top: 10px; - margin-bottom: 10px; + margin-top: 10px; + margin-bottom: 10px; } + .my-20 { - margin-top: 20px; - margin-bottom: 20px; + margin-top: 20px; + margin-bottom: 20px; } + .my-30 { - margin-top: 30px; - margin-bottom: 30px; + margin-top: 30px; + margin-bottom: 30px; } .mx-5 { - margin-left: 5px; - margin-right: 5px; + margin-left: 5px; + margin-right: 5px; } + .mx-10 { - margin-left: 10px; - margin-right: 10px; + margin-left: 10px; + margin-right: 10px; } + .mx-20 { - margin-left: 20px; - margin-right: 20px; + margin-left: 20px; + margin-right: 20px; } + .mx-30 { - margin-left: 30px; - margin-right: 30px; + margin-left: 30px; + margin-right: 30px; } + .text-bold { - font-weight: 600; + font-weight: 600; } + .rounded { - border-radius: 3px; + border-radius: 3px; } .btn-outline-light { - color: #f8f9fa; - background-color: transparent; - background-image: none; - border-color: #f8f9fa; + color: #f8f9fa; + background-color: transparent; + background-image: none; + border-color: #f8f9fa; } + .btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; - text-decoration: none; + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; + text-decoration: none; } .flex { - display: flex; + display: flex; } + .flex-wrap { - flex-wrap: wrap; + flex-wrap: wrap; } + @media (max-width: 992px) { -.hidden-md { + .hidden-md { display: none; + } } -} + .img-thumbnail { - padding: .25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: .25rem; - max-width: 100%; - height: auto; + padding: .25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: .25rem; + max-width: 100%; + height: auto; } img { -vertical-align: middle; -border-style: none; + vertical-align: middle; + border-style: none; } @media (max-width: 720px) { - .text-center-sm { - text-align: center; -} \ No newline at end of file + .text-center-sm { + text-align: center; + } diff --git a/loginSystem/templates/loginSystem/login.html b/loginSystem/templates/loginSystem/login.html index c34b049b6..239414e0c 100755 --- a/loginSystem/templates/loginSystem/login.html +++ b/loginSystem/templates/loginSystem/login.html @@ -1,249 +1,361 @@ + - - - - Login - CyberPanel - - + .col-login-left { + background: rgb(51, 204, 204); + background: -moz-linear-gradient(0deg, rgba(51, 204, 204, 1) 0%, rgba(0, 0, 122, 1) 100%); + background: -webkit-linear-gradient(0deg, rgba(51, 204, 204, 1) 0%, rgba(0, 0, 122, 1) 100%); + background: linear-gradient(0deg, rgba(51, 204, 204, 1) 0%, rgba(0, 0, 122, 1) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#33cccc", endColorstr="#00007a", GradientType=1); + justify-content: space-between; + } - - {% load static %} + .form-group .input-group select.form-control, + .form-group .input-group input.form-control, + button.btn.btn-login { + height: 45px; - + } + button.btn.btn-login { + background-color: rgb(51, 204, 204); + box-shadow: 0 0 px 0px rgba(0, 0, 0, 0), 0 1px 2px rgba(0, 0, 0, 0); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); + } + button.btn.btn-login:hover { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + } - + .form-group .input-group select.form-control:focus, + .form-group .input-group input.form-control:focus, + button.btn.btn-login { + border: 1px solid rgb(51, 204, 204); + } - + .col-login-right { + background: #ffffff; + justify-content: center; + } - + .col-login-right .login-wrapper { + display: flex; + flex-direction: column; + justify-content: space-around; + } + a.login-changelogs { + border-top: 1px solid #fff; + } - + .login-changelogs .card { + padding: 1em; + background-color: #fff; + border-radius: 8px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); + } - + .login-changelogs .card:hover { + color: rgb(51, 204, 204); + box-shadow: 0 12px 24px rgba(0, 0, 0, 0.16), 0 10px 10px rgba(0, 0, 0, 0.18); + } + .card-body { + padding-left: 15px; + } - + .object-fit { + height: 100%; + width: 100%; + object-fit: cover; + border-radius: 6px; + } - + h4.card-learnmore { + margin-top: 15px; + position: relative; + color: rgb(51, 204, 204); + font-weight: 500; + font-size: 1.2em; - + } - + h4.card-learnmore span { + display: inline; + padding-bottom: 4px; + border-bottom: 1px solid rgb(51, 204, 204); + } + .alert.alert-danger { + text-align: center; + margin: 1em 2em 1em 2em; + padding-top: 1em; + padding-bottom: 1em; + border: 1px solid red; + } - + .spinner>div { + width: 18px; + height: 18px; + background-color: #333; + border-radius: 100%; + display: inline-block; + -webkit-animation: bouncedelay 1.4s infinite ease-in-out; + animation: bouncedelay 1.4s infinite ease-in-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both + } + + .spinner .bounce1 { + -webkit-animation-delay: -.32s; + animation-delay: -.32s + } + + .spinner .bounce2 { + -webkit-animation-delay: -.16s; + animation-delay: -.16s + } + + @-webkit-keyframes bouncedelay { + + 0%, + 80%, + 100% { + -webkit-transform: scale(0.0) + } + + 40% { + -webkit-transform: scale(1.0) + } + } + + @keyframes bouncedelay { + + 0%, + 80%, + 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0) + } + + 40% { + transform: scale(1.0); + -webkit-transform: scale(1.0) + } + } + + + + Login - CyberPanel + + + + + {% load static %} + + + + + + + + + + + + + + + + + + + + + + + -
+
-
-
-
+
+
+
-
+
-
-
-
+
+ - -
-
-
-
-

- - CyberPanel - v 2.0 -

-

Web Hosting Control Panel

-
-
-
-
-
- - - - -
-
-
-
- - - - -
- -
- -
-
- - - - -
-
- - -
-
- -
-
- - - -
+ +
+
+
+ + -
-
- - - +
+ + + - \ No newline at end of file + + diff --git a/loginSystem/templates/loginSystem/test.html b/loginSystem/templates/loginSystem/test.html index 554fecddb..54ce02540 100755 --- a/loginSystem/templates/loginSystem/test.html +++ b/loginSystem/templates/loginSystem/test.html @@ -279,7 +279,7 @@ - + @@ -356,4 +356,4 @@ - \ No newline at end of file + diff --git a/static/baseTemplate/assets/finalLoginPageCSS/allCss.css b/static/baseTemplate/assets/finalLoginPageCSS/allCss.css index 5c059ba8c..bdfc24d5a 100644 --- a/static/baseTemplate/assets/finalLoginPageCSS/allCss.css +++ b/static/baseTemplate/assets/finalLoginPageCSS/allCss.css @@ -1,55 +1,4109 @@ -pre,pre code{white-space:pre-wrap}.clear,.form-row:after,.row:after{clear:both}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus,:active,:focus,:visited,a,a:active,a:focus,a:visited{outline:0}.xchart .color0 .line,.xchart .color0 circle,.xchart .color0.comp .line{stroke:#00bca4}.xchart .color0 .line .fill,.xchart .color1 .line .fill{pointer-events:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body,button,figure{margin:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-size:1em}q{quotes:'\201C''\201D''\2018''\2019'}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}button,input,select,textarea{font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}.collapsing,.divider,.overflow-hidden,.sr-only{overflow:hidden}table{border-spacing:0;border-collapse:collapse}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*{color:#000!important;background:0 0!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:' (' attr(href)')'}abbr[title]:after{content:' (' attr(title)')'}.ir a:after,a[href^='javascript:']:after,a[href^='#']:after{content:''}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}@page{margin:2cm .5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.jGrowl{display:none}}small{font-size:85%}a{text-decoration:none}html{font-size:62.5%;-webkit-tap-highlight-color:transparent}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.jqstooltip{box-sizing:content-box}.form-row,.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-right:-10px;margin-left:-10px}.form-row:after,.form-row:before,.row:after,.row:before{display:table;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;content:' '}blockquote small,pre{line-height:1.428571429;display:block}[class*=col-]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:10px;padding-left:10px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.333333333333332%}.col-xs-2{width:16.666666666666664%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333333333%}.col-xs-5{width:41.66666666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333333333336%}.col-xs-8{width:66.66666666666666%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333333334%}.col-xs-11{width:91.66666666666666%}.col-xs-12{width:100%}@media (min-width:768px){.boxed-layout #page-header,.boxed-layout #page-wrapper,.container{max-width:750px}.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media (min-width:992px){.boxed-layout #page-header,.boxed-layout #page-wrapper,.container{max-width:970px}.col-md-1,.col-md-10,.col-md-11,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media (min-width:1200px){.boxed-layout #page-header,.boxed-layout #page-wrapper,.container{max-width:1170px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}.row.no-gutter{margin-left:0;margin-right:0}.no-gutter>[class*=col-]{padding-left:0;padding-right:0}.pad5A{padding:5px!important}.pad5T{padding-top:5px!important}.pad5R{padding-right:5px!important}.pad5B{padding-bottom:5px!important}.pad5L{padding-left:5px!important}.pad10A{padding:10px!important}.pad10T{padding-top:10px!important}.pad10R{padding-right:10px!important}.pad10B{padding-bottom:10px!important}.pad10L{padding-left:10px!important}.pad15A{padding:15px!important}.pad15T{padding-top:15px!important}.pad15R{padding-right:15px!important}.pad15B{padding-bottom:15px!important}.pad15L{padding-left:15px!important}.pad20A{padding:20px!important}.pad20T{padding-top:20px!important}.pad20R{padding-right:20px!important}.pad20B{padding-bottom:20px!important}.pad20L{padding-left:20px!important}.pad25A{padding:25px!important}.pad25T{padding-top:25px!important}.pad25R{padding-right:25px!important}.pad25B{padding-bottom:25px!important}.pad25L{padding-left:25px!important}.pad45A{padding:45px!important}.pad45T{padding-top:45px!important}.pad45R{padding-right:45px!important}.pad45B{padding-bottom:45px!important}.pad45L{padding-left:45px!important}.pad0A{padding:0!important}.pad0T{padding-top:0!important}.pad0R{padding-right:0!important}.pad0B{padding-bottom:0!important}.pad0L{padding-left:0!important}.mrg5A{margin:5px!important}.mrg5T{margin-top:5px!important}.mrg5R{margin-right:5px!important}.mrg5B{margin-bottom:5px!important}.mrg5L{margin-left:5px!important}.mrg10A{margin:10px!important}.mrg10T{margin-top:10px!important}.mrg10R{margin-right:10px!important}.mrg10B{margin-bottom:10px!important}.mrg10L{margin-left:10px!important}.mrg15A{margin:15px!important}.mrg15T{margin-top:15px!important}.mrg15R{margin-right:15px!important}.mrg15B{margin-bottom:15px!important}.mrg15L{margin-left:15px!important}.mrg20A{margin:20px!important}.mrg20T{margin-top:20px!important}.mrg20R{margin-right:20px!important}.mrg20B{margin-bottom:20px!important}.mrg20L{margin-left:20px!important}.mrg25A{margin:25px!important}.mrg25T{margin-top:25px!important}.mrg25R{margin-right:25px!important}.mrg25B{margin-bottom:25px!important}.mrg25L{margin-left:25px!important}.mrg45A{margin:45px!important}.mrg45T{margin-top:45px!important}.mrg45R{margin-right:45px!important}.mrg45B{margin-bottom:45px!important}.mrg45L{margin-left:45px!important}.mrg0A{margin:0!important}.mrg0T{margin-top:0!important}.mrg0R{margin-right:0!important}.mrg0B{margin-bottom:0!important}.mrg0L{margin-left:0!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;margin:0}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400}.h1,h1{font-size:38px}.h2,h2{font-size:26px}.h3,h3{font-size:20px}.h4,h4{font-size:16px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:75%}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:50;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right .small,blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right .small:before,blockquote.pull-right small:before{content:''}blockquote.pull-right .small:after,blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before{content:''}address{font-style:normal;line-height:1.428571429;margin-bottom:20px}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{font-size:90%;padding:0 4px;white-space:nowrap;color:#d05;border:1px solid #dfe8f1;border-radius:3px;background:#fafafa}pre{font-size:13px;margin:0 0 10px;padding:9.5px;word-wrap:break-word;word-break:break-all;color:#333;border:1px solid #ccc;border-radius:4px;background-color:#f5f5f5}pre code{font-size:inherit;padding:0;color:inherit;border-radius:0;background-color:transparent}.btn,.fc-button,.input-group-btn,.text-no-wrap{white-space:nowrap}p{line-height:1.6em;margin:0}.title-hero{margin:0 0 15px;padding:0;text-transform:uppercase;font-size:14px;opacity:.7}h4.title-hero{font-size:15px}.title-lead{color:#3F3F3F}.title-hero .title-lead{font-size:65%;margin:5px 0 0}.title-hero+.title-lead{margin-top:-10px}.jumbotron{font-size:21px;font-weight:200;line-height:2.1428571435;margin-bottom:30px;padding:30px;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.float-left,.pull-left{float:left!important}.float-right,.pull-right{float:right!important}.float-none{float:none!important}.font-size-10{font-size:10px!important}.font-size-11{font-size:11px!important}.font-size-12{font-size:12px!important}.font-size-13{font-size:13px!important}.font-size-14{font-size:14px!important}.font-size-15{font-size:15px!important}.font-size-16{font-size:16px!important}.font-size-17{font-size:17px!important}.font-size-18{font-size:18px!important}.font-size-20{font-size:20px!important}.font-size-23{font-size:23px!important}.font-size-26{font-size:26px!important}.font-size-28{font-size:28px!important}.font-size-35{font-size:35px!important}.font-size-50{font-size:50px!important}.text-center{text-align:center!important}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-justify{text-align:justify}.text-transform-none{text-transform:none}.text-transform-upr{text-transform:uppercase}.text-transform-low{text-transform:lowercase}.text-transform-cap{text-transform:capitalize}.font-bold{font-weight:700!important}.btn,.fc-button,.font-normal{font-weight:400}.font-italic{font-style:italic}.font-none{font-style:none}.clear-none{clear:none!important}#page-wrapper:after,.btn-group:after,.btn-toolbar:after,.button-pane:after,.chat-box li:after,.clearfix:after,.comments-list li .panel-body:after,.container:after,.content-box-header:after,.example-box-wrapper:after,.files-box li:after,.form-horizontal .form-group:after,.form-input-prepend:after,.form-row:after,.info-box:after,.messages-box li:after,.nav-list li:after,.nav:after,.notifications-box li:after,.pager:after,.posts-list li:after,.tl-item:after,.tl-row:after,.todo-box li:after,.ui-datepicker-buttonpane:after,.ui-helper-clearfix:after{clear:both}.ui-front{z-index:100}.wrapper-sticky{z-index:15}.hide,.lazy,.mix,.tab-pane,[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.tab-pane{padding:15px}.hidden,.ui-helper-hidden-accessible{display:none!important}.display-block{position:relative!important;display:block!important}.display-block .button-content{float:none}.display-block.dropdown-menu{position:static!important}.display-inline{display:inline-block}.no-border{border-color:transparent!important}.dropdown-menu.pad0A .hasDatepicker .ui-datepicker,.remove-border{border:0!important}.border-top{border-top-width:3px!important;border-top-style:solid!important}.width-100{box-sizing:border-box;width:100%}.center-margin{float:none!important;margin:0 auto}.center-block,.container{display:block;margin-right:auto;margin-left:auto}.center-vertical{position:relative;z-index:15;top:0;left:0;display:table;width:100%;height:100%}.center-vertical .center-content{display:table-cell;vertical-align:middle}.position-absolute{position:absolute}.show{display:block!important}.hidden{display:none!important;visibility:hidden!important}.invisible{visibility:hidden}.center-div{float:none!important;margin-right:auto!important;margin-left:auto!important;text-align:center!important}.btn-group>.btn-group,.btn-toolbar .btn-group,.btn-toolbar .input-group,.demo-icon{float:left}.divider,.nav-divider{ityity:.7;-moz-opacity:.7;filter:alpha(opacity: 70)}.divider{height:1px;margin:10px 0;padding:0}.divider-header{font-size:11px;padding:10px 15px;text-transform:uppercase;opacity:.2;color:#fff}.width-reset{width:auto!important}.opacity-10{opacity:.1!important;-moz-opacity:.1!important;filter:alpha(opacity: 10)!important}.info-box b,.info-box.icon-wrapper .icon-large,.opacity-30{opacity:.3!important;-moz-opacity:.3!important;filter:alpha(opacity: 30)!important}.opacity-40{opacity:.4!important;-moz-opacity:.4!important;filter:alpha(opacity: 40)!important}.info-box b,.label-description span,.opacity-60,.opacity-hover{opacity:.6!important;-moz-opacity:.6!important;filter:alpha(opacity: 60)!important}.no-shadow.transparent.btn:hover i,.opacity-80,.ui-datepicker-current.ui-priority-secondary{opacity:.8!important;-moz-opacity:.8!important;filter:alpha(opacity: 80)!important}.opacity-100,.opacity-hover:hover{opacity:1!important;-moz-opacity:1!important;filter:alpha(opacity: 100)!important}.btn-link .glyph-icon.opacity-hover{margin:0 -5px}.transparent{border-color:transparent!important;background:0 0!important;box-shadow:0 0 0 0 transparent!important}.no-shadow{box-shadow:0 0 0 transparent!important}.remove-bg{background:0 0}.nicescroll-rails{background:0 0!important}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}#loading,.login-img,.ui-widget-overlay{width:100%;height:100%}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:'';border-top:0;border-bottom:4px solid}.chosen-results,.form-wizard>ul,.nav-list ul,.nav-list-horizontal ul,.parsley-errors-list,.reset-ul,.tabs-navigation>ul,ul.messages-box,ul.notifications-box,ul.progress-box{margin:0;padding:0;list-style:none}#page-wrapper:after,#page-wrapper:before,.btn-group:after,.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.button-pane:after,.button-pane:before,.chat-box li:after,.chat-box li:before,.clearfix:after,.clearfix:before,.comments-list li .panel-body:after,.comments-list li .panel-body:before,.container:after,.container:before,.content-box-header:after,.content-box-header:before,.example-box-wrapper:after,.example-box-wrapper:before,.files-box li:after,.files-box li:before,.form-input-prepend:after,.form-input-prepend:before,.form-row:after,.form-row:before,.info-box:after,.info-box:before,.messages-box li:after,.messages-box li:before,.nav-list li:after,.nav-list li:before,.nav:after,.nav:before,.notifications-box li:after,.notifications-box li:before,.pager:after,.pager:before,.posts-list li:after,.posts-list li:before,.tl-item:after,.tl-item:before,.tl-row:after,.tl-row:before,.todo-box li:after,.todo-box li:before,.ui-datepicker-buttonpane:after,.ui-datepicker-buttonpane:before,.ui-helper-clearfix:after,.ui-helper-clearfix:before{display:table;content:''}.ui-sortable-placeholder{visibility:visible!important;border:1px dashed #efda2c!important;background:#fffce5!important}.daterangepicker td.available.in-range:hover,.daterangepicker td.in-range{background:#fffce5}.checker.disabled,.checker.disabled span,.chosen-disabled,.disabled,.radio.disabled,.radio.disabled span,.ui-rangeSlider-disabled .ui-rangeSlider-arrow,.ui-rangeSlider-disabled .ui-rangeSlider-container,.ui-rangeSlider-disabled .ui-rangeSlider-label,.ui-state-disabled,button[disabled]{cursor:not-allowed!important;opacity:.65;filter:alpha(opacity: 65)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control,input[disabled],select[disabled],textarea[disabled]{cursor:not-allowed;opacity:.65;background:#fafafa;filter:alpha(opacity: 65)}input[readonly],select[readonly],textarea[readonly]{opacity:.8;background:#fdfdfd;-moz-opacity:.8;filter:alpha(opacity: 80)}.login-img{position:fixed!important;top:0;left:0}.fixed-bg{background-repeat:no-repeat;background-attachment:fixed;background-position:center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}.ui-widget-overlay{position:fixed;left:0;top:0;bottom:0;right:0;text-align:center;z-index:16}.ui-widget-overlay img{position:absolute;top:50%;left:50%;margin:-26px 0 0 -26px}#loading{z-index:5555;position:fixed;left:0;top:0;background:#fff}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.collapse{display:none}.collapse.in,.tab-pane.active{display:block}.collapsing{position:relative;height:0;-webkit-transition:height .35s ease;transition:height .35s ease}.small-padding{padding:25px 0}.medium-padding{padding:55px 0}.large-padding{padding:85px 0}.xlarge-padding{padding:115px 0}.glyph-icon{text-align:center}#page-sidebar li a.sf-with-ul:after,#page-sidebar li ul li a:before,.dataTables_paginate a i:before,.fc-icon,.glyph-icon:before,.search-choice-close:before,.ui-dialog-titlebar-close:before,.ui-icon:before{font-family:FontAwesome;font-weight:400;font-style:normal;display:inline-block;text-align:center;text-decoration:none;background:0 0;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{cursor:not-allowed;text-decoration:none;background-color:transparent;background-image:none;filter:progid: DXImageTransform.Microsoft.gradient(enabled=false)}.sr-only{position:absolute;clip:rect(0,0,0,0);width:1px;height:1px;margin:-1px;padding:0;border:0}.rm-transition{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important}.btn,a,button,div[id^=uniform-] span{-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-ms-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out}#page-header,#page-sidebar,.main-header,.top-bar{-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-ms-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out}.example-box-wrapper{margin-bottom:15px;position:relative}.example-box-wrapper .ui-datepicker-inline{position:relative;width:100%}.panel-body .col-md-6 .example-box-wrapper:last-child,.panel-body .example-box-wrapper:last-child{margin-bottom:0}.example-box-wrapper .alert,.example-box-wrapper .content-box,.example-box-wrapper .dashboard-box,.example-box-wrapper .dataTables_wrapper,.example-box-wrapper .icon-box,.example-box-wrapper .image-box,.example-box-wrapper .jcrop-holder,.example-box-wrapper .jvectormap-container,.example-box-wrapper .list-group,.example-box-wrapper .loading-spinner,.example-box-wrapper .loading-stick,.example-box-wrapper .minicolors,.example-box-wrapper .nav,.example-box-wrapper .panel-layout,.example-box-wrapper .scrollable-content,.example-box-wrapper .tile-box,.example-box-wrapper .ui-accordion,.example-box-wrapper .ui-rangeSlider,.example-box-wrapper .ui-slider,.example-box-wrapper .ui-tabs,.example-box-wrapper>.btn,.example-box-wrapper>.btn-group,.example-box-wrapper>.btn-group-vertical,.example-box-wrapper>.btn-toolbar,.example-box-wrapper>.display-block.dropdown-menu,.example-box-wrapper>.dropdown,.example-box-wrapper>.dropup,.example-box-wrapper>.hasDatepicker,.example-box-wrapper>.img-humbnail,.example-box-wrapper>.minicolors,.example-box-wrapper>.pagination,.example-box-wrapper>.panel-layout,.example-box-wrapper>.progressbar,.example-box-wrapper>.thumbnail,.example-box-wrapper>form,.example-box-wrapper>h6,.example-box-wrapper>img{margin-bottom:20px}.demo-icon{font-size:22px;line-height:40px;width:40px;height:40px;margin:10px;text-align:center;color:#92A0B3;border:1px solid rgba(220,233,255,.54);border-radius:3px}.btn-block,.btn-group-justified,.btn-group-justified>.btn-group .btn,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.demo-icon:hover{color:#59606c;border-color:#92A0B3}.font-black{color:#464646!important}.font-blue{color:#1f6dca!important}.font-blue-alt{color:#65a6ff!important}.font-azure{color:#41e5c0!important}.font-gray,.text-muted{color:#c2c2c2!important}.font-gray-dark,.text-info{color:#828282!important}.font-green,.text-success{color:#2ecc71!important}.font-orange,.text-warning{color:#fa7753!important}.font-yellow{color:#fc0!important}.font-purple{color:#984dff!important}.font-red,.has-error .help-block,.parsley-required,.text-danger{color:#ff5757!important}.font-white{color:#fff!important}.alert-info,.alert-info a{color:#6c6c6c;border-color:#c9c9c9;background:#dfe8f1}.alert-notice,.alert-notice a{color:#0f2c62;border-color:#62baf6;background:#c6e8ff}.alert-success,.alert-success a,.parsley-success{color:#1e620f;border-color:#7cd362;background:#d3ffc6}.parsley-success{background:#fff}.alert-warning,.alert-warning a,.warning{color:#624b0f;border-color:#ebc875;background:#ffeec6}.alert-danger,.alert-danger a,.danger,.parsley-error{color:#620f0f;border-color:#db6a6a;background:#ffc6c6}.bg-facebook,.bg-google,.bg-twitter{color:#fff!important}.parsley-error{background:#fff}.bg-facebook{background:#3b5998}.btn.bg-facebook:hover{background:#304b85}.bg-twitter{background:#3a92c8}.btn.bg-twitter:hover{background:#2b80b4}.bg-google{background:#dd4b39}.btn.bg-google:hover{background:#c93b2a}.badge-info,.bg-blue,.bootstrap-switch-info,.btn-info,.checkbox-info div[id^=uniform-] span.checked,.hover-blue:hover,.hover-info:hover,.label-info,.progress-bar-info,.radio-info div[id^=uniform-] span.checked{color:#fff;border-color:#308dcc;background:#3498db}.btn-info.active,.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info:active,.btn-info:focus,.btn-info:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,.label-info[href]:focus,.label-info[href]:hover,.open .dropdown-toggle.btn-info{color:#fff;border-color:#308dcc;background:#52a7e0}.badge-danger,.bg-danger,.bg-red,.bootstrap-switch-danger,.btn-danger,.checkbox-danger div[id^=uniform-] span.checked,.hover-danger:hover,.hover-red:hover,.label-danger,.progress-bar-danger,.radio-danger div[id^=uniform-] span.checked{color:#fff;border-color:#cf4436;background:#e74c3c}.btn-danger.active,.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,.label-danger[href]:focus,.label-danger[href]:hover,.open .dropdown-toggle.btn-danger{color:#fff;border-color:#cf4436;background:#eb6759}.badge-gray,.bg-gray,.btn-gray,.hover-gray:hover,.label-gray{color:#666;background:#efefef}.btn-gray.active,.btn-gray.disabled,.btn-gray.disabled.active,.btn-gray.disabled:active,.btn-gray.disabled:focus,.btn-gray.disabled:hover,.btn-gray:active,.btn-gray:focus,.btn-gray:hover,.btn-gray[disabled],.btn-gray[disabled].active,.btn-gray[disabled]:active,.btn-gray[disabled]:focus,.btn-gray[disabled]:hover,.label-gray[href]:focus,.label-gray[href]:hover,.open .dropdown-toggle.btn-gray{color:#333;background:#e7e7e7}.badge-gray-alt,.bg-gray-alt,.btn-gray-alt,.hover-gray-alt:hover,.label-gray-alt{color:#888;background:#f6f6f6}.btn-gray-alt.active,.btn-gray-alt.disabled,.btn-gray-alt.disabled.active,.btn-gray-alt.disabled:active,.btn-gray-alt.disabled:focus,.btn-gray-alt.disabled:hover,.btn-gray-alt:active,.btn-gray-alt:focus,.btn-gray-alt:hover,.btn-gray-alt[disabled],.btn-gray-alt[disabled].active,.btn-gray-alt[disabled]:active,.btn-gray-alt[disabled]:focus,.btn-gray-alt[disabled]:hover,.label-gray-alt[href]:focus,.label-gray-alt[href]:hover,.open .dropdown-toggle.btn-gray-alt{color:#444;background:#ededed}.badge-black,.bg-black,.btn-black,.hover-black:hover,.label-black{color:#ccc;border-color:#000;background:#2d2d2d}.boxed-layout.bg-black{background:#2d2d2d}.btn-black.active,.btn-black.disabled,.btn-black.disabled.active,.btn-black.disabled:active,.btn-black.disabled:focus,.btn-black.disabled:hover,.btn-black:active,.btn-black:focus,.btn-black:hover,.btn-black[disabled],.btn-black[disabled].active,.btn-black[disabled]:active,.btn-black[disabled]:focus,.btn-black[disabled]:hover,.label-black[href]:focus,.label-black[href]:hover,.open .dropdown-toggle.btn-black{color:#fdfdfd;background:#151515}.badge-black-opacity,.bg-black-opacity,.btn-black-opacity,.hover-black-opacity:hover,.label-black-opacity{color:#a9b3bb;background:#2b323d}.btn-black-opacity.active,.btn-black-opacity.disabled,.btn-black-opacity.disabled.active,.btn-black-opacity.disabled:active,.btn-black-opacity.disabled:focus,.btn-black-opacity.disabled:hover,.btn-black-opacity:active,.btn-black-opacity:focus,.btn-black-opacity:hover,.btn-black-opacity[disabled],.btn-black-opacity[disabled].active,.btn-black-opacity[disabled]:active,.btn-black-opacity[disabled]:focus,.btn-black-opacity[disabled]:hover,.label-black-opacity[href]:focus,.label-black-opacity[href]:hover,.open .dropdown-toggle.btn-black-opacity{color:#fff;background:#14171c}.badge-black-opacity-alt,.bg-black-opacity-alt,.btn-black-opacity-alt,.hover-black-opacity-alt:hover,.label-black-opacity-alt{color:#fff;background:rgba(0,0,0,.2);border-color:transparent}.btn-black-opacity-alt.active,.btn-black-opacity-alt.disabled,.btn-black-opacity-alt.disabled.active,.btn-black-opacity-alt.disabled:active,.btn-black-opacity-alt.disabled:focus,.btn-black-opacity-alt.disabled:hover,.btn-black-opacity-alt:active,.btn-black-opacity-alt:focus,.btn-black-opacity-alt:hover,.btn-black-opacity-alt[disabled],.btn-black-opacity-alt[disabled].active,.btn-black-opacity-alt[disabled]:active,.btn-black-opacity-alt[disabled]:focus,.btn-black-opacity-alt[disabled]:hover,.label-black-opacity-alt[href]:focus,.label-black-opacity-alt[href]:hover,.open .dropdown-toggle.btn-black-opacity-alt{color:#fff;background:rgba(0,0,0,.3)}.badge-success,.bg-green,.bootstrap-switch-success,.btn-success,.checkbox-success div[id^=uniform-] span.checked,.hover-green:hover,.hover-success:hover,.label-success,.progress-bar-success,.radio-success div[id^=uniform-] span.checked{color:#fff;border-color:#29b765;background:#2ecc71}.btn-success.active,.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success:active,.btn-success:focus,.btn-success:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,.label-success[href]:focus,.label-success[href]:hover,.open .dropdown-toggle.btn-success{color:#fff;border-color:#29b765;background:#58d68d}.badge-warning,.bg-orange,.bg-warning,.bootstrap-switch-warning,.btn-warning,.checkbox-warning div[id^=uniform-] span.checked,.hover-orange:hover,.hover-warning:hover,.label-warning,.progress-bar-warning,.radio-warning div[id^=uniform-] span.checked{color:#fff;border-color:#d67520;background:#e67e22}.btn-warning.active,.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,.label-warning[href]:focus,.label-warning[href]:hover,.open .dropdown-toggle.btn-warning{color:#fff;border-color:#d67520;background:#ea9143}.bg-white,.label-white,.table{background:#fff}.bg-white-opacity{background:rgba(255,255,255,.85)}.hover-white:hover{background:#fafafa}.badge-yellow,.bg-yellow,.btn-yellow,.hover-yellow:hover,.label-yellow{color:#fff;background:#fc0;border-color:#deb200}.btn-yellow.active,.btn-yellow.disabled,.btn-yellow.disabled.active,.btn-yellow.disabled:active,.btn-yellow.disabled:focus,.btn-yellow.disabled:hover,.btn-yellow:active,.btn-yellow:focus,.btn-yellow:hover,.btn-yellow[disabled],.btn-yellow[disabled].active,.btn-yellow[disabled]:active,.btn-yellow[disabled]:focus,.btn-yellow[disabled]:hover,.label-yellow[href]:focus,.label-yellow[href]:hover,.open .dropdown-toggle.btn-yellow{color:#fff;background:#e1b400;border-color:#c59e00}.badge-purple,.bg-purple,.btn-purple,.hover-purple:hover,.label-purple{color:#fff;background:#984dff;border-color:#7a3ecc}.btn-purple.active,.btn-purple.disabled,.btn-purple.disabled.active,.btn-purple.disabled:active,.btn-purple.disabled:focus,.btn-purple.disabled:hover,.btn-purple:active,.btn-purple:focus,.btn-purple:hover,.btn-purple[disabled],.btn-purple[disabled].active,.btn-purple[disabled]:active,.btn-purple[disabled]:focus,.btn-purple[disabled]:hover,.label-purple[href]:focus,.label-purple[href]:hover,.open .dropdown-toggle.btn-purple{color:#fff;background:#8134eb;border-color:#752fd6}.badge-blue-alt,.bg-blue-alt,.btn-blue-alt,.hover-blue-alt:hover,.label-blue-alt{color:#fff;background:#65a6ff;border-color:#5388d1}.btn-blue-alt.active,.btn-blue-alt.disabled,.btn-blue-alt.disabled.active,.btn-blue-alt.disabled:active,.btn-blue-alt.disabled:focus,.btn-blue-alt.disabled:hover,.btn-blue-alt:active,.btn-blue-alt:focus,.btn-blue-alt:hover,.btn-blue-alt[disabled],.btn-blue-alt[disabled].active,.btn-blue-alt[disabled]:active,.btn-blue-alt[disabled]:focus,.btn-blue-alt[disabled]:hover,.label-blue-alt[href]:focus,.label-blue-alt[href]:hover,.open .dropdown-toggle.btn-blue-alt{color:#fff;background:#478ded;border-color:#4c7ec1}.badge-azure,.bg-azure,.btn-azure,.hover-azure:hover,.label-azure{color:#fff;background:#41e5c0;border-color:#3acead}.btn-azure.active,.btn-azure.disabled,.btn-azure.disabled.active,.btn-azure.disabled:active,.btn-azure.disabled:focus,.btn-azure.disabled:hover,.btn-azure:active,.btn-azure:focus,.btn-azure:hover,.btn-azure[disabled],.btn-azure[disabled].active,.btn-azure[disabled]:active,.btn-azure[disabled]:focus,.btn-azure[disabled]:hover,.label-azure[href]:focus,.label-azure[href]:hover,.open .dropdown-toggle.btn-azure{color:#fff;background:#27d1ab;border-color:#24c19e}.border-black{border-color:#212121!important}.border-blue{border-color:#5bccf6!important}.border-blue-alt{border-color:#65a6ff!important}.border-azure{border-color:#41e5c0!important}.border-gray{border-color:#c2c2c2!important}.border-gray-dark{border-color:#828282!important}.border-green{border-color:#2ecc71!important}.border-orange{border-color:#fa7753!important}.border-yellow{border-color:#fc0!important}.border-purple{border-color:#984dff!important}.border-red{border-color:#ff5757!important}.parsley-success{border-color:#77e038!important}.parsley-error{border-color:#e03838!important}.btn,.fc-button{font-size:14px;position:relative;display:inline-block;padding:0 12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;border-width:1px;border-style:solid;border-color:transparent;background-image:none;-o-user-select:none}.btn-alt,.content-box-header-alt{font-weight:700;text-transform:uppercase}.btn,.fc-button,.size-md{line-height:32px;height:34px;min-width:34px}.btn-abs{position:absolute;top:50%;right:0;margin-top:-17px}.btn.hover-round:hover{border-radius:100px}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-link{border-radius:0}.btn.active,.btn:active,.fc-state-active,.fc-state-down,.ui-datepicker .ui-datepicker-buttonpane button:active,.ui-datepicker .ui-datepicker-next:active,.ui-datepicker .ui-datepicker-prev:active,.ui-dialog .ui-dialog-titlebar-close:active,.ui-dialog-buttonset button:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],.disabled,.fc-state-disabled,fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;-webkit-box-shadow:none;box-shadow:none;filter:alpha(opacity=65)}.btn-link{cursor:pointer}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:focus,.btn-link:hover{text-decoration:underline;background-color:transparent}.btn-border:hover,.pager li>a:focus,.pager li>a:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg,.size-lg{line-height:44px;min-width:56px;height:46px}.btn-lg-abs{margin-top:-23px}.btn-group-lg>.btn,.btn-lg{font-size:18px;padding:0 16px}.btn-group-sm>.btn,.btn-sm,.size-sm{line-height:28px;height:30px}.btn-sm-abs{margin-top:-15px}.btn-group-sm>.btn,.btn-sm{font-size:13px;padding:0 10px}.btn-group-xs>.btn,.btn-xs,.size-xs{line-height:20px;min-width:22px;height:22px}.btn-xs-abs{margin-top:-11px}.btn-group-xs>.btn,.btn-xs{font-size:11px;padding:0 5px}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-block{display:block;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:10px}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-justified{display:table;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:3px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.pagination{display:inline-block;padding-left:0}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{line-height:1.42857143;position:relative;float:left;margin-left:-1px;padding:6px 12px;text-decoration:none;border-width:1px;border-style:solid}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0}.pagination-lg>li>a,.pagination-lg>li>span{font-size:18px;padding:10px 16px}.pagination-sm>li>a,.pagination-sm>li>span{font-size:12px;padding:5px 10px}.pager{margin-top:0;padding-left:0;list-style:none;text-align:center}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;border:1px solid #ddd;border-radius:15px;background-color:#fff}.btn>.icon-separator,.icon-separator.float-right{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span,.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{cursor:not-allowed;color:#999;background-color:#fff}.btn>.icon-separator{position:absolute;top:0;left:0;width:32px;height:100%;border-top-right-radius:0!important}.icon-separator+.button-content{margin-left:32px}.btn-xs .icon-separator{width:22px}.btn-xs .icon-separator+.button-content{margin-left:22px}.btn-sm .icon-separator{width:25px}.btn-sm .icon-separator+.button-content{margin-left:25px}.btn-lg .icon-separator{width:44px}.btn-lg .icon-separator+.button-content{margin-left:44px}.icon-separator.float-right{border-top-left-radius:0!important}.vertical-button{line-height:1.6em;height:auto;padding:10px 0 5px}.vertical-button .button-content{opacity:.7;filter:alpha(opacity=70)}.icon-separator-vertical{font-size:25px;display:block;margin:5px auto}.dashboard-buttons .btn{width:93px;margin:5px 3px}.btn-outline,.btn-outline-inverse{display:inline-block;text-align:center;color:#fff;box-sizing:initial;border-width:2px;border-style:solid;text-transform:uppercase}.btn-outline-inverse{border-color:rgba(255,255,255,.47)}.btn-outline-inverse:hover{background:rgba(255,255,255,.2);border-color:#fff}.btn-outline-inverse.hero-btn{color:#fff}.btn-outline{color:rgba(0,0,0,.8);border-color:rgba(0,0,0,.6)}.btn-outline:hover{color:#fff;border-color:rgba(0,0,0,.8);background:rgba(0,0,0,.8)}.btn.btn-round{border-radius:150px;padding:0}.btn-round.btn-lg{width:46px;min-width:46px}.btn-round.btn-xlg{width:66px;min-width:66px;height:66px;line-height:66px}.btn-round.btn-xlg .glyph-icon{font-size:24px}.btn-round.btn-md{width:34px}.btn-round.btn-sm{width:30px}.btn-round.btn-xs{width:22px}.btn-alt{font-size:12px}.btn-hover span{padding:0 20px;left:0;position:relative;transition:opacity .2s ease-out,left .2s ease-out;-webkit-transition:opacity .2s ease-out,left .2s ease-out}.btn-hover .glyph-icon{opacity:0;-ms-filter:"alpha(opacity=0)";position:absolute;right:20px;transition:all .2s ease-out;-webkit-transition:all .2s ease-out}.btn-hover:hover .glyph-icon{opacity:1;right:15px;-ms-filter:"alpha(opacity=100)"}.btn-hover:hover span{left:-15px}.btn-border{border-width:2px;border-style:solid}.btn-border span{opacity:.75;filter:alpha(opacity=75)}.btn-border:hover span{opacity:1;filter:alpha(opacity=100)}.btn-group-justified>.btn,.btn-group-justified>.btn-group{width:auto}.demo-margin .btn{margin-bottom:10px}.content-box{background:#fff;margin-bottom:20px}.content-box,.content-box-header{position:relative;border-width:1px;border-style:solid}.content-box-header{font-size:14px;text-transform:uppercase;margin:-1px -1px 0;padding:15px;border-color:transparent}.content-box-header small+.font-size-11.float-right{position:absolute;top:14px;right:10px}.content-box-header-alt{padding:15px 10px 14px;font-size:12px}.content-box-header-alt small{font-size:13px;font-weight:400;display:block;padding:5px 0 0;text-transform:none;opacity:.7;filter:alpha(opacity: 70)}.content-box .ui-widget-overlay{position:absolute}.content-box .ui-widget-overlay img{position:absolute;top:50%;left:50%;margin:-27px 0 0 -27px}.content-box .content-box-wrapper{line-height:1.6em;padding:15px}.content-box .content-box-wrapper .scrollable-content,.content-box .content-box-wrapper p:last-child{margin-bottom:0}.content-box .content-box-header>.glyph-icon{margin-right:5px;opacity:.7;filter:alpha(opacity: 70)}.content-box-header-alt .icon-separator .glyph-icon,.content-box-header-alt>.glyph-icon{font-size:22px;line-height:30px;position:absolute;top:50%;left:15px;width:30px;height:30px;margin-top:-15px}.content-box-header>.icon-separator{position:relative;top:1px;left:-15px;padding:18px 15px 16px;text-align:center}.content-box-header>.icon-separator .glyph-icon{margin-left:3px}.content-box-header-alt>.header-wrapper{overflow:hidden;display:block;margin-left:40px}.content-box-header-alt>.icon-separator+.header-wrapper{margin-left:65px}.content-box-header-alt>.icon-separator{position:absolute;top:0;left:0;width:60px;height:100%}.content-box-header-alt>.icon-separator .glyph-icon{left:50%;margin-left:-15px}.header-buttons{position:absolute;top:0;right:10px;height:100%;display:block}.header-buttons .btn-xs{top:13px}.header-buttons .btn-sm{top:10px}.header-buttons .btn-sm:last-child{margin-right:0}.header-buttons>.btn-group:last-child{margin-right:-2px}.content-box-header-alt .header-buttons .btn-xs{top:24px}.content-box-header-alt .header-buttons .btn-sm{top:20px}.content-box-header-alt .header-buttons .btn-sm:last-child{margin-right:5px}.header-buttons-separator{position:absolute;top:0;right:0;height:100%}.header-buttons-separator .icon-separator{top:0;left:0;display:block;float:left;min-width:20px;height:100%;padding:0 10px}.header-buttons-separator .icon-separator .glyph-icon{line-height:30px;position:relative;top:50%;display:block;min-width:30px;height:30px;margin:-15px 0 0;text-align:center}.header-buttons>.btn-group{margin-top:8px}.header-buttons .btn-group-xs{margin-top:14px}.header-buttons .btn-group-xs:last-child{margin-right:0}.ui-dialog-buttonpane,body .button-pane{padding:10px;text-align:center;border-width:1px 0 0;border-style:solid;border-top-left-radius:0;border-top-right-radius:0}body .button-pane-top{border-width:0 0 1px;border-radius:0}.scrollable-content{overflow-y:scroll;overflow-x:hidden;height:300px;padding-right:0}.scrollable-xs{overflow-y:scroll;height:200px}.scrollable-sm{overflow-y:scroll;height:400px}.scrollable-lg{overflow-y:scroll;height:500px}.toggle-button .glyph-icon{-webkit-transition-duration:.5s;-moz-transition-duration:.5s;-o-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform}.hidden-button .content-box-header .btn,.hidden-button .content-box-header a,.hidden-button .content-box-header button{display:none}.content-box.border-top .content-box-header{font-size:18px;margin:0}.content-box.border-top .content-box-header small{opacity:.8;-moz-opacity:.8;filter:alpha(opacity: 80)}.content-box.border-top .content-box-header+.content-box-wrapper{padding-top:0}.box-xs{width:200px}.box-sm{width:324px}.box-md{width:400px}.box-lg{width:500px}.content-box-header>.ui-tabs-nav{position:absolute;top:2px;right:0;padding:0;list-style:none;border:0}.content-box-header>.ui-tabs-nav li>a{line-height:49px;height:49px;margin:0 2px;color:rgba(255,255,255,.7);border:0;background:0 0}.content-box-header>.ui-tabs-nav li>a:hover{color:#fff;background:rgba(255,255,255,.2)}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>a{color:inherit}.content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active>a,.content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active>a,.content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active>a{line-height:46px;height:46px;background:#F6F6F9}.content-box-header.bg-default>.ui-tabs-nav li>a,.content-box-header.bg-gray>.ui-tabs-nav li>a,.content-box-header.bg-white>.ui-tabs-nav li>a{line-height:50px;height:50px;margin:0;border-radius:0}.content-box-header.bg-default>.ui-tabs-nav,.content-box-header.bg-gray>.ui-tabs-nav,.content-box-header.bg-white>.ui-tabs-nav{top:0}.content-box-header>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header>.ui-tabs-nav li.ui-tabs-active>a{line-height:47px;height:49px;background:#fff}.panel{margin-bottom:20px;border-width:1px;border-style:solid;border-radius:4px;background-color:#fff;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group{margin-bottom:0}.panel-body{padding:15px 20px;position:relative}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent}.panel-title{font-size:16px;margin-top:0}.panel-footer{padding:10px 15px;border-top:1px solid transparent}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel-group{margin-bottom:20px}.panel-group .panel{overflow:hidden;margin-bottom:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid transparent}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid transparent}fieldset,legend{padding:0;border:0}fieldset{margin:0}legend{font-size:21px;line-height:inherit;display:block;width:100%;margin-bottom:20px;color:#333;border-bottom:1px solid #dfe8f1}label{font-weight:700;display:inline-block}.checkbox,.radio,input[type=file],output{display:block}input[type=checkbox],input[type=radio]{line-height:normal}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:#333 dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}output{font-size:14px;line-height:1.428571429;padding-top:7px;vertical-align:middle;color:#555}.bootstrap-timepicker-widget table td input,.chosen-container-multi,.chosen-container-single .chosen-search input,.dataTables_length select,.form-control,.input,.ui-toolbar input,.ui-toolbar select,div.dataTables_filter input{font-size:13px;display:block;float:none;background:#fff;width:100%;height:34px;padding:6px 12px;color:#2b2f33;border:1px solid #dfe8f1;-webkit-box-shadow:inset 1px 1px 3px #f6f6f6;-moz-box-shadow:inset 1px 1px 3px #f6f6f6;box-shadow:inset 1px 1px 3px #f6f6f6}.chosen-container-multi.chosen-with-drop.chosen-container-active{border:1px solid #ddd;border-bottom-right-radius:0;border-bottom-left-radius:0;box-shadow:0 0 0 transparent}.bootstrap-timepicker-widget table td input:focus,.chosen-container-active,.chosen-container-multi.chosen-container-active,.form-control:focus,.input:focus,.selector.focus,.ui-toolbar input:focus,.ui-toolbar select:focus,div.dataTables_filter input:focus{color:#333;border-color:#3da6ff}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.form-group label{margin-bottom:5px}.form-group .switch-toggle{margin-top:6px}.checkbox,.radio{min-height:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.checkbox label,.radio label{font-weight:400;display:inline;margin-bottom:0;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{float:left}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{font-weight:400;line-height:19px;display:inline-block;height:19px;margin-bottom:0;cursor:pointer;vertical-align:middle}.checkbox-inline label,.radio-inline label{font-weight:400;line-height:17px}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline[disabled],.checkbox[disabled],.radio-inline[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.input-sm{font-size:12px;line-height:1.5;height:30px;padding:5px 10px;border-radius:3px}select.input-sm{line-height:30px;height:30px}textarea.input-sm{height:auto}.input-lg{font-size:18px;line-height:1.33;height:45px;padding:10px 16px;border-radius:6px}select.input-lg{line-height:45px;height:45px}textarea.input-lg{height:auto}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:0;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}.form-horizontal .control-label{text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal>.form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:after,.form-horizontal .form-group:before{display:table;content:' '}.form-horizontal .form-control-static{padding-top:7px}.input-group{position:relative;display:table;width:100%;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{font-size:18px;line-height:1.33;height:45px;padding:10px 16px;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{line-height:45px;height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{font-size:12px;line-height:1.5;height:30px;padding:5px 10px;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{line-height:30px;height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon div[id^=uniform-]{margin:0 -3px}.input-group-addon,.input-group-btn{width:1%;vertical-align:middle;white-space:nowrap}.input-group-addon{font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center;color:#2b2f33;background-color:rgba(239,244,246,.36);border:1px solid #dfe8f1;border-radius:4px}body,label{color:#3e4855}.input-group-addon .glyph-icon{display:block;min-width:20px;margin:0 -4px;text-align:center}.input-group-addon.addon-inside{line-height:24px;position:absolute;top:5px;left:6px;display:block;width:32px;height:24px;padding:0;border-width:1px;border-style:solid}.input-group-btn,.input-group-btn>.btn,.ui-spinner{position:relative}.input-group-lg .input-group-addon.addon-inside{top:10px;left:10px;z-index:999}.input-group-addon.addon-inside .glyph-icon{margin:0}.input-group-addon.addon-inside+input{padding-left:48px}.input-group-addon.input-sm{font-size:12px;padding:5px 10px;border-radius:3px}.input-group-addon.input-lg{font-size:18px;padding:10px 16px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group-addon.addon-inside:first-child{border-right-width:1px;border-right-style:solid;border-color:transparent;z-index:999}.input-group-addon+.form-control,.input-group-addon:last-child,.input-group-btn+.form-control,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:active,.input-group-btn>.btn:hover{z-index:2}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}textarea.textarea-autoresize,textarea.textarea-no-resize{resize:none}.textarea-autosize{transition:height .3s;-webkit-transition:height .3s;-moz-transition:height .3s}textarea.form-control{line-height:1.6em;padding:8px 12px}textarea.textarea-xs{height:50px}textarea.textarea-sm{height:125px}textarea.textarea-md{height:200px}textarea.textarea-lg{height:275px}.ui-spinner{display:block}.xchart .color0.comp .fill,.xchart .color1.comp .fill{display:none}.ui-spinner .ui-spinner-button{font-size:9px;line-height:17px;position:absolute;right:0;width:17px;height:17px;cursor:pointer;text-align:center;border-width:1px;border-style:solid}.ui-spinner .ui-spinner-up{top:0}.ui-spinner .ui-spinner-down{bottom:0}.parsley-errors-list li{font-size:12px;padding-top:5px}.bordered-row>.form-group{padding:20px 0;margin-bottom:0;border-top-width:1px;border-top-style:dashed}.bordered-row>.form-group:last-child{padding-bottom:0}.form-group .ui-slider{margin-top:14px}.form-group .ui-slider+.input-group{margin-top:20px}body{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;background-color:#fff;line-height:1.42857143}#page-title>h2,#page-title>p,h1,h2,h3,h4,h5,h6{font-family:Raleway,"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}#page-header .user-account-btn>a.user-profile .glyph-icon,.logo-bg{background-color:rgba(255,255,255,.1);color:#fff}#page-header .user-account-btn>a.user-profile{color:#fff}#header-nav-right .dropdown>a .glyph-icon,#header-nav-right .header-btn .glyph-icon{color:rgba(255,255,255,.8)}#header-nav-right .dropdown>a:hover .glyph-icon,#header-nav-right .header-btn:hover .glyph-icon{color:rgba(255,255,255,.95)}#header-nav-right .dropdown>a,#header-nav-right .header-btn{border-color:rgba(255,255,255,.2)}#header-nav-right .dropdown>a:hover,#header-nav-right .header-btn:hover{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.25)}#page-content{background:#fafcfe}#page-sidebar ul li.header{color:#000}#page-sidebar ul li a .glyph-icon{color:#0093d9}#page-sidebar ul li a:hover,#page-sidebar ul li.sfHover>a.sf-with-ul{border-color:#d1d9dd}#sidebar-menu li .sidebar-submenu{border-color:#f6f7f8}#sidebar-menu li .sidebar-submenu ul li{border-color:#f8f9fa}#sidebar-menu li .sidebar-submenu ul li a.sfActive,#sidebar-menu li .sidebar-submenu ul li a:hover{background:#fcfdfe}#sidebar-menu li .sidebar-submenu ul li a.sfActive{color:#1c82e1}#page-sidebar.font-inverse ul li.header{color:rgba(255,255,255,.95)}#page-sidebar.font-inverse ul li.divider{background:rgba(255,255,255,.1)}#page-sidebar.font-inverse #sidebar-menu>li>a{color:rgba(255,255,255,.62)}#page-sidebar.font-inverse #sidebar-menu li a:hover,#page-sidebar.font-inverse #sidebar-menu li.sfHover>a.sf-with-ul{border-color:rgba(255,255,255,.26);color:rgba(255,255,255,.96)}#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu{border-color:rgba(255,255,255,.08);background:rgba(255,255,255,.05)}#page-sidebar.font-inverse #sidebar-menu li a{color:rgba(255,255,255,.62)}#page-sidebar.font-inverse #sidebar-menu li a:hover{color:rgba(255,255,255,.96)}#page-sidebar.font-inverse#page-sidebar ul li a .glyph-icon{color:rgba(255,255,255,.8)}#page-sidebar.font-inverse#page-sidebar ul li a:hover .glyph-icon{color:rgba(255,255,255,1);opacity:.9;-moz-opacity:.9;filter:alpha(opacity: 90)}#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li{border-color:rgba(255,255,255,.07)}#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li a:hover{background:rgba(255,255,255,.05)}.btn-link,.chosen-disabled .chosen-single,.content-box-header.bg-default>.ui-tabs-nav li>a,.content-box-header.bg-gray>.ui-tabs-nav li>a,.content-box-header.bg-white>.ui-tabs-nav li>a,.content-box-header>.ui-tabs-nav li.ui-tabs-active>a,.pagination>li>a,.pagination>li>span,.table,a,body .content-box-header>.ui-tabs-nav li.ui-tabs-active>a:hover,div.selector{color:#8da0aa}#page-sidebar ul li.sfHover>a.sf-with-ul,.btn-link:hover,.content-box-header.bg-default>.ui-tabs-nav li>a:hover,.content-box-header.bg-gray>.ui-tabs-nav li>a:hover,.content-box-header.bg-white>.ui-tabs-nav li>a:hover,.features-tour-box h3,.font-primary,.tabs-nav li a:hover,.tabs-nav li.active a,a:hover,table.dataTable thead th.sorting_asc:after,table.dataTable thead th.sorting_desc:after{color:#1c82e1}.border-primary,.btn-primary,.nav>li.active>a,.nav>li.active>a:focus,.nav>li.active>a:hover,.ui-accordion .ui-accordion-header.ui-accordion-header-active,.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev,.ui-dialog-buttonset button,.ui-spinner .ui-spinner-button:hover,a.list-group-item.active,a.list-group-item.active:focus,a.list-group-item.active:hover,a.thumbnail:hover,div[id^=uniform-] span.checked,li.active a.list-group-item,li.active a.list-group-item:focus,li.active a.list-group-item:hover{border-color:#00a792}a:focus{outline:0!important}#loadingbar,#nav-toggle span:after,#nav-toggle span:before,#nav-toggle.collapsed span,.badge-primary,.bg-primary,.bootstrap-switch-primary,.btn-primary,.chosen-container .chosen-results li.active-result.highlighted,.daterangepicker .ranges li.active,.daterangepicker .ranges li.active:hover,.fc-event,.form-wizard>ul>li.active .wizard-step,.irs-line-left,.irs-line-mid,.irs-line-right,.label-primary,.ms-hover.ui-state-focus,.ms-list .ms-hover,.nav>li.active>a,.nav>li.active>a:focus,.nav>li.active>a:hover,.owl-controls .owl-page span,.ui-accordion-header.ui-accordion-header-active,.ui-datepicker .ui-datepicker-current-day a,.ui-datepicker .ui-datepicker-current-day span,.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev,.ui-dialog-buttonset button,.ui-menu li>a:hover,.ui-rangeSlider-bar,.ui-slider-handle,.ui-spinner .ui-spinner-button:hover,.ui-tabs-nav li.ui-state-active.ui-state-hover>a,.ui-tabs-nav li.ui-state-active>a,a.list-group-item.active,a.list-group-item.active:focus,a.list-group-item.active:hover,div.switch-toggle.switch-on,div[id^=uniform-] span.checked,li.active a.list-group-item,li.active a.list-group-item:focus,li.active a.list-group-item:hover{color:#fff;background:#00bca4}.font-secondary,.inverse.carousel-wrapper .owl-controls .owl-buttons .owl-next,.inverse.carousel-wrapper .owl-controls .owl-buttons .owl-prev,.post-box .post-title{color:#00bca4}.post-box .post-title:hover{color:#3e4855}.bg-default,.bg-white.dashboard-box .button-pane,.bg-white.tile-box .tile-footer,.border-default,.bordered-row .form-group,.btn-default,.button-pane,.chosen-container,.chosen-container .chosen-drop,.chosen-container-active.chosen-with-drop .chosen-single div,.chosen-container-multi .chosen-choices li.search-choice,.chosen-container-single .chosen-single div,.content-box,.content-box-header.bg-default,.content-box-header.bg-gray,.content-box-header.bg-white,.dashboard-buttons .btn,.daterangepicker .calendar-date,.dropdown-menu,.email-body,.fc-state-default,.fc-widget-content,.fc-widget-header,.img-thumbnail,.jvectormap-label,.jvectormap-zoomin,.jvectormap-zoomout,.list-group-item,.mail-toolbar,.mailbox-wrapper .nav-list li a,.minicolors-panel,.ms-container .ms-list,.ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection,.nav .open>a,.nav .open>a:focus,.nav .open>a:hover,.nav-tabs,.nav-tabs>li>a:focus,.nav-tabs>li>a:hover,.pagination>li>a,.pagination>li>span,.panel,.panel-box.bg-default,.panel-box.bg-gray,.panel-box.bg-white,.panel-content.bg-default,.panel-content.bg-gray,.panel-content.bg-white,.panel-footer,.panel-group .panel-footer+.panel-collapse .panel-body,.panel-group .panel-heading+.panel-collapse .panel-body,.panel-heading,.popover,.popover-title,.posts-list li,.selector i,.table-bordered,.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th,.tabs-navigation>ul,.tabs-navigation>ul li.ui-state-hover>a,.tabs-navigation>ul li>a,.thumb-pane,.thumbnail,.timeline-box .tl-item .popover,.timeline-box:before,.ui-accordion .ui-accordion-header,.ui-datepicker,.ui-datepicker .ui-datepicker-buttonpane button,.ui-datepicker-buttonpane,.ui-dialog,.ui-dialog .ui-dialog-titlebar,.ui-dialog-buttonpane,.ui-menu,.ui-spinner .ui-spinner-button,.ui-tabs-nav,div.selector,div[id^=uniform-] span{border-color:#dfe8f1}.divider,.nav-divider,.timeline-horizontal.timeline-box:before{background:#dfe8f1}.content-box.border-top{border-right-color:#dfe8f1!important;border-bottom-color:#dfe8f1!important;border-left-color:#dfe8f1!important}.bg-default,.bg-white.dashboard-box .button-pane,.bg-white.tile-box .tile-footer,.bootstrap-switch-default,.btn-default,.button-pane,.jvectormap-label,.jvectormap-zoomin,.jvectormap-zoomout,.label-default,.mail-toolbar,.panel-footer,.panel-heading,.popover-title,.ui-accordion-header,.ui-datepicker td a,.ui-datepicker td span,.ui-dialog .ui-dialog-titlebar,.ui-spinner .ui-spinner-button,div[id^=uniform-] span{color:#555a60;background-color:#FEFEFF}.irs-diapason,.ui-datepicker-buttonpane,.ui-dialog-buttonpane,.ui-rangeSlider-container,.ui-slider-range{background-color:#FEFEFF}.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>th{color:#4b5056;background-color:#f9fafe}.btn-default.active,.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default:active,.btn-default:focus,.btn-default:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover,.jvectormap-zoomin:hover,.jvectormap-zoomout:hover,.open .dropdown-toggle.btn-default,.open.dropdown-submenu a,.ui-accordion-header.ui-state-hover,.ui-datepicker .ui-datepicker-buttonpane button:hover,.ui-tabs-nav>li.ui-state-hover>a{color:#2b2f33;border-color:#bfc8d1;background-color:#f3f3f9}.btn-default.active .glyph-icon{color:#2b2f33!important}.bsdatepicker td span:hover,.bsdatepicker td.active,.bsdatepicker td.day.active:hover,.bsdatepicker th.next:hover,.bsdatepicker th.prev:hover,.btn-primary.active,.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,.daterangepicker .calendar th.next:hover,.daterangepicker .calendar th.prev:hover,.daterangepicker td.active,.daterangepicker td.available.active:hover,.hover-primary:hover,.label-primary[href]:focus,.label-primary[href]:hover,.open .dropdown-toggle.btn-primary,.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover,.ui-accordion-header.ui-accordion-header-active.ui-state-hover,.ui-datepicker .ui-datepicker-next.ui-state-hover,.ui-datepicker .ui-datepicker-prev.ui-state-hover,.ui-datepicker td a:hover,.ui-dialog-buttonset button:hover,.ui-rangeSlider-bar:active,.ui-rangeSlider-bar:hover,.ui-slider-handle.ui-state-active,.ui-slider-handle.ui-state-hover{color:#fff;border-color:#00b19b;background-color:#00ceb4}.bsdatepicker td span,.bsdatepicker td.day:hover,.bsdatepicker thead tr:first-child th.switch:hover,.chosen-container-multi .chosen-choices li.search-choice,.chosen-container-single .chosen-single div,.daterangepicker .ranges li:hover,.daterangepicker td.available:hover,.nav>li>a:focus,.nav>li>a:hover,.pager li>a:focus,.pager li>a:hover,.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover,.selector i,.ui-datepicker-title,a.list-group-item:focus,a.list-group-item:hover{color:#2b2f33;background:#eff4f6}.pager li>a:focus,.pager li>a:hover,.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#2b2f33;background-color:#f3f3f9}.dropdown-menu .active>a,.dropdown-menu .active>a:focus,.dropdown-menu .active>a:hover,.dropdown-menu li>a:hover{color:#2b2f33;background:#eff4f6}.active>.badge,.active>.bs-badge,.active>.bs-label{color:#666!important;background:#fff!important}.active>.glyph-icon,a.list-group-item.active>.glyph-icon,li.active a.list-group-item>.glyph-icon{color:#fff!important}.icon-separator{border-right:rgba(255,255,255,.21) solid 1px;background:rgba(255,255,255,.2)}.content-box-header.bg-default .icon-separator,.content-box-header.bg-gray .icon-separator,.content-box-header.bg-white .icon-separator,.tile-box.bg-default .tile-header,.tile-box.bg-gray .tile-header,.tile-box.bg-white .tile-header,.tile-box.btn-default .tile-header{border-right:#dfe8f1 solid 1px;background:rgba(255,255,255,.1)}.content-box-header .header-buttons-separator .icon-separator{border-right:0;border-left:rgba(255,255,255,.21) solid 1px}.header-buttons-separator .icon-separator{color:rgba(255,255,255,.8)}.header-buttons-separator .icon-separator:hover{color:#fff;background:rgba(255,255,255,.3)}.content-box-header.bg-default .header-buttons-separator .icon-separator,.content-box-header.bg-gray .header-buttons-separator .icon-separator,.content-box-header.bg-white .header-buttons-separator .icon-separator{border-right:0;border-left:#dfe8f1 solid 1px;color:rgba(0,0,0,.6)}.content-box-header.bg-default .header-buttons-separator .icon-separator:hover,.content-box-header.bg-gray .header-buttons-separator .icon-separator:hover,.content-box-header.bg-white .header-buttons-separator .icon-separator:hover{color:rgba(0,0,0,.9)}.dashboard-panel .button-pane{background:rgba(0,0,0,.1)!important}.xchart .color0 rect{fill:#00bca4}.xchart .color0 circle{fill:#fff}.xchart .color0 .fill{fill:rgba(0,188,164,.06)}.xchart .color0.comp .pointer,.xchart .color0.comp circle,.xchart .color0.comp rect{fill:#00bca4}.xchart .color1 .line,.xchart .color1 circle,.xchart .color1.comp .line{stroke:#52a7e0}.xchart .color1 rect{fill:#52a7e0}.xchart .color1 circle{fill:#fff}.xchart .color1 .fill{fill:rgba(82,167,224,.06)}.xchart .color1.comp .pointer,.xchart .color1.comp circle,.xchart .color1.comp rect{fill:#52a7e0}body .popover.top .arrow:after{border-top-color:#fff}body .popover.right .arrow:after{border-right-color:#fff}body .popover.bottom .arrow:after{border-bottom-color:#fff}body .popover.left .arrow:after{border-left-color:#fff} +pre, pre code { + white-space: pre-wrap +} + +.clear, .form-row:after, .row:after { + clear: both +} + +.btn-group-vertical>.btn:focus, .btn-group>.btn:focus, :active, :focus, :visited, a, a:active, a:focus, a:visited { + outline: 0 +} + +.xchart .color0 .line, .xchart .color0 circle, .xchart .color0.comp .line { + stroke: #00bca4 +} + +.xchart .color0 .line .fill, .xchart .color1 .line .fill { + pointer-events: none +} + +article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { + display: block +} + +audio, canvas, video { + display: inline-block +} + +audio:not([controls]) { + display: none; + height: 0 +} + +[hidden] { + display: none +} + +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100% +} + +body, button, figure { + margin: 0 +} + +abbr[title] { + border-bottom: 1px dotted +} + +b, strong { + font-weight: 700 +} + +dfn { + font-style: italic +} + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0 +} + +mark { + color: #000; + background: #ff0 +} + +code, kbd, pre, samp { + font-size: 1em +} + +q { + quotes: '\201C''\201D''\2018''\2019' +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline +} + +sup { + top: -.5em +} + +sub { + bottom: -.25em +} + +img { + border: 0 +} + +svg:not(:root) { + overflow: hidden +} + +button, input, select, textarea { + font-family: inherit; + font-size: 100% +} + +button, input { + line-height: normal +} + +button, select { + text-transform: none +} + +button, html input[type=button], input[type=reset], input[type=submit] { + cursor: pointer; + -webkit-appearance: button +} + +input[type=checkbox], input[type=radio] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0 +} + +input[type=search] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield +} + +input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration { + -webkit-appearance: none +} + +button::-moz-focus-inner, input::-moz-focus-inner { + padding: 0; + border: 0 +} + +textarea { + overflow: auto; + vertical-align: top +} + +.collapsing, .divider, .overflow-hidden, .sr-only { + overflow: hidden +} + +table { + border-spacing: 0; + border-collapse: collapse +} + +@media print { + blockquote, img, pre, tr { + page-break-inside: avoid + } + + * { + color: #000 !important; + background: 0 0 !important; + box-shadow: none !important; + text-shadow: none !important + } + + a, a:visited { + text-decoration: underline + } + + a[href]:after { + content: ' ('attr(href)')' + } + + abbr[title]:after { + content: ' ('attr(title)')' + } + + .ir a:after, a[href^='javascript:']:after, a[href^='#']:after { + content: '' + } + + blockquote, pre { + border: 1px solid #999 + } + + thead { + display: table-header-group + } + + img { + max-width: 100% !important + } + + @page { + margin: 2cm .5cm + } + + h2, h3, p { + orphans: 3; + widows: 3 + } + + h2, h3 { + page-break-after: avoid + } + + .jGrowl { + display: none + } +} + +small { + font-size: 85% +} + +a { + text-decoration: none +} + +html { + font-size: 62.5%; + -webkit-tap-highlight-color: transparent +} + +*, :after, :before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.jqstooltip { + box-sizing: content-box +} + +.form-row, .row { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-right: -10px; + margin-left: -10px +} + +.form-row:after, .form-row:before, .row:after, .row:before { + display: table; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + content: ' ' +} + +blockquote small, pre { + line-height: 1.428571429; + display: block +} + +[class*=col-] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { + position: relative; + min-height: 1px; + padding-right: 10px; + padding-left: 10px +} + +.col-xs-1, .col-xs-10, .col-xs-11, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { + float: left +} + +.col-xs-1 { + width: 8.333333333333332% +} + +.col-xs-2 { + width: 16.666666666666664% +} + +.col-xs-3 { + width: 25% +} + +.col-xs-4 { + width: 33.33333333333333% +} + +.col-xs-5 { + width: 41.66666666666667% +} + +.col-xs-6 { + width: 50% +} + +.col-xs-7 { + width: 58.333333333333336% +} + +.col-xs-8 { + width: 66.66666666666666% +} + +.col-xs-9 { + width: 75% +} + +.col-xs-10 { + width: 83.33333333333334% +} + +.col-xs-11 { + width: 91.66666666666666% +} + +.col-xs-12 { + width: 100% +} + +@media (min-width:768px) { + .boxed-layout #page-header, .boxed-layout #page-wrapper, .container { + max-width: 750px + } + + .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9 { + float: left + } + + .col-sm-1 { + width: 8.333333333333332% + } + + .col-sm-2 { + width: 16.666666666666664% + } + + .col-sm-3 { + width: 25% + } + + .col-sm-4 { + width: 33.33333333333333% + } + + .col-sm-5 { + width: 41.66666666666667% + } + + .col-sm-6 { + width: 50% + } + + .col-sm-7 { + width: 58.333333333333336% + } + + .col-sm-8 { + width: 66.66666666666666% + } + + .col-sm-9 { + width: 75% + } + + .col-sm-10 { + width: 83.33333333333334% + } + + .col-sm-11 { + width: 91.66666666666666% + } + + .col-sm-12 { + width: 100% + } + + .col-sm-push-1 { + left: 8.333333333333332% + } + + .col-sm-push-2 { + left: 16.666666666666664% + } + + .col-sm-push-3 { + left: 25% + } + + .col-sm-push-4 { + left: 33.33333333333333% + } + + .col-sm-push-5 { + left: 41.66666666666667% + } + + .col-sm-push-6 { + left: 50% + } + + .col-sm-push-7 { + left: 58.333333333333336% + } + + .col-sm-push-8 { + left: 66.66666666666666% + } + + .col-sm-push-9 { + left: 75% + } + + .col-sm-push-10 { + left: 83.33333333333334% + } + + .col-sm-push-11 { + left: 91.66666666666666% + } + + .col-sm-pull-1 { + right: 8.333333333333332% + } + + .col-sm-pull-2 { + right: 16.666666666666664% + } + + .col-sm-pull-3 { + right: 25% + } + + .col-sm-pull-4 { + right: 33.33333333333333% + } + + .col-sm-pull-5 { + right: 41.66666666666667% + } + + .col-sm-pull-6 { + right: 50% + } + + .col-sm-pull-7 { + right: 58.333333333333336% + } + + .col-sm-pull-8 { + right: 66.66666666666666% + } + + .col-sm-pull-9 { + right: 75% + } + + .col-sm-pull-10 { + right: 83.33333333333334% + } + + .col-sm-pull-11 { + right: 91.66666666666666% + } + + .col-sm-offset-1 { + margin-left: 8.333333333333332% + } + + .col-sm-offset-2 { + margin-left: 16.666666666666664% + } + + .col-sm-offset-3 { + margin-left: 25% + } + + .col-sm-offset-4 { + margin-left: 33.33333333333333% + } + + .col-sm-offset-5 { + margin-left: 41.66666666666667% + } + + .col-sm-offset-6 { + margin-left: 50% + } + + .col-sm-offset-7 { + margin-left: 58.333333333333336% + } + + .col-sm-offset-8 { + margin-left: 66.66666666666666% + } + + .col-sm-offset-9 { + margin-left: 75% + } + + .col-sm-offset-10 { + margin-left: 83.33333333333334% + } + + .col-sm-offset-11 { + margin-left: 91.66666666666666% + } +} + +@media (min-width:992px) { + .boxed-layout #page-header, .boxed-layout #page-wrapper, .container { + max-width: 970px + } + + .col-md-1, .col-md-10, .col-md-11, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9 { + float: left + } + + .col-md-1 { + width: 8.333333333333332% + } + + .col-md-2 { + width: 16.666666666666664% + } + + .col-md-3 { + width: 25% + } + + .col-md-4 { + width: 33.33333333333333% + } + + .col-md-5 { + width: 41.66666666666667% + } + + .col-md-6 { + width: 50% + } + + .col-md-7 { + width: 58.333333333333336% + } + + .col-md-8 { + width: 66.66666666666666% + } + + .col-md-9 { + width: 75% + } + + .col-md-10 { + width: 83.33333333333334% + } + + .col-md-11 { + width: 91.66666666666666% + } + + .col-md-12 { + width: 100% + } + + .col-md-push-0 { + left: auto + } + + .col-md-push-1 { + left: 8.333333333333332% + } + + .col-md-push-2 { + left: 16.666666666666664% + } + + .col-md-push-3 { + left: 25% + } + + .col-md-push-4 { + left: 33.33333333333333% + } + + .col-md-push-5 { + left: 41.66666666666667% + } + + .col-md-push-6 { + left: 50% + } + + .col-md-push-7 { + left: 58.333333333333336% + } + + .col-md-push-8 { + left: 66.66666666666666% + } + + .col-md-push-9 { + left: 75% + } + + .col-md-push-10 { + left: 83.33333333333334% + } + + .col-md-push-11 { + left: 91.66666666666666% + } + + .col-md-pull-0 { + right: auto + } + + .col-md-pull-1 { + right: 8.333333333333332% + } + + .col-md-pull-2 { + right: 16.666666666666664% + } + + .col-md-pull-3 { + right: 25% + } + + .col-md-pull-4 { + right: 33.33333333333333% + } + + .col-md-pull-5 { + right: 41.66666666666667% + } + + .col-md-pull-6 { + right: 50% + } + + .col-md-pull-7 { + right: 58.333333333333336% + } + + .col-md-pull-8 { + right: 66.66666666666666% + } + + .col-md-pull-9 { + right: 75% + } + + .col-md-pull-10 { + right: 83.33333333333334% + } + + .col-md-pull-11 { + right: 91.66666666666666% + } + + .col-md-offset-0 { + margin-left: 0 + } + + .col-md-offset-1 { + margin-left: 8.333333333333332% + } + + .col-md-offset-2 { + margin-left: 16.666666666666664% + } + + .col-md-offset-3 { + margin-left: 25% + } + + .col-md-offset-4 { + margin-left: 33.33333333333333% + } + + .col-md-offset-5 { + margin-left: 41.66666666666667% + } + + .col-md-offset-6 { + margin-left: 50% + } + + .col-md-offset-7 { + margin-left: 58.333333333333336% + } + + .col-md-offset-8 { + margin-left: 66.66666666666666% + } + + .col-md-offset-9 { + margin-left: 75% + } + + .col-md-offset-10 { + margin-left: 83.33333333333334% + } + + .col-md-offset-11 { + margin-left: 91.66666666666666% + } +} + +@media (min-width:1200px) { + .boxed-layout #page-header, .boxed-layout #page-wrapper, .container { + max-width: 1170px + } + + .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9 { + float: left + } + + .col-lg-1 { + width: 8.333333333333332% + } + + .col-lg-2 { + width: 16.666666666666664% + } + + .col-lg-3 { + width: 25% + } + + .col-lg-4 { + width: 33.33333333333333% + } + + .col-lg-5 { + width: 41.66666666666667% + } + + .col-lg-6 { + width: 50% + } + + .col-lg-7 { + width: 58.333333333333336% + } + + .col-lg-8 { + width: 66.66666666666666% + } + + .col-lg-9 { + width: 75% + } + + .col-lg-10 { + width: 83.33333333333334% + } + + .col-lg-11 { + width: 91.66666666666666% + } + + .col-lg-12 { + width: 100% + } + + .col-lg-push-0 { + left: auto + } + + .col-lg-push-1 { + left: 8.333333333333332% + } + + .col-lg-push-2 { + left: 16.666666666666664% + } + + .col-lg-push-3 { + left: 25% + } + + .col-lg-push-4 { + left: 33.33333333333333% + } + + .col-lg-push-5 { + left: 41.66666666666667% + } + + .col-lg-push-6 { + left: 50% + } + + .col-lg-push-7 { + left: 58.333333333333336% + } + + .col-lg-push-8 { + left: 66.66666666666666% + } + + .col-lg-push-9 { + left: 75% + } + + .col-lg-push-10 { + left: 83.33333333333334% + } + + .col-lg-push-11 { + left: 91.66666666666666% + } + + .col-lg-pull-0 { + right: auto + } + + .col-lg-pull-1 { + right: 8.333333333333332% + } + + .col-lg-pull-2 { + right: 16.666666666666664% + } + + .col-lg-pull-3 { + right: 25% + } + + .col-lg-pull-4 { + right: 33.33333333333333% + } + + .col-lg-pull-5 { + right: 41.66666666666667% + } + + .col-lg-pull-6 { + right: 50% + } + + .col-lg-pull-7 { + right: 58.333333333333336% + } + + .col-lg-pull-8 { + right: 66.66666666666666% + } + + .col-lg-pull-9 { + right: 75% + } + + .col-lg-pull-10 { + right: 83.33333333333334% + } + + .col-lg-pull-11 { + right: 91.66666666666666% + } + + .col-lg-offset-0 { + margin-left: 0 + } + + .col-lg-offset-1 { + margin-left: 8.333333333333332% + } + + .col-lg-offset-2 { + margin-left: 16.666666666666664% + } + + .col-lg-offset-3 { + margin-left: 25% + } + + .col-lg-offset-4 { + margin-left: 33.33333333333333% + } + + .col-lg-offset-5 { + margin-left: 41.66666666666667% + } + + .col-lg-offset-6 { + margin-left: 50% + } + + .col-lg-offset-7 { + margin-left: 58.333333333333336% + } + + .col-lg-offset-8 { + margin-left: 66.66666666666666% + } + + .col-lg-offset-9 { + margin-left: 75% + } + + .col-lg-offset-10 { + margin-left: 83.33333333333334% + } + + .col-lg-offset-11 { + margin-left: 91.66666666666666% + } +} + +.row.no-gutter { + margin-left: 0; + margin-right: 0 +} + +.no-gutter>[class*=col-] { + padding-left: 0; + padding-right: 0 +} + +.pad5A { + padding: 5px !important +} + +.pad5T { + padding-top: 5px !important +} + +.pad5R { + padding-right: 5px !important +} + +.pad5B { + padding-bottom: 5px !important +} + +.pad5L { + padding-left: 5px !important +} + +.pad10A { + padding: 10px !important +} + +.pad10T { + padding-top: 10px !important +} + +.pad10R { + padding-right: 10px !important +} + +.pad10B { + padding-bottom: 10px !important +} + +.pad10L { + padding-left: 10px !important +} + +.pad15A { + padding: 15px !important +} + +.pad15T { + padding-top: 15px !important +} + +.pad15R { + padding-right: 15px !important +} + +.pad15B { + padding-bottom: 15px !important +} + +.pad15L { + padding-left: 15px !important +} + +.pad20A { + padding: 20px !important +} + +.pad20T { + padding-top: 20px !important +} + +.pad20R { + padding-right: 20px !important +} + +.pad20B { + padding-bottom: 20px !important +} + +.pad20L { + padding-left: 20px !important +} + +.pad25A { + padding: 25px !important +} + +.pad25T { + padding-top: 25px !important +} + +.pad25R { + padding-right: 25px !important +} + +.pad25B { + padding-bottom: 25px !important +} + +.pad25L { + padding-left: 25px !important +} + +.pad45A { + padding: 45px !important +} + +.pad45T { + padding-top: 45px !important +} + +.pad45R { + padding-right: 45px !important +} + +.pad45B { + padding-bottom: 45px !important +} + +.pad45L { + padding-left: 45px !important +} + +.pad0A { + padding: 0 !important +} + +.pad0T { + padding-top: 0 !important +} + +.pad0R { + padding-right: 0 !important +} + +.pad0B { + padding-bottom: 0 !important +} + +.pad0L { + padding-left: 0 !important +} + +.mrg5A { + margin: 5px !important +} + +.mrg5T { + margin-top: 5px !important +} + +.mrg5R { + margin-right: 5px !important +} + +.mrg5B { + margin-bottom: 5px !important +} + +.mrg5L { + margin-left: 5px !important +} + +.mrg10A { + margin: 10px !important +} + +.mrg10T { + margin-top: 10px !important +} + +.mrg10R { + margin-right: 10px !important +} + +.mrg10B { + margin-bottom: 10px !important +} + +.mrg10L { + margin-left: 10px !important +} + +.mrg15A { + margin: 15px !important +} + +.mrg15T { + margin-top: 15px !important +} + +.mrg15R { + margin-right: 15px !important +} + +.mrg15B { + margin-bottom: 15px !important +} + +.mrg15L { + margin-left: 15px !important +} + +.mrg20A { + margin: 20px !important +} + +.mrg20T { + margin-top: 20px !important +} + +.mrg20R { + margin-right: 20px !important +} + +.mrg20B { + margin-bottom: 20px !important +} + +.mrg20L { + margin-left: 20px !important +} + +.mrg25A { + margin: 25px !important +} + +.mrg25T { + margin-top: 25px !important +} + +.mrg25R { + margin-right: 25px !important +} + +.mrg25B { + margin-bottom: 25px !important +} + +.mrg25L { + margin-left: 25px !important +} + +.mrg45A { + margin: 45px !important +} + +.mrg45T { + margin-top: 45px !important +} + +.mrg45R { + margin-right: 45px !important +} + +.mrg45B { + margin-bottom: 45px !important +} + +.mrg45L { + margin-left: 45px !important +} + +.mrg0A { + margin: 0 !important +} + +.mrg0T { + margin-top: 0 !important +} + +.mrg0R { + margin-right: 0 !important +} + +.mrg0B { + margin-bottom: 0 !important +} + +.mrg0L { + margin-left: 0 !important +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-weight: 500; + margin: 0 +} + +.h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { + font-weight: 400 +} + +.h1, h1 { + font-size: 38px +} + +.h2, h2 { + font-size: 26px +} + +.h3, h3 { + font-size: 20px +} + +.h4, h4 { + font-size: 16px +} + +.h5, h5 { + font-size: 14px +} + +.h6, h6 { + font-size: 12px +} + +.h1 small, h1 small { + font-size: 24px +} + +.h2 small, h2 small { + font-size: 18px +} + +.h3 small, .h4 small, h3 small, h4 small { + font-size: 14px +} + +h1 .small, h1 small, h2 .small, h2 small, h3 .small, h3 small { + font-size: 75% +} + +blockquote { + margin: 0 0 20px; + padding: 10px 20px; + border-left: 5px solid #eee +} + +blockquote p { + font-size: 17.5px; + font-weight: 50; + line-height: 1.25 +} + +blockquote p:last-child { + margin-bottom: 0 +} + +blockquote small { + color: #999 +} + +blockquote small:before { + content: '\2014 \00A0' +} + +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eee; + border-left: 0 +} + +blockquote.pull-right .small, blockquote.pull-right p, blockquote.pull-right small { + text-align: right +} + +blockquote.pull-right .small:before, blockquote.pull-right small:before { + content: '' +} + +blockquote.pull-right .small:after, blockquote.pull-right small:after { + content: '\00A0 \2014' +} + +blockquote:after, blockquote:before { + content: '' +} + +address { + font-style: normal; + line-height: 1.428571429; + margin-bottom: 20px +} + +code, kbd, pre, samp { + font-family: Menlo, Monaco, Consolas, 'Courier New', monospace +} + +code { + font-size: 90%; + padding: 0 4px; + white-space: nowrap; + color: #d05; + border: 1px solid #dfe8f1; + border-radius: 3px; + background: #fafafa +} + +pre { + font-size: 13px; + margin: 0 0 10px; + padding: 9.5px; + word-wrap: break-word; + word-break: break-all; + color: #333; + border: 1px solid #ccc; + border-radius: 4px; + background-color: #f5f5f5 +} + +pre code { + font-size: inherit; + padding: 0; + color: inherit; + border-radius: 0; + background-color: transparent +} + +.btn, .fc-button, .input-group-btn, .text-no-wrap { + white-space: nowrap +} + +p { + line-height: 1.6em; + margin: 0 +} + +.title-hero { + margin: 0 0 15px; + padding: 0; + text-transform: uppercase; + font-size: 14px; + opacity: .7 +} + +h4.title-hero { + font-size: 15px +} + +.title-lead { + color: #3F3F3F +} + +.title-hero .title-lead { + font-size: 65%; + margin: 5px 0 0 +} + +.title-hero+.title-lead { + margin-top: -10px +} + +.jumbotron { + font-size: 21px; + font-weight: 200; + line-height: 2.1428571435; + margin-bottom: 30px; + padding: 30px; + color: inherit; + background-color: #eee +} + +.jumbotron h1 { + line-height: 1; + color: inherit +} + +.jumbotron p { + line-height: 1.4 +} + +.container .jumbotron { + border-radius: 6px +} + +@media screen and (min-width:768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px + } + + .container .jumbotron { + padding-right: 60px; + padding-left: 60px + } + + .jumbotron h1 { + font-size: 63px + } +} + +.float-left, .pull-left { + float: left !important +} + +.float-right, .pull-right { + float: right !important +} + +.float-none { + float: none !important +} + +.font-size-10 { + font-size: 10px !important +} + +.font-size-11 { + font-size: 11px !important +} + +.font-size-12 { + font-size: 12px !important +} + +.font-size-13 { + font-size: 13px !important +} + +.font-size-14 { + font-size: 14px !important +} + +.font-size-15 { + font-size: 15px !important +} + +.font-size-16 { + font-size: 16px !important +} + +.font-size-17 { + font-size: 17px !important +} + +.font-size-18 { + font-size: 18px !important +} + +.font-size-20 { + font-size: 20px !important +} + +.font-size-23 { + font-size: 23px !important +} + +.font-size-26 { + font-size: 26px !important +} + +.font-size-28 { + font-size: 28px !important +} + +.font-size-35 { + font-size: 35px !important +} + +.font-size-50 { + font-size: 50px !important +} + +.text-center { + text-align: center !important +} + +.text-left { + text-align: left !important +} + +.text-right { + text-align: right !important +} + +.text-justify { + text-align: justify +} + +.text-transform-none { + text-transform: none +} + +.text-transform-upr { + text-transform: uppercase +} + +.text-transform-low { + text-transform: lowercase +} + +.text-transform-cap { + text-transform: capitalize +} + +.font-bold { + font-weight: 700 !important +} + +.btn, .fc-button, .font-normal { + font-weight: 400 +} + +.font-italic { + font-style: italic +} + +.font-none { + font-style: none +} + +.clear-none { + clear: none !important +} + +#page-wrapper:after, .btn-group:after, .btn-toolbar:after, .button-pane:after, .chat-box li:after, .clearfix:after, .comments-list li .panel-body:after, .container:after, .content-box-header:after, .example-box-wrapper:after, .files-box li:after, .form-horizontal .form-group:after, .form-input-prepend:after, .form-row:after, .info-box:after, .messages-box li:after, .nav-list li:after, .nav:after, .notifications-box li:after, .pager:after, .posts-list li:after, .tl-item:after, .tl-row:after, .todo-box li:after, .ui-datepicker-buttonpane:after, .ui-helper-clearfix:after { + clear: both +} + +.ui-front { + z-index: 100 +} + +.wrapper-sticky { + z-index: 15 +} + +.hide, .lazy, .mix, .tab-pane, [data-toggle=buttons]>.btn>input[type=checkbox], [data-toggle=buttons]>.btn>input[type=radio] { + display: none +} + +.tab-pane { + padding: 15px +} + +.hidden, .ui-helper-hidden-accessible { + display: none !important +} + +.display-block { + position: relative !important; + display: block !important +} + +.display-block .button-content { + float: none +} + +.display-block.dropdown-menu { + position: static !important +} + +.display-inline { + display: inline-block +} + +.no-border { + border-color: transparent !important +} + +.dropdown-menu.pad0A .hasDatepicker .ui-datepicker, .remove-border { + border: 0 !important +} + +.border-top { + border-top-width: 3px !important; + border-top-style: solid !important +} + +.width-100 { + box-sizing: border-box; + width: 100% +} + +.center-margin { + float: none !important; + margin: 0 auto +} + +.center-block, .container { + display: block; + margin-right: auto; + margin-left: auto +} + +.center-vertical { + position: relative; + z-index: 15; + top: 0; + left: 0; + display: table; + width: 100%; + height: 100% +} + +.center-vertical .center-content { + display: table-cell; + vertical-align: middle +} + +.position-absolute { + position: absolute +} + +.show { + display: block !important +} + +.hidden { + display: none !important; + visibility: hidden !important +} + +.invisible { + visibility: hidden +} + +.center-div { + float: none !important; + margin-right: auto !important; + margin-left: auto !important; + text-align: center !important +} + +.btn-group>.btn-group, .btn-toolbar .btn-group, .btn-toolbar .input-group, .demo-icon { + float: left +} + +.divider, .nav-divider { + ityity: .7; + -moz-opacity: .7; + filter: alpha(opacity: 70) +} + +.divider { + height: 1px; + margin: 10px 0; + padding: 0 +} + +.divider-header { + font-size: 11px; + padding: 10px 15px; + text-transform: uppercase; + opacity: .2; + color: #fff +} + +.width-reset { + width: auto !important +} + +.opacity-10 { + opacity: .1 !important; + -moz-opacity: .1 !important; + filter: alpha(opacity: 10) !important +} + +.info-box b, .info-box.icon-wrapper .icon-large, .opacity-30 { + opacity: .3 !important; + -moz-opacity: .3 !important; + filter: alpha(opacity: 30) !important +} + +.opacity-40 { + opacity: .4 !important; + -moz-opacity: .4 !important; + filter: alpha(opacity: 40) !important +} + +.info-box b, .label-description span, .opacity-60, .opacity-hover { + opacity: .6 !important; + -moz-opacity: .6 !important; + filter: alpha(opacity: 60) !important +} + +.no-shadow.transparent.btn:hover i, .opacity-80, .ui-datepicker-current.ui-priority-secondary { + opacity: .8 !important; + -moz-opacity: .8 !important; + filter: alpha(opacity: 80) !important +} + +.opacity-100, .opacity-hover:hover { + opacity: 1 !important; + -moz-opacity: 1 !important; + filter: alpha(opacity: 100) !important +} + +.btn-link .glyph-icon.opacity-hover { + margin: 0 -5px +} + +.transparent { + border-color: transparent !important; + background: 0 0 !important; + box-shadow: 0 0 0 0 transparent !important +} + +.no-shadow { + box-shadow: 0 0 0 transparent !important +} + +.remove-bg { + background: 0 0 +} + +.nicescroll-rails { + background: 0 0 !important +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px solid; + border-right: 4px solid transparent; + border-left: 4px solid transparent +} + +#loading, .login-img, .ui-widget-overlay { + width: 100%; + height: 100% +} + +.dropup .caret, .navbar-fixed-bottom .dropdown .caret { + content: ''; + border-top: 0; + border-bottom: 4px solid +} + +.chosen-results, .form-wizard>ul, .nav-list ul, .nav-list-horizontal ul, .parsley-errors-list, .reset-ul, .tabs-navigation>ul, ul.messages-box, ul.notifications-box, ul.progress-box { + margin: 0; + padding: 0; + list-style: none +} + +#page-wrapper:after, #page-wrapper:before, .btn-group:after, .btn-group:before, .btn-toolbar:after, .btn-toolbar:before, .button-pane:after, .button-pane:before, .chat-box li:after, .chat-box li:before, .clearfix:after, .clearfix:before, .comments-list li .panel-body:after, .comments-list li .panel-body:before, .container:after, .container:before, .content-box-header:after, .content-box-header:before, .example-box-wrapper:after, .example-box-wrapper:before, .files-box li:after, .files-box li:before, .form-input-prepend:after, .form-input-prepend:before, .form-row:after, .form-row:before, .info-box:after, .info-box:before, .messages-box li:after, .messages-box li:before, .nav-list li:after, .nav-list li:before, .nav:after, .nav:before, .notifications-box li:after, .notifications-box li:before, .pager:after, .pager:before, .posts-list li:after, .posts-list li:before, .tl-item:after, .tl-item:before, .tl-row:after, .tl-row:before, .todo-box li:after, .todo-box li:before, .ui-datepicker-buttonpane:after, .ui-datepicker-buttonpane:before, .ui-helper-clearfix:after, .ui-helper-clearfix:before { + display: table; + content: '' +} + +.ui-sortable-placeholder { + visibility: visible !important; + border: 1px dashed #efda2c !important; + background: #fffce5 !important +} + +.daterangepicker td.available.in-range:hover, .daterangepicker td.in-range { + background: #fffce5 +} + +.checker.disabled, .checker.disabled span, .chosen-disabled, .disabled, .radio.disabled, .radio.disabled span, .ui-rangeSlider-disabled .ui-rangeSlider-arrow, .ui-rangeSlider-disabled .ui-rangeSlider-container, .ui-rangeSlider-disabled .ui-rangeSlider-label, .ui-state-disabled, button[disabled] { + cursor: not-allowed !important; + opacity: .65; + filter: alpha(opacity: 65) +} + +.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control, input[disabled], select[disabled], textarea[disabled] { + cursor: not-allowed; + opacity: .65; + background: #fafafa; + filter: alpha(opacity: 65) +} + +input[readonly], select[readonly], textarea[readonly] { + opacity: .8; + background: #fdfdfd; + -moz-opacity: .8; + filter: alpha(opacity: 80) +} + +.login-img { + position: fixed !important; + top: 0; + left: 0 +} + +.fixed-bg { + background-repeat: no-repeat; + background-attachment: fixed; + background-position: center center; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover +} + +.ui-widget-overlay { + position: fixed; + left: 0; + top: 0; + bottom: 0; + right: 0; + text-align: center; + z-index: 16 +} + +.ui-widget-overlay img { + position: absolute; + top: 50%; + left: 50%; + margin: -26px 0 0 -26px +} + +#loading { + z-index: 5555; + position: fixed; + left: 0; + top: 0; + background: #fff +} + +.fade { + -webkit-transition: opacity .15s linear; + transition: opacity .15s linear +} + +.collapse { + display: none +} + +.collapse.in, .tab-pane.active { + display: block +} + +.collapsing { + position: relative; + height: 0; + -webkit-transition: height .35s ease; + transition: height .35s ease +} + +.small-padding { + padding: 25px 0 +} + +.medium-padding { + padding: 55px 0 +} + +.large-padding { + padding: 85px 0 +} + +.xlarge-padding { + padding: 115px 0 +} + +.glyph-icon { + text-align: center +} + +#page-sidebar li a.sf-with-ul:after, #page-sidebar li ul li a:before, .dataTables_paginate a i:before, .fc-icon, .glyph-icon:before, .search-choice-close:before, .ui-dialog-titlebar-close:before, .ui-icon:before { + font-family: FontAwesome; + font-weight: 400; + font-style: normal; + display: inline-block; + text-align: center; + text-decoration: none; + background: 0 0; + speak: none; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.dropdown-menu>.disabled>a:focus, .dropdown-menu>.disabled>a:hover { + cursor: not-allowed; + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid: DXImageTransform.Microsoft.gradient(enabled=false) +} + +.sr-only { + position: absolute; + clip: rect(0, 0, 0, 0); + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + border: 0 +} + +.rm-transition { + -webkit-transition: none !important; + -moz-transition: none !important; + -ms-transition: none !important; + -o-transition: none !important +} + +.btn, a, button, div[id^=uniform-] span { + -webkit-transition: all .1s ease-in-out; + -moz-transition: all .1s ease-in-out; + -ms-transition: all .1s ease-in-out; + -o-transition: all .1s ease-in-out +} + +#page-header, #page-sidebar, .main-header, .top-bar { + -webkit-transition: all .5s ease-in-out; + -moz-transition: all .5s ease-in-out; + -ms-transition: all .5s ease-in-out; + -o-transition: all .5s ease-in-out +} + +.example-box-wrapper { + margin-bottom: 15px; + position: relative +} + +.example-box-wrapper .ui-datepicker-inline { + position: relative; + width: 100% +} + +.panel-body .col-md-6 .example-box-wrapper:last-child, .panel-body .example-box-wrapper:last-child { + margin-bottom: 0 +} + +.example-box-wrapper .alert, .example-box-wrapper .content-box, .example-box-wrapper .dashboard-box, .example-box-wrapper .dataTables_wrapper, .example-box-wrapper .icon-box, .example-box-wrapper .image-box, .example-box-wrapper .jcrop-holder, .example-box-wrapper .jvectormap-container, .example-box-wrapper .list-group, .example-box-wrapper .loading-spinner, .example-box-wrapper .loading-stick, .example-box-wrapper .minicolors, .example-box-wrapper .nav, .example-box-wrapper .panel-layout, .example-box-wrapper .scrollable-content, .example-box-wrapper .tile-box, .example-box-wrapper .ui-accordion, .example-box-wrapper .ui-rangeSlider, .example-box-wrapper .ui-slider, .example-box-wrapper .ui-tabs, .example-box-wrapper>.btn, .example-box-wrapper>.btn-group, .example-box-wrapper>.btn-group-vertical, .example-box-wrapper>.btn-toolbar, .example-box-wrapper>.display-block.dropdown-menu, .example-box-wrapper>.dropdown, .example-box-wrapper>.dropup, .example-box-wrapper>.hasDatepicker, .example-box-wrapper>.img-humbnail, .example-box-wrapper>.minicolors, .example-box-wrapper>.pagination, .example-box-wrapper>.panel-layout, .example-box-wrapper>.progressbar, .example-box-wrapper>.thumbnail, .example-box-wrapper>form, .example-box-wrapper>h6, .example-box-wrapper>img { + margin-bottom: 20px +} + +.demo-icon { + font-size: 22px; + line-height: 40px; + width: 40px; + height: 40px; + margin: 10px; + text-align: center; + color: #92A0B3; + border: 1px solid rgba(220, 233, 255, .54); + border-radius: 3px +} + +.btn-block, .btn-group-justified, .btn-group-justified>.btn-group .btn, input[type=button].btn-block, input[type=reset].btn-block, input[type=submit].btn-block { + width: 100% +} + +.demo-icon:hover { + color: #59606c; + border-color: #92A0B3 +} + +.font-black { + color: #464646 !important +} + +.font-blue { + color: #1f6dca !important +} + +.font-blue-alt { + color: #65a6ff !important +} + +.font-azure { + color: #41e5c0 !important +} + +.font-gray, .text-muted { + color: #c2c2c2 !important +} + +.font-gray-dark, .text-info { + color: #828282 !important +} + +.font-green, .text-success { + color: #2ecc71 !important +} + +.font-orange, .text-warning { + color: #fa7753 !important +} + +.font-yellow { + color: #fc0 !important +} + +.font-purple { + color: #984dff !important +} + +.font-red, .has-error .help-block, .parsley-required, .text-danger { + color: #ff5757 !important +} + +.font-white { + color: #fff !important +} + +.alert-info, .alert-info a { + color: #6c6c6c; + border-color: #c9c9c9; + background: #dfe8f1 +} + +.alert-notice, .alert-notice a { + color: #0f2c62; + border-color: #62baf6; + background: #c6e8ff +} + +.alert-success, .alert-success a, .parsley-success { + color: #1e620f; + border-color: #7cd362; + background: #d3ffc6 +} + +.parsley-success { + background: #fff +} + +.alert-warning, .alert-warning a, .warning { + color: #624b0f; + border-color: #ebc875; + background: #ffeec6 +} + +.alert-danger, .alert-danger a, .danger, .parsley-error { + color: #620f0f; + border-color: #db6a6a; + background: #ffc6c6 +} + +.bg-facebook, .bg-google, .bg-twitter { + color: #fff !important +} + +.parsley-error { + background: #fff +} + +.bg-facebook { + background: #3b5998 +} + +.btn.bg-facebook:hover { + background: #304b85 +} + +.bg-twitter { + background: #3a92c8 +} + +.btn.bg-twitter:hover { + background: #2b80b4 +} + +.bg-google { + background: #dd4b39 +} + +.btn.bg-google:hover { + background: #c93b2a +} + +.badge-info, .bg-blue, .bootstrap-switch-info, .btn-info, .checkbox-info div[id^=uniform-] span.checked, .hover-blue:hover, .hover-info:hover, .label-info, .progress-bar-info, .radio-info div[id^=uniform-] span.checked { + color: #fff; + border-color: #308dcc; + background: #3498db +} + +.btn-info.active, .btn-info.disabled, .btn-info.disabled.active, .btn-info.disabled:active, .btn-info.disabled:focus, .btn-info.disabled:hover, .btn-info:active, .btn-info:focus, .btn-info:hover, .btn-info[disabled], .btn-info[disabled].active, .btn-info[disabled]:active, .btn-info[disabled]:focus, .btn-info[disabled]:hover, .label-info[href]:focus, .label-info[href]:hover, .open .dropdown-toggle.btn-info { + color: #fff; + border-color: #308dcc; + background: #52a7e0 +} + +.badge-danger, .bg-danger, .bg-red, .bootstrap-switch-danger, .btn-danger, .checkbox-danger div[id^=uniform-] span.checked, .hover-danger:hover, .hover-red:hover, .label-danger, .progress-bar-danger, .radio-danger div[id^=uniform-] span.checked { + color: #fff; + border-color: #cf4436; + background: #e74c3c +} + +.btn-danger.active, .btn-danger.disabled, .btn-danger.disabled.active, .btn-danger.disabled:active, .btn-danger.disabled:focus, .btn-danger.disabled:hover, .btn-danger:active, .btn-danger:focus, .btn-danger:hover, .btn-danger[disabled], .btn-danger[disabled].active, .btn-danger[disabled]:active, .btn-danger[disabled]:focus, .btn-danger[disabled]:hover, .label-danger[href]:focus, .label-danger[href]:hover, .open .dropdown-toggle.btn-danger { + color: #fff; + border-color: #cf4436; + background: #eb6759 +} + +.badge-gray, .bg-gray, .btn-gray, .hover-gray:hover, .label-gray { + color: #666; + background: #efefef +} + +.btn-gray.active, .btn-gray.disabled, .btn-gray.disabled.active, .btn-gray.disabled:active, .btn-gray.disabled:focus, .btn-gray.disabled:hover, .btn-gray:active, .btn-gray:focus, .btn-gray:hover, .btn-gray[disabled], .btn-gray[disabled].active, .btn-gray[disabled]:active, .btn-gray[disabled]:focus, .btn-gray[disabled]:hover, .label-gray[href]:focus, .label-gray[href]:hover, .open .dropdown-toggle.btn-gray { + color: #333; + background: #e7e7e7 +} + +.badge-gray-alt, .bg-gray-alt, .btn-gray-alt, .hover-gray-alt:hover, .label-gray-alt { + color: #888; + background: #f6f6f6 +} + +.btn-gray-alt.active, .btn-gray-alt.disabled, .btn-gray-alt.disabled.active, .btn-gray-alt.disabled:active, .btn-gray-alt.disabled:focus, .btn-gray-alt.disabled:hover, .btn-gray-alt:active, .btn-gray-alt:focus, .btn-gray-alt:hover, .btn-gray-alt[disabled], .btn-gray-alt[disabled].active, .btn-gray-alt[disabled]:active, .btn-gray-alt[disabled]:focus, .btn-gray-alt[disabled]:hover, .label-gray-alt[href]:focus, .label-gray-alt[href]:hover, .open .dropdown-toggle.btn-gray-alt { + color: #444; + background: #ededed +} + +.badge-black, .bg-black, .btn-black, .hover-black:hover, .label-black { + color: #ccc; + border-color: #000; + background: #2d2d2d +} + +.boxed-layout.bg-black { + background: #2d2d2d +} + +.btn-black.active, .btn-black.disabled, .btn-black.disabled.active, .btn-black.disabled:active, .btn-black.disabled:focus, .btn-black.disabled:hover, .btn-black:active, .btn-black:focus, .btn-black:hover, .btn-black[disabled], .btn-black[disabled].active, .btn-black[disabled]:active, .btn-black[disabled]:focus, .btn-black[disabled]:hover, .label-black[href]:focus, .label-black[href]:hover, .open .dropdown-toggle.btn-black { + color: #fdfdfd; + background: #151515 +} + +.badge-black-opacity, .bg-black-opacity, .btn-black-opacity, .hover-black-opacity:hover, .label-black-opacity { + color: #a9b3bb; + background: #2b323d +} + +.btn-black-opacity.active, .btn-black-opacity.disabled, .btn-black-opacity.disabled.active, .btn-black-opacity.disabled:active, .btn-black-opacity.disabled:focus, .btn-black-opacity.disabled:hover, .btn-black-opacity:active, .btn-black-opacity:focus, .btn-black-opacity:hover, .btn-black-opacity[disabled], .btn-black-opacity[disabled].active, .btn-black-opacity[disabled]:active, .btn-black-opacity[disabled]:focus, .btn-black-opacity[disabled]:hover, .label-black-opacity[href]:focus, .label-black-opacity[href]:hover, .open .dropdown-toggle.btn-black-opacity { + color: #fff; + background: #14171c +} + +.badge-black-opacity-alt, .bg-black-opacity-alt, .btn-black-opacity-alt, .hover-black-opacity-alt:hover, .label-black-opacity-alt { + color: #fff; + background: rgba(0, 0, 0, .2); + border-color: transparent +} + +.btn-black-opacity-alt.active, .btn-black-opacity-alt.disabled, .btn-black-opacity-alt.disabled.active, .btn-black-opacity-alt.disabled:active, .btn-black-opacity-alt.disabled:focus, .btn-black-opacity-alt.disabled:hover, .btn-black-opacity-alt:active, .btn-black-opacity-alt:focus, .btn-black-opacity-alt:hover, .btn-black-opacity-alt[disabled], .btn-black-opacity-alt[disabled].active, .btn-black-opacity-alt[disabled]:active, .btn-black-opacity-alt[disabled]:focus, .btn-black-opacity-alt[disabled]:hover, .label-black-opacity-alt[href]:focus, .label-black-opacity-alt[href]:hover, .open .dropdown-toggle.btn-black-opacity-alt { + color: #fff; + background: rgba(0, 0, 0, .3) +} + +.badge-success, .bg-green, .bootstrap-switch-success, .btn-success, .checkbox-success div[id^=uniform-] span.checked, .hover-green:hover, .hover-success:hover, .label-success, .progress-bar-success, .radio-success div[id^=uniform-] span.checked { + color: #fff; + border-color: #29b765; + background: #2ecc71 +} + +.btn-success.active, .btn-success.disabled, .btn-success.disabled.active, .btn-success.disabled:active, .btn-success.disabled:focus, .btn-success.disabled:hover, .btn-success:active, .btn-success:focus, .btn-success:hover, .btn-success[disabled], .btn-success[disabled].active, .btn-success[disabled]:active, .btn-success[disabled]:focus, .btn-success[disabled]:hover, .label-success[href]:focus, .label-success[href]:hover, .open .dropdown-toggle.btn-success { + color: #fff; + border-color: #29b765; + background: #58d68d +} + +.badge-warning, .bg-orange, .bg-warning, .bootstrap-switch-warning, .btn-warning, .checkbox-warning div[id^=uniform-] span.checked, .hover-orange:hover, .hover-warning:hover, .label-warning, .progress-bar-warning, .radio-warning div[id^=uniform-] span.checked { + color: #fff; + border-color: #d67520; + background: #e67e22 +} + +.btn-warning.active, .btn-warning.disabled, .btn-warning.disabled.active, .btn-warning.disabled:active, .btn-warning.disabled:focus, .btn-warning.disabled:hover, .btn-warning:active, .btn-warning:focus, .btn-warning:hover, .btn-warning[disabled], .btn-warning[disabled].active, .btn-warning[disabled]:active, .btn-warning[disabled]:focus, .btn-warning[disabled]:hover, .label-warning[href]:focus, .label-warning[href]:hover, .open .dropdown-toggle.btn-warning { + color: #fff; + border-color: #d67520; + background: #ea9143 +} + +.bg-white, .label-white, .table { + background: #fff +} + +.bg-white-opacity { + background: rgba(255, 255, 255, .85) +} + +.hover-white:hover { + background: #fafafa +} + +.badge-yellow, .bg-yellow, .btn-yellow, .hover-yellow:hover, .label-yellow { + color: #fff; + background: #fc0; + border-color: #deb200 +} + +.btn-yellow.active, .btn-yellow.disabled, .btn-yellow.disabled.active, .btn-yellow.disabled:active, .btn-yellow.disabled:focus, .btn-yellow.disabled:hover, .btn-yellow:active, .btn-yellow:focus, .btn-yellow:hover, .btn-yellow[disabled], .btn-yellow[disabled].active, .btn-yellow[disabled]:active, .btn-yellow[disabled]:focus, .btn-yellow[disabled]:hover, .label-yellow[href]:focus, .label-yellow[href]:hover, .open .dropdown-toggle.btn-yellow { + color: #fff; + background: #e1b400; + border-color: #c59e00 +} + +.badge-purple, .bg-purple, .btn-purple, .hover-purple:hover, .label-purple { + color: #fff; + background: #984dff; + border-color: #7a3ecc +} + +.btn-purple.active, .btn-purple.disabled, .btn-purple.disabled.active, .btn-purple.disabled:active, .btn-purple.disabled:focus, .btn-purple.disabled:hover, .btn-purple:active, .btn-purple:focus, .btn-purple:hover, .btn-purple[disabled], .btn-purple[disabled].active, .btn-purple[disabled]:active, .btn-purple[disabled]:focus, .btn-purple[disabled]:hover, .label-purple[href]:focus, .label-purple[href]:hover, .open .dropdown-toggle.btn-purple { + color: #fff; + background: #8134eb; + border-color: #752fd6 +} + +.badge-blue-alt, .bg-blue-alt, .btn-blue-alt, .hover-blue-alt:hover, .label-blue-alt { + color: #fff; + background: #65a6ff; + border-color: #5388d1 +} + +.btn-blue-alt.active, .btn-blue-alt.disabled, .btn-blue-alt.disabled.active, .btn-blue-alt.disabled:active, .btn-blue-alt.disabled:focus, .btn-blue-alt.disabled:hover, .btn-blue-alt:active, .btn-blue-alt:focus, .btn-blue-alt:hover, .btn-blue-alt[disabled], .btn-blue-alt[disabled].active, .btn-blue-alt[disabled]:active, .btn-blue-alt[disabled]:focus, .btn-blue-alt[disabled]:hover, .label-blue-alt[href]:focus, .label-blue-alt[href]:hover, .open .dropdown-toggle.btn-blue-alt { + color: #fff; + background: #478ded; + border-color: #4c7ec1 +} + +.badge-azure, .bg-azure, .btn-azure, .hover-azure:hover, .label-azure { + color: #fff; + background: #41e5c0; + border-color: #3acead +} + +.btn-azure.active, .btn-azure.disabled, .btn-azure.disabled.active, .btn-azure.disabled:active, .btn-azure.disabled:focus, .btn-azure.disabled:hover, .btn-azure:active, .btn-azure:focus, .btn-azure:hover, .btn-azure[disabled], .btn-azure[disabled].active, .btn-azure[disabled]:active, .btn-azure[disabled]:focus, .btn-azure[disabled]:hover, .label-azure[href]:focus, .label-azure[href]:hover, .open .dropdown-toggle.btn-azure { + color: #fff; + background: #27d1ab; + border-color: #24c19e +} + +.border-black { + border-color: #212121 !important +} + +.border-blue { + border-color: #5bccf6 !important +} + +.border-blue-alt { + border-color: #65a6ff !important +} + +.border-azure { + border-color: #41e5c0 !important +} + +.border-gray { + border-color: #c2c2c2 !important +} + +.border-gray-dark { + border-color: #828282 !important +} + +.border-green { + border-color: #2ecc71 !important +} + +.border-orange { + border-color: #fa7753 !important +} + +.border-yellow { + border-color: #fc0 !important +} + +.border-purple { + border-color: #984dff !important +} + +.border-red { + border-color: #ff5757 !important +} + +.parsley-success { + border-color: #77e038 !important +} + +.parsley-error { + border-color: #e03838 !important +} + +.btn, .fc-button { + font-size: 14px; + position: relative; + display: inline-block; + padding: 0 12px; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-align: center; + border-width: 1px; + border-style: solid; + border-color: transparent; + background-image: none; + -o-user-select: none +} + +.btn-alt, .content-box-header-alt { + font-weight: 700; + text-transform: uppercase +} + +.btn, .fc-button, .size-md { + line-height: 32px; + height: 34px; + min-width: 34px +} + +.btn-abs { + position: absolute; + top: 50%; + right: 0; + margin-top: -17px +} + +.btn.hover-round:hover { + border-radius: 100px +} + +.btn-group-vertical>.btn:not(:first-child):not(:last-child), .btn-link { + border-radius: 0 +} + +.btn.active, .btn:active, .fc-state-active, .fc-state-down, .ui-datepicker .ui-datepicker-buttonpane button:active, .ui-datepicker .ui-datepicker-next:active, .ui-datepicker .ui-datepicker-prev:active, .ui-dialog .ui-dialog-titlebar-close:active, .ui-dialog-buttonset button:active { + outline: 0; + background-image: none; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) +} + +.btn.disabled, .btn[disabled], .disabled, .fc-state-disabled, fieldset[disabled] .btn { + cursor: not-allowed; + pointer-events: none; + opacity: .65; + -webkit-box-shadow: none; + box-shadow: none; + filter: alpha(opacity=65) +} + +.btn-link { + cursor: pointer +} + +.btn-link, .btn-link:active, .btn-link[disabled] { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none +} + +.btn-link:focus, .btn-link:hover { + text-decoration: underline; + background-color: transparent +} + +.btn-border:hover, .pager li>a:focus, .pager li>a:hover { + text-decoration: none +} + +.btn-group-lg>.btn, .btn-lg, .size-lg { + line-height: 44px; + min-width: 56px; + height: 46px +} + +.btn-lg-abs { + margin-top: -23px +} + +.btn-group-lg>.btn, .btn-lg { + font-size: 18px; + padding: 0 16px +} + +.btn-group-sm>.btn, .btn-sm, .size-sm { + line-height: 28px; + height: 30px +} + +.btn-sm-abs { + margin-top: -15px +} + +.btn-group-sm>.btn, .btn-sm { + font-size: 13px; + padding: 0 10px +} + +.btn-group-xs>.btn, .btn-xs, .size-xs { + line-height: 20px; + min-width: 22px; + height: 22px +} + +.btn-xs-abs { + margin-top: -11px +} + +.btn-group-xs>.btn, .btn-xs { + font-size: 11px; + padding: 0 5px +} + +.btn .caret { + margin-left: 0 +} + +.btn-lg .caret { + border-width: 5px 5px 0 +} + +.dropup .btn-lg .caret { + border-width: 0 5px 5px +} + +.btn-block { + display: block; + padding-right: 0; + padding-left: 0 +} + +.btn-block+.btn-block { + margin-top: 5px +} + +.btn-group, .btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle +} + +.btn-group-vertical>.btn, .btn-group>.btn { + position: relative; + float: left +} + +.btn-group-vertical>.btn.active, .btn-group-vertical>.btn:active, .btn-group-vertical>.btn:focus, .btn-group-vertical>.btn:hover, .btn-group>.btn.active, .btn-group>.btn:active, .btn-group>.btn:focus, .btn-group>.btn:hover { + z-index: 2 +} + +.btn-group .btn+.btn, .btn-group .btn+.btn-group, .btn-group .btn-group+.btn, .btn-group .btn-group+.btn-group { + margin-left: -1px +} + +.btn-toolbar { + margin-left: -5px +} + +.btn-toolbar>.btn, .btn-toolbar>.btn-group, .btn-toolbar>.input-group { + margin-left: 10px +} + +.btn-group>.btn:first-child { + margin-left: 0 +} + +.btn-group>.btn+.dropdown-toggle { + padding-right: 8px; + padding-left: 8px +} + +.btn-group>.btn-lg+.dropdown-toggle { + padding-right: 12px; + padding-left: 12px +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) +} + +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none +} + +.btn-group-vertical>.btn, .btn-group-vertical>.btn-group, .btn-group-vertical>.btn-group>.btn { + display: block; + float: none; + width: 100%; + max-width: 100% +} + +.btn-group-vertical>.btn-group>.btn { + float: none +} + +.btn-group-vertical>.btn+.btn, .btn-group-vertical>.btn+.btn-group, .btn-group-vertical>.btn-group+.btn, .btn-group-vertical>.btn-group+.btn-group { + margin-top: -1px; + margin-left: 0 +} + +.btn-group-justified { + display: table; + table-layout: fixed; + border-collapse: separate +} + +.btn-group-justified>.btn, .btn-group-justified>.btn-group { + display: table-cell; + float: none +} + +.btn-group-vertical>.btn:first-child:not(:last-child) { + border-top-right-radius: 3px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: 3px +} + +.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn, .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn, .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0 +} + +.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child, .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.btn-group>.btn-group:first-child>.btn:last-child, .btn-group>.btn-group:first-child>.dropdown-toggle, .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn-group:last-child>.btn:first-child, .btn-group>.btn:last-child:not(:first-child), .btn-group>.dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.pagination { + display: inline-block; + padding-left: 0 +} + +.pager li, .pagination>li { + display: inline +} + +.pagination>li>a, .pagination>li>span { + line-height: 1.42857143; + position: relative; + float: left; + margin-left: -1px; + padding: 6px 12px; + text-decoration: none; + border-width: 1px; + border-style: solid +} + +.pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover { + z-index: 2 +} + +.pagination>li:first-child>a, .pagination>li:first-child>span { + margin-left: 0 +} + +.pagination-lg>li>a, .pagination-lg>li>span { + font-size: 18px; + padding: 10px 16px +} + +.pagination-sm>li>a, .pagination-sm>li>span { + font-size: 12px; + padding: 5px 10px +} + +.pager { + margin-top: 0; + padding-left: 0; + list-style: none; + text-align: center +} + +.pager li>a, .pager li>span { + display: inline-block; + padding: 5px 14px; + border: 1px solid #ddd; + border-radius: 15px; + background-color: #fff +} + +.btn>.icon-separator, .icon-separator.float-right { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important +} + +.pager .next>a, .pager .next>span { + float: right +} + +.pager .previous>a, .pager .previous>span { + float: left +} + +.pager .disabled>a, .pager .disabled>a:focus, .pager .disabled>a:hover, .pager .disabled>span, .pagination>.disabled>a, .pagination>.disabled>a:focus, .pagination>.disabled>a:hover, .pagination>.disabled>span, .pagination>.disabled>span:focus, .pagination>.disabled>span:hover { + cursor: not-allowed; + color: #999; + background-color: #fff +} + +.btn>.icon-separator { + position: absolute; + top: 0; + left: 0; + width: 32px; + height: 100%; + border-top-right-radius: 0 !important +} + +.icon-separator+.button-content { + margin-left: 32px +} + +.btn-xs .icon-separator { + width: 22px +} + +.btn-xs .icon-separator+.button-content { + margin-left: 22px +} + +.btn-sm .icon-separator { + width: 25px +} + +.btn-sm .icon-separator+.button-content { + margin-left: 25px +} + +.btn-lg .icon-separator { + width: 44px +} + +.btn-lg .icon-separator+.button-content { + margin-left: 44px +} + +.icon-separator.float-right { + border-top-left-radius: 0 !important +} + +.vertical-button { + line-height: 1.6em; + height: auto; + padding: 10px 0 5px +} + +.vertical-button .button-content { + opacity: .7; + filter: alpha(opacity=70) +} + +.icon-separator-vertical { + font-size: 25px; + display: block; + margin: 5px auto +} + +.dashboard-buttons .btn { + width: 93px; + margin: 5px 3px +} + +.btn-outline, .btn-outline-inverse { + display: inline-block; + text-align: center; + color: #fff; + box-sizing: initial; + border-width: 2px; + border-style: solid; + text-transform: uppercase +} + +.btn-outline-inverse { + border-color: rgba(255, 255, 255, .47) +} + +.btn-outline-inverse:hover { + background: rgba(255, 255, 255, .2); + border-color: #fff +} + +.btn-outline-inverse.hero-btn { + color: #fff +} + +.btn-outline { + color: rgba(0, 0, 0, .8); + border-color: rgba(0, 0, 0, .6) +} + +.btn-outline:hover { + color: #fff; + border-color: rgba(0, 0, 0, .8); + background: rgba(0, 0, 0, .8) +} + +.btn.btn-round { + border-radius: 150px; + padding: 0 +} + +.btn-round.btn-lg { + width: 46px; + min-width: 46px +} + +.btn-round.btn-xlg { + width: 66px; + min-width: 66px; + height: 66px; + line-height: 66px +} + +.btn-round.btn-xlg .glyph-icon { + font-size: 24px +} + +.btn-round.btn-md { + width: 34px +} + +.btn-round.btn-sm { + width: 30px +} + +.btn-round.btn-xs { + width: 22px +} + +.btn-alt { + font-size: 12px +} + +.btn-hover span { + padding: 0 20px; + left: 0; + position: relative; + transition: opacity .2s ease-out, left .2s ease-out; + -webkit-transition: opacity .2s ease-out, left .2s ease-out +} + +.btn-hover .glyph-icon { + opacity: 0; + -ms-filter: "alpha(opacity=0)"; + position: absolute; + right: 20px; + transition: all .2s ease-out; + -webkit-transition: all .2s ease-out +} + +.btn-hover:hover .glyph-icon { + opacity: 1; + right: 15px; + -ms-filter: "alpha(opacity=100)" +} + +.btn-hover:hover span { + left: -15px +} + +.btn-border { + border-width: 2px; + border-style: solid +} + +.btn-border span { + opacity: .75; + filter: alpha(opacity=75) +} + +.btn-border:hover span { + opacity: 1; + filter: alpha(opacity=100) +} + +.btn-group-justified>.btn, .btn-group-justified>.btn-group { + width: auto +} + +.demo-margin .btn { + margin-bottom: 10px +} + +.content-box { + background: #fff; + margin-bottom: 20px +} + +.content-box, .content-box-header { + position: relative; + border-width: 1px; + border-style: solid +} + +.content-box-header { + font-size: 14px; + text-transform: uppercase; + margin: -1px -1px 0; + padding: 15px; + border-color: transparent +} + +.content-box-header small+.font-size-11.float-right { + position: absolute; + top: 14px; + right: 10px +} + +.content-box-header-alt { + padding: 15px 10px 14px; + font-size: 12px +} + +.content-box-header-alt small { + font-size: 13px; + font-weight: 400; + display: block; + padding: 5px 0 0; + text-transform: none; + opacity: .7; + filter: alpha(opacity: 70) +} + +.content-box .ui-widget-overlay { + position: absolute +} + +.content-box .ui-widget-overlay img { + position: absolute; + top: 50%; + left: 50%; + margin: -27px 0 0 -27px +} + +.content-box .content-box-wrapper { + line-height: 1.6em; + padding: 15px +} + +.content-box .content-box-wrapper .scrollable-content, .content-box .content-box-wrapper p:last-child { + margin-bottom: 0 +} + +.content-box .content-box-header>.glyph-icon { + margin-right: 5px; + opacity: .7; + filter: alpha(opacity: 70) +} + +.content-box-header-alt .icon-separator .glyph-icon, .content-box-header-alt>.glyph-icon { + font-size: 22px; + line-height: 30px; + position: absolute; + top: 50%; + left: 15px; + width: 30px; + height: 30px; + margin-top: -15px +} + +.content-box-header>.icon-separator { + position: relative; + top: 1px; + left: -15px; + padding: 18px 15px 16px; + text-align: center +} + +.content-box-header>.icon-separator .glyph-icon { + margin-left: 3px +} + +.content-box-header-alt>.header-wrapper { + overflow: hidden; + display: block; + margin-left: 40px +} + +.content-box-header-alt>.icon-separator+.header-wrapper { + margin-left: 65px +} + +.content-box-header-alt>.icon-separator { + position: absolute; + top: 0; + left: 0; + width: 60px; + height: 100% +} + +.content-box-header-alt>.icon-separator .glyph-icon { + left: 50%; + margin-left: -15px +} + +.header-buttons { + position: absolute; + top: 0; + right: 10px; + height: 100%; + display: block +} + +.header-buttons .btn-xs { + top: 13px +} + +.header-buttons .btn-sm { + top: 10px +} + +.header-buttons .btn-sm:last-child { + margin-right: 0 +} + +.header-buttons>.btn-group:last-child { + margin-right: -2px +} + +.content-box-header-alt .header-buttons .btn-xs { + top: 24px +} + +.content-box-header-alt .header-buttons .btn-sm { + top: 20px +} + +.content-box-header-alt .header-buttons .btn-sm:last-child { + margin-right: 5px +} + +.header-buttons-separator { + position: absolute; + top: 0; + right: 0; + height: 100% +} + +.header-buttons-separator .icon-separator { + top: 0; + left: 0; + display: block; + float: left; + min-width: 20px; + height: 100%; + padding: 0 10px +} + +.header-buttons-separator .icon-separator .glyph-icon { + line-height: 30px; + position: relative; + top: 50%; + display: block; + min-width: 30px; + height: 30px; + margin: -15px 0 0; + text-align: center +} + +.header-buttons>.btn-group { + margin-top: 8px +} + +.header-buttons .btn-group-xs { + margin-top: 14px +} + +.header-buttons .btn-group-xs:last-child { + margin-right: 0 +} + +.ui-dialog-buttonpane, body .button-pane { + padding: 10px; + text-align: center; + border-width: 1px 0 0; + border-style: solid; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +body .button-pane-top { + border-width: 0 0 1px; + border-radius: 0 +} + +.scrollable-content { + overflow-y: scroll; + overflow-x: hidden; + height: 300px; + padding-right: 0 +} + +.scrollable-xs { + overflow-y: scroll; + height: 200px +} + +.scrollable-sm { + overflow-y: scroll; + height: 400px +} + +.scrollable-lg { + overflow-y: scroll; + height: 500px +} + +.toggle-button .glyph-icon { + -webkit-transition-duration: .5s; + -moz-transition-duration: .5s; + -o-transition-duration: .5s; + transition-duration: .5s; + -webkit-transition-property: -webkit-transform; + -moz-transition-property: -moz-transform; + -o-transition-property: -o-transform; + transition-property: transform +} + +.hidden-button .content-box-header .btn, .hidden-button .content-box-header a, .hidden-button .content-box-header button { + display: none +} + +.content-box.border-top .content-box-header { + font-size: 18px; + margin: 0 +} + +.content-box.border-top .content-box-header small { + opacity: .8; + -moz-opacity: .8; + filter: alpha(opacity: 80) +} + +.content-box.border-top .content-box-header+.content-box-wrapper { + padding-top: 0 +} + +.box-xs { + width: 200px +} + +.box-sm { + width: 324px +} + +.box-md { + width: 400px +} + +.box-lg { + width: 500px +} + +.content-box-header>.ui-tabs-nav { + position: absolute; + top: 2px; + right: 0; + padding: 0; + list-style: none; + border: 0 +} + +.content-box-header>.ui-tabs-nav li>a { + line-height: 49px; + height: 49px; + margin: 0 2px; + color: rgba(255, 255, 255, .7); + border: 0; + background: 0 0 +} + +.content-box-header>.ui-tabs-nav li>a:hover { + color: #fff; + background: rgba(255, 255, 255, .2) +} + +.panel-heading>.dropdown .dropdown-toggle, .panel-title, .panel-title>a { + color: inherit +} + +.content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active>a, .content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active>a, .content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active>a { + line-height: 46px; + height: 46px; + background: #F6F6F9 +} + +.content-box-header.bg-default>.ui-tabs-nav li>a, .content-box-header.bg-gray>.ui-tabs-nav li>a, .content-box-header.bg-white>.ui-tabs-nav li>a { + line-height: 50px; + height: 50px; + margin: 0; + border-radius: 0 +} + +.content-box-header.bg-default>.ui-tabs-nav, .content-box-header.bg-gray>.ui-tabs-nav, .content-box-header.bg-white>.ui-tabs-nav { + top: 0 +} + +.content-box-header>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header>.ui-tabs-nav li.ui-tabs-active>a { + line-height: 47px; + height: 49px; + background: #fff +} + +.panel { + margin-bottom: 20px; + border-width: 1px; + border-style: solid; + border-radius: 4px; + background-color: #fff; + box-shadow: 0 1px 1px rgba(0, 0, 0, .05) +} + +.panel-title, .panel>.list-group { + margin-bottom: 0 +} + +.panel-body { + padding: 15px 20px; + position: relative +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent +} + +.panel-title { + font-size: 16px; + margin-top: 0 +} + +.panel-footer { + padding: 10px 15px; + border-top: 1px solid transparent +} + +.panel>.list-group .list-group-item { + border-width: 1px 0; + border-radius: 0 +} + +.panel-group .panel-heading, .panel>.list-group:last-child .list-group-item:last-child { + border-bottom: 0 +} + +.panel>.list-group:first-child .list-group-item:first-child { + border-top: 0 +} + +.panel-heading+.list-group .list-group-item:first-child { + border-top-width: 0 +} + +.panel-group { + margin-bottom: 20px +} + +.panel-group .panel { + overflow: hidden; + margin-bottom: 0 +} + +.panel-group .panel+.panel { + margin-top: 5px +} + +.panel-group .panel-heading+.panel-collapse .panel-body { + border-top: 1px solid transparent +} + +.panel-group .panel-footer { + border-top: 0 +} + +.panel-group .panel-footer+.panel-collapse .panel-body { + border-bottom: 1px solid transparent +} + +fieldset, legend { + padding: 0; + border: 0 +} + +fieldset { + margin: 0 +} + +legend { + font-size: 21px; + line-height: inherit; + display: block; + width: 100%; + margin-bottom: 20px; + color: #333; + border-bottom: 1px solid #dfe8f1 +} + +label { + font-weight: 700; + display: inline-block +} + +.checkbox, .radio, input[type=file], output { + display: block +} + +input[type=checkbox], input[type=radio] { + line-height: normal +} + +select[multiple], select[size] { + height: auto +} + +select optgroup { + font-family: inherit; + font-size: inherit; + font-style: inherit +} + +input[type=file]:focus, input[type=checkbox]:focus, input[type=radio]:focus { + outline: #333 dotted thin; + outline: -webkit-focus-ring-color auto 5px; + outline-offset: -2px +} + +input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { + height: auto +} + +output { + font-size: 14px; + line-height: 1.428571429; + padding-top: 7px; + vertical-align: middle; + color: #555 +} + +.bootstrap-timepicker-widget table td input, .chosen-container-multi, .chosen-container-single .chosen-search input, .dataTables_length select, .form-control, .input, .ui-toolbar input, .ui-toolbar select, div.dataTables_filter input { + font-size: 13px; + display: block; + float: none; + background: #fff; + width: 100%; + height: 34px; + padding: 6px 12px; + color: #2b2f33; + border: 1px solid #dfe8f1; + -webkit-box-shadow: inset 1px 1px 3px #f6f6f6; + -moz-box-shadow: inset 1px 1px 3px #f6f6f6; + box-shadow: inset 1px 1px 3px #f6f6f6 +} + +.chosen-container-multi.chosen-with-drop.chosen-container-active { + border: 1px solid #ddd; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; + box-shadow: 0 0 0 transparent +} + +.bootstrap-timepicker-widget table td input:focus, .chosen-container-active, .chosen-container-multi.chosen-container-active, .form-control:focus, .input:focus, .selector.focus, .ui-toolbar input:focus, .ui-toolbar select:focus, div.dataTables_filter input:focus { + color: #333; + border-color: #3da6ff +} + +.form-control:-moz-placeholder { + color: #999 +} + +.form-control::-moz-placeholder { + color: #999 +} + +.form-control:-ms-input-placeholder { + color: #999 +} + +.form-control::-webkit-input-placeholder { + color: #999 +} + +textarea.form-control { + height: auto +} + +.form-group { + margin-bottom: 15px +} + +.form-group label { + margin-bottom: 5px +} + +.form-group .switch-toggle { + margin-top: 6px +} + +.checkbox, .radio { + min-height: 20px; + margin-top: 10px; + margin-bottom: 10px; + vertical-align: middle +} + +.checkbox label, .radio label { + font-weight: 400; + display: inline; + margin-bottom: 0; + cursor: pointer +} + +.checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], .radio input[type=radio], .radio-inline input[type=radio] { + float: left +} + +.checkbox+.checkbox, .radio+.radio { + margin-top: -5px +} + +.checkbox-inline, .radio-inline { + font-weight: 400; + line-height: 19px; + display: inline-block; + height: 19px; + margin-bottom: 0; + cursor: pointer; + vertical-align: middle +} + +.checkbox-inline label, .radio-inline label { + font-weight: 400; + line-height: 17px +} + +.checkbox-inline+.checkbox-inline, .radio-inline+.radio-inline { + margin-top: 0; + margin-left: 10px +} + +.checkbox-inline[disabled], .checkbox[disabled], .radio-inline[disabled], .radio[disabled], fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline, fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] input[type=checkbox], fieldset[disabled] input[type=radio], input[type=checkbox][disabled], input[type=radio][disabled] { + cursor: not-allowed +} + +.input-sm { + font-size: 12px; + line-height: 1.5; + height: 30px; + padding: 5px 10px; + border-radius: 3px +} + +select.input-sm { + line-height: 30px; + height: 30px +} + +textarea.input-sm { + height: auto +} + +.input-lg { + font-size: 18px; + line-height: 1.33; + height: 45px; + padding: 10px 16px; + border-radius: 6px +} + +select.input-lg { + line-height: 45px; + height: 45px +} + +textarea.input-lg { + height: auto +} + +.form-control-static { + margin-bottom: 0 +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 0; + color: #737373 +} + +@media (min-width:768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle + } + + .form-inline .form-control { + display: inline-block + } + + .form-inline .checkbox, .form-inline .radio { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + padding-left: 0 + } + + .form-inline .checkbox input[type=checkbox], .form-inline .radio input[type=radio] { + float: none; + margin-left: 0 + } + + .form-horizontal .control-label { + text-align: right + } +} + +.form-horizontal .checkbox, .form-horizontal .checkbox-inline, .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .radio-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: 7px +} + +.form-horizontal>.form-group { + margin-right: -15px; + margin-left: -15px +} + +.form-horizontal .form-group:after, .form-horizontal .form-group:before { + display: table; + content: ' ' +} + +.form-horizontal .form-control-static { + padding-top: 7px +} + +.input-group { + position: relative; + display: table; + width: 100%; + border-collapse: separate +} + +.input-group.col { + float: none; + padding-right: 0; + padding-left: 0 +} + +.input-group .form-control { + width: 100%; + margin-bottom: 0 +} + +.input-group-lg>.form-control, .input-group-lg>.input-group-addon, .input-group-lg>.input-group-btn>.btn { + font-size: 18px; + line-height: 1.33; + height: 45px; + padding: 10px 16px; + border-radius: 6px +} + +select.input-group-lg>.form-control, select.input-group-lg>.input-group-addon, select.input-group-lg>.input-group-btn>.btn { + line-height: 45px; + height: 45px +} + +textarea.input-group-lg>.form-control, textarea.input-group-lg>.input-group-addon, textarea.input-group-lg>.input-group-btn>.btn { + height: auto +} + +.input-group-sm>.form-control, .input-group-sm>.input-group-addon, .input-group-sm>.input-group-btn>.btn { + font-size: 12px; + line-height: 1.5; + height: 30px; + padding: 5px 10px; + border-radius: 3px +} + +select.input-group-sm>.form-control, select.input-group-sm>.input-group-addon, select.input-group-sm>.input-group-btn>.btn { + line-height: 30px; + height: 30px +} + +textarea.input-group-sm>.form-control, textarea.input-group-sm>.input-group-addon, textarea.input-group-sm>.input-group-btn>.btn { + height: auto +} + +.input-group .form-control, .input-group-addon, .input-group-btn { + display: table-cell +} + +.input-group .form-control:not(:first-child):not(:last-child), .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child) { + border-radius: 0 +} + +.input-group-addon div[id^=uniform-] { + margin: 0 -3px +} + +.input-group-addon, .input-group-btn { + width: 1%; + vertical-align: middle; + white-space: nowrap +} + +.input-group-addon { + font-size: 14px; + font-weight: 400; + line-height: 1; + padding: 6px 12px; + text-align: center; + color: #2b2f33; + background-color: rgba(239, 244, 246, .36); + border: 1px solid #dfe8f1; + border-radius: 4px +} + +body, label { + color: #3e4855 +} + +.input-group-addon .glyph-icon { + display: block; + min-width: 20px; + margin: 0 -4px; + text-align: center +} + +.input-group-addon.addon-inside { + line-height: 24px; + position: absolute; + top: 5px; + left: 6px; + display: block; + width: 32px; + height: 24px; + padding: 0; + border-width: 1px; + border-style: solid +} + +.input-group-btn, .input-group-btn>.btn, .ui-spinner { + position: relative +} + +.input-group-lg .input-group-addon.addon-inside { + top: 10px; + left: 10px; + z-index: 999 +} + +.input-group-addon.addon-inside .glyph-icon { + margin: 0 +} + +.input-group-addon.addon-inside+input { + padding-left: 48px +} + +.input-group-addon.input-sm { + font-size: 12px; + padding: 5px 10px; + border-radius: 3px +} + +.input-group-addon.input-lg { + font-size: 18px; + padding: 10px 16px; + border-radius: 6px +} + +.input-group-addon input[type=checkbox], .input-group-addon input[type=radio] { + margin-top: 0 +} + +.input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child>.btn, .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group-addon:first-child { + border-right: 0 +} + +.input-group-addon.addon-inside:first-child { + border-right-width: 1px; + border-right-style: solid; + border-color: transparent; + z-index: 999 +} + +.input-group-addon+.form-control, .input-group-addon:last-child, .input-group-btn+.form-control, .input-group-btn:first-child>.btn:not(:first-child), .input-group-btn:last-child>.btn, .input-group-btn:last-child>.dropdown-toggle { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group-addon:last-child { + border-left: 0 +} + +.input-group-btn:first-child>.btn { + margin-right: -1px +} + +.input-group-btn:last-child>.btn { + margin-left: -1px +} + +.input-group-btn>.btn+.btn { + margin-left: -4px +} + +.input-group-btn>.btn:active, .input-group-btn>.btn:hover { + z-index: 2 +} + +[data-toggle=buttons]>.btn>input[type=checkbox], [data-toggle=buttons]>.btn>input[type=radio] { + display: none +} + +textarea.textarea-autoresize, textarea.textarea-no-resize { + resize: none +} + +.textarea-autosize { + transition: height .3s; + -webkit-transition: height .3s; + -moz-transition: height .3s +} + +textarea.form-control { + line-height: 1.6em; + padding: 8px 12px +} + +textarea.textarea-xs { + height: 50px +} + +textarea.textarea-sm { + height: 125px +} + +textarea.textarea-md { + height: 200px +} + +textarea.textarea-lg { + height: 275px +} + +.ui-spinner { + display: block +} + +.xchart .color0.comp .fill, .xchart .color1.comp .fill { + display: none +} + +.ui-spinner .ui-spinner-button { + font-size: 9px; + line-height: 17px; + position: absolute; + right: 0; + width: 17px; + height: 17px; + cursor: pointer; + text-align: center; + border-width: 1px; + border-style: solid +} + +.ui-spinner .ui-spinner-up { + top: 0 +} + +.ui-spinner .ui-spinner-down { + bottom: 0 +} + +.parsley-errors-list li { + font-size: 12px; + padding-top: 5px +} + +.bordered-row>.form-group { + padding: 20px 0; + margin-bottom: 0; + border-top-width: 1px; + border-top-style: dashed +} + +.bordered-row>.form-group:last-child { + padding-bottom: 0 +} + +.form-group .ui-slider { + margin-top: 14px +} + +.form-group .ui-slider+.input-group { + margin-top: 20px +} + +body { + font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + background-color: #fff; + line-height: 1.42857143 +} + +#page-title>h2, #page-title>p, h1, h2, h3, h4, h5, h6 { + font-family: Raleway, "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: 300 +} + +#page-header .user-account-btn>a.user-profile .glyph-icon, .logo-bg { + background-color: rgba(255, 255, 255, .1); + color: #fff +} + +#page-header .user-account-btn>a.user-profile { + color: #fff +} + +#header-nav-right .dropdown>a .glyph-icon, #header-nav-right .header-btn .glyph-icon { + color: rgba(255, 255, 255, .8) +} + +#header-nav-right .dropdown>a:hover .glyph-icon, #header-nav-right .header-btn:hover .glyph-icon { + color: rgba(255, 255, 255, .95) +} + +#header-nav-right .dropdown>a, #header-nav-right .header-btn { + border-color: rgba(255, 255, 255, .2) +} + +#header-nav-right .dropdown>a:hover, #header-nav-right .header-btn:hover { + background: rgba(255, 255, 255, .05); + border-color: rgba(255, 255, 255, .25) +} + +#page-content { + background: #fafcfe +} + +#page-sidebar ul li.header { + color: #000 +} + +#page-sidebar ul li a .glyph-icon { + color: #0093d9 +} + +#page-sidebar ul li a:hover, #page-sidebar ul li.sfHover>a.sf-with-ul { + border-color: #d1d9dd +} + +#sidebar-menu li .sidebar-submenu { + border-color: #f6f7f8 +} + +#sidebar-menu li .sidebar-submenu ul li { + border-color: #f8f9fa +} + +#sidebar-menu li .sidebar-submenu ul li a.sfActive, #sidebar-menu li .sidebar-submenu ul li a:hover { + background: #fcfdfe +} + +#sidebar-menu li .sidebar-submenu ul li a.sfActive { + color: #1c82e1 +} + +#page-sidebar.font-inverse ul li.header { + color: rgba(255, 255, 255, .95) +} + +#page-sidebar.font-inverse ul li.divider { + background: rgba(255, 255, 255, .1) +} + +#page-sidebar.font-inverse #sidebar-menu>li>a { + color: rgba(255, 255, 255, .62) +} + +#page-sidebar.font-inverse #sidebar-menu li a:hover, #page-sidebar.font-inverse #sidebar-menu li.sfHover>a.sf-with-ul { + border-color: rgba(255, 255, 255, .26); + color: rgba(255, 255, 255, .96) +} + +#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu { + border-color: rgba(255, 255, 255, .08); + background: rgba(255, 255, 255, .05) +} + +#page-sidebar.font-inverse #sidebar-menu li a { + color: rgba(255, 255, 255, .62) +} + +#page-sidebar.font-inverse #sidebar-menu li a:hover { + color: rgba(255, 255, 255, .96) +} + +#page-sidebar.font-inverse#page-sidebar ul li a .glyph-icon { + color: rgba(255, 255, 255, .8) +} + +#page-sidebar.font-inverse#page-sidebar ul li a:hover .glyph-icon { + color: rgba(255, 255, 255, 1); + opacity: .9; + -moz-opacity: .9; + filter: alpha(opacity: 90) +} + +#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li { + border-color: rgba(255, 255, 255, .07) +} + +#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li a:hover { + background: rgba(255, 255, 255, .05) +} + +.btn-link, .chosen-disabled .chosen-single, .content-box-header.bg-default>.ui-tabs-nav li>a, .content-box-header.bg-gray>.ui-tabs-nav li>a, .content-box-header.bg-white>.ui-tabs-nav li>a, .content-box-header>.ui-tabs-nav li.ui-tabs-active>a, .pagination>li>a, .pagination>li>span, .table, a, body .content-box-header>.ui-tabs-nav li.ui-tabs-active>a:hover, div.selector { + color: #8da0aa +} + +#page-sidebar ul li.sfHover>a.sf-with-ul, .btn-link:hover, .content-box-header.bg-default>.ui-tabs-nav li>a:hover, .content-box-header.bg-gray>.ui-tabs-nav li>a:hover, .content-box-header.bg-white>.ui-tabs-nav li>a:hover, .features-tour-box h3, .font-primary, .tabs-nav li a:hover, .tabs-nav li.active a, a:hover, table.dataTable thead th.sorting_asc:after, table.dataTable thead th.sorting_desc:after { + color: #1c82e1 +} + +.border-primary, .btn-primary, .nav>li.active>a, .nav>li.active>a:focus, .nav>li.active>a:hover, .ui-accordion .ui-accordion-header.ui-accordion-header-active, .ui-datepicker .ui-datepicker-next, .ui-datepicker .ui-datepicker-prev, .ui-dialog-buttonset button, .ui-spinner .ui-spinner-button:hover, a.list-group-item.active, a.list-group-item.active:focus, a.list-group-item.active:hover, a.thumbnail:hover, div[id^=uniform-] span.checked, li.active a.list-group-item, li.active a.list-group-item:focus, li.active a.list-group-item:hover { + border-color: #00a792 +} + +a:focus { + outline: 0 !important +} + +#loadingbar, #nav-toggle span:after, #nav-toggle span:before, #nav-toggle.collapsed span, .badge-primary, .bg-primary, .bootstrap-switch-primary, .btn-primary, .chosen-container .chosen-results li.active-result.highlighted, .daterangepicker .ranges li.active, .daterangepicker .ranges li.active:hover, .fc-event, .form-wizard>ul>li.active .wizard-step, .irs-line-left, .irs-line-mid, .irs-line-right, .label-primary, .ms-hover.ui-state-focus, .ms-list .ms-hover, .nav>li.active>a, .nav>li.active>a:focus, .nav>li.active>a:hover, .owl-controls .owl-page span, .ui-accordion-header.ui-accordion-header-active, .ui-datepicker .ui-datepicker-current-day a, .ui-datepicker .ui-datepicker-current-day span, .ui-datepicker .ui-datepicker-next, .ui-datepicker .ui-datepicker-prev, .ui-dialog-buttonset button, .ui-menu li>a:hover, .ui-rangeSlider-bar, .ui-slider-handle, .ui-spinner .ui-spinner-button:hover, .ui-tabs-nav li.ui-state-active.ui-state-hover>a, .ui-tabs-nav li.ui-state-active>a, a.list-group-item.active, a.list-group-item.active:focus, a.list-group-item.active:hover, div.switch-toggle.switch-on, div[id^=uniform-] span.checked, li.active a.list-group-item, li.active a.list-group-item:focus, li.active a.list-group-item:hover { + color: #fff; + background: #00bca4 +} + +.font-secondary, .inverse.carousel-wrapper .owl-controls .owl-buttons .owl-next, .inverse.carousel-wrapper .owl-controls .owl-buttons .owl-prev, .post-box .post-title { + color: #00bca4 +} + +.post-box .post-title:hover { + color: #3e4855 +} + +.bg-default, .bg-white.dashboard-box .button-pane, .bg-white.tile-box .tile-footer, .border-default, .bordered-row .form-group, .btn-default, .button-pane, .chosen-container, .chosen-container .chosen-drop, .chosen-container-active.chosen-with-drop .chosen-single div, .chosen-container-multi .chosen-choices li.search-choice, .chosen-container-single .chosen-single div, .content-box, .content-box-header.bg-default, .content-box-header.bg-gray, .content-box-header.bg-white, .dashboard-buttons .btn, .daterangepicker .calendar-date, .dropdown-menu, .email-body, .fc-state-default, .fc-widget-content, .fc-widget-header, .img-thumbnail, .jvectormap-label, .jvectormap-zoomin, .jvectormap-zoomout, .list-group-item, .mail-toolbar, .mailbox-wrapper .nav-list li a, .minicolors-panel, .ms-container .ms-list, .ms-container .ms-selectable li.ms-elem-selectable, .ms-container .ms-selection li.ms-elem-selection, .nav .open>a, .nav .open>a:focus, .nav .open>a:hover, .nav-tabs, .nav-tabs>li>a:focus, .nav-tabs>li>a:hover, .pagination>li>a, .pagination>li>span, .panel, .panel-box.bg-default, .panel-box.bg-gray, .panel-box.bg-white, .panel-content.bg-default, .panel-content.bg-gray, .panel-content.bg-white, .panel-footer, .panel-group .panel-footer+.panel-collapse .panel-body, .panel-group .panel-heading+.panel-collapse .panel-body, .panel-heading, .popover, .popover-title, .posts-list li, .selector i, .table-bordered, .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, .table>thead>tr>td, .table>thead>tr>th, .tabs-navigation>ul, .tabs-navigation>ul li.ui-state-hover>a, .tabs-navigation>ul li>a, .thumb-pane, .thumbnail, .timeline-box .tl-item .popover, .timeline-box:before, .ui-accordion .ui-accordion-header, .ui-datepicker, .ui-datepicker .ui-datepicker-buttonpane button, .ui-datepicker-buttonpane, .ui-dialog, .ui-dialog .ui-dialog-titlebar, .ui-dialog-buttonpane, .ui-menu, .ui-spinner .ui-spinner-button, .ui-tabs-nav, div.selector, div[id^=uniform-] span { + border-color: #dfe8f1 +} + +.divider, .nav-divider, .timeline-horizontal.timeline-box:before { + background: #dfe8f1 +} + +.content-box.border-top { + border-right-color: #dfe8f1 !important; + border-bottom-color: #dfe8f1 !important; + border-left-color: #dfe8f1 !important +} + +.bg-default, .bg-white.dashboard-box .button-pane, .bg-white.tile-box .tile-footer, .bootstrap-switch-default, .btn-default, .button-pane, .jvectormap-label, .jvectormap-zoomin, .jvectormap-zoomout, .label-default, .mail-toolbar, .panel-footer, .panel-heading, .popover-title, .ui-accordion-header, .ui-datepicker td a, .ui-datepicker td span, .ui-dialog .ui-dialog-titlebar, .ui-spinner .ui-spinner-button, div[id^=uniform-] span { + color: #555a60; + background-color: #FEFEFF +} + +.irs-diapason, .ui-datepicker-buttonpane, .ui-dialog-buttonpane, .ui-rangeSlider-container, .ui-slider-range { + background-color: #FEFEFF +} + +.table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>th { + color: #4b5056; + background-color: #f9fafe +} + +.btn-default.active, .btn-default.disabled, .btn-default.disabled.active, .btn-default.disabled:active, .btn-default.disabled:focus, .btn-default.disabled:hover, .btn-default:active, .btn-default:focus, .btn-default:hover, .btn-default[disabled], .btn-default[disabled].active, .btn-default[disabled]:active, .btn-default[disabled]:focus, .btn-default[disabled]:hover, .fc-state-active, .fc-state-disabled, .fc-state-down, .fc-state-hover, .jvectormap-zoomin:hover, .jvectormap-zoomout:hover, .open .dropdown-toggle.btn-default, .open.dropdown-submenu a, .ui-accordion-header.ui-state-hover, .ui-datepicker .ui-datepicker-buttonpane button:hover, .ui-tabs-nav>li.ui-state-hover>a { + color: #2b2f33; + border-color: #bfc8d1; + background-color: #f3f3f9 +} + +.btn-default.active .glyph-icon { + color: #2b2f33 !important +} + +.bsdatepicker td span:hover, .bsdatepicker td.active, .bsdatepicker td.day.active:hover, .bsdatepicker th.next:hover, .bsdatepicker th.prev:hover, .btn-primary.active, .btn-primary.disabled, .btn-primary.disabled.active, .btn-primary.disabled:active, .btn-primary.disabled:focus, .btn-primary.disabled:hover, .btn-primary:active, .btn-primary:focus, .btn-primary:hover, .btn-primary[disabled], .btn-primary[disabled].active, .btn-primary[disabled]:active, .btn-primary[disabled]:focus, .btn-primary[disabled]:hover, .daterangepicker .calendar th.next:hover, .daterangepicker .calendar th.prev:hover, .daterangepicker td.active, .daterangepicker td.available.active:hover, .hover-primary:hover, .label-primary[href]:focus, .label-primary[href]:hover, .open .dropdown-toggle.btn-primary, .pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover, .ui-accordion-header.ui-accordion-header-active.ui-state-hover, .ui-datepicker .ui-datepicker-next.ui-state-hover, .ui-datepicker .ui-datepicker-prev.ui-state-hover, .ui-datepicker td a:hover, .ui-dialog-buttonset button:hover, .ui-rangeSlider-bar:active, .ui-rangeSlider-bar:hover, .ui-slider-handle.ui-state-active, .ui-slider-handle.ui-state-hover { + color: #fff; + border-color: #00b19b; + background-color: #00ceb4 +} + +.bsdatepicker td span, .bsdatepicker td.day:hover, .bsdatepicker thead tr:first-child th.switch:hover, .chosen-container-multi .chosen-choices li.search-choice, .chosen-container-single .chosen-single div, .daterangepicker .ranges li:hover, .daterangepicker td.available:hover, .nav>li>a:focus, .nav>li>a:hover, .pager li>a:focus, .pager li>a:hover, .pagination>li>a:focus, .pagination>li>a:hover, .pagination>li>span:focus, .pagination>li>span:hover, .selector i, .ui-datepicker-title, a.list-group-item:focus, a.list-group-item:hover { + color: #2b2f33; + background: #eff4f6 +} + +.pager li>a:focus, .pager li>a:hover, .pagination>li>a:focus, .pagination>li>a:hover, .pagination>li>span:focus, .pagination>li>span:hover { + color: #2b2f33; + background-color: #f3f3f9 +} + +.dropdown-menu .active>a, .dropdown-menu .active>a:focus, .dropdown-menu .active>a:hover, .dropdown-menu li>a:hover { + color: #2b2f33; + background: #eff4f6 +} + +.active>.badge, .active>.bs-badge, .active>.bs-label { + color: #666 !important; + background: #fff !important +} + +.active>.glyph-icon, a.list-group-item.active>.glyph-icon, li.active a.list-group-item>.glyph-icon { + color: #fff !important +} + +.icon-separator { + border-right: rgba(255, 255, 255, .21) solid 1px; + background: rgba(255, 255, 255, .2) +} + +.content-box-header.bg-default .icon-separator, .content-box-header.bg-gray .icon-separator, .content-box-header.bg-white .icon-separator, .tile-box.bg-default .tile-header, .tile-box.bg-gray .tile-header, .tile-box.bg-white .tile-header, .tile-box.btn-default .tile-header { + border-right: #dfe8f1 solid 1px; + background: rgba(255, 255, 255, .1) +} + +.content-box-header .header-buttons-separator .icon-separator { + border-right: 0; + border-left: rgba(255, 255, 255, .21) solid 1px +} + +.header-buttons-separator .icon-separator { + color: rgba(255, 255, 255, .8) +} + +.header-buttons-separator .icon-separator:hover { + color: #fff; + background: rgba(255, 255, 255, .3) +} + +.content-box-header.bg-default .header-buttons-separator .icon-separator, .content-box-header.bg-gray .header-buttons-separator .icon-separator, .content-box-header.bg-white .header-buttons-separator .icon-separator { + border-right: 0; + border-left: #dfe8f1 solid 1px; + color: rgba(0, 0, 0, .6) +} + +.content-box-header.bg-default .header-buttons-separator .icon-separator:hover, .content-box-header.bg-gray .header-buttons-separator .icon-separator:hover, .content-box-header.bg-white .header-buttons-separator .icon-separator:hover { + color: rgba(0, 0, 0, .9) +} + +.dashboard-panel .button-pane { + background: rgba(0, 0, 0, .1) !important +} + +.xchart .color0 rect { + fill: #00bca4 +} + +.xchart .color0 circle { + fill: #fff +} + +.xchart .color0 .fill { + fill: rgba(0, 188, 164, .06) +} + +.xchart .color0.comp .pointer, .xchart .color0.comp circle, .xchart .color0.comp rect { + fill: #00bca4 +} + +.xchart .color1 .line, .xchart .color1 circle, .xchart .color1.comp .line { + stroke: #52a7e0 +} + +.xchart .color1 rect { + fill: #52a7e0 +} + +.xchart .color1 circle { + fill: #fff +} + +.xchart .color1 .fill { + fill: rgba(82, 167, 224, .06) +} + +.xchart .color1.comp .pointer, .xchart .color1.comp circle, .xchart .color1.comp rect { + fill: #52a7e0 +} + +body .popover.top .arrow:after { + border-top-color: #fff +} + +body .popover.right .arrow:after { + border-right-color: #fff +} + +body .popover.bottom .arrow:after { + border-bottom-color: #fff +} + +body .popover.left .arrow:after { + border-left-color: #fff +} @font-face { - font-family: 'FontAwesome'; - src: url('fontawesome-webfont.eot?v=4.0.3'); - src: url('fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), - url('fontawesome-webfont.woff?v=4.0.3') format('woff'), - url('fontawesome-webfont.ttf?v=4.0.3') format('truetype'), - url('fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; + font-family: 'FontAwesome'; + src: url('fontawesome-webfont.eot?v=4.0.3'); + src: url('fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), + url('fontawesome-webfont.woff?v=4.0.3') format('woff'), + url('fontawesome-webfont.ttf?v=4.0.3') format('truetype'), + url('fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; } .icon-glass:before { - content: "\f000"; + content: "\f000"; } + .icon-music:before { - content: "\f001"; + content: "\f001"; } + .icon-search:before { - content: "\f002"; + content: "\f002"; } + .icon-envelope-o:before { - content: "\f003"; + content: "\f003"; } + .icon-heart:before { - content: "\f004"; + content: "\f004"; } + .icon-star:before { - content: "\f005"; + content: "\f005"; } + .icon-star-o:before { - content: "\f006"; + content: "\f006"; } + .icon-user:before { - content: "\f007"; + content: "\f007"; } + .icon-film:before { - content: "\f008"; + content: "\f008"; } + .icon-th-large:before { - content: "\f009"; + content: "\f009"; } + .icon-th:before { - content: "\f00a"; + content: "\f00a"; } + .icon-th-list:before { - content: "\f00b"; + content: "\f00b"; } + .icon-check:before { - content: "\f00c"; + content: "\f00c"; } + .icon-times:before, .icon-remove:before, .search-choice-close:before, @@ -57,1589 +4111,2091 @@ pre,pre code{white-space:pre-wrap}.clear,.form-row:after,.row:after{clear:both}. .ui-dialog-titlebar-close:before, .icon-clock-os:before, .icon-close:before { - content: "\f00d"; + content: "\f00d"; } + .icon-search-plus:before { - content: "\f00e"; + content: "\f00e"; } + .icon-search-minus:before { - content: "\f010"; + content: "\f010"; } + .icon-power-off:before { - content: "\f011"; + content: "\f011"; } + .icon-signal:before { - content: "\f012"; + content: "\f012"; } + .icon-gear:before, .icon-cog:before { - content: "\f013"; + content: "\f013"; } + .icon-trash-o:before { - content: "\f014"; + content: "\f014"; } + .icon-home:before { - content: "\f015"; + content: "\f015"; } + .icon-file-o:before { - content: "\f016"; + content: "\f016"; } + .icon-clock-o:before { - content: "\f017"; + content: "\f017"; } + .icon-road:before { - content: "\f018"; + content: "\f018"; } + .icon-download:before { - content: "\f019"; + content: "\f019"; } + .icon-arrow-circle-o-down:before { - content: "\f01a"; + content: "\f01a"; } + .icon-arrow-circle-o-up:before { - content: "\f01b"; + content: "\f01b"; } + .icon-inbox:before { - content: "\f01c"; + content: "\f01c"; } + .icon-play-circle-o:before { - content: "\f01d"; + content: "\f01d"; } + .icon-rotate-right:before, .icon-repeat:before { - content: "\f01e"; + content: "\f01e"; } + .icon-refresh:before { - content: "\f021"; + content: "\f021"; } + .icon-list-alt:before { - content: "\f022"; + content: "\f022"; } + .icon-lock:before { - content: "\f023"; + content: "\f023"; } + .icon-flag:before { - content: "\f024"; + content: "\f024"; } + .icon-headphones:before { - content: "\f025"; + content: "\f025"; } + .icon-volume-off:before { - content: "\f026"; + content: "\f026"; } + .icon-volume-down:before { - content: "\f027"; + content: "\f027"; } + .icon-volume-up:before { - content: "\f028"; + content: "\f028"; } + .icon-qrcode:before { - content: "\f029"; + content: "\f029"; } + .icon-barcode:before { - content: "\f02a"; + content: "\f02a"; } + .icon-tag:before { - content: "\f02b"; + content: "\f02b"; } + .icon-tags:before { - content: "\f02c"; + content: "\f02c"; } + .icon-book:before { - content: "\f02d"; + content: "\f02d"; } + .icon-bookmark:before { - content: "\f02e"; + content: "\f02e"; } + .icon-print:before { - content: "\f02f"; + content: "\f02f"; } + .icon-camera:before { - content: "\f030"; + content: "\f030"; } + .icon-font:before { - content: "\f031"; + content: "\f031"; } + .icon-bold:before { - content: "\f032"; + content: "\f032"; } + .icon-italic:before { - content: "\f033"; + content: "\f033"; } + .icon-text-height:before { - content: "\f034"; + content: "\f034"; } + .icon-text-width:before { - content: "\f035"; + content: "\f035"; } + .icon-align-left:before { - content: "\f036"; + content: "\f036"; } + .icon-align-center:before { - content: "\f037"; + content: "\f037"; } + .icon-align-right:before { - content: "\f038"; + content: "\f038"; } + .icon-align-justify:before { - content: "\f039"; + content: "\f039"; } + .icon-list:before { - content: "\f03a"; + content: "\f03a"; } + .icon-dedent:before, .icon-outdent:before { - content: "\f03b"; + content: "\f03b"; } + .icon-indent:before { - content: "\f03c"; + content: "\f03c"; } + .icon-video-camera:before { - content: "\f03d"; + content: "\f03d"; } + .icon-photo:before, .icon-image:before, .icon-picture-o:before { - content: "\f03e"; + content: "\f03e"; } + .icon-pencil:before { - content: "\f040"; + content: "\f040"; } + .icon-map-marker:before { - content: "\f041"; + content: "\f041"; } + .icon-adjust:before { - content: "\f042"; + content: "\f042"; } + .icon-tint:before { - content: "\f043"; + content: "\f043"; } + .icon-edit:before, .icon-pencil-square-o:before { - content: "\f044"; + content: "\f044"; } + .icon-share-square-o:before { - content: "\f045"; + content: "\f045"; } + .icon-check-square-o:before { - content: "\f046"; + content: "\f046"; } + .icon-arrows:before { - content: "\f047"; + content: "\f047"; } + .icon-step-backward:before { - content: "\f048"; + content: "\f048"; } + .icon-fast-backward:before { - content: "\f049"; + content: "\f049"; } + .icon-backward:before { - content: "\f04a"; + content: "\f04a"; } + .icon-play:before { - content: "\f04b"; + content: "\f04b"; } + .icon-pause:before { - content: "\f04c"; + content: "\f04c"; } + .icon-stop:before { - content: "\f04d"; + content: "\f04d"; } + .icon-forward:before { - content: "\f04e"; + content: "\f04e"; } + .icon-fast-forward:before { - content: "\f050"; + content: "\f050"; } + .icon-step-forward:before { - content: "\f051"; + content: "\f051"; } + .icon-eject:before { - content: "\f052"; + content: "\f052"; } + .icon-chevron-left:before { - content: "\f053"; + content: "\f053"; } + .icon-chevron-right:before { - content: "\f054"; + content: "\f054"; } + .icon-plus-circle:before { - content: "\f055"; + content: "\f055"; } + .icon-minus-circle:before { - content: "\f056"; + content: "\f056"; } + .icon-times-circle:before { - content: "\f057"; + content: "\f057"; } + .icon-check-circle:before { - content: "\f058"; + content: "\f058"; } + .icon-question-circle:before { - content: "\f059"; + content: "\f059"; } + .icon-info-circle:before { - content: "\f05a"; + content: "\f05a"; } + .icon-crosshairs:before { - content: "\f05b"; + content: "\f05b"; } + .icon-times-circle-o:before { - content: "\f05c"; + content: "\f05c"; } + .icon-check-circle-o:before { - content: "\f05d"; + content: "\f05d"; } + .icon-ban:before { - content: "\f05e"; + content: "\f05e"; } + .icon-arrow-left:before { - content: "\f060"; + content: "\f060"; } + .icon-arrow-right:before { - content: "\f061"; + content: "\f061"; } + .icon-arrow-up:before { - content: "\f062"; + content: "\f062"; } + .icon-arrow-down:before { - content: "\f063"; + content: "\f063"; } + .icon-mail-forward:before, .icon-share:before { - content: "\f064"; + content: "\f064"; } + .icon-expand:before { - content: "\f065"; + content: "\f065"; } + .icon-compress:before { - content: "\f066"; + content: "\f066"; } + .icon-plus:before { - content: "\f067"; + content: "\f067"; } + .icon-minus:before { - content: "\f068"; + content: "\f068"; } + .icon-asterisk:before { - content: "\f069"; + content: "\f069"; } + .icon-exclamation-circle:before { - content: "\f06a"; + content: "\f06a"; } + .icon-gift:before { - content: "\f06b"; + content: "\f06b"; } + .icon-leaf:before { - content: "\f06c"; + content: "\f06c"; } + .icon-fire:before { - content: "\f06d"; + content: "\f06d"; } + .icon-eye:before { - content: "\f06e"; + content: "\f06e"; } + .icon-eye-slash:before { - content: "\f070"; + content: "\f070"; } + .icon-warning:before, .icon-exclamation-triangle:before { - content: "\f071"; + content: "\f071"; } + .icon-plane:before { - content: "\f072"; + content: "\f072"; } + .icon-calendar:before { - content: "\f073"; + content: "\f073"; } + .icon-random:before { - content: "\f074"; + content: "\f074"; } + .icon-comment:before { - content: "\f075"; + content: "\f075"; } + .icon-magnet:before { - content: "\f076"; + content: "\f076"; } + .icon-chevron-up:before { - content: "\f077"; + content: "\f077"; } + .icon-chevron-down:before { - content: "\f078"; + content: "\f078"; } + .icon-retweet:before { - content: "\f079"; + content: "\f079"; } + .icon-shopping-cart:before { - content: "\f07a"; + content: "\f07a"; } + .icon-folder:before { - content: "\f07b"; + content: "\f07b"; } + .icon-folder-open:before { - content: "\f07c"; + content: "\f07c"; } + .icon-arrows-v:before { - content: "\f07d"; + content: "\f07d"; } + .icon-arrows-h:before { - content: "\f07e"; + content: "\f07e"; } + .icon-bar-chart-o:before, .icon-bar-chart:before { - content: "\f080"; + content: "\f080"; } + .icon-twitter-square:before { - content: "\f081"; + content: "\f081"; } + .icon-facebook-square:before { - content: "\f082"; + content: "\f082"; } + .icon-camera-retro:before { - content: "\f083"; + content: "\f083"; } + .icon-key:before { - content: "\f084"; + content: "\f084"; } + .icon-gears:before, .icon-cogs:before { - content: "\f085"; + content: "\f085"; } + .icon-comments:before { - content: "\f086"; + content: "\f086"; } + .icon-thumbs-o-up:before { - content: "\f087"; + content: "\f087"; } + .icon-thumbs-o-down:before { - content: "\f088"; + content: "\f088"; } + .icon-star-half:before { - content: "\f089"; + content: "\f089"; } + .icon-heart-o:before { - content: "\f08a"; + content: "\f08a"; } + .icon-sign-out:before { - content: "\f08b"; + content: "\f08b"; } + .icon-linkedin-square:before { - content: "\f08c"; + content: "\f08c"; } + .icon-thumb-tack:before { - content: "\f08d"; + content: "\f08d"; } + .icon-external-link:before { - content: "\f08e"; + content: "\f08e"; } + .icon-sign-in:before { - content: "\f090"; + content: "\f090"; } + .icon-trophy:before { - content: "\f091"; + content: "\f091"; } + .icon-github-square:before { - content: "\f092"; + content: "\f092"; } + .icon-upload:before { - content: "\f093"; + content: "\f093"; } + .icon-lemon-o:before { - content: "\f094"; + content: "\f094"; } + .icon-phone:before { - content: "\f095"; + content: "\f095"; } + .icon-square-o:before { - content: "\f096"; + content: "\f096"; } + .icon-bookmark-o:before { - content: "\f097"; + content: "\f097"; } + .icon-phone-square:before { - content: "\f098"; + content: "\f098"; } + .icon-twitter:before { - content: "\f099"; + content: "\f099"; } + .icon-facebook:before { - content: "\f09a"; + content: "\f09a"; } + .icon-github:before { - content: "\f09b"; + content: "\f09b"; } + .icon-unlock:before { - content: "\f09c"; + content: "\f09c"; } + .icon-credit-card:before { - content: "\f09d"; + content: "\f09d"; } + .icon-rss:before { - content: "\f09e"; + content: "\f09e"; } + .icon-hdd-o:before { - content: "\f0a0"; + content: "\f0a0"; } + .icon-bullhorn:before { - content: "\f0a1"; + content: "\f0a1"; } + .icon-bell:before { - content: "\f0f3"; + content: "\f0f3"; } + .icon-certificate:before { - content: "\f0a3"; + content: "\f0a3"; } + .icon-hand-o-right:before { - content: "\f0a4"; + content: "\f0a4"; } + .icon-hand-o-left:before { - content: "\f0a5"; + content: "\f0a5"; } + .icon-hand-o-up:before { - content: "\f0a6"; + content: "\f0a6"; } + .icon-hand-o-down:before { - content: "\f0a7"; + content: "\f0a7"; } + .icon-arrow-circle-left:before { - content: "\f0a8"; + content: "\f0a8"; } + .icon-arrow-circle-right:before { - content: "\f0a9"; + content: "\f0a9"; } + .icon-arrow-circle-up:before { - content: "\f0aa"; + content: "\f0aa"; } + .icon-arrow-circle-down:before { - content: "\f0ab"; + content: "\f0ab"; } + .icon-globe:before { - content: "\f0ac"; + content: "\f0ac"; } + .icon-wrench:before { - content: "\f0ad"; + content: "\f0ad"; } + .icon-tasks:before { - content: "\f0ae"; + content: "\f0ae"; } + .icon-filter:before { - content: "\f0b0"; + content: "\f0b0"; } + .icon-briefcase:before { - content: "\f0b1"; + content: "\f0b1"; } + .icon-arrows-alt:before { - content: "\f0b2"; + content: "\f0b2"; } + .icon-group:before, .icon-users:before { - content: "\f0c0"; + content: "\f0c0"; } + .icon-chain:before, .icon-link:before { - content: "\f0c1"; + content: "\f0c1"; } + .icon-cloud:before { - content: "\f0c2"; + content: "\f0c2"; } + .icon-flask:before { - content: "\f0c3"; + content: "\f0c3"; } + .icon-cut:before, .icon-scissors:before { - content: "\f0c4"; + content: "\f0c4"; } + .icon-copy:before, .icon-files-o:before { - content: "\f0c5"; + content: "\f0c5"; } + .icon-paperclip:before { - content: "\f0c6"; + content: "\f0c6"; } + .icon-save:before, .icon-floppy-o:before { - content: "\f0c7"; + content: "\f0c7"; } + .icon-square:before { - content: "\f0c8"; + content: "\f0c8"; } + .icon-navicon:before, .icon-reorder:before, .icon-bars:before { - content: "\f0c9"; + content: "\f0c9"; } + .icon-list-ul:before { - content: "\f0ca"; + content: "\f0ca"; } + .icon-list-ol:before { - content: "\f0cb"; + content: "\f0cb"; } + .icon-strikethrough:before { - content: "\f0cc"; + content: "\f0cc"; } + .icon-underline:before { - content: "\f0cd"; + content: "\f0cd"; } + .icon-table:before { - content: "\f0ce"; + content: "\f0ce"; } + .icon-magic:before { - content: "\f0d0"; + content: "\f0d0"; } + .icon-truck:before { - content: "\f0d1"; + content: "\f0d1"; } + .icon-pinterest:before { - content: "\f0d2"; + content: "\f0d2"; } + .icon-pinterest-square:before { - content: "\f0d3"; + content: "\f0d3"; } + .icon-google-plus-square:before { - content: "\f0d4"; + content: "\f0d4"; } + .icon-google-plus:before { - content: "\f0d5"; + content: "\f0d5"; } + .icon-money:before { - content: "\f0d6"; + content: "\f0d6"; } + .ui-accordion-header-icon.ui-icon-triangle-1-s:before, .icon-caret-down:before { - content: "\f0d7"; + content: "\f0d7"; } + .icon-caret-up:before { - content: "\f0d8"; + content: "\f0d8"; } + .icon-caret-left:before { - content: "\f0d9"; + content: "\f0d9"; } + .ui-icon-triangle-1-e:before, .icon-caret-right:before { - content: "\f0da"; + content: "\f0da"; } + .icon-columns:before { - content: "\f0db"; + content: "\f0db"; } + .dataTable .sorting .glyph-icon:before, .dataTable .ui-icon-carat-2-n-s:before, .icon-unsorted:before, .icon-sort:before { - content: "\f0dc"; + content: "\f0dc"; } + .dataTable .sorting_asc .glyph-icon:before, .icon-sort-down:before, .icon-sort-asc:before { - content: "\f0dd"; + content: "\f0dd"; } + .dataTable .sorting_desc .glyph-icon:before, .dataTable .ui-icon-triangle-1-n:before, .icon-sort-up:before, .icon-sort-desc:before { - content: "\f0de"; + content: "\f0de"; } + .icon-envelope:before { - content: "\f0e0"; + content: "\f0e0"; } + .icon-linkedin:before { - content: "\f0e1"; + content: "\f0e1"; } + .icon-rotate-left:before, .icon-undo:before { - content: "\f0e2"; + content: "\f0e2"; } + .icon-legal:before, .icon-gavel:before { - content: "\f0e3"; + content: "\f0e3"; } + .icon-dashboard:before, .icon-tachometer:before { - content: "\f0e4"; + content: "\f0e4"; } + .icon-comment-o:before { - content: "\f0e5"; + content: "\f0e5"; } + .icon-comments-o:before { - content: "\f0e6"; + content: "\f0e6"; } + .icon-flash:before, .icon-bolt:before { - content: "\f0e7"; + content: "\f0e7"; } + .icon-sitemap:before { - content: "\f0e8"; + content: "\f0e8"; } + .icon-umbrella:before { - content: "\f0e9"; + content: "\f0e9"; } + .icon-paste:before, .icon-clipboard:before { - content: "\f0ea"; + content: "\f0ea"; } + .icon-lightbulb-o:before { - content: "\f0eb"; + content: "\f0eb"; } + .icon-exchange:before { - content: "\f0ec"; + content: "\f0ec"; } + .icon-cloud-download:before { - content: "\f0ed"; + content: "\f0ed"; } + .icon-cloud-upload:before { - content: "\f0ee"; + content: "\f0ee"; } + .icon-user-md:before { - content: "\f0f0"; + content: "\f0f0"; } + .icon-stethoscope:before { - content: "\f0f1"; + content: "\f0f1"; } + .icon-suitcase:before { - content: "\f0f2"; + content: "\f0f2"; } + .icon-bell-o:before { - content: "\f0a2"; + content: "\f0a2"; } + .icon-coffee:before { - content: "\f0f4"; + content: "\f0f4"; } + .icon-cutlery:before { - content: "\f0f5"; + content: "\f0f5"; } + .icon-file-text-o:before { - content: "\f0f6"; + content: "\f0f6"; } + .icon-building-o:before { - content: "\f0f7"; + content: "\f0f7"; } + .icon-hospital-o:before { - content: "\f0f8"; + content: "\f0f8"; } + .icon-ambulance:before { - content: "\f0f9"; + content: "\f0f9"; } + .icon-medkit:before { - content: "\f0fa"; + content: "\f0fa"; } + .icon-fighter-jet:before { - content: "\f0fb"; + content: "\f0fb"; } + .icon-beer:before { - content: "\f0fc"; + content: "\f0fc"; } + .icon-h-square:before { - content: "\f0fd"; + content: "\f0fd"; } + .icon-plus-square:before { - content: "\f0fe"; + content: "\f0fe"; } + .icon-angle-double-left:before { - content: "\f100"; + content: "\f100"; } + .icon-angle-double-right:before { - content: "\f101"; + content: "\f101"; } + .icon-angle-double-up:before { - content: "\f102"; + content: "\f102"; } + .icon-angle-double-down:before { - content: "\f103"; + content: "\f103"; } + .icon-angle-left:before { - content: "\f104"; + content: "\f104"; } + #page-sidebar li a.sf-with-ul:after, .icon-angle-right:before { - content: "\f105"; + content: "\f105"; } + .icon-angle-up:before { - content: "\f106"; + content: "\f106"; } + .icon-angle-down:before { - content: "\f107"; + content: "\f107"; } + .icon-desktop:before { - content: "\f108"; + content: "\f108"; } + .icon-laptop:before { - content: "\f109"; + content: "\f109"; } + .icon-tablet:before { - content: "\f10a"; + content: "\f10a"; } + .icon-mobile-phone:before, .icon-mobile:before { - content: "\f10b"; + content: "\f10b"; } + .icon-circle-o:before { - content: "\f10c"; + content: "\f10c"; } + .icon-quote-left:before { - content: "\f10d"; + content: "\f10d"; } + .icon-quote-right:before { - content: "\f10e"; + content: "\f10e"; } + .icon-spinner:before { - content: "\f110"; + content: "\f110"; } + #page-sidebar li ul li a:before, .icon-circle:before { - content: "\f111"; + content: "\f111"; } + .icon-mail-reply:before, .icon-reply:before { - content: "\f112"; + content: "\f112"; } + .icon-github-alt:before { - content: "\f113"; + content: "\f113"; } + .icon-folder-o:before { - content: "\f114"; + content: "\f114"; } + .icon-folder-open-o:before { - content: "\f115"; + content: "\f115"; } + .icon-smile-o:before { - content: "\f118"; + content: "\f118"; } + .icon-frown-o:before { - content: "\f119"; + content: "\f119"; } + .icon-meh-o:before { - content: "\f11a"; + content: "\f11a"; } + .icon-gamepad:before { - content: "\f11b"; + content: "\f11b"; } + .icon-keyboard-o:before { - content: "\f11c"; + content: "\f11c"; } + .icon-flag-o:before { - content: "\f11d"; + content: "\f11d"; } + .icon-flag-checkered:before { - content: "\f11e"; + content: "\f11e"; } + .icon-terminal:before { - content: "\f120"; + content: "\f120"; } + .icon-code:before { - content: "\f121"; + content: "\f121"; } + .icon-mail-reply-all:before, .icon-reply-all:before { - content: "\f122"; + content: "\f122"; } + .icon-star-half-empty:before, .icon-star-half-full:before, .icon-star-half-o:before { - content: "\f123"; + content: "\f123"; } + .icon-location-arrow:before { - content: "\f124"; + content: "\f124"; } + .icon-crop:before { - content: "\f125"; + content: "\f125"; } + .icon-code-fork:before { - content: "\f126"; + content: "\f126"; } + .icon-unlink:before, .icon-chain-broken:before { - content: "\f127"; + content: "\f127"; } + .icon-question:before { - content: "\f128"; + content: "\f128"; } + .icon-info:before { - content: "\f129"; + content: "\f129"; } + .icon-exclamation:before { - content: "\f12a"; + content: "\f12a"; } + .icon-superscript:before { - content: "\f12b"; + content: "\f12b"; } + .icon-subscript:before { - content: "\f12c"; + content: "\f12c"; } + .icon-eraser:before { - content: "\f12d"; + content: "\f12d"; } + .icon-puzzle-piece:before { - content: "\f12e"; + content: "\f12e"; } + .icon-microphone:before { - content: "\f130"; + content: "\f130"; } + .icon-microphone-slash:before { - content: "\f131"; + content: "\f131"; } + .icon-shield:before { - content: "\f132"; + content: "\f132"; } + .icon-calendar-o:before { - content: "\f133"; + content: "\f133"; } + .icon-fire-extinguisher:before { - content: "\f134"; + content: "\f134"; } + .icon-rocket:before { - content: "\f135"; + content: "\f135"; } + .icon-maxcdn:before { - content: "\f136"; + content: "\f136"; } + .ui-icon-circle-triangle-w:before, .icon-chevron-circle-left:before { - content: "\f137"; + content: "\f137"; } + .ui-icon-circle-triangle-e:before, .icon-chevron-circle-right:before { - content: "\f138"; + content: "\f138"; } + .icon-chevron-circle-up:before { - content: "\f139"; + content: "\f139"; } + .icon-chevron-circle-down:before { - content: "\f13a"; + content: "\f13a"; } + .icon-html5:before { - content: "\f13b"; + content: "\f13b"; } + .icon-css3:before { - content: "\f13c"; + content: "\f13c"; } + .icon-anchor:before { - content: "\f13d"; + content: "\f13d"; } + .icon-unlock-alt:before { - content: "\f13e"; + content: "\f13e"; } + .icon-bullseye:before { - content: "\f140"; + content: "\f140"; } + .icon-ellipsis-h:before { - content: "\f141"; + content: "\f141"; } + .icon-ellipsis-v:before { - content: "\f142"; + content: "\f142"; } + .icon-rss-square:before { - content: "\f143"; + content: "\f143"; } + .icon-play-circle:before { - content: "\f144"; + content: "\f144"; } + .icon-ticket:before { - content: "\f145"; + content: "\f145"; } + .icon-minus-square:before { - content: "\f146"; + content: "\f146"; } + .icon-minus-square-o:before { - content: "\f147"; + content: "\f147"; } + .icon-level-up:before { - content: "\f148"; + content: "\f148"; } + .icon-level-down:before { - content: "\f149"; + content: "\f149"; } + .icon-check-square:before { - content: "\f14a"; + content: "\f14a"; } + .icon-pencil-square:before { - content: "\f14b"; + content: "\f14b"; } + .icon-external-link-square:before { - content: "\f14c"; + content: "\f14c"; } + .icon-share-square:before { - content: "\f14d"; + content: "\f14d"; } + .icon-compass:before { - content: "\f14e"; + content: "\f14e"; } + .icon-toggle-down:before, .icon-caret-square-o-down:before { - content: "\f150"; + content: "\f150"; } + .icon-toggle-up:before, .icon-caret-square-o-up:before { - content: "\f151"; + content: "\f151"; } + .icon-toggle-right:before, .icon-caret-square-o-right:before { - content: "\f152"; + content: "\f152"; } + .icon-euro:before, .icon-eur:before { - content: "\f153"; + content: "\f153"; } + .icon-gbp:before { - content: "\f154"; + content: "\f154"; } + .icon-dollar:before, .icon-usd:before { - content: "\f155"; + content: "\f155"; } + .icon-rupee:before, .icon-inr:before { - content: "\f156"; + content: "\f156"; } + .icon-cny:before, .icon-rmb:before, .icon-yen:before, .icon-jpy:before { - content: "\f157"; + content: "\f157"; } + .icon-ruble:before, .icon-rouble:before, .icon-rub:before { - content: "\f158"; + content: "\f158"; } + .icon-won:before, .icon-krw:before { - content: "\f159"; + content: "\f159"; } + .icon-bitcoin:before, .icon-btc:before { - content: "\f15a"; + content: "\f15a"; } + .icon-file:before { - content: "\f15b"; + content: "\f15b"; } + .icon-file-text:before { - content: "\f15c"; + content: "\f15c"; } + .icon-sort-alpha-asc:before { - content: "\f15d"; + content: "\f15d"; } + .icon-sort-alpha-desc:before { - content: "\f15e"; + content: "\f15e"; } + .icon-sort-amount-asc:before { - content: "\f160"; + content: "\f160"; } + .icon-sort-amount-desc:before { - content: "\f161"; + content: "\f161"; } + .icon-sort-numeric-asc:before { - content: "\f162"; + content: "\f162"; } + .icon-sort-numeric-desc:before { - content: "\f163"; + content: "\f163"; } + .icon-thumbs-up:before { - content: "\f164"; + content: "\f164"; } + .icon-thumbs-down:before { - content: "\f165"; + content: "\f165"; } + .icon-youtube-square:before { - content: "\f166"; + content: "\f166"; } + .icon-youtube:before { - content: "\f167"; + content: "\f167"; } + .icon-xing:before { - content: "\f168"; + content: "\f168"; } + .icon-xing-square:before { - content: "\f169"; + content: "\f169"; } + .icon-youtube-play:before { - content: "\f16a"; + content: "\f16a"; } + .icon-dropbox:before { - content: "\f16b"; + content: "\f16b"; } + .icon-stack-overflow:before { - content: "\f16c"; + content: "\f16c"; } + .icon-instagram:before { - content: "\f16d"; + content: "\f16d"; } + .icon-flickr:before { - content: "\f16e"; + content: "\f16e"; } + .icon-adn:before { - content: "\f170"; + content: "\f170"; } + .icon-bitbucket:before { - content: "\f171"; + content: "\f171"; } + .icon-bitbucket-square:before { - content: "\f172"; + content: "\f172"; } + .icon-tumblr:before { - content: "\f173"; + content: "\f173"; } + .icon-tumblr-square:before { - content: "\f174"; + content: "\f174"; } + .icon-long-arrow-down:before { - content: "\f175"; + content: "\f175"; } + .icon-long-arrow-up:before { - content: "\f176"; + content: "\f176"; } + .icon-long-arrow-left:before { - content: "\f177"; + content: "\f177"; } + .icon-long-arrow-right:before { - content: "\f178"; + content: "\f178"; } + .icon-apple:before { - content: "\f179"; + content: "\f179"; } + .icon-windows:before { - content: "\f17a"; + content: "\f17a"; } + .icon-android:before { - content: "\f17b"; + content: "\f17b"; } + .icon-linux:before { - content: "\f17c"; + content: "\f17c"; } + .icon-dribbble:before { - content: "\f17d"; + content: "\f17d"; } + .icon-skype:before { - content: "\f17e"; + content: "\f17e"; } + .icon-foursquare:before { - content: "\f180"; + content: "\f180"; } + .icon-trello:before { - content: "\f181"; + content: "\f181"; } + .icon-female:before { - content: "\f182"; + content: "\f182"; } + .icon-male:before { - content: "\f183"; + content: "\f183"; } + .icon-gittip:before { - content: "\f184"; + content: "\f184"; } + .icon-sun-o:before { - content: "\f185"; + content: "\f185"; } + .icon-moon-o:before { - content: "\f186"; + content: "\f186"; } + .icon-archive:before { - content: "\f187"; + content: "\f187"; } + .icon-bug:before { - content: "\f188"; + content: "\f188"; } + .icon-vk:before { - content: "\f189"; + content: "\f189"; } + .icon-weibo:before { - content: "\f18a"; + content: "\f18a"; } + .icon-renren:before { - content: "\f18b"; + content: "\f18b"; } + .icon-pagelines:before { - content: "\f18c"; + content: "\f18c"; } + .icon-stack-exchange:before { - content: "\f18d"; + content: "\f18d"; } + .icon-arrow-circle-o-right:before { - content: "\f18e"; + content: "\f18e"; } + .icon-arrow-circle-o-left:before { - content: "\f190"; + content: "\f190"; } + .icon-toggle-left:before, .icon-caret-square-o-left:before { - content: "\f191"; + content: "\f191"; } + .icon-dot-circle-o:before { - content: "\f192"; + content: "\f192"; } + .icon-wheelchair:before { - content: "\f193"; + content: "\f193"; } + .icon-vimeo-square:before { - content: "\f194"; + content: "\f194"; } + .icon-turkish-lira:before, .icon-try:before { - content: "\f195"; + content: "\f195"; } + .icon-plus-square-o:before { - content: "\f196"; + content: "\f196"; } + .icon-space-shuttle:before { - content: "\f197"; + content: "\f197"; } + .icon-slack:before { - content: "\f198"; + content: "\f198"; } + .icon-envelope-square:before { - content: "\f199"; + content: "\f199"; } + .icon-wordpress:before { - content: "\f19a"; + content: "\f19a"; } + .icon-openid:before { - content: "\f19b"; + content: "\f19b"; } + .icon-institution:before, .icon-bank:before, .icon-university:before { - content: "\f19c"; + content: "\f19c"; } + .icon-mortar-board:before, .icon-graduation-cap:before { - content: "\f19d"; + content: "\f19d"; } + .icon-yahoo:before { - content: "\f19e"; + content: "\f19e"; } + .icon-google:before { - content: "\f1a0"; + content: "\f1a0"; } + .icon-reddit:before { - content: "\f1a1"; + content: "\f1a1"; } + .icon-reddit-square:before { - content: "\f1a2"; + content: "\f1a2"; } + .icon-stumbleupon-circle:before { - content: "\f1a3"; + content: "\f1a3"; } + .icon-stumbleupon:before { - content: "\f1a4"; + content: "\f1a4"; } + .icon-delicious:before { - content: "\f1a5"; + content: "\f1a5"; } + .icon-digg:before { - content: "\f1a6"; + content: "\f1a6"; } + .icon-pied-piper:before { - content: "\f1a7"; + content: "\f1a7"; } + .icon-pied-piper-alt:before { - content: "\f1a8"; + content: "\f1a8"; } + .icon-drupal:before { - content: "\f1a9"; + content: "\f1a9"; } + .icon-joomla:before { - content: "\f1aa"; + content: "\f1aa"; } + .icon-language:before { - content: "\f1ab"; + content: "\f1ab"; } + .icon-fax:before { - content: "\f1ac"; + content: "\f1ac"; } + .icon-building:before { - content: "\f1ad"; + content: "\f1ad"; } + .icon-child:before { - content: "\f1ae"; + content: "\f1ae"; } + .icon-paw:before { - content: "\f1b0"; + content: "\f1b0"; } + .icon-spoon:before { - content: "\f1b1"; + content: "\f1b1"; } + .icon-cube:before { - content: "\f1b2"; + content: "\f1b2"; } + .icon-cubes:before { - content: "\f1b3"; + content: "\f1b3"; } + .icon-behance:before { - content: "\f1b4"; + content: "\f1b4"; } + .icon-behance-square:before { - content: "\f1b5"; + content: "\f1b5"; } + .icon-steam:before { - content: "\f1b6"; + content: "\f1b6"; } + .icon-steam-square:before { - content: "\f1b7"; + content: "\f1b7"; } + .icon-recycle:before { - content: "\f1b8"; + content: "\f1b8"; } + .icon-automobile:before, .icon-car:before { - content: "\f1b9"; + content: "\f1b9"; } + .icon-cab:before, .icon-taxi:before { - content: "\f1ba"; + content: "\f1ba"; } + .icon-tree:before { - content: "\f1bb"; + content: "\f1bb"; } + .icon-spotify:before { - content: "\f1bc"; + content: "\f1bc"; } + .icon-deviantart:before { - content: "\f1bd"; + content: "\f1bd"; } + .icon-soundcloud:before { - content: "\f1be"; + content: "\f1be"; } + .icon-database:before { - content: "\f1c0"; + content: "\f1c0"; } + .icon-file-pdf-o:before { - content: "\f1c1"; + content: "\f1c1"; } + .icon-file-word-o:before { - content: "\f1c2"; + content: "\f1c2"; } + .icon-file-excel-o:before { - content: "\f1c3"; + content: "\f1c3"; } + .icon-file-powerpoint-o:before { - content: "\f1c4"; + content: "\f1c4"; } + .icon-file-photo-o:before, .icon-file-picture-o:before, .icon-file-image-o:before { - content: "\f1c5"; + content: "\f1c5"; } + .icon-file-zip-o:before, .icon-file-archive-o:before { - content: "\f1c6"; + content: "\f1c6"; } + .icon-file-sound-o:before, .icon-file-audio-o:before { - content: "\f1c7"; + content: "\f1c7"; } + .icon-file-movie-o:before, .icon-file-video-o:before { - content: "\f1c8"; + content: "\f1c8"; } + .icon-file-code-o:before { - content: "\f1c9"; + content: "\f1c9"; } + .icon-vine:before { - content: "\f1ca"; + content: "\f1ca"; } + .icon-codepen:before { - content: "\f1cb"; + content: "\f1cb"; } + .icon-jsfiddle:before { - content: "\f1cc"; + content: "\f1cc"; } + .icon-life-bouy:before, .icon-life-buoy:before, .icon-life-saver:before, .icon-support:before, .icon-life-ring:before { - content: "\f1cd"; + content: "\f1cd"; } + .icon-circle-o-notch:before { - content: "\f1ce"; + content: "\f1ce"; } + .icon-ra:before, .icon-rebel:before { - content: "\f1d0"; + content: "\f1d0"; } + .icon-ge:before, .icon-empire:before { - content: "\f1d1"; + content: "\f1d1"; } + .icon-git-square:before { - content: "\f1d2"; + content: "\f1d2"; } + .icon-git:before { - content: "\f1d3"; + content: "\f1d3"; } + .icon-hacker-news:before { - content: "\f1d4"; + content: "\f1d4"; } + .icon-tencent-weibo:before { - content: "\f1d5"; + content: "\f1d5"; } + .icon-qq:before { - content: "\f1d6"; + content: "\f1d6"; } + .icon-wechat:before, .icon-weixin:before { - content: "\f1d7"; + content: "\f1d7"; } + .icon-send:before, .icon-paper-plane:before { - content: "\f1d8"; + content: "\f1d8"; } + .icon-send-o:before, .icon-paper-plane-o:before { - content: "\f1d9"; + content: "\f1d9"; } + .icon-history:before { - content: "\f1da"; + content: "\f1da"; } + .icon-circle-thin:before { - content: "\f1db"; + content: "\f1db"; } + .icon-header:before { - content: "\f1dc"; + content: "\f1dc"; } + .icon-paragraph:before { - content: "\f1dd"; + content: "\f1dd"; } + .icon-sliders:before { - content: "\f1de"; + content: "\f1de"; } + .icon-share-alt:before { - content: "\f1e0"; + content: "\f1e0"; } + .icon-share-alt-square:before { - content: "\f1e1"; + content: "\f1e1"; } + .icon-bomb:before { - content: "\f1e2"; + content: "\f1e2"; } + .icon-soccer-ball-o:before, .icon-futbol-o:before { - content: "\f1e3"; + content: "\f1e3"; } + .icon-tty:before { - content: "\f1e4"; + content: "\f1e4"; } + .icon-binoculars:before { - content: "\f1e5"; + content: "\f1e5"; } + .icon-plug:before { - content: "\f1e6"; + content: "\f1e6"; } + .icon-slideshare:before { - content: "\f1e7"; + content: "\f1e7"; } + .icon-twitch:before { - content: "\f1e8"; + content: "\f1e8"; } + .icon-yelp:before { - content: "\f1e9"; + content: "\f1e9"; } + .icon-newspaper-o:before { - content: "\f1ea"; + content: "\f1ea"; } + .icon-wifi:before { - content: "\f1eb"; + content: "\f1eb"; } + .icon-calculator:before { - content: "\f1ec"; + content: "\f1ec"; } + .icon-paypal:before { - content: "\f1ed"; + content: "\f1ed"; } + .icon-google-wallet:before { - content: "\f1ee"; + content: "\f1ee"; } + .icon-cc-visa:before { - content: "\f1f0"; + content: "\f1f0"; } + .icon-cc-mastercard:before { - content: "\f1f1"; + content: "\f1f1"; } + .icon-cc-discover:before { - content: "\f1f2"; + content: "\f1f2"; } + .icon-cc-amex:before { - content: "\f1f3"; + content: "\f1f3"; } + .icon-cc-paypal:before { - content: "\f1f4"; + content: "\f1f4"; } + .icon-cc-stripe:before { - content: "\f1f5"; + content: "\f1f5"; } + .icon-bell-slash:before { - content: "\f1f6"; + content: "\f1f6"; } + .icon-bell-slash-o:before { - content: "\f1f7"; + content: "\f1f7"; } + .icon-trash:before { - content: "\f1f8"; + content: "\f1f8"; } + .icon-copyright:before { - content: "\f1f9"; + content: "\f1f9"; } + .icon-at:before { - content: "\f1fa"; + content: "\f1fa"; } + .icon-eyedropper:before { - content: "\f1fb"; + content: "\f1fb"; } + .icon-paint-brush:before { - content: "\f1fc"; + content: "\f1fc"; } + .icon-birthday-cake:before { - content: "\f1fd"; + content: "\f1fd"; } + .icon-area-chart:before { - content: "\f1fe"; + content: "\f1fe"; } + .icon-pie-chart:before { - content: "\f200"; + content: "\f200"; } + .icon-line-chart:before { - content: "\f201"; + content: "\f201"; } + .icon-lastfm:before { - content: "\f202"; + content: "\f202"; } + .icon-lastfm-square:before { - content: "\f203"; + content: "\f203"; } + .icon-toggle-off:before { - content: "\f204"; + content: "\f204"; } + .icon-toggle-on:before { - content: "\f205"; + content: "\f205"; } + .icon-bicycle:before { - content: "\f206"; + content: "\f206"; } + .icon-bus:before { - content: "\f207"; + content: "\f207"; } + .icon-ioxhost:before { - content: "\f208"; + content: "\f208"; } + .icon-angellist:before { - content: "\f209"; + content: "\f209"; } + .icon-cc:before { - content: "\f20a"; + content: "\f20a"; } + .icon-shekel:before, .icon-sheqel:before, .icon-ils:before { - content: "\f20b"; + content: "\f20b"; } + .icon-meanpath:before { - content: "\f20c"; + content: "\f20c"; } /*customized mzou*/ .text-white { - color: #FFFFFF; + color: #FFFFFF; } + .mt-5 { - margin-top: 5px; + margin-top: 5px; } + .mt-10 { - margin-top: 10px; + margin-top: 10px; } + .mt-20 { - margin-top: 20px; + margin-top: 20px; } + .mt-30 { - margin-top: 30px; + margin-top: 30px; } + .mr-10 { - margin-right: 10px; + margin-right: 10px; } + .mb-10 { - margin-bottom: 10px; + margin-bottom: 10px; } + .mb-20 { - margin-bottom: 20px; + margin-bottom: 20px; } + .mb-30 { - margin-bottom: 30px; + margin-bottom: 30px; } + .ml-10 { - margin-left: 10px; + margin-left: 10px; } + .my-10 { - margin-top: 10px; - margin-bottom: 10px; + margin-top: 10px; + margin-bottom: 10px; } + .my-20 { - margin-top: 20px; - margin-bottom: 20px; + margin-top: 20px; + margin-bottom: 20px; } + .my-30 { - margin-top: 30px; - margin-bottom: 30px; + margin-top: 30px; + margin-bottom: 30px; } .mx-5 { - margin-left: 5px; - margin-right: 5px; + margin-left: 5px; + margin-right: 5px; } + .mx-10 { - margin-left: 10px; - margin-right: 10px; + margin-left: 10px; + margin-right: 10px; } + .mx-20 { - margin-left: 20px; - margin-right: 20px; + margin-left: 20px; + margin-right: 20px; } + .mx-30 { - margin-left: 30px; - margin-right: 30px; + margin-left: 30px; + margin-right: 30px; } + .text-bold { - font-weight: 600; + font-weight: 600; } + .rounded { - border-radius: 3px; + border-radius: 3px; } .btn-outline-light { - color: #f8f9fa; - background-color: transparent; - background-image: none; - border-color: #f8f9fa; + color: #f8f9fa; + background-color: transparent; + background-image: none; + border-color: #f8f9fa; } + .btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; - text-decoration: none; + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; + text-decoration: none; } .flex { - display: flex; + display: flex; } + .flex-wrap { - flex-wrap: wrap; + flex-wrap: wrap; } + @media (max-width: 992px) { -.hidden-md { + .hidden-md { display: none; + } } -} + .img-thumbnail { - padding: .25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: .25rem; - max-width: 100%; - height: auto; + padding: .25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: .25rem; + max-width: 100%; + height: auto; } img { -vertical-align: middle; -border-style: none; + vertical-align: middle; + border-style: none; } @media (max-width: 720px) { - .text-center-sm { - text-align: center; -} \ No newline at end of file + .text-center-sm { + text-align: center; + } +} +.col-login{ + height: 100vh; + display: flex; + flex-direction: column; + +} +.col-login-left{ + justify-content: space-between; +} +.col-login-right{ + justify-content: center; +} +ul.login-changelogs{ + border-top: 1px solid #fff +} From 9fa3361d8037feb56ea6d3e04c3629c17e460e4f Mon Sep 17 00:00:00 2001 From: Jordan Lambrecht Date: Mon, 21 Dec 2020 14:25:53 -0600 Subject: [PATCH 013/107] Was scared of commiting css to this file so I revered it --- .../assets/finalLoginPageCSS/allCss.css | 5628 ++--------------- 1 file changed, 536 insertions(+), 5092 deletions(-) diff --git a/static/baseTemplate/assets/finalLoginPageCSS/allCss.css b/static/baseTemplate/assets/finalLoginPageCSS/allCss.css index bdfc24d5a..71f8dae4d 100644 --- a/static/baseTemplate/assets/finalLoginPageCSS/allCss.css +++ b/static/baseTemplate/assets/finalLoginPageCSS/allCss.css @@ -1,4109 +1,55 @@ -pre, pre code { - white-space: pre-wrap -} - -.clear, .form-row:after, .row:after { - clear: both -} - -.btn-group-vertical>.btn:focus, .btn-group>.btn:focus, :active, :focus, :visited, a, a:active, a:focus, a:visited { - outline: 0 -} - -.xchart .color0 .line, .xchart .color0 circle, .xchart .color0.comp .line { - stroke: #00bca4 -} - -.xchart .color0 .line .fill, .xchart .color1 .line .fill { - pointer-events: none -} - -article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { - display: block -} - -audio, canvas, video { - display: inline-block -} - -audio:not([controls]) { - display: none; - height: 0 -} - -[hidden] { - display: none -} - -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100% -} - -body, button, figure { - margin: 0 -} - -abbr[title] { - border-bottom: 1px dotted -} - -b, strong { - font-weight: 700 -} - -dfn { - font-style: italic -} - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0 -} - -mark { - color: #000; - background: #ff0 -} - -code, kbd, pre, samp { - font-size: 1em -} - -q { - quotes: '\201C''\201D''\2018''\2019' -} - -sub, sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline -} - -sup { - top: -.5em -} - -sub { - bottom: -.25em -} - -img { - border: 0 -} - -svg:not(:root) { - overflow: hidden -} - -button, input, select, textarea { - font-family: inherit; - font-size: 100% -} - -button, input { - line-height: normal -} - -button, select { - text-transform: none -} - -button, html input[type=button], input[type=reset], input[type=submit] { - cursor: pointer; - -webkit-appearance: button -} - -input[type=checkbox], input[type=radio] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0 -} - -input[type=search] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield -} - -input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration { - -webkit-appearance: none -} - -button::-moz-focus-inner, input::-moz-focus-inner { - padding: 0; - border: 0 -} - -textarea { - overflow: auto; - vertical-align: top -} - -.collapsing, .divider, .overflow-hidden, .sr-only { - overflow: hidden -} - -table { - border-spacing: 0; - border-collapse: collapse -} - -@media print { - blockquote, img, pre, tr { - page-break-inside: avoid - } - - * { - color: #000 !important; - background: 0 0 !important; - box-shadow: none !important; - text-shadow: none !important - } - - a, a:visited { - text-decoration: underline - } - - a[href]:after { - content: ' ('attr(href)')' - } - - abbr[title]:after { - content: ' ('attr(title)')' - } - - .ir a:after, a[href^='javascript:']:after, a[href^='#']:after { - content: '' - } - - blockquote, pre { - border: 1px solid #999 - } - - thead { - display: table-header-group - } - - img { - max-width: 100% !important - } - - @page { - margin: 2cm .5cm - } - - h2, h3, p { - orphans: 3; - widows: 3 - } - - h2, h3 { - page-break-after: avoid - } - - .jGrowl { - display: none - } -} - -small { - font-size: 85% -} - -a { - text-decoration: none -} - -html { - font-size: 62.5%; - -webkit-tap-highlight-color: transparent -} - -*, :after, :before { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box -} - -.jqstooltip { - box-sizing: content-box -} - -.form-row, .row { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-right: -10px; - margin-left: -10px -} - -.form-row:after, .form-row:before, .row:after, .row:before { - display: table; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - content: ' ' -} - -blockquote small, pre { - line-height: 1.428571429; - display: block -} - -[class*=col-] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box -} - -.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { - position: relative; - min-height: 1px; - padding-right: 10px; - padding-left: 10px -} - -.col-xs-1, .col-xs-10, .col-xs-11, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { - float: left -} - -.col-xs-1 { - width: 8.333333333333332% -} - -.col-xs-2 { - width: 16.666666666666664% -} - -.col-xs-3 { - width: 25% -} - -.col-xs-4 { - width: 33.33333333333333% -} - -.col-xs-5 { - width: 41.66666666666667% -} - -.col-xs-6 { - width: 50% -} - -.col-xs-7 { - width: 58.333333333333336% -} - -.col-xs-8 { - width: 66.66666666666666% -} - -.col-xs-9 { - width: 75% -} - -.col-xs-10 { - width: 83.33333333333334% -} - -.col-xs-11 { - width: 91.66666666666666% -} - -.col-xs-12 { - width: 100% -} - -@media (min-width:768px) { - .boxed-layout #page-header, .boxed-layout #page-wrapper, .container { - max-width: 750px - } - - .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9 { - float: left - } - - .col-sm-1 { - width: 8.333333333333332% - } - - .col-sm-2 { - width: 16.666666666666664% - } - - .col-sm-3 { - width: 25% - } - - .col-sm-4 { - width: 33.33333333333333% - } - - .col-sm-5 { - width: 41.66666666666667% - } - - .col-sm-6 { - width: 50% - } - - .col-sm-7 { - width: 58.333333333333336% - } - - .col-sm-8 { - width: 66.66666666666666% - } - - .col-sm-9 { - width: 75% - } - - .col-sm-10 { - width: 83.33333333333334% - } - - .col-sm-11 { - width: 91.66666666666666% - } - - .col-sm-12 { - width: 100% - } - - .col-sm-push-1 { - left: 8.333333333333332% - } - - .col-sm-push-2 { - left: 16.666666666666664% - } - - .col-sm-push-3 { - left: 25% - } - - .col-sm-push-4 { - left: 33.33333333333333% - } - - .col-sm-push-5 { - left: 41.66666666666667% - } - - .col-sm-push-6 { - left: 50% - } - - .col-sm-push-7 { - left: 58.333333333333336% - } - - .col-sm-push-8 { - left: 66.66666666666666% - } - - .col-sm-push-9 { - left: 75% - } - - .col-sm-push-10 { - left: 83.33333333333334% - } - - .col-sm-push-11 { - left: 91.66666666666666% - } - - .col-sm-pull-1 { - right: 8.333333333333332% - } - - .col-sm-pull-2 { - right: 16.666666666666664% - } - - .col-sm-pull-3 { - right: 25% - } - - .col-sm-pull-4 { - right: 33.33333333333333% - } - - .col-sm-pull-5 { - right: 41.66666666666667% - } - - .col-sm-pull-6 { - right: 50% - } - - .col-sm-pull-7 { - right: 58.333333333333336% - } - - .col-sm-pull-8 { - right: 66.66666666666666% - } - - .col-sm-pull-9 { - right: 75% - } - - .col-sm-pull-10 { - right: 83.33333333333334% - } - - .col-sm-pull-11 { - right: 91.66666666666666% - } - - .col-sm-offset-1 { - margin-left: 8.333333333333332% - } - - .col-sm-offset-2 { - margin-left: 16.666666666666664% - } - - .col-sm-offset-3 { - margin-left: 25% - } - - .col-sm-offset-4 { - margin-left: 33.33333333333333% - } - - .col-sm-offset-5 { - margin-left: 41.66666666666667% - } - - .col-sm-offset-6 { - margin-left: 50% - } - - .col-sm-offset-7 { - margin-left: 58.333333333333336% - } - - .col-sm-offset-8 { - margin-left: 66.66666666666666% - } - - .col-sm-offset-9 { - margin-left: 75% - } - - .col-sm-offset-10 { - margin-left: 83.33333333333334% - } - - .col-sm-offset-11 { - margin-left: 91.66666666666666% - } -} - -@media (min-width:992px) { - .boxed-layout #page-header, .boxed-layout #page-wrapper, .container { - max-width: 970px - } - - .col-md-1, .col-md-10, .col-md-11, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9 { - float: left - } - - .col-md-1 { - width: 8.333333333333332% - } - - .col-md-2 { - width: 16.666666666666664% - } - - .col-md-3 { - width: 25% - } - - .col-md-4 { - width: 33.33333333333333% - } - - .col-md-5 { - width: 41.66666666666667% - } - - .col-md-6 { - width: 50% - } - - .col-md-7 { - width: 58.333333333333336% - } - - .col-md-8 { - width: 66.66666666666666% - } - - .col-md-9 { - width: 75% - } - - .col-md-10 { - width: 83.33333333333334% - } - - .col-md-11 { - width: 91.66666666666666% - } - - .col-md-12 { - width: 100% - } - - .col-md-push-0 { - left: auto - } - - .col-md-push-1 { - left: 8.333333333333332% - } - - .col-md-push-2 { - left: 16.666666666666664% - } - - .col-md-push-3 { - left: 25% - } - - .col-md-push-4 { - left: 33.33333333333333% - } - - .col-md-push-5 { - left: 41.66666666666667% - } - - .col-md-push-6 { - left: 50% - } - - .col-md-push-7 { - left: 58.333333333333336% - } - - .col-md-push-8 { - left: 66.66666666666666% - } - - .col-md-push-9 { - left: 75% - } - - .col-md-push-10 { - left: 83.33333333333334% - } - - .col-md-push-11 { - left: 91.66666666666666% - } - - .col-md-pull-0 { - right: auto - } - - .col-md-pull-1 { - right: 8.333333333333332% - } - - .col-md-pull-2 { - right: 16.666666666666664% - } - - .col-md-pull-3 { - right: 25% - } - - .col-md-pull-4 { - right: 33.33333333333333% - } - - .col-md-pull-5 { - right: 41.66666666666667% - } - - .col-md-pull-6 { - right: 50% - } - - .col-md-pull-7 { - right: 58.333333333333336% - } - - .col-md-pull-8 { - right: 66.66666666666666% - } - - .col-md-pull-9 { - right: 75% - } - - .col-md-pull-10 { - right: 83.33333333333334% - } - - .col-md-pull-11 { - right: 91.66666666666666% - } - - .col-md-offset-0 { - margin-left: 0 - } - - .col-md-offset-1 { - margin-left: 8.333333333333332% - } - - .col-md-offset-2 { - margin-left: 16.666666666666664% - } - - .col-md-offset-3 { - margin-left: 25% - } - - .col-md-offset-4 { - margin-left: 33.33333333333333% - } - - .col-md-offset-5 { - margin-left: 41.66666666666667% - } - - .col-md-offset-6 { - margin-left: 50% - } - - .col-md-offset-7 { - margin-left: 58.333333333333336% - } - - .col-md-offset-8 { - margin-left: 66.66666666666666% - } - - .col-md-offset-9 { - margin-left: 75% - } - - .col-md-offset-10 { - margin-left: 83.33333333333334% - } - - .col-md-offset-11 { - margin-left: 91.66666666666666% - } -} - -@media (min-width:1200px) { - .boxed-layout #page-header, .boxed-layout #page-wrapper, .container { - max-width: 1170px - } - - .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9 { - float: left - } - - .col-lg-1 { - width: 8.333333333333332% - } - - .col-lg-2 { - width: 16.666666666666664% - } - - .col-lg-3 { - width: 25% - } - - .col-lg-4 { - width: 33.33333333333333% - } - - .col-lg-5 { - width: 41.66666666666667% - } - - .col-lg-6 { - width: 50% - } - - .col-lg-7 { - width: 58.333333333333336% - } - - .col-lg-8 { - width: 66.66666666666666% - } - - .col-lg-9 { - width: 75% - } - - .col-lg-10 { - width: 83.33333333333334% - } - - .col-lg-11 { - width: 91.66666666666666% - } - - .col-lg-12 { - width: 100% - } - - .col-lg-push-0 { - left: auto - } - - .col-lg-push-1 { - left: 8.333333333333332% - } - - .col-lg-push-2 { - left: 16.666666666666664% - } - - .col-lg-push-3 { - left: 25% - } - - .col-lg-push-4 { - left: 33.33333333333333% - } - - .col-lg-push-5 { - left: 41.66666666666667% - } - - .col-lg-push-6 { - left: 50% - } - - .col-lg-push-7 { - left: 58.333333333333336% - } - - .col-lg-push-8 { - left: 66.66666666666666% - } - - .col-lg-push-9 { - left: 75% - } - - .col-lg-push-10 { - left: 83.33333333333334% - } - - .col-lg-push-11 { - left: 91.66666666666666% - } - - .col-lg-pull-0 { - right: auto - } - - .col-lg-pull-1 { - right: 8.333333333333332% - } - - .col-lg-pull-2 { - right: 16.666666666666664% - } - - .col-lg-pull-3 { - right: 25% - } - - .col-lg-pull-4 { - right: 33.33333333333333% - } - - .col-lg-pull-5 { - right: 41.66666666666667% - } - - .col-lg-pull-6 { - right: 50% - } - - .col-lg-pull-7 { - right: 58.333333333333336% - } - - .col-lg-pull-8 { - right: 66.66666666666666% - } - - .col-lg-pull-9 { - right: 75% - } - - .col-lg-pull-10 { - right: 83.33333333333334% - } - - .col-lg-pull-11 { - right: 91.66666666666666% - } - - .col-lg-offset-0 { - margin-left: 0 - } - - .col-lg-offset-1 { - margin-left: 8.333333333333332% - } - - .col-lg-offset-2 { - margin-left: 16.666666666666664% - } - - .col-lg-offset-3 { - margin-left: 25% - } - - .col-lg-offset-4 { - margin-left: 33.33333333333333% - } - - .col-lg-offset-5 { - margin-left: 41.66666666666667% - } - - .col-lg-offset-6 { - margin-left: 50% - } - - .col-lg-offset-7 { - margin-left: 58.333333333333336% - } - - .col-lg-offset-8 { - margin-left: 66.66666666666666% - } - - .col-lg-offset-9 { - margin-left: 75% - } - - .col-lg-offset-10 { - margin-left: 83.33333333333334% - } - - .col-lg-offset-11 { - margin-left: 91.66666666666666% - } -} - -.row.no-gutter { - margin-left: 0; - margin-right: 0 -} - -.no-gutter>[class*=col-] { - padding-left: 0; - padding-right: 0 -} - -.pad5A { - padding: 5px !important -} - -.pad5T { - padding-top: 5px !important -} - -.pad5R { - padding-right: 5px !important -} - -.pad5B { - padding-bottom: 5px !important -} - -.pad5L { - padding-left: 5px !important -} - -.pad10A { - padding: 10px !important -} - -.pad10T { - padding-top: 10px !important -} - -.pad10R { - padding-right: 10px !important -} - -.pad10B { - padding-bottom: 10px !important -} - -.pad10L { - padding-left: 10px !important -} - -.pad15A { - padding: 15px !important -} - -.pad15T { - padding-top: 15px !important -} - -.pad15R { - padding-right: 15px !important -} - -.pad15B { - padding-bottom: 15px !important -} - -.pad15L { - padding-left: 15px !important -} - -.pad20A { - padding: 20px !important -} - -.pad20T { - padding-top: 20px !important -} - -.pad20R { - padding-right: 20px !important -} - -.pad20B { - padding-bottom: 20px !important -} - -.pad20L { - padding-left: 20px !important -} - -.pad25A { - padding: 25px !important -} - -.pad25T { - padding-top: 25px !important -} - -.pad25R { - padding-right: 25px !important -} - -.pad25B { - padding-bottom: 25px !important -} - -.pad25L { - padding-left: 25px !important -} - -.pad45A { - padding: 45px !important -} - -.pad45T { - padding-top: 45px !important -} - -.pad45R { - padding-right: 45px !important -} - -.pad45B { - padding-bottom: 45px !important -} - -.pad45L { - padding-left: 45px !important -} - -.pad0A { - padding: 0 !important -} - -.pad0T { - padding-top: 0 !important -} - -.pad0R { - padding-right: 0 !important -} - -.pad0B { - padding-bottom: 0 !important -} - -.pad0L { - padding-left: 0 !important -} - -.mrg5A { - margin: 5px !important -} - -.mrg5T { - margin-top: 5px !important -} - -.mrg5R { - margin-right: 5px !important -} - -.mrg5B { - margin-bottom: 5px !important -} - -.mrg5L { - margin-left: 5px !important -} - -.mrg10A { - margin: 10px !important -} - -.mrg10T { - margin-top: 10px !important -} - -.mrg10R { - margin-right: 10px !important -} - -.mrg10B { - margin-bottom: 10px !important -} - -.mrg10L { - margin-left: 10px !important -} - -.mrg15A { - margin: 15px !important -} - -.mrg15T { - margin-top: 15px !important -} - -.mrg15R { - margin-right: 15px !important -} - -.mrg15B { - margin-bottom: 15px !important -} - -.mrg15L { - margin-left: 15px !important -} - -.mrg20A { - margin: 20px !important -} - -.mrg20T { - margin-top: 20px !important -} - -.mrg20R { - margin-right: 20px !important -} - -.mrg20B { - margin-bottom: 20px !important -} - -.mrg20L { - margin-left: 20px !important -} - -.mrg25A { - margin: 25px !important -} - -.mrg25T { - margin-top: 25px !important -} - -.mrg25R { - margin-right: 25px !important -} - -.mrg25B { - margin-bottom: 25px !important -} - -.mrg25L { - margin-left: 25px !important -} - -.mrg45A { - margin: 45px !important -} - -.mrg45T { - margin-top: 45px !important -} - -.mrg45R { - margin-right: 45px !important -} - -.mrg45B { - margin-bottom: 45px !important -} - -.mrg45L { - margin-left: 45px !important -} - -.mrg0A { - margin: 0 !important -} - -.mrg0T { - margin-top: 0 !important -} - -.mrg0R { - margin-right: 0 !important -} - -.mrg0B { - margin-bottom: 0 !important -} - -.mrg0L { - margin-left: 0 !important -} - -.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { - font-weight: 500; - margin: 0 -} - -.h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { - font-weight: 400 -} - -.h1, h1 { - font-size: 38px -} - -.h2, h2 { - font-size: 26px -} - -.h3, h3 { - font-size: 20px -} - -.h4, h4 { - font-size: 16px -} - -.h5, h5 { - font-size: 14px -} - -.h6, h6 { - font-size: 12px -} - -.h1 small, h1 small { - font-size: 24px -} - -.h2 small, h2 small { - font-size: 18px -} - -.h3 small, .h4 small, h3 small, h4 small { - font-size: 14px -} - -h1 .small, h1 small, h2 .small, h2 small, h3 .small, h3 small { - font-size: 75% -} - -blockquote { - margin: 0 0 20px; - padding: 10px 20px; - border-left: 5px solid #eee -} - -blockquote p { - font-size: 17.5px; - font-weight: 50; - line-height: 1.25 -} - -blockquote p:last-child { - margin-bottom: 0 -} - -blockquote small { - color: #999 -} - -blockquote small:before { - content: '\2014 \00A0' -} - -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eee; - border-left: 0 -} - -blockquote.pull-right .small, blockquote.pull-right p, blockquote.pull-right small { - text-align: right -} - -blockquote.pull-right .small:before, blockquote.pull-right small:before { - content: '' -} - -blockquote.pull-right .small:after, blockquote.pull-right small:after { - content: '\00A0 \2014' -} - -blockquote:after, blockquote:before { - content: '' -} - -address { - font-style: normal; - line-height: 1.428571429; - margin-bottom: 20px -} - -code, kbd, pre, samp { - font-family: Menlo, Monaco, Consolas, 'Courier New', monospace -} - -code { - font-size: 90%; - padding: 0 4px; - white-space: nowrap; - color: #d05; - border: 1px solid #dfe8f1; - border-radius: 3px; - background: #fafafa -} - -pre { - font-size: 13px; - margin: 0 0 10px; - padding: 9.5px; - word-wrap: break-word; - word-break: break-all; - color: #333; - border: 1px solid #ccc; - border-radius: 4px; - background-color: #f5f5f5 -} - -pre code { - font-size: inherit; - padding: 0; - color: inherit; - border-radius: 0; - background-color: transparent -} - -.btn, .fc-button, .input-group-btn, .text-no-wrap { - white-space: nowrap -} - -p { - line-height: 1.6em; - margin: 0 -} - -.title-hero { - margin: 0 0 15px; - padding: 0; - text-transform: uppercase; - font-size: 14px; - opacity: .7 -} - -h4.title-hero { - font-size: 15px -} - -.title-lead { - color: #3F3F3F -} - -.title-hero .title-lead { - font-size: 65%; - margin: 5px 0 0 -} - -.title-hero+.title-lead { - margin-top: -10px -} - -.jumbotron { - font-size: 21px; - font-weight: 200; - line-height: 2.1428571435; - margin-bottom: 30px; - padding: 30px; - color: inherit; - background-color: #eee -} - -.jumbotron h1 { - line-height: 1; - color: inherit -} - -.jumbotron p { - line-height: 1.4 -} - -.container .jumbotron { - border-radius: 6px -} - -@media screen and (min-width:768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px - } - - .container .jumbotron { - padding-right: 60px; - padding-left: 60px - } - - .jumbotron h1 { - font-size: 63px - } -} - -.float-left, .pull-left { - float: left !important -} - -.float-right, .pull-right { - float: right !important -} - -.float-none { - float: none !important -} - -.font-size-10 { - font-size: 10px !important -} - -.font-size-11 { - font-size: 11px !important -} - -.font-size-12 { - font-size: 12px !important -} - -.font-size-13 { - font-size: 13px !important -} - -.font-size-14 { - font-size: 14px !important -} - -.font-size-15 { - font-size: 15px !important -} - -.font-size-16 { - font-size: 16px !important -} - -.font-size-17 { - font-size: 17px !important -} - -.font-size-18 { - font-size: 18px !important -} - -.font-size-20 { - font-size: 20px !important -} - -.font-size-23 { - font-size: 23px !important -} - -.font-size-26 { - font-size: 26px !important -} - -.font-size-28 { - font-size: 28px !important -} - -.font-size-35 { - font-size: 35px !important -} - -.font-size-50 { - font-size: 50px !important -} - -.text-center { - text-align: center !important -} - -.text-left { - text-align: left !important -} - -.text-right { - text-align: right !important -} - -.text-justify { - text-align: justify -} - -.text-transform-none { - text-transform: none -} - -.text-transform-upr { - text-transform: uppercase -} - -.text-transform-low { - text-transform: lowercase -} - -.text-transform-cap { - text-transform: capitalize -} - -.font-bold { - font-weight: 700 !important -} - -.btn, .fc-button, .font-normal { - font-weight: 400 -} - -.font-italic { - font-style: italic -} - -.font-none { - font-style: none -} - -.clear-none { - clear: none !important -} - -#page-wrapper:after, .btn-group:after, .btn-toolbar:after, .button-pane:after, .chat-box li:after, .clearfix:after, .comments-list li .panel-body:after, .container:after, .content-box-header:after, .example-box-wrapper:after, .files-box li:after, .form-horizontal .form-group:after, .form-input-prepend:after, .form-row:after, .info-box:after, .messages-box li:after, .nav-list li:after, .nav:after, .notifications-box li:after, .pager:after, .posts-list li:after, .tl-item:after, .tl-row:after, .todo-box li:after, .ui-datepicker-buttonpane:after, .ui-helper-clearfix:after { - clear: both -} - -.ui-front { - z-index: 100 -} - -.wrapper-sticky { - z-index: 15 -} - -.hide, .lazy, .mix, .tab-pane, [data-toggle=buttons]>.btn>input[type=checkbox], [data-toggle=buttons]>.btn>input[type=radio] { - display: none -} - -.tab-pane { - padding: 15px -} - -.hidden, .ui-helper-hidden-accessible { - display: none !important -} - -.display-block { - position: relative !important; - display: block !important -} - -.display-block .button-content { - float: none -} - -.display-block.dropdown-menu { - position: static !important -} - -.display-inline { - display: inline-block -} - -.no-border { - border-color: transparent !important -} - -.dropdown-menu.pad0A .hasDatepicker .ui-datepicker, .remove-border { - border: 0 !important -} - -.border-top { - border-top-width: 3px !important; - border-top-style: solid !important -} - -.width-100 { - box-sizing: border-box; - width: 100% -} - -.center-margin { - float: none !important; - margin: 0 auto -} - -.center-block, .container { - display: block; - margin-right: auto; - margin-left: auto -} - -.center-vertical { - position: relative; - z-index: 15; - top: 0; - left: 0; - display: table; - width: 100%; - height: 100% -} - -.center-vertical .center-content { - display: table-cell; - vertical-align: middle -} - -.position-absolute { - position: absolute -} - -.show { - display: block !important -} - -.hidden { - display: none !important; - visibility: hidden !important -} - -.invisible { - visibility: hidden -} - -.center-div { - float: none !important; - margin-right: auto !important; - margin-left: auto !important; - text-align: center !important -} - -.btn-group>.btn-group, .btn-toolbar .btn-group, .btn-toolbar .input-group, .demo-icon { - float: left -} - -.divider, .nav-divider { - ityity: .7; - -moz-opacity: .7; - filter: alpha(opacity: 70) -} - -.divider { - height: 1px; - margin: 10px 0; - padding: 0 -} - -.divider-header { - font-size: 11px; - padding: 10px 15px; - text-transform: uppercase; - opacity: .2; - color: #fff -} - -.width-reset { - width: auto !important -} - -.opacity-10 { - opacity: .1 !important; - -moz-opacity: .1 !important; - filter: alpha(opacity: 10) !important -} - -.info-box b, .info-box.icon-wrapper .icon-large, .opacity-30 { - opacity: .3 !important; - -moz-opacity: .3 !important; - filter: alpha(opacity: 30) !important -} - -.opacity-40 { - opacity: .4 !important; - -moz-opacity: .4 !important; - filter: alpha(opacity: 40) !important -} - -.info-box b, .label-description span, .opacity-60, .opacity-hover { - opacity: .6 !important; - -moz-opacity: .6 !important; - filter: alpha(opacity: 60) !important -} - -.no-shadow.transparent.btn:hover i, .opacity-80, .ui-datepicker-current.ui-priority-secondary { - opacity: .8 !important; - -moz-opacity: .8 !important; - filter: alpha(opacity: 80) !important -} - -.opacity-100, .opacity-hover:hover { - opacity: 1 !important; - -moz-opacity: 1 !important; - filter: alpha(opacity: 100) !important -} - -.btn-link .glyph-icon.opacity-hover { - margin: 0 -5px -} - -.transparent { - border-color: transparent !important; - background: 0 0 !important; - box-shadow: 0 0 0 0 transparent !important -} - -.no-shadow { - box-shadow: 0 0 0 transparent !important -} - -.remove-bg { - background: 0 0 -} - -.nicescroll-rails { - background: 0 0 !important -} - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent -} - -#loading, .login-img, .ui-widget-overlay { - width: 100%; - height: 100% -} - -.dropup .caret, .navbar-fixed-bottom .dropdown .caret { - content: ''; - border-top: 0; - border-bottom: 4px solid -} - -.chosen-results, .form-wizard>ul, .nav-list ul, .nav-list-horizontal ul, .parsley-errors-list, .reset-ul, .tabs-navigation>ul, ul.messages-box, ul.notifications-box, ul.progress-box { - margin: 0; - padding: 0; - list-style: none -} - -#page-wrapper:after, #page-wrapper:before, .btn-group:after, .btn-group:before, .btn-toolbar:after, .btn-toolbar:before, .button-pane:after, .button-pane:before, .chat-box li:after, .chat-box li:before, .clearfix:after, .clearfix:before, .comments-list li .panel-body:after, .comments-list li .panel-body:before, .container:after, .container:before, .content-box-header:after, .content-box-header:before, .example-box-wrapper:after, .example-box-wrapper:before, .files-box li:after, .files-box li:before, .form-input-prepend:after, .form-input-prepend:before, .form-row:after, .form-row:before, .info-box:after, .info-box:before, .messages-box li:after, .messages-box li:before, .nav-list li:after, .nav-list li:before, .nav:after, .nav:before, .notifications-box li:after, .notifications-box li:before, .pager:after, .pager:before, .posts-list li:after, .posts-list li:before, .tl-item:after, .tl-item:before, .tl-row:after, .tl-row:before, .todo-box li:after, .todo-box li:before, .ui-datepicker-buttonpane:after, .ui-datepicker-buttonpane:before, .ui-helper-clearfix:after, .ui-helper-clearfix:before { - display: table; - content: '' -} - -.ui-sortable-placeholder { - visibility: visible !important; - border: 1px dashed #efda2c !important; - background: #fffce5 !important -} - -.daterangepicker td.available.in-range:hover, .daterangepicker td.in-range { - background: #fffce5 -} - -.checker.disabled, .checker.disabled span, .chosen-disabled, .disabled, .radio.disabled, .radio.disabled span, .ui-rangeSlider-disabled .ui-rangeSlider-arrow, .ui-rangeSlider-disabled .ui-rangeSlider-container, .ui-rangeSlider-disabled .ui-rangeSlider-label, .ui-state-disabled, button[disabled] { - cursor: not-allowed !important; - opacity: .65; - filter: alpha(opacity: 65) -} - -.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control, input[disabled], select[disabled], textarea[disabled] { - cursor: not-allowed; - opacity: .65; - background: #fafafa; - filter: alpha(opacity: 65) -} - -input[readonly], select[readonly], textarea[readonly] { - opacity: .8; - background: #fdfdfd; - -moz-opacity: .8; - filter: alpha(opacity: 80) -} - -.login-img { - position: fixed !important; - top: 0; - left: 0 -} - -.fixed-bg { - background-repeat: no-repeat; - background-attachment: fixed; - background-position: center center; - -webkit-background-size: cover; - -moz-background-size: cover; - -o-background-size: cover; - background-size: cover -} - -.ui-widget-overlay { - position: fixed; - left: 0; - top: 0; - bottom: 0; - right: 0; - text-align: center; - z-index: 16 -} - -.ui-widget-overlay img { - position: absolute; - top: 50%; - left: 50%; - margin: -26px 0 0 -26px -} - -#loading { - z-index: 5555; - position: fixed; - left: 0; - top: 0; - background: #fff -} - -.fade { - -webkit-transition: opacity .15s linear; - transition: opacity .15s linear -} - -.collapse { - display: none -} - -.collapse.in, .tab-pane.active { - display: block -} - -.collapsing { - position: relative; - height: 0; - -webkit-transition: height .35s ease; - transition: height .35s ease -} - -.small-padding { - padding: 25px 0 -} - -.medium-padding { - padding: 55px 0 -} - -.large-padding { - padding: 85px 0 -} - -.xlarge-padding { - padding: 115px 0 -} - -.glyph-icon { - text-align: center -} - -#page-sidebar li a.sf-with-ul:after, #page-sidebar li ul li a:before, .dataTables_paginate a i:before, .fc-icon, .glyph-icon:before, .search-choice-close:before, .ui-dialog-titlebar-close:before, .ui-icon:before { - font-family: FontAwesome; - font-weight: 400; - font-style: normal; - display: inline-block; - text-align: center; - text-decoration: none; - background: 0 0; - speak: none; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale -} - -.dropdown-menu>.disabled>a:focus, .dropdown-menu>.disabled>a:hover { - cursor: not-allowed; - text-decoration: none; - background-color: transparent; - background-image: none; - filter: progid: DXImageTransform.Microsoft.gradient(enabled=false) -} - -.sr-only { - position: absolute; - clip: rect(0, 0, 0, 0); - width: 1px; - height: 1px; - margin: -1px; - padding: 0; - border: 0 -} - -.rm-transition { - -webkit-transition: none !important; - -moz-transition: none !important; - -ms-transition: none !important; - -o-transition: none !important -} - -.btn, a, button, div[id^=uniform-] span { - -webkit-transition: all .1s ease-in-out; - -moz-transition: all .1s ease-in-out; - -ms-transition: all .1s ease-in-out; - -o-transition: all .1s ease-in-out -} - -#page-header, #page-sidebar, .main-header, .top-bar { - -webkit-transition: all .5s ease-in-out; - -moz-transition: all .5s ease-in-out; - -ms-transition: all .5s ease-in-out; - -o-transition: all .5s ease-in-out -} - -.example-box-wrapper { - margin-bottom: 15px; - position: relative -} - -.example-box-wrapper .ui-datepicker-inline { - position: relative; - width: 100% -} - -.panel-body .col-md-6 .example-box-wrapper:last-child, .panel-body .example-box-wrapper:last-child { - margin-bottom: 0 -} - -.example-box-wrapper .alert, .example-box-wrapper .content-box, .example-box-wrapper .dashboard-box, .example-box-wrapper .dataTables_wrapper, .example-box-wrapper .icon-box, .example-box-wrapper .image-box, .example-box-wrapper .jcrop-holder, .example-box-wrapper .jvectormap-container, .example-box-wrapper .list-group, .example-box-wrapper .loading-spinner, .example-box-wrapper .loading-stick, .example-box-wrapper .minicolors, .example-box-wrapper .nav, .example-box-wrapper .panel-layout, .example-box-wrapper .scrollable-content, .example-box-wrapper .tile-box, .example-box-wrapper .ui-accordion, .example-box-wrapper .ui-rangeSlider, .example-box-wrapper .ui-slider, .example-box-wrapper .ui-tabs, .example-box-wrapper>.btn, .example-box-wrapper>.btn-group, .example-box-wrapper>.btn-group-vertical, .example-box-wrapper>.btn-toolbar, .example-box-wrapper>.display-block.dropdown-menu, .example-box-wrapper>.dropdown, .example-box-wrapper>.dropup, .example-box-wrapper>.hasDatepicker, .example-box-wrapper>.img-humbnail, .example-box-wrapper>.minicolors, .example-box-wrapper>.pagination, .example-box-wrapper>.panel-layout, .example-box-wrapper>.progressbar, .example-box-wrapper>.thumbnail, .example-box-wrapper>form, .example-box-wrapper>h6, .example-box-wrapper>img { - margin-bottom: 20px -} - -.demo-icon { - font-size: 22px; - line-height: 40px; - width: 40px; - height: 40px; - margin: 10px; - text-align: center; - color: #92A0B3; - border: 1px solid rgba(220, 233, 255, .54); - border-radius: 3px -} - -.btn-block, .btn-group-justified, .btn-group-justified>.btn-group .btn, input[type=button].btn-block, input[type=reset].btn-block, input[type=submit].btn-block { - width: 100% -} - -.demo-icon:hover { - color: #59606c; - border-color: #92A0B3 -} - -.font-black { - color: #464646 !important -} - -.font-blue { - color: #1f6dca !important -} - -.font-blue-alt { - color: #65a6ff !important -} - -.font-azure { - color: #41e5c0 !important -} - -.font-gray, .text-muted { - color: #c2c2c2 !important -} - -.font-gray-dark, .text-info { - color: #828282 !important -} - -.font-green, .text-success { - color: #2ecc71 !important -} - -.font-orange, .text-warning { - color: #fa7753 !important -} - -.font-yellow { - color: #fc0 !important -} - -.font-purple { - color: #984dff !important -} - -.font-red, .has-error .help-block, .parsley-required, .text-danger { - color: #ff5757 !important -} - -.font-white { - color: #fff !important -} - -.alert-info, .alert-info a { - color: #6c6c6c; - border-color: #c9c9c9; - background: #dfe8f1 -} - -.alert-notice, .alert-notice a { - color: #0f2c62; - border-color: #62baf6; - background: #c6e8ff -} - -.alert-success, .alert-success a, .parsley-success { - color: #1e620f; - border-color: #7cd362; - background: #d3ffc6 -} - -.parsley-success { - background: #fff -} - -.alert-warning, .alert-warning a, .warning { - color: #624b0f; - border-color: #ebc875; - background: #ffeec6 -} - -.alert-danger, .alert-danger a, .danger, .parsley-error { - color: #620f0f; - border-color: #db6a6a; - background: #ffc6c6 -} - -.bg-facebook, .bg-google, .bg-twitter { - color: #fff !important -} - -.parsley-error { - background: #fff -} - -.bg-facebook { - background: #3b5998 -} - -.btn.bg-facebook:hover { - background: #304b85 -} - -.bg-twitter { - background: #3a92c8 -} - -.btn.bg-twitter:hover { - background: #2b80b4 -} - -.bg-google { - background: #dd4b39 -} - -.btn.bg-google:hover { - background: #c93b2a -} - -.badge-info, .bg-blue, .bootstrap-switch-info, .btn-info, .checkbox-info div[id^=uniform-] span.checked, .hover-blue:hover, .hover-info:hover, .label-info, .progress-bar-info, .radio-info div[id^=uniform-] span.checked { - color: #fff; - border-color: #308dcc; - background: #3498db -} - -.btn-info.active, .btn-info.disabled, .btn-info.disabled.active, .btn-info.disabled:active, .btn-info.disabled:focus, .btn-info.disabled:hover, .btn-info:active, .btn-info:focus, .btn-info:hover, .btn-info[disabled], .btn-info[disabled].active, .btn-info[disabled]:active, .btn-info[disabled]:focus, .btn-info[disabled]:hover, .label-info[href]:focus, .label-info[href]:hover, .open .dropdown-toggle.btn-info { - color: #fff; - border-color: #308dcc; - background: #52a7e0 -} - -.badge-danger, .bg-danger, .bg-red, .bootstrap-switch-danger, .btn-danger, .checkbox-danger div[id^=uniform-] span.checked, .hover-danger:hover, .hover-red:hover, .label-danger, .progress-bar-danger, .radio-danger div[id^=uniform-] span.checked { - color: #fff; - border-color: #cf4436; - background: #e74c3c -} - -.btn-danger.active, .btn-danger.disabled, .btn-danger.disabled.active, .btn-danger.disabled:active, .btn-danger.disabled:focus, .btn-danger.disabled:hover, .btn-danger:active, .btn-danger:focus, .btn-danger:hover, .btn-danger[disabled], .btn-danger[disabled].active, .btn-danger[disabled]:active, .btn-danger[disabled]:focus, .btn-danger[disabled]:hover, .label-danger[href]:focus, .label-danger[href]:hover, .open .dropdown-toggle.btn-danger { - color: #fff; - border-color: #cf4436; - background: #eb6759 -} - -.badge-gray, .bg-gray, .btn-gray, .hover-gray:hover, .label-gray { - color: #666; - background: #efefef -} - -.btn-gray.active, .btn-gray.disabled, .btn-gray.disabled.active, .btn-gray.disabled:active, .btn-gray.disabled:focus, .btn-gray.disabled:hover, .btn-gray:active, .btn-gray:focus, .btn-gray:hover, .btn-gray[disabled], .btn-gray[disabled].active, .btn-gray[disabled]:active, .btn-gray[disabled]:focus, .btn-gray[disabled]:hover, .label-gray[href]:focus, .label-gray[href]:hover, .open .dropdown-toggle.btn-gray { - color: #333; - background: #e7e7e7 -} - -.badge-gray-alt, .bg-gray-alt, .btn-gray-alt, .hover-gray-alt:hover, .label-gray-alt { - color: #888; - background: #f6f6f6 -} - -.btn-gray-alt.active, .btn-gray-alt.disabled, .btn-gray-alt.disabled.active, .btn-gray-alt.disabled:active, .btn-gray-alt.disabled:focus, .btn-gray-alt.disabled:hover, .btn-gray-alt:active, .btn-gray-alt:focus, .btn-gray-alt:hover, .btn-gray-alt[disabled], .btn-gray-alt[disabled].active, .btn-gray-alt[disabled]:active, .btn-gray-alt[disabled]:focus, .btn-gray-alt[disabled]:hover, .label-gray-alt[href]:focus, .label-gray-alt[href]:hover, .open .dropdown-toggle.btn-gray-alt { - color: #444; - background: #ededed -} - -.badge-black, .bg-black, .btn-black, .hover-black:hover, .label-black { - color: #ccc; - border-color: #000; - background: #2d2d2d -} - -.boxed-layout.bg-black { - background: #2d2d2d -} - -.btn-black.active, .btn-black.disabled, .btn-black.disabled.active, .btn-black.disabled:active, .btn-black.disabled:focus, .btn-black.disabled:hover, .btn-black:active, .btn-black:focus, .btn-black:hover, .btn-black[disabled], .btn-black[disabled].active, .btn-black[disabled]:active, .btn-black[disabled]:focus, .btn-black[disabled]:hover, .label-black[href]:focus, .label-black[href]:hover, .open .dropdown-toggle.btn-black { - color: #fdfdfd; - background: #151515 -} - -.badge-black-opacity, .bg-black-opacity, .btn-black-opacity, .hover-black-opacity:hover, .label-black-opacity { - color: #a9b3bb; - background: #2b323d -} - -.btn-black-opacity.active, .btn-black-opacity.disabled, .btn-black-opacity.disabled.active, .btn-black-opacity.disabled:active, .btn-black-opacity.disabled:focus, .btn-black-opacity.disabled:hover, .btn-black-opacity:active, .btn-black-opacity:focus, .btn-black-opacity:hover, .btn-black-opacity[disabled], .btn-black-opacity[disabled].active, .btn-black-opacity[disabled]:active, .btn-black-opacity[disabled]:focus, .btn-black-opacity[disabled]:hover, .label-black-opacity[href]:focus, .label-black-opacity[href]:hover, .open .dropdown-toggle.btn-black-opacity { - color: #fff; - background: #14171c -} - -.badge-black-opacity-alt, .bg-black-opacity-alt, .btn-black-opacity-alt, .hover-black-opacity-alt:hover, .label-black-opacity-alt { - color: #fff; - background: rgba(0, 0, 0, .2); - border-color: transparent -} - -.btn-black-opacity-alt.active, .btn-black-opacity-alt.disabled, .btn-black-opacity-alt.disabled.active, .btn-black-opacity-alt.disabled:active, .btn-black-opacity-alt.disabled:focus, .btn-black-opacity-alt.disabled:hover, .btn-black-opacity-alt:active, .btn-black-opacity-alt:focus, .btn-black-opacity-alt:hover, .btn-black-opacity-alt[disabled], .btn-black-opacity-alt[disabled].active, .btn-black-opacity-alt[disabled]:active, .btn-black-opacity-alt[disabled]:focus, .btn-black-opacity-alt[disabled]:hover, .label-black-opacity-alt[href]:focus, .label-black-opacity-alt[href]:hover, .open .dropdown-toggle.btn-black-opacity-alt { - color: #fff; - background: rgba(0, 0, 0, .3) -} - -.badge-success, .bg-green, .bootstrap-switch-success, .btn-success, .checkbox-success div[id^=uniform-] span.checked, .hover-green:hover, .hover-success:hover, .label-success, .progress-bar-success, .radio-success div[id^=uniform-] span.checked { - color: #fff; - border-color: #29b765; - background: #2ecc71 -} - -.btn-success.active, .btn-success.disabled, .btn-success.disabled.active, .btn-success.disabled:active, .btn-success.disabled:focus, .btn-success.disabled:hover, .btn-success:active, .btn-success:focus, .btn-success:hover, .btn-success[disabled], .btn-success[disabled].active, .btn-success[disabled]:active, .btn-success[disabled]:focus, .btn-success[disabled]:hover, .label-success[href]:focus, .label-success[href]:hover, .open .dropdown-toggle.btn-success { - color: #fff; - border-color: #29b765; - background: #58d68d -} - -.badge-warning, .bg-orange, .bg-warning, .bootstrap-switch-warning, .btn-warning, .checkbox-warning div[id^=uniform-] span.checked, .hover-orange:hover, .hover-warning:hover, .label-warning, .progress-bar-warning, .radio-warning div[id^=uniform-] span.checked { - color: #fff; - border-color: #d67520; - background: #e67e22 -} - -.btn-warning.active, .btn-warning.disabled, .btn-warning.disabled.active, .btn-warning.disabled:active, .btn-warning.disabled:focus, .btn-warning.disabled:hover, .btn-warning:active, .btn-warning:focus, .btn-warning:hover, .btn-warning[disabled], .btn-warning[disabled].active, .btn-warning[disabled]:active, .btn-warning[disabled]:focus, .btn-warning[disabled]:hover, .label-warning[href]:focus, .label-warning[href]:hover, .open .dropdown-toggle.btn-warning { - color: #fff; - border-color: #d67520; - background: #ea9143 -} - -.bg-white, .label-white, .table { - background: #fff -} - -.bg-white-opacity { - background: rgba(255, 255, 255, .85) -} - -.hover-white:hover { - background: #fafafa -} - -.badge-yellow, .bg-yellow, .btn-yellow, .hover-yellow:hover, .label-yellow { - color: #fff; - background: #fc0; - border-color: #deb200 -} - -.btn-yellow.active, .btn-yellow.disabled, .btn-yellow.disabled.active, .btn-yellow.disabled:active, .btn-yellow.disabled:focus, .btn-yellow.disabled:hover, .btn-yellow:active, .btn-yellow:focus, .btn-yellow:hover, .btn-yellow[disabled], .btn-yellow[disabled].active, .btn-yellow[disabled]:active, .btn-yellow[disabled]:focus, .btn-yellow[disabled]:hover, .label-yellow[href]:focus, .label-yellow[href]:hover, .open .dropdown-toggle.btn-yellow { - color: #fff; - background: #e1b400; - border-color: #c59e00 -} - -.badge-purple, .bg-purple, .btn-purple, .hover-purple:hover, .label-purple { - color: #fff; - background: #984dff; - border-color: #7a3ecc -} - -.btn-purple.active, .btn-purple.disabled, .btn-purple.disabled.active, .btn-purple.disabled:active, .btn-purple.disabled:focus, .btn-purple.disabled:hover, .btn-purple:active, .btn-purple:focus, .btn-purple:hover, .btn-purple[disabled], .btn-purple[disabled].active, .btn-purple[disabled]:active, .btn-purple[disabled]:focus, .btn-purple[disabled]:hover, .label-purple[href]:focus, .label-purple[href]:hover, .open .dropdown-toggle.btn-purple { - color: #fff; - background: #8134eb; - border-color: #752fd6 -} - -.badge-blue-alt, .bg-blue-alt, .btn-blue-alt, .hover-blue-alt:hover, .label-blue-alt { - color: #fff; - background: #65a6ff; - border-color: #5388d1 -} - -.btn-blue-alt.active, .btn-blue-alt.disabled, .btn-blue-alt.disabled.active, .btn-blue-alt.disabled:active, .btn-blue-alt.disabled:focus, .btn-blue-alt.disabled:hover, .btn-blue-alt:active, .btn-blue-alt:focus, .btn-blue-alt:hover, .btn-blue-alt[disabled], .btn-blue-alt[disabled].active, .btn-blue-alt[disabled]:active, .btn-blue-alt[disabled]:focus, .btn-blue-alt[disabled]:hover, .label-blue-alt[href]:focus, .label-blue-alt[href]:hover, .open .dropdown-toggle.btn-blue-alt { - color: #fff; - background: #478ded; - border-color: #4c7ec1 -} - -.badge-azure, .bg-azure, .btn-azure, .hover-azure:hover, .label-azure { - color: #fff; - background: #41e5c0; - border-color: #3acead -} - -.btn-azure.active, .btn-azure.disabled, .btn-azure.disabled.active, .btn-azure.disabled:active, .btn-azure.disabled:focus, .btn-azure.disabled:hover, .btn-azure:active, .btn-azure:focus, .btn-azure:hover, .btn-azure[disabled], .btn-azure[disabled].active, .btn-azure[disabled]:active, .btn-azure[disabled]:focus, .btn-azure[disabled]:hover, .label-azure[href]:focus, .label-azure[href]:hover, .open .dropdown-toggle.btn-azure { - color: #fff; - background: #27d1ab; - border-color: #24c19e -} - -.border-black { - border-color: #212121 !important -} - -.border-blue { - border-color: #5bccf6 !important -} - -.border-blue-alt { - border-color: #65a6ff !important -} - -.border-azure { - border-color: #41e5c0 !important -} - -.border-gray { - border-color: #c2c2c2 !important -} - -.border-gray-dark { - border-color: #828282 !important -} - -.border-green { - border-color: #2ecc71 !important -} - -.border-orange { - border-color: #fa7753 !important -} - -.border-yellow { - border-color: #fc0 !important -} - -.border-purple { - border-color: #984dff !important -} - -.border-red { - border-color: #ff5757 !important -} - -.parsley-success { - border-color: #77e038 !important -} - -.parsley-error { - border-color: #e03838 !important -} - -.btn, .fc-button { - font-size: 14px; - position: relative; - display: inline-block; - padding: 0 12px; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - text-align: center; - border-width: 1px; - border-style: solid; - border-color: transparent; - background-image: none; - -o-user-select: none -} - -.btn-alt, .content-box-header-alt { - font-weight: 700; - text-transform: uppercase -} - -.btn, .fc-button, .size-md { - line-height: 32px; - height: 34px; - min-width: 34px -} - -.btn-abs { - position: absolute; - top: 50%; - right: 0; - margin-top: -17px -} - -.btn.hover-round:hover { - border-radius: 100px -} - -.btn-group-vertical>.btn:not(:first-child):not(:last-child), .btn-link { - border-radius: 0 -} - -.btn.active, .btn:active, .fc-state-active, .fc-state-down, .ui-datepicker .ui-datepicker-buttonpane button:active, .ui-datepicker .ui-datepicker-next:active, .ui-datepicker .ui-datepicker-prev:active, .ui-dialog .ui-dialog-titlebar-close:active, .ui-dialog-buttonset button:active { - outline: 0; - background-image: none; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) -} - -.btn.disabled, .btn[disabled], .disabled, .fc-state-disabled, fieldset[disabled] .btn { - cursor: not-allowed; - pointer-events: none; - opacity: .65; - -webkit-box-shadow: none; - box-shadow: none; - filter: alpha(opacity=65) -} - -.btn-link { - cursor: pointer -} - -.btn-link, .btn-link:active, .btn-link[disabled] { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none -} - -.btn-link:focus, .btn-link:hover { - text-decoration: underline; - background-color: transparent -} - -.btn-border:hover, .pager li>a:focus, .pager li>a:hover { - text-decoration: none -} - -.btn-group-lg>.btn, .btn-lg, .size-lg { - line-height: 44px; - min-width: 56px; - height: 46px -} - -.btn-lg-abs { - margin-top: -23px -} - -.btn-group-lg>.btn, .btn-lg { - font-size: 18px; - padding: 0 16px -} - -.btn-group-sm>.btn, .btn-sm, .size-sm { - line-height: 28px; - height: 30px -} - -.btn-sm-abs { - margin-top: -15px -} - -.btn-group-sm>.btn, .btn-sm { - font-size: 13px; - padding: 0 10px -} - -.btn-group-xs>.btn, .btn-xs, .size-xs { - line-height: 20px; - min-width: 22px; - height: 22px -} - -.btn-xs-abs { - margin-top: -11px -} - -.btn-group-xs>.btn, .btn-xs { - font-size: 11px; - padding: 0 5px -} - -.btn .caret { - margin-left: 0 -} - -.btn-lg .caret { - border-width: 5px 5px 0 -} - -.dropup .btn-lg .caret { - border-width: 0 5px 5px -} - -.btn-block { - display: block; - padding-right: 0; - padding-left: 0 -} - -.btn-block+.btn-block { - margin-top: 5px -} - -.btn-group, .btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle -} - -.btn-group-vertical>.btn, .btn-group>.btn { - position: relative; - float: left -} - -.btn-group-vertical>.btn.active, .btn-group-vertical>.btn:active, .btn-group-vertical>.btn:focus, .btn-group-vertical>.btn:hover, .btn-group>.btn.active, .btn-group>.btn:active, .btn-group>.btn:focus, .btn-group>.btn:hover { - z-index: 2 -} - -.btn-group .btn+.btn, .btn-group .btn+.btn-group, .btn-group .btn-group+.btn, .btn-group .btn-group+.btn-group { - margin-left: -1px -} - -.btn-toolbar { - margin-left: -5px -} - -.btn-toolbar>.btn, .btn-toolbar>.btn-group, .btn-toolbar>.input-group { - margin-left: 10px -} - -.btn-group>.btn:first-child { - margin-left: 0 -} - -.btn-group>.btn+.dropdown-toggle { - padding-right: 8px; - padding-left: 8px -} - -.btn-group>.btn-lg+.dropdown-toggle { - padding-right: 12px; - padding-left: 12px -} - -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) -} - -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none -} - -.btn-group-vertical>.btn, .btn-group-vertical>.btn-group, .btn-group-vertical>.btn-group>.btn { - display: block; - float: none; - width: 100%; - max-width: 100% -} - -.btn-group-vertical>.btn-group>.btn { - float: none -} - -.btn-group-vertical>.btn+.btn, .btn-group-vertical>.btn+.btn-group, .btn-group-vertical>.btn-group+.btn, .btn-group-vertical>.btn-group+.btn-group { - margin-top: -1px; - margin-left: 0 -} - -.btn-group-justified { - display: table; - table-layout: fixed; - border-collapse: separate -} - -.btn-group-justified>.btn, .btn-group-justified>.btn-group { - display: table-cell; - float: none -} - -.btn-group-vertical>.btn:first-child:not(:last-child) { - border-top-right-radius: 3px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0 -} - -.btn-group-vertical>.btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 3px -} - -.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn, .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn, .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0 -} - -.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child, .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0 -} - -.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -.btn-group>.btn-group:first-child>.btn:last-child, .btn-group>.btn-group:first-child>.dropdown-toggle, .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.btn-group>.btn-group:last-child>.btn:first-child, .btn-group>.btn:last-child:not(:first-child), .btn-group>.dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.pagination { - display: inline-block; - padding-left: 0 -} - -.pager li, .pagination>li { - display: inline -} - -.pagination>li>a, .pagination>li>span { - line-height: 1.42857143; - position: relative; - float: left; - margin-left: -1px; - padding: 6px 12px; - text-decoration: none; - border-width: 1px; - border-style: solid -} - -.pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover { - z-index: 2 -} - -.pagination>li:first-child>a, .pagination>li:first-child>span { - margin-left: 0 -} - -.pagination-lg>li>a, .pagination-lg>li>span { - font-size: 18px; - padding: 10px 16px -} - -.pagination-sm>li>a, .pagination-sm>li>span { - font-size: 12px; - padding: 5px 10px -} - -.pager { - margin-top: 0; - padding-left: 0; - list-style: none; - text-align: center -} - -.pager li>a, .pager li>span { - display: inline-block; - padding: 5px 14px; - border: 1px solid #ddd; - border-radius: 15px; - background-color: #fff -} - -.btn>.icon-separator, .icon-separator.float-right { - border-bottom-right-radius: 0 !important; - border-bottom-left-radius: 0 !important -} - -.pager .next>a, .pager .next>span { - float: right -} - -.pager .previous>a, .pager .previous>span { - float: left -} - -.pager .disabled>a, .pager .disabled>a:focus, .pager .disabled>a:hover, .pager .disabled>span, .pagination>.disabled>a, .pagination>.disabled>a:focus, .pagination>.disabled>a:hover, .pagination>.disabled>span, .pagination>.disabled>span:focus, .pagination>.disabled>span:hover { - cursor: not-allowed; - color: #999; - background-color: #fff -} - -.btn>.icon-separator { - position: absolute; - top: 0; - left: 0; - width: 32px; - height: 100%; - border-top-right-radius: 0 !important -} - -.icon-separator+.button-content { - margin-left: 32px -} - -.btn-xs .icon-separator { - width: 22px -} - -.btn-xs .icon-separator+.button-content { - margin-left: 22px -} - -.btn-sm .icon-separator { - width: 25px -} - -.btn-sm .icon-separator+.button-content { - margin-left: 25px -} - -.btn-lg .icon-separator { - width: 44px -} - -.btn-lg .icon-separator+.button-content { - margin-left: 44px -} - -.icon-separator.float-right { - border-top-left-radius: 0 !important -} - -.vertical-button { - line-height: 1.6em; - height: auto; - padding: 10px 0 5px -} - -.vertical-button .button-content { - opacity: .7; - filter: alpha(opacity=70) -} - -.icon-separator-vertical { - font-size: 25px; - display: block; - margin: 5px auto -} - -.dashboard-buttons .btn { - width: 93px; - margin: 5px 3px -} - -.btn-outline, .btn-outline-inverse { - display: inline-block; - text-align: center; - color: #fff; - box-sizing: initial; - border-width: 2px; - border-style: solid; - text-transform: uppercase -} - -.btn-outline-inverse { - border-color: rgba(255, 255, 255, .47) -} - -.btn-outline-inverse:hover { - background: rgba(255, 255, 255, .2); - border-color: #fff -} - -.btn-outline-inverse.hero-btn { - color: #fff -} - -.btn-outline { - color: rgba(0, 0, 0, .8); - border-color: rgba(0, 0, 0, .6) -} - -.btn-outline:hover { - color: #fff; - border-color: rgba(0, 0, 0, .8); - background: rgba(0, 0, 0, .8) -} - -.btn.btn-round { - border-radius: 150px; - padding: 0 -} - -.btn-round.btn-lg { - width: 46px; - min-width: 46px -} - -.btn-round.btn-xlg { - width: 66px; - min-width: 66px; - height: 66px; - line-height: 66px -} - -.btn-round.btn-xlg .glyph-icon { - font-size: 24px -} - -.btn-round.btn-md { - width: 34px -} - -.btn-round.btn-sm { - width: 30px -} - -.btn-round.btn-xs { - width: 22px -} - -.btn-alt { - font-size: 12px -} - -.btn-hover span { - padding: 0 20px; - left: 0; - position: relative; - transition: opacity .2s ease-out, left .2s ease-out; - -webkit-transition: opacity .2s ease-out, left .2s ease-out -} - -.btn-hover .glyph-icon { - opacity: 0; - -ms-filter: "alpha(opacity=0)"; - position: absolute; - right: 20px; - transition: all .2s ease-out; - -webkit-transition: all .2s ease-out -} - -.btn-hover:hover .glyph-icon { - opacity: 1; - right: 15px; - -ms-filter: "alpha(opacity=100)" -} - -.btn-hover:hover span { - left: -15px -} - -.btn-border { - border-width: 2px; - border-style: solid -} - -.btn-border span { - opacity: .75; - filter: alpha(opacity=75) -} - -.btn-border:hover span { - opacity: 1; - filter: alpha(opacity=100) -} - -.btn-group-justified>.btn, .btn-group-justified>.btn-group { - width: auto -} - -.demo-margin .btn { - margin-bottom: 10px -} - -.content-box { - background: #fff; - margin-bottom: 20px -} - -.content-box, .content-box-header { - position: relative; - border-width: 1px; - border-style: solid -} - -.content-box-header { - font-size: 14px; - text-transform: uppercase; - margin: -1px -1px 0; - padding: 15px; - border-color: transparent -} - -.content-box-header small+.font-size-11.float-right { - position: absolute; - top: 14px; - right: 10px -} - -.content-box-header-alt { - padding: 15px 10px 14px; - font-size: 12px -} - -.content-box-header-alt small { - font-size: 13px; - font-weight: 400; - display: block; - padding: 5px 0 0; - text-transform: none; - opacity: .7; - filter: alpha(opacity: 70) -} - -.content-box .ui-widget-overlay { - position: absolute -} - -.content-box .ui-widget-overlay img { - position: absolute; - top: 50%; - left: 50%; - margin: -27px 0 0 -27px -} - -.content-box .content-box-wrapper { - line-height: 1.6em; - padding: 15px -} - -.content-box .content-box-wrapper .scrollable-content, .content-box .content-box-wrapper p:last-child { - margin-bottom: 0 -} - -.content-box .content-box-header>.glyph-icon { - margin-right: 5px; - opacity: .7; - filter: alpha(opacity: 70) -} - -.content-box-header-alt .icon-separator .glyph-icon, .content-box-header-alt>.glyph-icon { - font-size: 22px; - line-height: 30px; - position: absolute; - top: 50%; - left: 15px; - width: 30px; - height: 30px; - margin-top: -15px -} - -.content-box-header>.icon-separator { - position: relative; - top: 1px; - left: -15px; - padding: 18px 15px 16px; - text-align: center -} - -.content-box-header>.icon-separator .glyph-icon { - margin-left: 3px -} - -.content-box-header-alt>.header-wrapper { - overflow: hidden; - display: block; - margin-left: 40px -} - -.content-box-header-alt>.icon-separator+.header-wrapper { - margin-left: 65px -} - -.content-box-header-alt>.icon-separator { - position: absolute; - top: 0; - left: 0; - width: 60px; - height: 100% -} - -.content-box-header-alt>.icon-separator .glyph-icon { - left: 50%; - margin-left: -15px -} - -.header-buttons { - position: absolute; - top: 0; - right: 10px; - height: 100%; - display: block -} - -.header-buttons .btn-xs { - top: 13px -} - -.header-buttons .btn-sm { - top: 10px -} - -.header-buttons .btn-sm:last-child { - margin-right: 0 -} - -.header-buttons>.btn-group:last-child { - margin-right: -2px -} - -.content-box-header-alt .header-buttons .btn-xs { - top: 24px -} - -.content-box-header-alt .header-buttons .btn-sm { - top: 20px -} - -.content-box-header-alt .header-buttons .btn-sm:last-child { - margin-right: 5px -} - -.header-buttons-separator { - position: absolute; - top: 0; - right: 0; - height: 100% -} - -.header-buttons-separator .icon-separator { - top: 0; - left: 0; - display: block; - float: left; - min-width: 20px; - height: 100%; - padding: 0 10px -} - -.header-buttons-separator .icon-separator .glyph-icon { - line-height: 30px; - position: relative; - top: 50%; - display: block; - min-width: 30px; - height: 30px; - margin: -15px 0 0; - text-align: center -} - -.header-buttons>.btn-group { - margin-top: 8px -} - -.header-buttons .btn-group-xs { - margin-top: 14px -} - -.header-buttons .btn-group-xs:last-child { - margin-right: 0 -} - -.ui-dialog-buttonpane, body .button-pane { - padding: 10px; - text-align: center; - border-width: 1px 0 0; - border-style: solid; - border-top-left-radius: 0; - border-top-right-radius: 0 -} - -body .button-pane-top { - border-width: 0 0 1px; - border-radius: 0 -} - -.scrollable-content { - overflow-y: scroll; - overflow-x: hidden; - height: 300px; - padding-right: 0 -} - -.scrollable-xs { - overflow-y: scroll; - height: 200px -} - -.scrollable-sm { - overflow-y: scroll; - height: 400px -} - -.scrollable-lg { - overflow-y: scroll; - height: 500px -} - -.toggle-button .glyph-icon { - -webkit-transition-duration: .5s; - -moz-transition-duration: .5s; - -o-transition-duration: .5s; - transition-duration: .5s; - -webkit-transition-property: -webkit-transform; - -moz-transition-property: -moz-transform; - -o-transition-property: -o-transform; - transition-property: transform -} - -.hidden-button .content-box-header .btn, .hidden-button .content-box-header a, .hidden-button .content-box-header button { - display: none -} - -.content-box.border-top .content-box-header { - font-size: 18px; - margin: 0 -} - -.content-box.border-top .content-box-header small { - opacity: .8; - -moz-opacity: .8; - filter: alpha(opacity: 80) -} - -.content-box.border-top .content-box-header+.content-box-wrapper { - padding-top: 0 -} - -.box-xs { - width: 200px -} - -.box-sm { - width: 324px -} - -.box-md { - width: 400px -} - -.box-lg { - width: 500px -} - -.content-box-header>.ui-tabs-nav { - position: absolute; - top: 2px; - right: 0; - padding: 0; - list-style: none; - border: 0 -} - -.content-box-header>.ui-tabs-nav li>a { - line-height: 49px; - height: 49px; - margin: 0 2px; - color: rgba(255, 255, 255, .7); - border: 0; - background: 0 0 -} - -.content-box-header>.ui-tabs-nav li>a:hover { - color: #fff; - background: rgba(255, 255, 255, .2) -} - -.panel-heading>.dropdown .dropdown-toggle, .panel-title, .panel-title>a { - color: inherit -} - -.content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active>a, .content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active>a, .content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active>a { - line-height: 46px; - height: 46px; - background: #F6F6F9 -} - -.content-box-header.bg-default>.ui-tabs-nav li>a, .content-box-header.bg-gray>.ui-tabs-nav li>a, .content-box-header.bg-white>.ui-tabs-nav li>a { - line-height: 50px; - height: 50px; - margin: 0; - border-radius: 0 -} - -.content-box-header.bg-default>.ui-tabs-nav, .content-box-header.bg-gray>.ui-tabs-nav, .content-box-header.bg-white>.ui-tabs-nav { - top: 0 -} - -.content-box-header>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a, .content-box-header>.ui-tabs-nav li.ui-tabs-active>a { - line-height: 47px; - height: 49px; - background: #fff -} - -.panel { - margin-bottom: 20px; - border-width: 1px; - border-style: solid; - border-radius: 4px; - background-color: #fff; - box-shadow: 0 1px 1px rgba(0, 0, 0, .05) -} - -.panel-title, .panel>.list-group { - margin-bottom: 0 -} - -.panel-body { - padding: 15px 20px; - position: relative -} - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent -} - -.panel-title { - font-size: 16px; - margin-top: 0 -} - -.panel-footer { - padding: 10px 15px; - border-top: 1px solid transparent -} - -.panel>.list-group .list-group-item { - border-width: 1px 0; - border-radius: 0 -} - -.panel-group .panel-heading, .panel>.list-group:last-child .list-group-item:last-child { - border-bottom: 0 -} - -.panel>.list-group:first-child .list-group-item:first-child { - border-top: 0 -} - -.panel-heading+.list-group .list-group-item:first-child { - border-top-width: 0 -} - -.panel-group { - margin-bottom: 20px -} - -.panel-group .panel { - overflow: hidden; - margin-bottom: 0 -} - -.panel-group .panel+.panel { - margin-top: 5px -} - -.panel-group .panel-heading+.panel-collapse .panel-body { - border-top: 1px solid transparent -} - -.panel-group .panel-footer { - border-top: 0 -} - -.panel-group .panel-footer+.panel-collapse .panel-body { - border-bottom: 1px solid transparent -} - -fieldset, legend { - padding: 0; - border: 0 -} - -fieldset { - margin: 0 -} - -legend { - font-size: 21px; - line-height: inherit; - display: block; - width: 100%; - margin-bottom: 20px; - color: #333; - border-bottom: 1px solid #dfe8f1 -} - -label { - font-weight: 700; - display: inline-block -} - -.checkbox, .radio, input[type=file], output { - display: block -} - -input[type=checkbox], input[type=radio] { - line-height: normal -} - -select[multiple], select[size] { - height: auto -} - -select optgroup { - font-family: inherit; - font-size: inherit; - font-style: inherit -} - -input[type=file]:focus, input[type=checkbox]:focus, input[type=radio]:focus { - outline: #333 dotted thin; - outline: -webkit-focus-ring-color auto 5px; - outline-offset: -2px -} - -input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { - height: auto -} - -output { - font-size: 14px; - line-height: 1.428571429; - padding-top: 7px; - vertical-align: middle; - color: #555 -} - -.bootstrap-timepicker-widget table td input, .chosen-container-multi, .chosen-container-single .chosen-search input, .dataTables_length select, .form-control, .input, .ui-toolbar input, .ui-toolbar select, div.dataTables_filter input { - font-size: 13px; - display: block; - float: none; - background: #fff; - width: 100%; - height: 34px; - padding: 6px 12px; - color: #2b2f33; - border: 1px solid #dfe8f1; - -webkit-box-shadow: inset 1px 1px 3px #f6f6f6; - -moz-box-shadow: inset 1px 1px 3px #f6f6f6; - box-shadow: inset 1px 1px 3px #f6f6f6 -} - -.chosen-container-multi.chosen-with-drop.chosen-container-active { - border: 1px solid #ddd; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; - box-shadow: 0 0 0 transparent -} - -.bootstrap-timepicker-widget table td input:focus, .chosen-container-active, .chosen-container-multi.chosen-container-active, .form-control:focus, .input:focus, .selector.focus, .ui-toolbar input:focus, .ui-toolbar select:focus, div.dataTables_filter input:focus { - color: #333; - border-color: #3da6ff -} - -.form-control:-moz-placeholder { - color: #999 -} - -.form-control::-moz-placeholder { - color: #999 -} - -.form-control:-ms-input-placeholder { - color: #999 -} - -.form-control::-webkit-input-placeholder { - color: #999 -} - -textarea.form-control { - height: auto -} - -.form-group { - margin-bottom: 15px -} - -.form-group label { - margin-bottom: 5px -} - -.form-group .switch-toggle { - margin-top: 6px -} - -.checkbox, .radio { - min-height: 20px; - margin-top: 10px; - margin-bottom: 10px; - vertical-align: middle -} - -.checkbox label, .radio label { - font-weight: 400; - display: inline; - margin-bottom: 0; - cursor: pointer -} - -.checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], .radio input[type=radio], .radio-inline input[type=radio] { - float: left -} - -.checkbox+.checkbox, .radio+.radio { - margin-top: -5px -} - -.checkbox-inline, .radio-inline { - font-weight: 400; - line-height: 19px; - display: inline-block; - height: 19px; - margin-bottom: 0; - cursor: pointer; - vertical-align: middle -} - -.checkbox-inline label, .radio-inline label { - font-weight: 400; - line-height: 17px -} - -.checkbox-inline+.checkbox-inline, .radio-inline+.radio-inline { - margin-top: 0; - margin-left: 10px -} - -.checkbox-inline[disabled], .checkbox[disabled], .radio-inline[disabled], .radio[disabled], fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline, fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] input[type=checkbox], fieldset[disabled] input[type=radio], input[type=checkbox][disabled], input[type=radio][disabled] { - cursor: not-allowed -} - -.input-sm { - font-size: 12px; - line-height: 1.5; - height: 30px; - padding: 5px 10px; - border-radius: 3px -} - -select.input-sm { - line-height: 30px; - height: 30px -} - -textarea.input-sm { - height: auto -} - -.input-lg { - font-size: 18px; - line-height: 1.33; - height: 45px; - padding: 10px 16px; - border-radius: 6px -} - -select.input-lg { - line-height: 45px; - height: 45px -} - -textarea.input-lg { - height: auto -} - -.form-control-static { - margin-bottom: 0 -} - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 0; - color: #737373 -} - -@media (min-width:768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle - } - - .form-inline .form-control { - display: inline-block - } - - .form-inline .checkbox, .form-inline .radio { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - padding-left: 0 - } - - .form-inline .checkbox input[type=checkbox], .form-inline .radio input[type=radio] { - float: none; - margin-left: 0 - } - - .form-horizontal .control-label { - text-align: right - } -} - -.form-horizontal .checkbox, .form-horizontal .checkbox-inline, .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .radio-inline { - margin-top: 0; - margin-bottom: 0; - padding-top: 7px -} - -.form-horizontal>.form-group { - margin-right: -15px; - margin-left: -15px -} - -.form-horizontal .form-group:after, .form-horizontal .form-group:before { - display: table; - content: ' ' -} - -.form-horizontal .form-control-static { - padding-top: 7px -} - -.input-group { - position: relative; - display: table; - width: 100%; - border-collapse: separate -} - -.input-group.col { - float: none; - padding-right: 0; - padding-left: 0 -} - -.input-group .form-control { - width: 100%; - margin-bottom: 0 -} - -.input-group-lg>.form-control, .input-group-lg>.input-group-addon, .input-group-lg>.input-group-btn>.btn { - font-size: 18px; - line-height: 1.33; - height: 45px; - padding: 10px 16px; - border-radius: 6px -} - -select.input-group-lg>.form-control, select.input-group-lg>.input-group-addon, select.input-group-lg>.input-group-btn>.btn { - line-height: 45px; - height: 45px -} - -textarea.input-group-lg>.form-control, textarea.input-group-lg>.input-group-addon, textarea.input-group-lg>.input-group-btn>.btn { - height: auto -} - -.input-group-sm>.form-control, .input-group-sm>.input-group-addon, .input-group-sm>.input-group-btn>.btn { - font-size: 12px; - line-height: 1.5; - height: 30px; - padding: 5px 10px; - border-radius: 3px -} - -select.input-group-sm>.form-control, select.input-group-sm>.input-group-addon, select.input-group-sm>.input-group-btn>.btn { - line-height: 30px; - height: 30px -} - -textarea.input-group-sm>.form-control, textarea.input-group-sm>.input-group-addon, textarea.input-group-sm>.input-group-btn>.btn { - height: auto -} - -.input-group .form-control, .input-group-addon, .input-group-btn { - display: table-cell -} - -.input-group .form-control:not(:first-child):not(:last-child), .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child) { - border-radius: 0 -} - -.input-group-addon div[id^=uniform-] { - margin: 0 -3px -} - -.input-group-addon, .input-group-btn { - width: 1%; - vertical-align: middle; - white-space: nowrap -} - -.input-group-addon { - font-size: 14px; - font-weight: 400; - line-height: 1; - padding: 6px 12px; - text-align: center; - color: #2b2f33; - background-color: rgba(239, 244, 246, .36); - border: 1px solid #dfe8f1; - border-radius: 4px -} - -body, label { - color: #3e4855 -} - -.input-group-addon .glyph-icon { - display: block; - min-width: 20px; - margin: 0 -4px; - text-align: center -} - -.input-group-addon.addon-inside { - line-height: 24px; - position: absolute; - top: 5px; - left: 6px; - display: block; - width: 32px; - height: 24px; - padding: 0; - border-width: 1px; - border-style: solid -} - -.input-group-btn, .input-group-btn>.btn, .ui-spinner { - position: relative -} - -.input-group-lg .input-group-addon.addon-inside { - top: 10px; - left: 10px; - z-index: 999 -} - -.input-group-addon.addon-inside .glyph-icon { - margin: 0 -} - -.input-group-addon.addon-inside+input { - padding-left: 48px -} - -.input-group-addon.input-sm { - font-size: 12px; - padding: 5px 10px; - border-radius: 3px -} - -.input-group-addon.input-lg { - font-size: 18px; - padding: 10px 16px; - border-radius: 6px -} - -.input-group-addon input[type=checkbox], .input-group-addon input[type=radio] { - margin-top: 0 -} - -.input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child>.btn, .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0 -} - -.input-group-addon:first-child { - border-right: 0 -} - -.input-group-addon.addon-inside:first-child { - border-right-width: 1px; - border-right-style: solid; - border-color: transparent; - z-index: 999 -} - -.input-group-addon+.form-control, .input-group-addon:last-child, .input-group-btn+.form-control, .input-group-btn:first-child>.btn:not(:first-child), .input-group-btn:last-child>.btn, .input-group-btn:last-child>.dropdown-toggle { - border-top-left-radius: 0; - border-bottom-left-radius: 0 -} - -.input-group-addon:last-child { - border-left: 0 -} - -.input-group-btn:first-child>.btn { - margin-right: -1px -} - -.input-group-btn:last-child>.btn { - margin-left: -1px -} - -.input-group-btn>.btn+.btn { - margin-left: -4px -} - -.input-group-btn>.btn:active, .input-group-btn>.btn:hover { - z-index: 2 -} - -[data-toggle=buttons]>.btn>input[type=checkbox], [data-toggle=buttons]>.btn>input[type=radio] { - display: none -} - -textarea.textarea-autoresize, textarea.textarea-no-resize { - resize: none -} - -.textarea-autosize { - transition: height .3s; - -webkit-transition: height .3s; - -moz-transition: height .3s -} - -textarea.form-control { - line-height: 1.6em; - padding: 8px 12px -} - -textarea.textarea-xs { - height: 50px -} - -textarea.textarea-sm { - height: 125px -} - -textarea.textarea-md { - height: 200px -} - -textarea.textarea-lg { - height: 275px -} - -.ui-spinner { - display: block -} - -.xchart .color0.comp .fill, .xchart .color1.comp .fill { - display: none -} - -.ui-spinner .ui-spinner-button { - font-size: 9px; - line-height: 17px; - position: absolute; - right: 0; - width: 17px; - height: 17px; - cursor: pointer; - text-align: center; - border-width: 1px; - border-style: solid -} - -.ui-spinner .ui-spinner-up { - top: 0 -} - -.ui-spinner .ui-spinner-down { - bottom: 0 -} - -.parsley-errors-list li { - font-size: 12px; - padding-top: 5px -} - -.bordered-row>.form-group { - padding: 20px 0; - margin-bottom: 0; - border-top-width: 1px; - border-top-style: dashed -} - -.bordered-row>.form-group:last-child { - padding-bottom: 0 -} - -.form-group .ui-slider { - margin-top: 14px -} - -.form-group .ui-slider+.input-group { - margin-top: 20px -} - -body { - font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - background-color: #fff; - line-height: 1.42857143 -} - -#page-title>h2, #page-title>p, h1, h2, h3, h4, h5, h6 { - font-family: Raleway, "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: 300 -} - -#page-header .user-account-btn>a.user-profile .glyph-icon, .logo-bg { - background-color: rgba(255, 255, 255, .1); - color: #fff -} - -#page-header .user-account-btn>a.user-profile { - color: #fff -} - -#header-nav-right .dropdown>a .glyph-icon, #header-nav-right .header-btn .glyph-icon { - color: rgba(255, 255, 255, .8) -} - -#header-nav-right .dropdown>a:hover .glyph-icon, #header-nav-right .header-btn:hover .glyph-icon { - color: rgba(255, 255, 255, .95) -} - -#header-nav-right .dropdown>a, #header-nav-right .header-btn { - border-color: rgba(255, 255, 255, .2) -} - -#header-nav-right .dropdown>a:hover, #header-nav-right .header-btn:hover { - background: rgba(255, 255, 255, .05); - border-color: rgba(255, 255, 255, .25) -} - -#page-content { - background: #fafcfe -} - -#page-sidebar ul li.header { - color: #000 -} - -#page-sidebar ul li a .glyph-icon { - color: #0093d9 -} - -#page-sidebar ul li a:hover, #page-sidebar ul li.sfHover>a.sf-with-ul { - border-color: #d1d9dd -} - -#sidebar-menu li .sidebar-submenu { - border-color: #f6f7f8 -} - -#sidebar-menu li .sidebar-submenu ul li { - border-color: #f8f9fa -} - -#sidebar-menu li .sidebar-submenu ul li a.sfActive, #sidebar-menu li .sidebar-submenu ul li a:hover { - background: #fcfdfe -} - -#sidebar-menu li .sidebar-submenu ul li a.sfActive { - color: #1c82e1 -} - -#page-sidebar.font-inverse ul li.header { - color: rgba(255, 255, 255, .95) -} - -#page-sidebar.font-inverse ul li.divider { - background: rgba(255, 255, 255, .1) -} - -#page-sidebar.font-inverse #sidebar-menu>li>a { - color: rgba(255, 255, 255, .62) -} - -#page-sidebar.font-inverse #sidebar-menu li a:hover, #page-sidebar.font-inverse #sidebar-menu li.sfHover>a.sf-with-ul { - border-color: rgba(255, 255, 255, .26); - color: rgba(255, 255, 255, .96) -} - -#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu { - border-color: rgba(255, 255, 255, .08); - background: rgba(255, 255, 255, .05) -} - -#page-sidebar.font-inverse #sidebar-menu li a { - color: rgba(255, 255, 255, .62) -} - -#page-sidebar.font-inverse #sidebar-menu li a:hover { - color: rgba(255, 255, 255, .96) -} - -#page-sidebar.font-inverse#page-sidebar ul li a .glyph-icon { - color: rgba(255, 255, 255, .8) -} - -#page-sidebar.font-inverse#page-sidebar ul li a:hover .glyph-icon { - color: rgba(255, 255, 255, 1); - opacity: .9; - -moz-opacity: .9; - filter: alpha(opacity: 90) -} - -#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li { - border-color: rgba(255, 255, 255, .07) -} - -#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li a:hover { - background: rgba(255, 255, 255, .05) -} - -.btn-link, .chosen-disabled .chosen-single, .content-box-header.bg-default>.ui-tabs-nav li>a, .content-box-header.bg-gray>.ui-tabs-nav li>a, .content-box-header.bg-white>.ui-tabs-nav li>a, .content-box-header>.ui-tabs-nav li.ui-tabs-active>a, .pagination>li>a, .pagination>li>span, .table, a, body .content-box-header>.ui-tabs-nav li.ui-tabs-active>a:hover, div.selector { - color: #8da0aa -} - -#page-sidebar ul li.sfHover>a.sf-with-ul, .btn-link:hover, .content-box-header.bg-default>.ui-tabs-nav li>a:hover, .content-box-header.bg-gray>.ui-tabs-nav li>a:hover, .content-box-header.bg-white>.ui-tabs-nav li>a:hover, .features-tour-box h3, .font-primary, .tabs-nav li a:hover, .tabs-nav li.active a, a:hover, table.dataTable thead th.sorting_asc:after, table.dataTable thead th.sorting_desc:after { - color: #1c82e1 -} - -.border-primary, .btn-primary, .nav>li.active>a, .nav>li.active>a:focus, .nav>li.active>a:hover, .ui-accordion .ui-accordion-header.ui-accordion-header-active, .ui-datepicker .ui-datepicker-next, .ui-datepicker .ui-datepicker-prev, .ui-dialog-buttonset button, .ui-spinner .ui-spinner-button:hover, a.list-group-item.active, a.list-group-item.active:focus, a.list-group-item.active:hover, a.thumbnail:hover, div[id^=uniform-] span.checked, li.active a.list-group-item, li.active a.list-group-item:focus, li.active a.list-group-item:hover { - border-color: #00a792 -} - -a:focus { - outline: 0 !important -} - -#loadingbar, #nav-toggle span:after, #nav-toggle span:before, #nav-toggle.collapsed span, .badge-primary, .bg-primary, .bootstrap-switch-primary, .btn-primary, .chosen-container .chosen-results li.active-result.highlighted, .daterangepicker .ranges li.active, .daterangepicker .ranges li.active:hover, .fc-event, .form-wizard>ul>li.active .wizard-step, .irs-line-left, .irs-line-mid, .irs-line-right, .label-primary, .ms-hover.ui-state-focus, .ms-list .ms-hover, .nav>li.active>a, .nav>li.active>a:focus, .nav>li.active>a:hover, .owl-controls .owl-page span, .ui-accordion-header.ui-accordion-header-active, .ui-datepicker .ui-datepicker-current-day a, .ui-datepicker .ui-datepicker-current-day span, .ui-datepicker .ui-datepicker-next, .ui-datepicker .ui-datepicker-prev, .ui-dialog-buttonset button, .ui-menu li>a:hover, .ui-rangeSlider-bar, .ui-slider-handle, .ui-spinner .ui-spinner-button:hover, .ui-tabs-nav li.ui-state-active.ui-state-hover>a, .ui-tabs-nav li.ui-state-active>a, a.list-group-item.active, a.list-group-item.active:focus, a.list-group-item.active:hover, div.switch-toggle.switch-on, div[id^=uniform-] span.checked, li.active a.list-group-item, li.active a.list-group-item:focus, li.active a.list-group-item:hover { - color: #fff; - background: #00bca4 -} - -.font-secondary, .inverse.carousel-wrapper .owl-controls .owl-buttons .owl-next, .inverse.carousel-wrapper .owl-controls .owl-buttons .owl-prev, .post-box .post-title { - color: #00bca4 -} - -.post-box .post-title:hover { - color: #3e4855 -} - -.bg-default, .bg-white.dashboard-box .button-pane, .bg-white.tile-box .tile-footer, .border-default, .bordered-row .form-group, .btn-default, .button-pane, .chosen-container, .chosen-container .chosen-drop, .chosen-container-active.chosen-with-drop .chosen-single div, .chosen-container-multi .chosen-choices li.search-choice, .chosen-container-single .chosen-single div, .content-box, .content-box-header.bg-default, .content-box-header.bg-gray, .content-box-header.bg-white, .dashboard-buttons .btn, .daterangepicker .calendar-date, .dropdown-menu, .email-body, .fc-state-default, .fc-widget-content, .fc-widget-header, .img-thumbnail, .jvectormap-label, .jvectormap-zoomin, .jvectormap-zoomout, .list-group-item, .mail-toolbar, .mailbox-wrapper .nav-list li a, .minicolors-panel, .ms-container .ms-list, .ms-container .ms-selectable li.ms-elem-selectable, .ms-container .ms-selection li.ms-elem-selection, .nav .open>a, .nav .open>a:focus, .nav .open>a:hover, .nav-tabs, .nav-tabs>li>a:focus, .nav-tabs>li>a:hover, .pagination>li>a, .pagination>li>span, .panel, .panel-box.bg-default, .panel-box.bg-gray, .panel-box.bg-white, .panel-content.bg-default, .panel-content.bg-gray, .panel-content.bg-white, .panel-footer, .panel-group .panel-footer+.panel-collapse .panel-body, .panel-group .panel-heading+.panel-collapse .panel-body, .panel-heading, .popover, .popover-title, .posts-list li, .selector i, .table-bordered, .table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, .table>thead>tr>td, .table>thead>tr>th, .tabs-navigation>ul, .tabs-navigation>ul li.ui-state-hover>a, .tabs-navigation>ul li>a, .thumb-pane, .thumbnail, .timeline-box .tl-item .popover, .timeline-box:before, .ui-accordion .ui-accordion-header, .ui-datepicker, .ui-datepicker .ui-datepicker-buttonpane button, .ui-datepicker-buttonpane, .ui-dialog, .ui-dialog .ui-dialog-titlebar, .ui-dialog-buttonpane, .ui-menu, .ui-spinner .ui-spinner-button, .ui-tabs-nav, div.selector, div[id^=uniform-] span { - border-color: #dfe8f1 -} - -.divider, .nav-divider, .timeline-horizontal.timeline-box:before { - background: #dfe8f1 -} - -.content-box.border-top { - border-right-color: #dfe8f1 !important; - border-bottom-color: #dfe8f1 !important; - border-left-color: #dfe8f1 !important -} - -.bg-default, .bg-white.dashboard-box .button-pane, .bg-white.tile-box .tile-footer, .bootstrap-switch-default, .btn-default, .button-pane, .jvectormap-label, .jvectormap-zoomin, .jvectormap-zoomout, .label-default, .mail-toolbar, .panel-footer, .panel-heading, .popover-title, .ui-accordion-header, .ui-datepicker td a, .ui-datepicker td span, .ui-dialog .ui-dialog-titlebar, .ui-spinner .ui-spinner-button, div[id^=uniform-] span { - color: #555a60; - background-color: #FEFEFF -} - -.irs-diapason, .ui-datepicker-buttonpane, .ui-dialog-buttonpane, .ui-rangeSlider-container, .ui-slider-range { - background-color: #FEFEFF -} - -.table>tbody>tr>th, .table>tfoot>tr>th, .table>thead>tr>th { - color: #4b5056; - background-color: #f9fafe -} - -.btn-default.active, .btn-default.disabled, .btn-default.disabled.active, .btn-default.disabled:active, .btn-default.disabled:focus, .btn-default.disabled:hover, .btn-default:active, .btn-default:focus, .btn-default:hover, .btn-default[disabled], .btn-default[disabled].active, .btn-default[disabled]:active, .btn-default[disabled]:focus, .btn-default[disabled]:hover, .fc-state-active, .fc-state-disabled, .fc-state-down, .fc-state-hover, .jvectormap-zoomin:hover, .jvectormap-zoomout:hover, .open .dropdown-toggle.btn-default, .open.dropdown-submenu a, .ui-accordion-header.ui-state-hover, .ui-datepicker .ui-datepicker-buttonpane button:hover, .ui-tabs-nav>li.ui-state-hover>a { - color: #2b2f33; - border-color: #bfc8d1; - background-color: #f3f3f9 -} - -.btn-default.active .glyph-icon { - color: #2b2f33 !important -} - -.bsdatepicker td span:hover, .bsdatepicker td.active, .bsdatepicker td.day.active:hover, .bsdatepicker th.next:hover, .bsdatepicker th.prev:hover, .btn-primary.active, .btn-primary.disabled, .btn-primary.disabled.active, .btn-primary.disabled:active, .btn-primary.disabled:focus, .btn-primary.disabled:hover, .btn-primary:active, .btn-primary:focus, .btn-primary:hover, .btn-primary[disabled], .btn-primary[disabled].active, .btn-primary[disabled]:active, .btn-primary[disabled]:focus, .btn-primary[disabled]:hover, .daterangepicker .calendar th.next:hover, .daterangepicker .calendar th.prev:hover, .daterangepicker td.active, .daterangepicker td.available.active:hover, .hover-primary:hover, .label-primary[href]:focus, .label-primary[href]:hover, .open .dropdown-toggle.btn-primary, .pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover, .ui-accordion-header.ui-accordion-header-active.ui-state-hover, .ui-datepicker .ui-datepicker-next.ui-state-hover, .ui-datepicker .ui-datepicker-prev.ui-state-hover, .ui-datepicker td a:hover, .ui-dialog-buttonset button:hover, .ui-rangeSlider-bar:active, .ui-rangeSlider-bar:hover, .ui-slider-handle.ui-state-active, .ui-slider-handle.ui-state-hover { - color: #fff; - border-color: #00b19b; - background-color: #00ceb4 -} - -.bsdatepicker td span, .bsdatepicker td.day:hover, .bsdatepicker thead tr:first-child th.switch:hover, .chosen-container-multi .chosen-choices li.search-choice, .chosen-container-single .chosen-single div, .daterangepicker .ranges li:hover, .daterangepicker td.available:hover, .nav>li>a:focus, .nav>li>a:hover, .pager li>a:focus, .pager li>a:hover, .pagination>li>a:focus, .pagination>li>a:hover, .pagination>li>span:focus, .pagination>li>span:hover, .selector i, .ui-datepicker-title, a.list-group-item:focus, a.list-group-item:hover { - color: #2b2f33; - background: #eff4f6 -} - -.pager li>a:focus, .pager li>a:hover, .pagination>li>a:focus, .pagination>li>a:hover, .pagination>li>span:focus, .pagination>li>span:hover { - color: #2b2f33; - background-color: #f3f3f9 -} - -.dropdown-menu .active>a, .dropdown-menu .active>a:focus, .dropdown-menu .active>a:hover, .dropdown-menu li>a:hover { - color: #2b2f33; - background: #eff4f6 -} - -.active>.badge, .active>.bs-badge, .active>.bs-label { - color: #666 !important; - background: #fff !important -} - -.active>.glyph-icon, a.list-group-item.active>.glyph-icon, li.active a.list-group-item>.glyph-icon { - color: #fff !important -} - -.icon-separator { - border-right: rgba(255, 255, 255, .21) solid 1px; - background: rgba(255, 255, 255, .2) -} - -.content-box-header.bg-default .icon-separator, .content-box-header.bg-gray .icon-separator, .content-box-header.bg-white .icon-separator, .tile-box.bg-default .tile-header, .tile-box.bg-gray .tile-header, .tile-box.bg-white .tile-header, .tile-box.btn-default .tile-header { - border-right: #dfe8f1 solid 1px; - background: rgba(255, 255, 255, .1) -} - -.content-box-header .header-buttons-separator .icon-separator { - border-right: 0; - border-left: rgba(255, 255, 255, .21) solid 1px -} - -.header-buttons-separator .icon-separator { - color: rgba(255, 255, 255, .8) -} - -.header-buttons-separator .icon-separator:hover { - color: #fff; - background: rgba(255, 255, 255, .3) -} - -.content-box-header.bg-default .header-buttons-separator .icon-separator, .content-box-header.bg-gray .header-buttons-separator .icon-separator, .content-box-header.bg-white .header-buttons-separator .icon-separator { - border-right: 0; - border-left: #dfe8f1 solid 1px; - color: rgba(0, 0, 0, .6) -} - -.content-box-header.bg-default .header-buttons-separator .icon-separator:hover, .content-box-header.bg-gray .header-buttons-separator .icon-separator:hover, .content-box-header.bg-white .header-buttons-separator .icon-separator:hover { - color: rgba(0, 0, 0, .9) -} - -.dashboard-panel .button-pane { - background: rgba(0, 0, 0, .1) !important -} - -.xchart .color0 rect { - fill: #00bca4 -} - -.xchart .color0 circle { - fill: #fff -} - -.xchart .color0 .fill { - fill: rgba(0, 188, 164, .06) -} - -.xchart .color0.comp .pointer, .xchart .color0.comp circle, .xchart .color0.comp rect { - fill: #00bca4 -} - -.xchart .color1 .line, .xchart .color1 circle, .xchart .color1.comp .line { - stroke: #52a7e0 -} - -.xchart .color1 rect { - fill: #52a7e0 -} - -.xchart .color1 circle { - fill: #fff -} - -.xchart .color1 .fill { - fill: rgba(82, 167, 224, .06) -} - -.xchart .color1.comp .pointer, .xchart .color1.comp circle, .xchart .color1.comp rect { - fill: #52a7e0 -} - -body .popover.top .arrow:after { - border-top-color: #fff -} - -body .popover.right .arrow:after { - border-right-color: #fff -} - -body .popover.bottom .arrow:after { - border-bottom-color: #fff -} - -body .popover.left .arrow:after { - border-left-color: #fff -} +pre,pre code{white-space:pre-wrap}.clear,.form-row:after,.row:after{clear:both}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus,:active,:focus,:visited,a,a:active,a:focus,a:visited{outline:0}.xchart .color0 .line,.xchart .color0 circle,.xchart .color0.comp .line{stroke:#00bca4}.xchart .color0 .line .fill,.xchart .color1 .line .fill{pointer-events:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body,button,figure{margin:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-size:1em}q{quotes:'\201C''\201D''\2018''\2019'}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}button,input,select,textarea{font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}.collapsing,.divider,.overflow-hidden,.sr-only{overflow:hidden}table{border-spacing:0;border-collapse:collapse}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*{color:#000!important;background:0 0!important;box-shadow:none!important;text-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:' (' attr(href)')'}abbr[title]:after{content:' (' attr(title)')'}.ir a:after,a[href^='javascript:']:after,a[href^='#']:after{content:''}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}@page{margin:2cm .5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.jGrowl{display:none}}small{font-size:85%}a{text-decoration:none}html{font-size:62.5%;-webkit-tap-highlight-color:transparent}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.jqstooltip{box-sizing:content-box}.form-row,.row{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;margin-right:-10px;margin-left:-10px}.form-row:after,.form-row:before,.row:after,.row:before{display:table;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;content:' '}blockquote small,pre{line-height:1.428571429;display:block}[class*=col-]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:10px;padding-left:10px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.333333333333332%}.col-xs-2{width:16.666666666666664%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333333333%}.col-xs-5{width:41.66666666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333333333336%}.col-xs-8{width:66.66666666666666%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333333334%}.col-xs-11{width:91.66666666666666%}.col-xs-12{width:100%}@media (min-width:768px){.boxed-layout #page-header,.boxed-layout #page-wrapper,.container{max-width:750px}.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media (min-width:992px){.boxed-layout #page-header,.boxed-layout #page-wrapper,.container{max-width:970px}.col-md-1,.col-md-10,.col-md-11,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media (min-width:1200px){.boxed-layout #page-header,.boxed-layout #page-wrapper,.container{max-width:1170px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}.row.no-gutter{margin-left:0;margin-right:0}.no-gutter>[class*=col-]{padding-left:0;padding-right:0}.pad5A{padding:5px!important}.pad5T{padding-top:5px!important}.pad5R{padding-right:5px!important}.pad5B{padding-bottom:5px!important}.pad5L{padding-left:5px!important}.pad10A{padding:10px!important}.pad10T{padding-top:10px!important}.pad10R{padding-right:10px!important}.pad10B{padding-bottom:10px!important}.pad10L{padding-left:10px!important}.pad15A{padding:15px!important}.pad15T{padding-top:15px!important}.pad15R{padding-right:15px!important}.pad15B{padding-bottom:15px!important}.pad15L{padding-left:15px!important}.pad20A{padding:20px!important}.pad20T{padding-top:20px!important}.pad20R{padding-right:20px!important}.pad20B{padding-bottom:20px!important}.pad20L{padding-left:20px!important}.pad25A{padding:25px!important}.pad25T{padding-top:25px!important}.pad25R{padding-right:25px!important}.pad25B{padding-bottom:25px!important}.pad25L{padding-left:25px!important}.pad45A{padding:45px!important}.pad45T{padding-top:45px!important}.pad45R{padding-right:45px!important}.pad45B{padding-bottom:45px!important}.pad45L{padding-left:45px!important}.pad0A{padding:0!important}.pad0T{padding-top:0!important}.pad0R{padding-right:0!important}.pad0B{padding-bottom:0!important}.pad0L{padding-left:0!important}.mrg5A{margin:5px!important}.mrg5T{margin-top:5px!important}.mrg5R{margin-right:5px!important}.mrg5B{margin-bottom:5px!important}.mrg5L{margin-left:5px!important}.mrg10A{margin:10px!important}.mrg10T{margin-top:10px!important}.mrg10R{margin-right:10px!important}.mrg10B{margin-bottom:10px!important}.mrg10L{margin-left:10px!important}.mrg15A{margin:15px!important}.mrg15T{margin-top:15px!important}.mrg15R{margin-right:15px!important}.mrg15B{margin-bottom:15px!important}.mrg15L{margin-left:15px!important}.mrg20A{margin:20px!important}.mrg20T{margin-top:20px!important}.mrg20R{margin-right:20px!important}.mrg20B{margin-bottom:20px!important}.mrg20L{margin-left:20px!important}.mrg25A{margin:25px!important}.mrg25T{margin-top:25px!important}.mrg25R{margin-right:25px!important}.mrg25B{margin-bottom:25px!important}.mrg25L{margin-left:25px!important}.mrg45A{margin:45px!important}.mrg45T{margin-top:45px!important}.mrg45R{margin-right:45px!important}.mrg45B{margin-bottom:45px!important}.mrg45L{margin-left:45px!important}.mrg0A{margin:0!important}.mrg0T{margin-top:0!important}.mrg0R{margin-right:0!important}.mrg0B{margin-bottom:0!important}.mrg0L{margin-left:0!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;margin:0}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400}.h1,h1{font-size:38px}.h2,h2{font-size:26px}.h3,h3{font-size:20px}.h4,h4{font-size:16px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:75%}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:50;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right .small,blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right .small:before,blockquote.pull-right small:before{content:''}blockquote.pull-right .small:after,blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before{content:''}address{font-style:normal;line-height:1.428571429;margin-bottom:20px}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,'Courier New',monospace}code{font-size:90%;padding:0 4px;white-space:nowrap;color:#d05;border:1px solid #dfe8f1;border-radius:3px;background:#fafafa}pre{font-size:13px;margin:0 0 10px;padding:9.5px;word-wrap:break-word;word-break:break-all;color:#333;border:1px solid #ccc;border-radius:4px;background-color:#f5f5f5}pre code{font-size:inherit;padding:0;color:inherit;border-radius:0;background-color:transparent}.btn,.fc-button,.input-group-btn,.text-no-wrap{white-space:nowrap}p{line-height:1.6em;margin:0}.title-hero{margin:0 0 15px;padding:0;text-transform:uppercase;font-size:14px;opacity:.7}h4.title-hero{font-size:15px}.title-lead{color:#3F3F3F}.title-hero .title-lead{font-size:65%;margin:5px 0 0}.title-hero+.title-lead{margin-top:-10px}.jumbotron{font-size:21px;font-weight:200;line-height:2.1428571435;margin-bottom:30px;padding:30px;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.float-left,.pull-left{float:left!important}.float-right,.pull-right{float:right!important}.float-none{float:none!important}.font-size-10{font-size:10px!important}.font-size-11{font-size:11px!important}.font-size-12{font-size:12px!important}.font-size-13{font-size:13px!important}.font-size-14{font-size:14px!important}.font-size-15{font-size:15px!important}.font-size-16{font-size:16px!important}.font-size-17{font-size:17px!important}.font-size-18{font-size:18px!important}.font-size-20{font-size:20px!important}.font-size-23{font-size:23px!important}.font-size-26{font-size:26px!important}.font-size-28{font-size:28px!important}.font-size-35{font-size:35px!important}.font-size-50{font-size:50px!important}.text-center{text-align:center!important}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-justify{text-align:justify}.text-transform-none{text-transform:none}.text-transform-upr{text-transform:uppercase}.text-transform-low{text-transform:lowercase}.text-transform-cap{text-transform:capitalize}.font-bold{font-weight:700!important}.btn,.fc-button,.font-normal{font-weight:400}.font-italic{font-style:italic}.font-none{font-style:none}.clear-none{clear:none!important}#page-wrapper:after,.btn-group:after,.btn-toolbar:after,.button-pane:after,.chat-box li:after,.clearfix:after,.comments-list li .panel-body:after,.container:after,.content-box-header:after,.example-box-wrapper:after,.files-box li:after,.form-horizontal .form-group:after,.form-input-prepend:after,.form-row:after,.info-box:after,.messages-box li:after,.nav-list li:after,.nav:after,.notifications-box li:after,.pager:after,.posts-list li:after,.tl-item:after,.tl-row:after,.todo-box li:after,.ui-datepicker-buttonpane:after,.ui-helper-clearfix:after{clear:both}.ui-front{z-index:100}.wrapper-sticky{z-index:15}.hide,.lazy,.mix,.tab-pane,[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.tab-pane{padding:15px}.hidden,.ui-helper-hidden-accessible{display:none!important}.display-block{position:relative!important;display:block!important}.display-block .button-content{float:none}.display-block.dropdown-menu{position:static!important}.display-inline{display:inline-block}.no-border{border-color:transparent!important}.dropdown-menu.pad0A .hasDatepicker .ui-datepicker,.remove-border{border:0!important}.border-top{border-top-width:3px!important;border-top-style:solid!important}.width-100{box-sizing:border-box;width:100%}.center-margin{float:none!important;margin:0 auto}.center-block,.container{display:block;margin-right:auto;margin-left:auto}.center-vertical{position:relative;z-index:15;top:0;left:0;display:table;width:100%;height:100%}.center-vertical .center-content{display:table-cell;vertical-align:middle}.position-absolute{position:absolute}.show{display:block!important}.hidden{display:none!important;visibility:hidden!important}.invisible{visibility:hidden}.center-div{float:none!important;margin-right:auto!important;margin-left:auto!important;text-align:center!important}.btn-group>.btn-group,.btn-toolbar .btn-group,.btn-toolbar .input-group,.demo-icon{float:left}.divider,.nav-divider{ityity:.7;-moz-opacity:.7;filter:alpha(opacity: 70)}.divider{height:1px;margin:10px 0;padding:0}.divider-header{font-size:11px;padding:10px 15px;text-transform:uppercase;opacity:.2;color:#fff}.width-reset{width:auto!important}.opacity-10{opacity:.1!important;-moz-opacity:.1!important;filter:alpha(opacity: 10)!important}.info-box b,.info-box.icon-wrapper .icon-large,.opacity-30{opacity:.3!important;-moz-opacity:.3!important;filter:alpha(opacity: 30)!important}.opacity-40{opacity:.4!important;-moz-opacity:.4!important;filter:alpha(opacity: 40)!important}.info-box b,.label-description span,.opacity-60,.opacity-hover{opacity:.6!important;-moz-opacity:.6!important;filter:alpha(opacity: 60)!important}.no-shadow.transparent.btn:hover i,.opacity-80,.ui-datepicker-current.ui-priority-secondary{opacity:.8!important;-moz-opacity:.8!important;filter:alpha(opacity: 80)!important}.opacity-100,.opacity-hover:hover{opacity:1!important;-moz-opacity:1!important;filter:alpha(opacity: 100)!important}.btn-link .glyph-icon.opacity-hover{margin:0 -5px}.transparent{border-color:transparent!important;background:0 0!important;box-shadow:0 0 0 0 transparent!important}.no-shadow{box-shadow:0 0 0 transparent!important}.remove-bg{background:0 0}.nicescroll-rails{background:0 0!important}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}#loading,.login-img,.ui-widget-overlay{width:100%;height:100%}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:'';border-top:0;border-bottom:4px solid}.chosen-results,.form-wizard>ul,.nav-list ul,.nav-list-horizontal ul,.parsley-errors-list,.reset-ul,.tabs-navigation>ul,ul.messages-box,ul.notifications-box,ul.progress-box{margin:0;padding:0;list-style:none}#page-wrapper:after,#page-wrapper:before,.btn-group:after,.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.button-pane:after,.button-pane:before,.chat-box li:after,.chat-box li:before,.clearfix:after,.clearfix:before,.comments-list li .panel-body:after,.comments-list li .panel-body:before,.container:after,.container:before,.content-box-header:after,.content-box-header:before,.example-box-wrapper:after,.example-box-wrapper:before,.files-box li:after,.files-box li:before,.form-input-prepend:after,.form-input-prepend:before,.form-row:after,.form-row:before,.info-box:after,.info-box:before,.messages-box li:after,.messages-box li:before,.nav-list li:after,.nav-list li:before,.nav:after,.nav:before,.notifications-box li:after,.notifications-box li:before,.pager:after,.pager:before,.posts-list li:after,.posts-list li:before,.tl-item:after,.tl-item:before,.tl-row:after,.tl-row:before,.todo-box li:after,.todo-box li:before,.ui-datepicker-buttonpane:after,.ui-datepicker-buttonpane:before,.ui-helper-clearfix:after,.ui-helper-clearfix:before{display:table;content:''}.ui-sortable-placeholder{visibility:visible!important;border:1px dashed #efda2c!important;background:#fffce5!important}.daterangepicker td.available.in-range:hover,.daterangepicker td.in-range{background:#fffce5}.checker.disabled,.checker.disabled span,.chosen-disabled,.disabled,.radio.disabled,.radio.disabled span,.ui-rangeSlider-disabled .ui-rangeSlider-arrow,.ui-rangeSlider-disabled .ui-rangeSlider-container,.ui-rangeSlider-disabled .ui-rangeSlider-label,.ui-state-disabled,button[disabled]{cursor:not-allowed!important;opacity:.65;filter:alpha(opacity: 65)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control,input[disabled],select[disabled],textarea[disabled]{cursor:not-allowed;opacity:.65;background:#fafafa;filter:alpha(opacity: 65)}input[readonly],select[readonly],textarea[readonly]{opacity:.8;background:#fdfdfd;-moz-opacity:.8;filter:alpha(opacity: 80)}.login-img{position:fixed!important;top:0;left:0}.fixed-bg{background-repeat:no-repeat;background-attachment:fixed;background-position:center center;-webkit-background-size:cover;-moz-background-size:cover;-o-background-size:cover;background-size:cover}.ui-widget-overlay{position:fixed;left:0;top:0;bottom:0;right:0;text-align:center;z-index:16}.ui-widget-overlay img{position:absolute;top:50%;left:50%;margin:-26px 0 0 -26px}#loading{z-index:5555;position:fixed;left:0;top:0;background:#fff}.fade{-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.collapse{display:none}.collapse.in,.tab-pane.active{display:block}.collapsing{position:relative;height:0;-webkit-transition:height .35s ease;transition:height .35s ease}.small-padding{padding:25px 0}.medium-padding{padding:55px 0}.large-padding{padding:85px 0}.xlarge-padding{padding:115px 0}.glyph-icon{text-align:center}#page-sidebar li a.sf-with-ul:after,#page-sidebar li ul li a:before,.dataTables_paginate a i:before,.fc-icon,.glyph-icon:before,.search-choice-close:before,.ui-dialog-titlebar-close:before,.ui-icon:before{font-family:FontAwesome;font-weight:400;font-style:normal;display:inline-block;text-align:center;text-decoration:none;background:0 0;speak:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{cursor:not-allowed;text-decoration:none;background-color:transparent;background-image:none;filter:progid: DXImageTransform.Microsoft.gradient(enabled=false)}.sr-only{position:absolute;clip:rect(0,0,0,0);width:1px;height:1px;margin:-1px;padding:0;border:0}.rm-transition{-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important}.btn,a,button,div[id^=uniform-] span{-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;-ms-transition:all .1s ease-in-out;-o-transition:all .1s ease-in-out}#page-header,#page-sidebar,.main-header,.top-bar{-webkit-transition:all .5s ease-in-out;-moz-transition:all .5s ease-in-out;-ms-transition:all .5s ease-in-out;-o-transition:all .5s ease-in-out}.example-box-wrapper{margin-bottom:15px;position:relative}.example-box-wrapper .ui-datepicker-inline{position:relative;width:100%}.panel-body .col-md-6 .example-box-wrapper:last-child,.panel-body .example-box-wrapper:last-child{margin-bottom:0}.example-box-wrapper .alert,.example-box-wrapper .content-box,.example-box-wrapper .dashboard-box,.example-box-wrapper .dataTables_wrapper,.example-box-wrapper .icon-box,.example-box-wrapper .image-box,.example-box-wrapper .jcrop-holder,.example-box-wrapper .jvectormap-container,.example-box-wrapper .list-group,.example-box-wrapper .loading-spinner,.example-box-wrapper .loading-stick,.example-box-wrapper .minicolors,.example-box-wrapper .nav,.example-box-wrapper .panel-layout,.example-box-wrapper .scrollable-content,.example-box-wrapper .tile-box,.example-box-wrapper .ui-accordion,.example-box-wrapper .ui-rangeSlider,.example-box-wrapper .ui-slider,.example-box-wrapper .ui-tabs,.example-box-wrapper>.btn,.example-box-wrapper>.btn-group,.example-box-wrapper>.btn-group-vertical,.example-box-wrapper>.btn-toolbar,.example-box-wrapper>.display-block.dropdown-menu,.example-box-wrapper>.dropdown,.example-box-wrapper>.dropup,.example-box-wrapper>.hasDatepicker,.example-box-wrapper>.img-humbnail,.example-box-wrapper>.minicolors,.example-box-wrapper>.pagination,.example-box-wrapper>.panel-layout,.example-box-wrapper>.progressbar,.example-box-wrapper>.thumbnail,.example-box-wrapper>form,.example-box-wrapper>h6,.example-box-wrapper>img{margin-bottom:20px}.demo-icon{font-size:22px;line-height:40px;width:40px;height:40px;margin:10px;text-align:center;color:#92A0B3;border:1px solid rgba(220,233,255,.54);border-radius:3px}.btn-block,.btn-group-justified,.btn-group-justified>.btn-group .btn,input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.demo-icon:hover{color:#59606c;border-color:#92A0B3}.font-black{color:#464646!important}.font-blue{color:#1f6dca!important}.font-blue-alt{color:#65a6ff!important}.font-azure{color:#41e5c0!important}.font-gray,.text-muted{color:#c2c2c2!important}.font-gray-dark,.text-info{color:#828282!important}.font-green,.text-success{color:#2ecc71!important}.font-orange,.text-warning{color:#fa7753!important}.font-yellow{color:#fc0!important}.font-purple{color:#984dff!important}.font-red,.has-error .help-block,.parsley-required,.text-danger{color:#ff5757!important}.font-white{color:#fff!important}.alert-info,.alert-info a{color:#6c6c6c;border-color:#c9c9c9;background:#dfe8f1}.alert-notice,.alert-notice a{color:#0f2c62;border-color:#62baf6;background:#c6e8ff}.alert-success,.alert-success a,.parsley-success{color:#1e620f;border-color:#7cd362;background:#d3ffc6}.parsley-success{background:#fff}.alert-warning,.alert-warning a,.warning{color:#624b0f;border-color:#ebc875;background:#ffeec6}.alert-danger,.alert-danger a,.danger,.parsley-error{color:#620f0f;border-color:#db6a6a;background:#ffc6c6}.bg-facebook,.bg-google,.bg-twitter{color:#fff!important}.parsley-error{background:#fff}.bg-facebook{background:#3b5998}.btn.bg-facebook:hover{background:#304b85}.bg-twitter{background:#3a92c8}.btn.bg-twitter:hover{background:#2b80b4}.bg-google{background:#dd4b39}.btn.bg-google:hover{background:#c93b2a}.badge-info,.bg-blue,.bootstrap-switch-info,.btn-info,.checkbox-info div[id^=uniform-] span.checked,.hover-blue:hover,.hover-info:hover,.label-info,.progress-bar-info,.radio-info div[id^=uniform-] span.checked{color:#fff;border-color:#308dcc;background:#3498db}.btn-info.active,.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info:active,.btn-info:focus,.btn-info:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,.label-info[href]:focus,.label-info[href]:hover,.open .dropdown-toggle.btn-info{color:#fff;border-color:#308dcc;background:#52a7e0}.badge-danger,.bg-danger,.bg-red,.bootstrap-switch-danger,.btn-danger,.checkbox-danger div[id^=uniform-] span.checked,.hover-danger:hover,.hover-red:hover,.label-danger,.progress-bar-danger,.radio-danger div[id^=uniform-] span.checked{color:#fff;border-color:#cf4436;background:#e74c3c}.btn-danger.active,.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,.label-danger[href]:focus,.label-danger[href]:hover,.open .dropdown-toggle.btn-danger{color:#fff;border-color:#cf4436;background:#eb6759}.badge-gray,.bg-gray,.btn-gray,.hover-gray:hover,.label-gray{color:#666;background:#efefef}.btn-gray.active,.btn-gray.disabled,.btn-gray.disabled.active,.btn-gray.disabled:active,.btn-gray.disabled:focus,.btn-gray.disabled:hover,.btn-gray:active,.btn-gray:focus,.btn-gray:hover,.btn-gray[disabled],.btn-gray[disabled].active,.btn-gray[disabled]:active,.btn-gray[disabled]:focus,.btn-gray[disabled]:hover,.label-gray[href]:focus,.label-gray[href]:hover,.open .dropdown-toggle.btn-gray{color:#333;background:#e7e7e7}.badge-gray-alt,.bg-gray-alt,.btn-gray-alt,.hover-gray-alt:hover,.label-gray-alt{color:#888;background:#f6f6f6}.btn-gray-alt.active,.btn-gray-alt.disabled,.btn-gray-alt.disabled.active,.btn-gray-alt.disabled:active,.btn-gray-alt.disabled:focus,.btn-gray-alt.disabled:hover,.btn-gray-alt:active,.btn-gray-alt:focus,.btn-gray-alt:hover,.btn-gray-alt[disabled],.btn-gray-alt[disabled].active,.btn-gray-alt[disabled]:active,.btn-gray-alt[disabled]:focus,.btn-gray-alt[disabled]:hover,.label-gray-alt[href]:focus,.label-gray-alt[href]:hover,.open .dropdown-toggle.btn-gray-alt{color:#444;background:#ededed}.badge-black,.bg-black,.btn-black,.hover-black:hover,.label-black{color:#ccc;border-color:#000;background:#2d2d2d}.boxed-layout.bg-black{background:#2d2d2d}.btn-black.active,.btn-black.disabled,.btn-black.disabled.active,.btn-black.disabled:active,.btn-black.disabled:focus,.btn-black.disabled:hover,.btn-black:active,.btn-black:focus,.btn-black:hover,.btn-black[disabled],.btn-black[disabled].active,.btn-black[disabled]:active,.btn-black[disabled]:focus,.btn-black[disabled]:hover,.label-black[href]:focus,.label-black[href]:hover,.open .dropdown-toggle.btn-black{color:#fdfdfd;background:#151515}.badge-black-opacity,.bg-black-opacity,.btn-black-opacity,.hover-black-opacity:hover,.label-black-opacity{color:#a9b3bb;background:#2b323d}.btn-black-opacity.active,.btn-black-opacity.disabled,.btn-black-opacity.disabled.active,.btn-black-opacity.disabled:active,.btn-black-opacity.disabled:focus,.btn-black-opacity.disabled:hover,.btn-black-opacity:active,.btn-black-opacity:focus,.btn-black-opacity:hover,.btn-black-opacity[disabled],.btn-black-opacity[disabled].active,.btn-black-opacity[disabled]:active,.btn-black-opacity[disabled]:focus,.btn-black-opacity[disabled]:hover,.label-black-opacity[href]:focus,.label-black-opacity[href]:hover,.open .dropdown-toggle.btn-black-opacity{color:#fff;background:#14171c}.badge-black-opacity-alt,.bg-black-opacity-alt,.btn-black-opacity-alt,.hover-black-opacity-alt:hover,.label-black-opacity-alt{color:#fff;background:rgba(0,0,0,.2);border-color:transparent}.btn-black-opacity-alt.active,.btn-black-opacity-alt.disabled,.btn-black-opacity-alt.disabled.active,.btn-black-opacity-alt.disabled:active,.btn-black-opacity-alt.disabled:focus,.btn-black-opacity-alt.disabled:hover,.btn-black-opacity-alt:active,.btn-black-opacity-alt:focus,.btn-black-opacity-alt:hover,.btn-black-opacity-alt[disabled],.btn-black-opacity-alt[disabled].active,.btn-black-opacity-alt[disabled]:active,.btn-black-opacity-alt[disabled]:focus,.btn-black-opacity-alt[disabled]:hover,.label-black-opacity-alt[href]:focus,.label-black-opacity-alt[href]:hover,.open .dropdown-toggle.btn-black-opacity-alt{color:#fff;background:rgba(0,0,0,.3)}.badge-success,.bg-green,.bootstrap-switch-success,.btn-success,.checkbox-success div[id^=uniform-] span.checked,.hover-green:hover,.hover-success:hover,.label-success,.progress-bar-success,.radio-success div[id^=uniform-] span.checked{color:#fff;border-color:#29b765;background:#2ecc71}.btn-success.active,.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success:active,.btn-success:focus,.btn-success:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,.label-success[href]:focus,.label-success[href]:hover,.open .dropdown-toggle.btn-success{color:#fff;border-color:#29b765;background:#58d68d}.badge-warning,.bg-orange,.bg-warning,.bootstrap-switch-warning,.btn-warning,.checkbox-warning div[id^=uniform-] span.checked,.hover-orange:hover,.hover-warning:hover,.label-warning,.progress-bar-warning,.radio-warning div[id^=uniform-] span.checked{color:#fff;border-color:#d67520;background:#e67e22}.btn-warning.active,.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,.label-warning[href]:focus,.label-warning[href]:hover,.open .dropdown-toggle.btn-warning{color:#fff;border-color:#d67520;background:#ea9143}.bg-white,.label-white,.table{background:#fff}.bg-white-opacity{background:rgba(255,255,255,.85)}.hover-white:hover{background:#fafafa}.badge-yellow,.bg-yellow,.btn-yellow,.hover-yellow:hover,.label-yellow{color:#fff;background:#fc0;border-color:#deb200}.btn-yellow.active,.btn-yellow.disabled,.btn-yellow.disabled.active,.btn-yellow.disabled:active,.btn-yellow.disabled:focus,.btn-yellow.disabled:hover,.btn-yellow:active,.btn-yellow:focus,.btn-yellow:hover,.btn-yellow[disabled],.btn-yellow[disabled].active,.btn-yellow[disabled]:active,.btn-yellow[disabled]:focus,.btn-yellow[disabled]:hover,.label-yellow[href]:focus,.label-yellow[href]:hover,.open .dropdown-toggle.btn-yellow{color:#fff;background:#e1b400;border-color:#c59e00}.badge-purple,.bg-purple,.btn-purple,.hover-purple:hover,.label-purple{color:#fff;background:#984dff;border-color:#7a3ecc}.btn-purple.active,.btn-purple.disabled,.btn-purple.disabled.active,.btn-purple.disabled:active,.btn-purple.disabled:focus,.btn-purple.disabled:hover,.btn-purple:active,.btn-purple:focus,.btn-purple:hover,.btn-purple[disabled],.btn-purple[disabled].active,.btn-purple[disabled]:active,.btn-purple[disabled]:focus,.btn-purple[disabled]:hover,.label-purple[href]:focus,.label-purple[href]:hover,.open .dropdown-toggle.btn-purple{color:#fff;background:#8134eb;border-color:#752fd6}.badge-blue-alt,.bg-blue-alt,.btn-blue-alt,.hover-blue-alt:hover,.label-blue-alt{color:#fff;background:#65a6ff;border-color:#5388d1}.btn-blue-alt.active,.btn-blue-alt.disabled,.btn-blue-alt.disabled.active,.btn-blue-alt.disabled:active,.btn-blue-alt.disabled:focus,.btn-blue-alt.disabled:hover,.btn-blue-alt:active,.btn-blue-alt:focus,.btn-blue-alt:hover,.btn-blue-alt[disabled],.btn-blue-alt[disabled].active,.btn-blue-alt[disabled]:active,.btn-blue-alt[disabled]:focus,.btn-blue-alt[disabled]:hover,.label-blue-alt[href]:focus,.label-blue-alt[href]:hover,.open .dropdown-toggle.btn-blue-alt{color:#fff;background:#478ded;border-color:#4c7ec1}.badge-azure,.bg-azure,.btn-azure,.hover-azure:hover,.label-azure{color:#fff;background:#41e5c0;border-color:#3acead}.btn-azure.active,.btn-azure.disabled,.btn-azure.disabled.active,.btn-azure.disabled:active,.btn-azure.disabled:focus,.btn-azure.disabled:hover,.btn-azure:active,.btn-azure:focus,.btn-azure:hover,.btn-azure[disabled],.btn-azure[disabled].active,.btn-azure[disabled]:active,.btn-azure[disabled]:focus,.btn-azure[disabled]:hover,.label-azure[href]:focus,.label-azure[href]:hover,.open .dropdown-toggle.btn-azure{color:#fff;background:#27d1ab;border-color:#24c19e}.border-black{border-color:#212121!important}.border-blue{border-color:#5bccf6!important}.border-blue-alt{border-color:#65a6ff!important}.border-azure{border-color:#41e5c0!important}.border-gray{border-color:#c2c2c2!important}.border-gray-dark{border-color:#828282!important}.border-green{border-color:#2ecc71!important}.border-orange{border-color:#fa7753!important}.border-yellow{border-color:#fc0!important}.border-purple{border-color:#984dff!important}.border-red{border-color:#ff5757!important}.parsley-success{border-color:#77e038!important}.parsley-error{border-color:#e03838!important}.btn,.fc-button{font-size:14px;position:relative;display:inline-block;padding:0 12px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;border-width:1px;border-style:solid;border-color:transparent;background-image:none;-o-user-select:none}.btn-alt,.content-box-header-alt{font-weight:700;text-transform:uppercase}.btn,.fc-button,.size-md{line-height:32px;height:34px;min-width:34px}.btn-abs{position:absolute;top:50%;right:0;margin-top:-17px}.btn.hover-round:hover{border-radius:100px}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-link{border-radius:0}.btn.active,.btn:active,.fc-state-active,.fc-state-down,.ui-datepicker .ui-datepicker-buttonpane button:active,.ui-datepicker .ui-datepicker-next:active,.ui-datepicker .ui-datepicker-prev:active,.ui-dialog .ui-dialog-titlebar-close:active,.ui-dialog-buttonset button:active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],.disabled,.fc-state-disabled,fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;-webkit-box-shadow:none;box-shadow:none;filter:alpha(opacity=65)}.btn-link{cursor:pointer}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link:focus,.btn-link:hover{text-decoration:underline;background-color:transparent}.btn-border:hover,.pager li>a:focus,.pager li>a:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg,.size-lg{line-height:44px;min-width:56px;height:46px}.btn-lg-abs{margin-top:-23px}.btn-group-lg>.btn,.btn-lg{font-size:18px;padding:0 16px}.btn-group-sm>.btn,.btn-sm,.size-sm{line-height:28px;height:30px}.btn-sm-abs{margin-top:-15px}.btn-group-sm>.btn,.btn-sm{font-size:13px;padding:0 10px}.btn-group-xs>.btn,.btn-xs,.size-xs{line-height:20px;min-width:22px;height:22px}.btn-xs-abs{margin-top:-11px}.btn-group-xs>.btn,.btn-xs{font-size:11px;padding:0 5px}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-block{display:block;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:10px}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-justified{display:table;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:3px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.pagination{display:inline-block;padding-left:0}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{line-height:1.42857143;position:relative;float:left;margin-left:-1px;padding:6px 12px;text-decoration:none;border-width:1px;border-style:solid}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0}.pagination-lg>li>a,.pagination-lg>li>span{font-size:18px;padding:10px 16px}.pagination-sm>li>a,.pagination-sm>li>span{font-size:12px;padding:5px 10px}.pager{margin-top:0;padding-left:0;list-style:none;text-align:center}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;border:1px solid #ddd;border-radius:15px;background-color:#fff}.btn>.icon-separator,.icon-separator.float-right{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span,.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{cursor:not-allowed;color:#999;background-color:#fff}.btn>.icon-separator{position:absolute;top:0;left:0;width:32px;height:100%;border-top-right-radius:0!important}.icon-separator+.button-content{margin-left:32px}.btn-xs .icon-separator{width:22px}.btn-xs .icon-separator+.button-content{margin-left:22px}.btn-sm .icon-separator{width:25px}.btn-sm .icon-separator+.button-content{margin-left:25px}.btn-lg .icon-separator{width:44px}.btn-lg .icon-separator+.button-content{margin-left:44px}.icon-separator.float-right{border-top-left-radius:0!important}.vertical-button{line-height:1.6em;height:auto;padding:10px 0 5px}.vertical-button .button-content{opacity:.7;filter:alpha(opacity=70)}.icon-separator-vertical{font-size:25px;display:block;margin:5px auto}.dashboard-buttons .btn{width:93px;margin:5px 3px}.btn-outline,.btn-outline-inverse{display:inline-block;text-align:center;color:#fff;box-sizing:initial;border-width:2px;border-style:solid;text-transform:uppercase}.btn-outline-inverse{border-color:rgba(255,255,255,.47)}.btn-outline-inverse:hover{background:rgba(255,255,255,.2);border-color:#fff}.btn-outline-inverse.hero-btn{color:#fff}.btn-outline{color:rgba(0,0,0,.8);border-color:rgba(0,0,0,.6)}.btn-outline:hover{color:#fff;border-color:rgba(0,0,0,.8);background:rgba(0,0,0,.8)}.btn.btn-round{border-radius:150px;padding:0}.btn-round.btn-lg{width:46px;min-width:46px}.btn-round.btn-xlg{width:66px;min-width:66px;height:66px;line-height:66px}.btn-round.btn-xlg .glyph-icon{font-size:24px}.btn-round.btn-md{width:34px}.btn-round.btn-sm{width:30px}.btn-round.btn-xs{width:22px}.btn-alt{font-size:12px}.btn-hover span{padding:0 20px;left:0;position:relative;transition:opacity .2s ease-out,left .2s ease-out;-webkit-transition:opacity .2s ease-out,left .2s ease-out}.btn-hover .glyph-icon{opacity:0;-ms-filter:"alpha(opacity=0)";position:absolute;right:20px;transition:all .2s ease-out;-webkit-transition:all .2s ease-out}.btn-hover:hover .glyph-icon{opacity:1;right:15px;-ms-filter:"alpha(opacity=100)"}.btn-hover:hover span{left:-15px}.btn-border{border-width:2px;border-style:solid}.btn-border span{opacity:.75;filter:alpha(opacity=75)}.btn-border:hover span{opacity:1;filter:alpha(opacity=100)}.btn-group-justified>.btn,.btn-group-justified>.btn-group{width:auto}.demo-margin .btn{margin-bottom:10px}.content-box{background:#fff;margin-bottom:20px}.content-box,.content-box-header{position:relative;border-width:1px;border-style:solid}.content-box-header{font-size:14px;text-transform:uppercase;margin:-1px -1px 0;padding:15px;border-color:transparent}.content-box-header small+.font-size-11.float-right{position:absolute;top:14px;right:10px}.content-box-header-alt{padding:15px 10px 14px;font-size:12px}.content-box-header-alt small{font-size:13px;font-weight:400;display:block;padding:5px 0 0;text-transform:none;opacity:.7;filter:alpha(opacity: 70)}.content-box .ui-widget-overlay{position:absolute}.content-box .ui-widget-overlay img{position:absolute;top:50%;left:50%;margin:-27px 0 0 -27px}.content-box .content-box-wrapper{line-height:1.6em;padding:15px}.content-box .content-box-wrapper .scrollable-content,.content-box .content-box-wrapper p:last-child{margin-bottom:0}.content-box .content-box-header>.glyph-icon{margin-right:5px;opacity:.7;filter:alpha(opacity: 70)}.content-box-header-alt .icon-separator .glyph-icon,.content-box-header-alt>.glyph-icon{font-size:22px;line-height:30px;position:absolute;top:50%;left:15px;width:30px;height:30px;margin-top:-15px}.content-box-header>.icon-separator{position:relative;top:1px;left:-15px;padding:18px 15px 16px;text-align:center}.content-box-header>.icon-separator .glyph-icon{margin-left:3px}.content-box-header-alt>.header-wrapper{overflow:hidden;display:block;margin-left:40px}.content-box-header-alt>.icon-separator+.header-wrapper{margin-left:65px}.content-box-header-alt>.icon-separator{position:absolute;top:0;left:0;width:60px;height:100%}.content-box-header-alt>.icon-separator .glyph-icon{left:50%;margin-left:-15px}.header-buttons{position:absolute;top:0;right:10px;height:100%;display:block}.header-buttons .btn-xs{top:13px}.header-buttons .btn-sm{top:10px}.header-buttons .btn-sm:last-child{margin-right:0}.header-buttons>.btn-group:last-child{margin-right:-2px}.content-box-header-alt .header-buttons .btn-xs{top:24px}.content-box-header-alt .header-buttons .btn-sm{top:20px}.content-box-header-alt .header-buttons .btn-sm:last-child{margin-right:5px}.header-buttons-separator{position:absolute;top:0;right:0;height:100%}.header-buttons-separator .icon-separator{top:0;left:0;display:block;float:left;min-width:20px;height:100%;padding:0 10px}.header-buttons-separator .icon-separator .glyph-icon{line-height:30px;position:relative;top:50%;display:block;min-width:30px;height:30px;margin:-15px 0 0;text-align:center}.header-buttons>.btn-group{margin-top:8px}.header-buttons .btn-group-xs{margin-top:14px}.header-buttons .btn-group-xs:last-child{margin-right:0}.ui-dialog-buttonpane,body .button-pane{padding:10px;text-align:center;border-width:1px 0 0;border-style:solid;border-top-left-radius:0;border-top-right-radius:0}body .button-pane-top{border-width:0 0 1px;border-radius:0}.scrollable-content{overflow-y:scroll;overflow-x:hidden;height:300px;padding-right:0}.scrollable-xs{overflow-y:scroll;height:200px}.scrollable-sm{overflow-y:scroll;height:400px}.scrollable-lg{overflow-y:scroll;height:500px}.toggle-button .glyph-icon{-webkit-transition-duration:.5s;-moz-transition-duration:.5s;-o-transition-duration:.5s;transition-duration:.5s;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;transition-property:transform}.hidden-button .content-box-header .btn,.hidden-button .content-box-header a,.hidden-button .content-box-header button{display:none}.content-box.border-top .content-box-header{font-size:18px;margin:0}.content-box.border-top .content-box-header small{opacity:.8;-moz-opacity:.8;filter:alpha(opacity: 80)}.content-box.border-top .content-box-header+.content-box-wrapper{padding-top:0}.box-xs{width:200px}.box-sm{width:324px}.box-md{width:400px}.box-lg{width:500px}.content-box-header>.ui-tabs-nav{position:absolute;top:2px;right:0;padding:0;list-style:none;border:0}.content-box-header>.ui-tabs-nav li>a{line-height:49px;height:49px;margin:0 2px;color:rgba(255,255,255,.7);border:0;background:0 0}.content-box-header>.ui-tabs-nav li>a:hover{color:#fff;background:rgba(255,255,255,.2)}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>a{color:inherit}.content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header.bg-default>.ui-tabs-nav li.ui-tabs-active>a,.content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header.bg-gray>.ui-tabs-nav li.ui-tabs-active>a,.content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header.bg-white>.ui-tabs-nav li.ui-tabs-active>a{line-height:46px;height:46px;background:#F6F6F9}.content-box-header.bg-default>.ui-tabs-nav li>a,.content-box-header.bg-gray>.ui-tabs-nav li>a,.content-box-header.bg-white>.ui-tabs-nav li>a{line-height:50px;height:50px;margin:0;border-radius:0}.content-box-header.bg-default>.ui-tabs-nav,.content-box-header.bg-gray>.ui-tabs-nav,.content-box-header.bg-white>.ui-tabs-nav{top:0}.content-box-header>.ui-tabs-nav li.ui-tabs-active.ui-state-hover>a,.content-box-header>.ui-tabs-nav li.ui-tabs-active>a{line-height:47px;height:49px;background:#fff}.panel{margin-bottom:20px;border-width:1px;border-style:solid;border-radius:4px;background-color:#fff;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group{margin-bottom:0}.panel-body{padding:15px 20px;position:relative}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent}.panel-title{font-size:16px;margin-top:0}.panel-footer{padding:10px 15px;border-top:1px solid transparent}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel-group{margin-bottom:20px}.panel-group .panel{overflow:hidden;margin-bottom:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid transparent}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid transparent}fieldset,legend{padding:0;border:0}fieldset{margin:0}legend{font-size:21px;line-height:inherit;display:block;width:100%;margin-bottom:20px;color:#333;border-bottom:1px solid #dfe8f1}label{font-weight:700;display:inline-block}.checkbox,.radio,input[type=file],output{display:block}input[type=checkbox],input[type=radio]{line-height:normal}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:#333 dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}output{font-size:14px;line-height:1.428571429;padding-top:7px;vertical-align:middle;color:#555}.bootstrap-timepicker-widget table td input,.chosen-container-multi,.chosen-container-single .chosen-search input,.dataTables_length select,.form-control,.input,.ui-toolbar input,.ui-toolbar select,div.dataTables_filter input{font-size:13px;display:block;float:none;background:#fff;width:100%;height:34px;padding:6px 12px;color:#2b2f33;border:1px solid #dfe8f1;-webkit-box-shadow:inset 1px 1px 3px #f6f6f6;-moz-box-shadow:inset 1px 1px 3px #f6f6f6;box-shadow:inset 1px 1px 3px #f6f6f6}.chosen-container-multi.chosen-with-drop.chosen-container-active{border:1px solid #ddd;border-bottom-right-radius:0;border-bottom-left-radius:0;box-shadow:0 0 0 transparent}.bootstrap-timepicker-widget table td input:focus,.chosen-container-active,.chosen-container-multi.chosen-container-active,.form-control:focus,.input:focus,.selector.focus,.ui-toolbar input:focus,.ui-toolbar select:focus,div.dataTables_filter input:focus{color:#333;border-color:#3da6ff}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.form-group label{margin-bottom:5px}.form-group .switch-toggle{margin-top:6px}.checkbox,.radio{min-height:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.checkbox label,.radio label{font-weight:400;display:inline;margin-bottom:0;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{float:left}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{font-weight:400;line-height:19px;display:inline-block;height:19px;margin-bottom:0;cursor:pointer;vertical-align:middle}.checkbox-inline label,.radio-inline label{font-weight:400;line-height:17px}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline[disabled],.checkbox[disabled],.radio-inline[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.input-sm{font-size:12px;line-height:1.5;height:30px;padding:5px 10px;border-radius:3px}select.input-sm{line-height:30px;height:30px}textarea.input-sm{height:auto}.input-lg{font-size:18px;line-height:1.33;height:45px;padding:10px 16px;border-radius:6px}select.input-lg{line-height:45px;height:45px}textarea.input-lg{height:auto}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:0;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}.form-horizontal .control-label{text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal>.form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:after,.form-horizontal .form-group:before{display:table;content:' '}.form-horizontal .form-control-static{padding-top:7px}.input-group{position:relative;display:table;width:100%;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{font-size:18px;line-height:1.33;height:45px;padding:10px 16px;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{line-height:45px;height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{font-size:12px;line-height:1.5;height:30px;padding:5px 10px;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{line-height:30px;height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon div[id^=uniform-]{margin:0 -3px}.input-group-addon,.input-group-btn{width:1%;vertical-align:middle;white-space:nowrap}.input-group-addon{font-size:14px;font-weight:400;line-height:1;padding:6px 12px;text-align:center;color:#2b2f33;background-color:rgba(239,244,246,.36);border:1px solid #dfe8f1;border-radius:4px}body,label{color:#3e4855}.input-group-addon .glyph-icon{display:block;min-width:20px;margin:0 -4px;text-align:center}.input-group-addon.addon-inside{line-height:24px;position:absolute;top:5px;left:6px;display:block;width:32px;height:24px;padding:0;border-width:1px;border-style:solid}.input-group-btn,.input-group-btn>.btn,.ui-spinner{position:relative}.input-group-lg .input-group-addon.addon-inside{top:10px;left:10px;z-index:999}.input-group-addon.addon-inside .glyph-icon{margin:0}.input-group-addon.addon-inside+input{padding-left:48px}.input-group-addon.input-sm{font-size:12px;padding:5px 10px;border-radius:3px}.input-group-addon.input-lg{font-size:18px;padding:10px 16px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group-addon.addon-inside:first-child{border-right-width:1px;border-right-style:solid;border-color:transparent;z-index:999}.input-group-addon+.form-control,.input-group-addon:last-child,.input-group-btn+.form-control,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:active,.input-group-btn>.btn:hover{z-index:2}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}textarea.textarea-autoresize,textarea.textarea-no-resize{resize:none}.textarea-autosize{transition:height .3s;-webkit-transition:height .3s;-moz-transition:height .3s}textarea.form-control{line-height:1.6em;padding:8px 12px}textarea.textarea-xs{height:50px}textarea.textarea-sm{height:125px}textarea.textarea-md{height:200px}textarea.textarea-lg{height:275px}.ui-spinner{display:block}.xchart .color0.comp .fill,.xchart .color1.comp .fill{display:none}.ui-spinner .ui-spinner-button{font-size:9px;line-height:17px;position:absolute;right:0;width:17px;height:17px;cursor:pointer;text-align:center;border-width:1px;border-style:solid}.ui-spinner .ui-spinner-up{top:0}.ui-spinner .ui-spinner-down{bottom:0}.parsley-errors-list li{font-size:12px;padding-top:5px}.bordered-row>.form-group{padding:20px 0;margin-bottom:0;border-top-width:1px;border-top-style:dashed}.bordered-row>.form-group:last-child{padding-bottom:0}.form-group .ui-slider{margin-top:14px}.form-group .ui-slider+.input-group{margin-top:20px}body{font-family:"Open Sans","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;background-color:#fff;line-height:1.42857143}#page-title>h2,#page-title>p,h1,h2,h3,h4,h5,h6{font-family:Raleway,"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:300}#page-header .user-account-btn>a.user-profile .glyph-icon,.logo-bg{background-color:rgba(255,255,255,.1);color:#fff}#page-header .user-account-btn>a.user-profile{color:#fff}#header-nav-right .dropdown>a .glyph-icon,#header-nav-right .header-btn .glyph-icon{color:rgba(255,255,255,.8)}#header-nav-right .dropdown>a:hover .glyph-icon,#header-nav-right .header-btn:hover .glyph-icon{color:rgba(255,255,255,.95)}#header-nav-right .dropdown>a,#header-nav-right .header-btn{border-color:rgba(255,255,255,.2)}#header-nav-right .dropdown>a:hover,#header-nav-right .header-btn:hover{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.25)}#page-content{background:#fafcfe}#page-sidebar ul li.header{color:#000}#page-sidebar ul li a .glyph-icon{color:#0093d9}#page-sidebar ul li a:hover,#page-sidebar ul li.sfHover>a.sf-with-ul{border-color:#d1d9dd}#sidebar-menu li .sidebar-submenu{border-color:#f6f7f8}#sidebar-menu li .sidebar-submenu ul li{border-color:#f8f9fa}#sidebar-menu li .sidebar-submenu ul li a.sfActive,#sidebar-menu li .sidebar-submenu ul li a:hover{background:#fcfdfe}#sidebar-menu li .sidebar-submenu ul li a.sfActive{color:#1c82e1}#page-sidebar.font-inverse ul li.header{color:rgba(255,255,255,.95)}#page-sidebar.font-inverse ul li.divider{background:rgba(255,255,255,.1)}#page-sidebar.font-inverse #sidebar-menu>li>a{color:rgba(255,255,255,.62)}#page-sidebar.font-inverse #sidebar-menu li a:hover,#page-sidebar.font-inverse #sidebar-menu li.sfHover>a.sf-with-ul{border-color:rgba(255,255,255,.26);color:rgba(255,255,255,.96)}#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu{border-color:rgba(255,255,255,.08);background:rgba(255,255,255,.05)}#page-sidebar.font-inverse #sidebar-menu li a{color:rgba(255,255,255,.62)}#page-sidebar.font-inverse #sidebar-menu li a:hover{color:rgba(255,255,255,.96)}#page-sidebar.font-inverse#page-sidebar ul li a .glyph-icon{color:rgba(255,255,255,.8)}#page-sidebar.font-inverse#page-sidebar ul li a:hover .glyph-icon{color:rgba(255,255,255,1);opacity:.9;-moz-opacity:.9;filter:alpha(opacity: 90)}#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li{border-color:rgba(255,255,255,.07)}#page-sidebar.font-inverse #sidebar-menu li .sidebar-submenu ul li a:hover{background:rgba(255,255,255,.05)}.btn-link,.chosen-disabled .chosen-single,.content-box-header.bg-default>.ui-tabs-nav li>a,.content-box-header.bg-gray>.ui-tabs-nav li>a,.content-box-header.bg-white>.ui-tabs-nav li>a,.content-box-header>.ui-tabs-nav li.ui-tabs-active>a,.pagination>li>a,.pagination>li>span,.table,a,body .content-box-header>.ui-tabs-nav li.ui-tabs-active>a:hover,div.selector{color:#8da0aa}#page-sidebar ul li.sfHover>a.sf-with-ul,.btn-link:hover,.content-box-header.bg-default>.ui-tabs-nav li>a:hover,.content-box-header.bg-gray>.ui-tabs-nav li>a:hover,.content-box-header.bg-white>.ui-tabs-nav li>a:hover,.features-tour-box h3,.font-primary,.tabs-nav li a:hover,.tabs-nav li.active a,a:hover,table.dataTable thead th.sorting_asc:after,table.dataTable thead th.sorting_desc:after{color:#1c82e1}.border-primary,.btn-primary,.nav>li.active>a,.nav>li.active>a:focus,.nav>li.active>a:hover,.ui-accordion .ui-accordion-header.ui-accordion-header-active,.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev,.ui-dialog-buttonset button,.ui-spinner .ui-spinner-button:hover,a.list-group-item.active,a.list-group-item.active:focus,a.list-group-item.active:hover,a.thumbnail:hover,div[id^=uniform-] span.checked,li.active a.list-group-item,li.active a.list-group-item:focus,li.active a.list-group-item:hover{border-color:#00a792}a:focus{outline:0!important}#loadingbar,#nav-toggle span:after,#nav-toggle span:before,#nav-toggle.collapsed span,.badge-primary,.bg-primary,.bootstrap-switch-primary,.btn-primary,.chosen-container .chosen-results li.active-result.highlighted,.daterangepicker .ranges li.active,.daterangepicker .ranges li.active:hover,.fc-event,.form-wizard>ul>li.active .wizard-step,.irs-line-left,.irs-line-mid,.irs-line-right,.label-primary,.ms-hover.ui-state-focus,.ms-list .ms-hover,.nav>li.active>a,.nav>li.active>a:focus,.nav>li.active>a:hover,.owl-controls .owl-page span,.ui-accordion-header.ui-accordion-header-active,.ui-datepicker .ui-datepicker-current-day a,.ui-datepicker .ui-datepicker-current-day span,.ui-datepicker .ui-datepicker-next,.ui-datepicker .ui-datepicker-prev,.ui-dialog-buttonset button,.ui-menu li>a:hover,.ui-rangeSlider-bar,.ui-slider-handle,.ui-spinner .ui-spinner-button:hover,.ui-tabs-nav li.ui-state-active.ui-state-hover>a,.ui-tabs-nav li.ui-state-active>a,a.list-group-item.active,a.list-group-item.active:focus,a.list-group-item.active:hover,div.switch-toggle.switch-on,div[id^=uniform-] span.checked,li.active a.list-group-item,li.active a.list-group-item:focus,li.active a.list-group-item:hover{color:#fff;background:#00bca4}.font-secondary,.inverse.carousel-wrapper .owl-controls .owl-buttons .owl-next,.inverse.carousel-wrapper .owl-controls .owl-buttons .owl-prev,.post-box .post-title{color:#00bca4}.post-box .post-title:hover{color:#3e4855}.bg-default,.bg-white.dashboard-box .button-pane,.bg-white.tile-box .tile-footer,.border-default,.bordered-row .form-group,.btn-default,.button-pane,.chosen-container,.chosen-container .chosen-drop,.chosen-container-active.chosen-with-drop .chosen-single div,.chosen-container-multi .chosen-choices li.search-choice,.chosen-container-single .chosen-single div,.content-box,.content-box-header.bg-default,.content-box-header.bg-gray,.content-box-header.bg-white,.dashboard-buttons .btn,.daterangepicker .calendar-date,.dropdown-menu,.email-body,.fc-state-default,.fc-widget-content,.fc-widget-header,.img-thumbnail,.jvectormap-label,.jvectormap-zoomin,.jvectormap-zoomout,.list-group-item,.mail-toolbar,.mailbox-wrapper .nav-list li a,.minicolors-panel,.ms-container .ms-list,.ms-container .ms-selectable li.ms-elem-selectable,.ms-container .ms-selection li.ms-elem-selection,.nav .open>a,.nav .open>a:focus,.nav .open>a:hover,.nav-tabs,.nav-tabs>li>a:focus,.nav-tabs>li>a:hover,.pagination>li>a,.pagination>li>span,.panel,.panel-box.bg-default,.panel-box.bg-gray,.panel-box.bg-white,.panel-content.bg-default,.panel-content.bg-gray,.panel-content.bg-white,.panel-footer,.panel-group .panel-footer+.panel-collapse .panel-body,.panel-group .panel-heading+.panel-collapse .panel-body,.panel-heading,.popover,.popover-title,.posts-list li,.selector i,.table-bordered,.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th,.tabs-navigation>ul,.tabs-navigation>ul li.ui-state-hover>a,.tabs-navigation>ul li>a,.thumb-pane,.thumbnail,.timeline-box .tl-item .popover,.timeline-box:before,.ui-accordion .ui-accordion-header,.ui-datepicker,.ui-datepicker .ui-datepicker-buttonpane button,.ui-datepicker-buttonpane,.ui-dialog,.ui-dialog .ui-dialog-titlebar,.ui-dialog-buttonpane,.ui-menu,.ui-spinner .ui-spinner-button,.ui-tabs-nav,div.selector,div[id^=uniform-] span{border-color:#dfe8f1}.divider,.nav-divider,.timeline-horizontal.timeline-box:before{background:#dfe8f1}.content-box.border-top{border-right-color:#dfe8f1!important;border-bottom-color:#dfe8f1!important;border-left-color:#dfe8f1!important}.bg-default,.bg-white.dashboard-box .button-pane,.bg-white.tile-box .tile-footer,.bootstrap-switch-default,.btn-default,.button-pane,.jvectormap-label,.jvectormap-zoomin,.jvectormap-zoomout,.label-default,.mail-toolbar,.panel-footer,.panel-heading,.popover-title,.ui-accordion-header,.ui-datepicker td a,.ui-datepicker td span,.ui-dialog .ui-dialog-titlebar,.ui-spinner .ui-spinner-button,div[id^=uniform-] span{color:#555a60;background-color:#FEFEFF}.irs-diapason,.ui-datepicker-buttonpane,.ui-dialog-buttonpane,.ui-rangeSlider-container,.ui-slider-range{background-color:#FEFEFF}.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>th{color:#4b5056;background-color:#f9fafe}.btn-default.active,.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default:active,.btn-default:focus,.btn-default:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover,.jvectormap-zoomin:hover,.jvectormap-zoomout:hover,.open .dropdown-toggle.btn-default,.open.dropdown-submenu a,.ui-accordion-header.ui-state-hover,.ui-datepicker .ui-datepicker-buttonpane button:hover,.ui-tabs-nav>li.ui-state-hover>a{color:#2b2f33;border-color:#bfc8d1;background-color:#f3f3f9}.btn-default.active .glyph-icon{color:#2b2f33!important}.bsdatepicker td span:hover,.bsdatepicker td.active,.bsdatepicker td.day.active:hover,.bsdatepicker th.next:hover,.bsdatepicker th.prev:hover,.btn-primary.active,.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,.daterangepicker .calendar th.next:hover,.daterangepicker .calendar th.prev:hover,.daterangepicker td.active,.daterangepicker td.available.active:hover,.hover-primary:hover,.label-primary[href]:focus,.label-primary[href]:hover,.open .dropdown-toggle.btn-primary,.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover,.ui-accordion-header.ui-accordion-header-active.ui-state-hover,.ui-datepicker .ui-datepicker-next.ui-state-hover,.ui-datepicker .ui-datepicker-prev.ui-state-hover,.ui-datepicker td a:hover,.ui-dialog-buttonset button:hover,.ui-rangeSlider-bar:active,.ui-rangeSlider-bar:hover,.ui-slider-handle.ui-state-active,.ui-slider-handle.ui-state-hover{color:#fff;border-color:#00b19b;background-color:#00ceb4}.bsdatepicker td span,.bsdatepicker td.day:hover,.bsdatepicker thead tr:first-child th.switch:hover,.chosen-container-multi .chosen-choices li.search-choice,.chosen-container-single .chosen-single div,.daterangepicker .ranges li:hover,.daterangepicker td.available:hover,.nav>li>a:focus,.nav>li>a:hover,.pager li>a:focus,.pager li>a:hover,.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover,.selector i,.ui-datepicker-title,a.list-group-item:focus,a.list-group-item:hover{color:#2b2f33;background:#eff4f6}.pager li>a:focus,.pager li>a:hover,.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#2b2f33;background-color:#f3f3f9}.dropdown-menu .active>a,.dropdown-menu .active>a:focus,.dropdown-menu .active>a:hover,.dropdown-menu li>a:hover{color:#2b2f33;background:#eff4f6}.active>.badge,.active>.bs-badge,.active>.bs-label{color:#666!important;background:#fff!important}.active>.glyph-icon,a.list-group-item.active>.glyph-icon,li.active a.list-group-item>.glyph-icon{color:#fff!important}.icon-separator{border-right:rgba(255,255,255,.21) solid 1px;background:rgba(255,255,255,.2)}.content-box-header.bg-default .icon-separator,.content-box-header.bg-gray .icon-separator,.content-box-header.bg-white .icon-separator,.tile-box.bg-default .tile-header,.tile-box.bg-gray .tile-header,.tile-box.bg-white .tile-header,.tile-box.btn-default .tile-header{border-right:#dfe8f1 solid 1px;background:rgba(255,255,255,.1)}.content-box-header .header-buttons-separator .icon-separator{border-right:0;border-left:rgba(255,255,255,.21) solid 1px}.header-buttons-separator .icon-separator{color:rgba(255,255,255,.8)}.header-buttons-separator .icon-separator:hover{color:#fff;background:rgba(255,255,255,.3)}.content-box-header.bg-default .header-buttons-separator .icon-separator,.content-box-header.bg-gray .header-buttons-separator .icon-separator,.content-box-header.bg-white .header-buttons-separator .icon-separator{border-right:0;border-left:#dfe8f1 solid 1px;color:rgba(0,0,0,.6)}.content-box-header.bg-default .header-buttons-separator .icon-separator:hover,.content-box-header.bg-gray .header-buttons-separator .icon-separator:hover,.content-box-header.bg-white .header-buttons-separator .icon-separator:hover{color:rgba(0,0,0,.9)}.dashboard-panel .button-pane{background:rgba(0,0,0,.1)!important}.xchart .color0 rect{fill:#00bca4}.xchart .color0 circle{fill:#fff}.xchart .color0 .fill{fill:rgba(0,188,164,.06)}.xchart .color0.comp .pointer,.xchart .color0.comp circle,.xchart .color0.comp rect{fill:#00bca4}.xchart .color1 .line,.xchart .color1 circle,.xchart .color1.comp .line{stroke:#52a7e0}.xchart .color1 rect{fill:#52a7e0}.xchart .color1 circle{fill:#fff}.xchart .color1 .fill{fill:rgba(82,167,224,.06)}.xchart .color1.comp .pointer,.xchart .color1.comp circle,.xchart .color1.comp rect{fill:#52a7e0}body .popover.top .arrow:after{border-top-color:#fff}body .popover.right .arrow:after{border-right-color:#fff}body .popover.bottom .arrow:after{border-bottom-color:#fff}body .popover.left .arrow:after{border-left-color:#fff} @font-face { - font-family: 'FontAwesome'; - src: url('fontawesome-webfont.eot?v=4.0.3'); - src: url('fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), - url('fontawesome-webfont.woff?v=4.0.3') format('woff'), - url('fontawesome-webfont.ttf?v=4.0.3') format('truetype'), - url('fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; + font-family: 'FontAwesome'; + src: url('fontawesome-webfont.eot?v=4.0.3'); + src: url('fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), + url('fontawesome-webfont.woff?v=4.0.3') format('woff'), + url('fontawesome-webfont.ttf?v=4.0.3') format('truetype'), + url('fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; } .icon-glass:before { - content: "\f000"; + content: "\f000"; } - .icon-music:before { - content: "\f001"; + content: "\f001"; } - .icon-search:before { - content: "\f002"; + content: "\f002"; } - .icon-envelope-o:before { - content: "\f003"; + content: "\f003"; } - .icon-heart:before { - content: "\f004"; + content: "\f004"; } - .icon-star:before { - content: "\f005"; + content: "\f005"; } - .icon-star-o:before { - content: "\f006"; + content: "\f006"; } - .icon-user:before { - content: "\f007"; + content: "\f007"; } - .icon-film:before { - content: "\f008"; + content: "\f008"; } - .icon-th-large:before { - content: "\f009"; + content: "\f009"; } - .icon-th:before { - content: "\f00a"; + content: "\f00a"; } - .icon-th-list:before { - content: "\f00b"; + content: "\f00b"; } - .icon-check:before { - content: "\f00c"; + content: "\f00c"; } - .icon-times:before, .icon-remove:before, .search-choice-close:before, @@ -4111,2091 +57,1589 @@ body .popover.left .arrow:after { .ui-dialog-titlebar-close:before, .icon-clock-os:before, .icon-close:before { - content: "\f00d"; + content: "\f00d"; } - .icon-search-plus:before { - content: "\f00e"; + content: "\f00e"; } - .icon-search-minus:before { - content: "\f010"; + content: "\f010"; } - .icon-power-off:before { - content: "\f011"; + content: "\f011"; } - .icon-signal:before { - content: "\f012"; + content: "\f012"; } - .icon-gear:before, .icon-cog:before { - content: "\f013"; + content: "\f013"; } - .icon-trash-o:before { - content: "\f014"; + content: "\f014"; } - .icon-home:before { - content: "\f015"; + content: "\f015"; } - .icon-file-o:before { - content: "\f016"; + content: "\f016"; } - .icon-clock-o:before { - content: "\f017"; + content: "\f017"; } - .icon-road:before { - content: "\f018"; + content: "\f018"; } - .icon-download:before { - content: "\f019"; + content: "\f019"; } - .icon-arrow-circle-o-down:before { - content: "\f01a"; + content: "\f01a"; } - .icon-arrow-circle-o-up:before { - content: "\f01b"; + content: "\f01b"; } - .icon-inbox:before { - content: "\f01c"; + content: "\f01c"; } - .icon-play-circle-o:before { - content: "\f01d"; + content: "\f01d"; } - .icon-rotate-right:before, .icon-repeat:before { - content: "\f01e"; + content: "\f01e"; } - .icon-refresh:before { - content: "\f021"; + content: "\f021"; } - .icon-list-alt:before { - content: "\f022"; + content: "\f022"; } - .icon-lock:before { - content: "\f023"; + content: "\f023"; } - .icon-flag:before { - content: "\f024"; + content: "\f024"; } - .icon-headphones:before { - content: "\f025"; + content: "\f025"; } - .icon-volume-off:before { - content: "\f026"; + content: "\f026"; } - .icon-volume-down:before { - content: "\f027"; + content: "\f027"; } - .icon-volume-up:before { - content: "\f028"; + content: "\f028"; } - .icon-qrcode:before { - content: "\f029"; + content: "\f029"; } - .icon-barcode:before { - content: "\f02a"; + content: "\f02a"; } - .icon-tag:before { - content: "\f02b"; + content: "\f02b"; } - .icon-tags:before { - content: "\f02c"; + content: "\f02c"; } - .icon-book:before { - content: "\f02d"; + content: "\f02d"; } - .icon-bookmark:before { - content: "\f02e"; + content: "\f02e"; } - .icon-print:before { - content: "\f02f"; + content: "\f02f"; } - .icon-camera:before { - content: "\f030"; + content: "\f030"; } - .icon-font:before { - content: "\f031"; + content: "\f031"; } - .icon-bold:before { - content: "\f032"; + content: "\f032"; } - .icon-italic:before { - content: "\f033"; + content: "\f033"; } - .icon-text-height:before { - content: "\f034"; + content: "\f034"; } - .icon-text-width:before { - content: "\f035"; + content: "\f035"; } - .icon-align-left:before { - content: "\f036"; + content: "\f036"; } - .icon-align-center:before { - content: "\f037"; + content: "\f037"; } - .icon-align-right:before { - content: "\f038"; + content: "\f038"; } - .icon-align-justify:before { - content: "\f039"; + content: "\f039"; } - .icon-list:before { - content: "\f03a"; + content: "\f03a"; } - .icon-dedent:before, .icon-outdent:before { - content: "\f03b"; + content: "\f03b"; } - .icon-indent:before { - content: "\f03c"; + content: "\f03c"; } - .icon-video-camera:before { - content: "\f03d"; + content: "\f03d"; } - .icon-photo:before, .icon-image:before, .icon-picture-o:before { - content: "\f03e"; + content: "\f03e"; } - .icon-pencil:before { - content: "\f040"; + content: "\f040"; } - .icon-map-marker:before { - content: "\f041"; + content: "\f041"; } - .icon-adjust:before { - content: "\f042"; + content: "\f042"; } - .icon-tint:before { - content: "\f043"; + content: "\f043"; } - .icon-edit:before, .icon-pencil-square-o:before { - content: "\f044"; + content: "\f044"; } - .icon-share-square-o:before { - content: "\f045"; + content: "\f045"; } - .icon-check-square-o:before { - content: "\f046"; + content: "\f046"; } - .icon-arrows:before { - content: "\f047"; + content: "\f047"; } - .icon-step-backward:before { - content: "\f048"; + content: "\f048"; } - .icon-fast-backward:before { - content: "\f049"; + content: "\f049"; } - .icon-backward:before { - content: "\f04a"; + content: "\f04a"; } - .icon-play:before { - content: "\f04b"; + content: "\f04b"; } - .icon-pause:before { - content: "\f04c"; + content: "\f04c"; } - .icon-stop:before { - content: "\f04d"; + content: "\f04d"; } - .icon-forward:before { - content: "\f04e"; + content: "\f04e"; } - .icon-fast-forward:before { - content: "\f050"; + content: "\f050"; } - .icon-step-forward:before { - content: "\f051"; + content: "\f051"; } - .icon-eject:before { - content: "\f052"; + content: "\f052"; } - .icon-chevron-left:before { - content: "\f053"; + content: "\f053"; } - .icon-chevron-right:before { - content: "\f054"; + content: "\f054"; } - .icon-plus-circle:before { - content: "\f055"; + content: "\f055"; } - .icon-minus-circle:before { - content: "\f056"; + content: "\f056"; } - .icon-times-circle:before { - content: "\f057"; + content: "\f057"; } - .icon-check-circle:before { - content: "\f058"; + content: "\f058"; } - .icon-question-circle:before { - content: "\f059"; + content: "\f059"; } - .icon-info-circle:before { - content: "\f05a"; + content: "\f05a"; } - .icon-crosshairs:before { - content: "\f05b"; + content: "\f05b"; } - .icon-times-circle-o:before { - content: "\f05c"; + content: "\f05c"; } - .icon-check-circle-o:before { - content: "\f05d"; + content: "\f05d"; } - .icon-ban:before { - content: "\f05e"; + content: "\f05e"; } - .icon-arrow-left:before { - content: "\f060"; + content: "\f060"; } - .icon-arrow-right:before { - content: "\f061"; + content: "\f061"; } - .icon-arrow-up:before { - content: "\f062"; + content: "\f062"; } - .icon-arrow-down:before { - content: "\f063"; + content: "\f063"; } - .icon-mail-forward:before, .icon-share:before { - content: "\f064"; + content: "\f064"; } - .icon-expand:before { - content: "\f065"; + content: "\f065"; } - .icon-compress:before { - content: "\f066"; + content: "\f066"; } - .icon-plus:before { - content: "\f067"; + content: "\f067"; } - .icon-minus:before { - content: "\f068"; + content: "\f068"; } - .icon-asterisk:before { - content: "\f069"; + content: "\f069"; } - .icon-exclamation-circle:before { - content: "\f06a"; + content: "\f06a"; } - .icon-gift:before { - content: "\f06b"; + content: "\f06b"; } - .icon-leaf:before { - content: "\f06c"; + content: "\f06c"; } - .icon-fire:before { - content: "\f06d"; + content: "\f06d"; } - .icon-eye:before { - content: "\f06e"; + content: "\f06e"; } - .icon-eye-slash:before { - content: "\f070"; + content: "\f070"; } - .icon-warning:before, .icon-exclamation-triangle:before { - content: "\f071"; + content: "\f071"; } - .icon-plane:before { - content: "\f072"; + content: "\f072"; } - .icon-calendar:before { - content: "\f073"; + content: "\f073"; } - .icon-random:before { - content: "\f074"; + content: "\f074"; } - .icon-comment:before { - content: "\f075"; + content: "\f075"; } - .icon-magnet:before { - content: "\f076"; + content: "\f076"; } - .icon-chevron-up:before { - content: "\f077"; + content: "\f077"; } - .icon-chevron-down:before { - content: "\f078"; + content: "\f078"; } - .icon-retweet:before { - content: "\f079"; + content: "\f079"; } - .icon-shopping-cart:before { - content: "\f07a"; + content: "\f07a"; } - .icon-folder:before { - content: "\f07b"; + content: "\f07b"; } - .icon-folder-open:before { - content: "\f07c"; + content: "\f07c"; } - .icon-arrows-v:before { - content: "\f07d"; + content: "\f07d"; } - .icon-arrows-h:before { - content: "\f07e"; + content: "\f07e"; } - .icon-bar-chart-o:before, .icon-bar-chart:before { - content: "\f080"; + content: "\f080"; } - .icon-twitter-square:before { - content: "\f081"; + content: "\f081"; } - .icon-facebook-square:before { - content: "\f082"; + content: "\f082"; } - .icon-camera-retro:before { - content: "\f083"; + content: "\f083"; } - .icon-key:before { - content: "\f084"; + content: "\f084"; } - .icon-gears:before, .icon-cogs:before { - content: "\f085"; + content: "\f085"; } - .icon-comments:before { - content: "\f086"; + content: "\f086"; } - .icon-thumbs-o-up:before { - content: "\f087"; + content: "\f087"; } - .icon-thumbs-o-down:before { - content: "\f088"; + content: "\f088"; } - .icon-star-half:before { - content: "\f089"; + content: "\f089"; } - .icon-heart-o:before { - content: "\f08a"; + content: "\f08a"; } - .icon-sign-out:before { - content: "\f08b"; + content: "\f08b"; } - .icon-linkedin-square:before { - content: "\f08c"; + content: "\f08c"; } - .icon-thumb-tack:before { - content: "\f08d"; + content: "\f08d"; } - .icon-external-link:before { - content: "\f08e"; + content: "\f08e"; } - .icon-sign-in:before { - content: "\f090"; + content: "\f090"; } - .icon-trophy:before { - content: "\f091"; + content: "\f091"; } - .icon-github-square:before { - content: "\f092"; + content: "\f092"; } - .icon-upload:before { - content: "\f093"; + content: "\f093"; } - .icon-lemon-o:before { - content: "\f094"; + content: "\f094"; } - .icon-phone:before { - content: "\f095"; + content: "\f095"; } - .icon-square-o:before { - content: "\f096"; + content: "\f096"; } - .icon-bookmark-o:before { - content: "\f097"; + content: "\f097"; } - .icon-phone-square:before { - content: "\f098"; + content: "\f098"; } - .icon-twitter:before { - content: "\f099"; + content: "\f099"; } - .icon-facebook:before { - content: "\f09a"; + content: "\f09a"; } - .icon-github:before { - content: "\f09b"; + content: "\f09b"; } - .icon-unlock:before { - content: "\f09c"; + content: "\f09c"; } - .icon-credit-card:before { - content: "\f09d"; + content: "\f09d"; } - .icon-rss:before { - content: "\f09e"; + content: "\f09e"; } - .icon-hdd-o:before { - content: "\f0a0"; + content: "\f0a0"; } - .icon-bullhorn:before { - content: "\f0a1"; + content: "\f0a1"; } - .icon-bell:before { - content: "\f0f3"; + content: "\f0f3"; } - .icon-certificate:before { - content: "\f0a3"; + content: "\f0a3"; } - .icon-hand-o-right:before { - content: "\f0a4"; + content: "\f0a4"; } - .icon-hand-o-left:before { - content: "\f0a5"; + content: "\f0a5"; } - .icon-hand-o-up:before { - content: "\f0a6"; + content: "\f0a6"; } - .icon-hand-o-down:before { - content: "\f0a7"; + content: "\f0a7"; } - .icon-arrow-circle-left:before { - content: "\f0a8"; + content: "\f0a8"; } - .icon-arrow-circle-right:before { - content: "\f0a9"; + content: "\f0a9"; } - .icon-arrow-circle-up:before { - content: "\f0aa"; + content: "\f0aa"; } - .icon-arrow-circle-down:before { - content: "\f0ab"; + content: "\f0ab"; } - .icon-globe:before { - content: "\f0ac"; + content: "\f0ac"; } - .icon-wrench:before { - content: "\f0ad"; + content: "\f0ad"; } - .icon-tasks:before { - content: "\f0ae"; + content: "\f0ae"; } - .icon-filter:before { - content: "\f0b0"; + content: "\f0b0"; } - .icon-briefcase:before { - content: "\f0b1"; + content: "\f0b1"; } - .icon-arrows-alt:before { - content: "\f0b2"; + content: "\f0b2"; } - .icon-group:before, .icon-users:before { - content: "\f0c0"; + content: "\f0c0"; } - .icon-chain:before, .icon-link:before { - content: "\f0c1"; + content: "\f0c1"; } - .icon-cloud:before { - content: "\f0c2"; + content: "\f0c2"; } - .icon-flask:before { - content: "\f0c3"; + content: "\f0c3"; } - .icon-cut:before, .icon-scissors:before { - content: "\f0c4"; + content: "\f0c4"; } - .icon-copy:before, .icon-files-o:before { - content: "\f0c5"; + content: "\f0c5"; } - .icon-paperclip:before { - content: "\f0c6"; + content: "\f0c6"; } - .icon-save:before, .icon-floppy-o:before { - content: "\f0c7"; + content: "\f0c7"; } - .icon-square:before { - content: "\f0c8"; + content: "\f0c8"; } - .icon-navicon:before, .icon-reorder:before, .icon-bars:before { - content: "\f0c9"; + content: "\f0c9"; } - .icon-list-ul:before { - content: "\f0ca"; + content: "\f0ca"; } - .icon-list-ol:before { - content: "\f0cb"; + content: "\f0cb"; } - .icon-strikethrough:before { - content: "\f0cc"; + content: "\f0cc"; } - .icon-underline:before { - content: "\f0cd"; + content: "\f0cd"; } - .icon-table:before { - content: "\f0ce"; + content: "\f0ce"; } - .icon-magic:before { - content: "\f0d0"; + content: "\f0d0"; } - .icon-truck:before { - content: "\f0d1"; + content: "\f0d1"; } - .icon-pinterest:before { - content: "\f0d2"; + content: "\f0d2"; } - .icon-pinterest-square:before { - content: "\f0d3"; + content: "\f0d3"; } - .icon-google-plus-square:before { - content: "\f0d4"; + content: "\f0d4"; } - .icon-google-plus:before { - content: "\f0d5"; + content: "\f0d5"; } - .icon-money:before { - content: "\f0d6"; + content: "\f0d6"; } - .ui-accordion-header-icon.ui-icon-triangle-1-s:before, .icon-caret-down:before { - content: "\f0d7"; + content: "\f0d7"; } - .icon-caret-up:before { - content: "\f0d8"; + content: "\f0d8"; } - .icon-caret-left:before { - content: "\f0d9"; + content: "\f0d9"; } - .ui-icon-triangle-1-e:before, .icon-caret-right:before { - content: "\f0da"; + content: "\f0da"; } - .icon-columns:before { - content: "\f0db"; + content: "\f0db"; } - .dataTable .sorting .glyph-icon:before, .dataTable .ui-icon-carat-2-n-s:before, .icon-unsorted:before, .icon-sort:before { - content: "\f0dc"; + content: "\f0dc"; } - .dataTable .sorting_asc .glyph-icon:before, .icon-sort-down:before, .icon-sort-asc:before { - content: "\f0dd"; + content: "\f0dd"; } - .dataTable .sorting_desc .glyph-icon:before, .dataTable .ui-icon-triangle-1-n:before, .icon-sort-up:before, .icon-sort-desc:before { - content: "\f0de"; + content: "\f0de"; } - .icon-envelope:before { - content: "\f0e0"; + content: "\f0e0"; } - .icon-linkedin:before { - content: "\f0e1"; + content: "\f0e1"; } - .icon-rotate-left:before, .icon-undo:before { - content: "\f0e2"; + content: "\f0e2"; } - .icon-legal:before, .icon-gavel:before { - content: "\f0e3"; + content: "\f0e3"; } - .icon-dashboard:before, .icon-tachometer:before { - content: "\f0e4"; + content: "\f0e4"; } - .icon-comment-o:before { - content: "\f0e5"; + content: "\f0e5"; } - .icon-comments-o:before { - content: "\f0e6"; + content: "\f0e6"; } - .icon-flash:before, .icon-bolt:before { - content: "\f0e7"; + content: "\f0e7"; } - .icon-sitemap:before { - content: "\f0e8"; + content: "\f0e8"; } - .icon-umbrella:before { - content: "\f0e9"; + content: "\f0e9"; } - .icon-paste:before, .icon-clipboard:before { - content: "\f0ea"; + content: "\f0ea"; } - .icon-lightbulb-o:before { - content: "\f0eb"; + content: "\f0eb"; } - .icon-exchange:before { - content: "\f0ec"; + content: "\f0ec"; } - .icon-cloud-download:before { - content: "\f0ed"; + content: "\f0ed"; } - .icon-cloud-upload:before { - content: "\f0ee"; + content: "\f0ee"; } - .icon-user-md:before { - content: "\f0f0"; + content: "\f0f0"; } - .icon-stethoscope:before { - content: "\f0f1"; + content: "\f0f1"; } - .icon-suitcase:before { - content: "\f0f2"; + content: "\f0f2"; } - .icon-bell-o:before { - content: "\f0a2"; + content: "\f0a2"; } - .icon-coffee:before { - content: "\f0f4"; + content: "\f0f4"; } - .icon-cutlery:before { - content: "\f0f5"; + content: "\f0f5"; } - .icon-file-text-o:before { - content: "\f0f6"; + content: "\f0f6"; } - .icon-building-o:before { - content: "\f0f7"; + content: "\f0f7"; } - .icon-hospital-o:before { - content: "\f0f8"; + content: "\f0f8"; } - .icon-ambulance:before { - content: "\f0f9"; + content: "\f0f9"; } - .icon-medkit:before { - content: "\f0fa"; + content: "\f0fa"; } - .icon-fighter-jet:before { - content: "\f0fb"; + content: "\f0fb"; } - .icon-beer:before { - content: "\f0fc"; + content: "\f0fc"; } - .icon-h-square:before { - content: "\f0fd"; + content: "\f0fd"; } - .icon-plus-square:before { - content: "\f0fe"; + content: "\f0fe"; } - .icon-angle-double-left:before { - content: "\f100"; + content: "\f100"; } - .icon-angle-double-right:before { - content: "\f101"; + content: "\f101"; } - .icon-angle-double-up:before { - content: "\f102"; + content: "\f102"; } - .icon-angle-double-down:before { - content: "\f103"; + content: "\f103"; } - .icon-angle-left:before { - content: "\f104"; + content: "\f104"; } - #page-sidebar li a.sf-with-ul:after, .icon-angle-right:before { - content: "\f105"; + content: "\f105"; } - .icon-angle-up:before { - content: "\f106"; + content: "\f106"; } - .icon-angle-down:before { - content: "\f107"; + content: "\f107"; } - .icon-desktop:before { - content: "\f108"; + content: "\f108"; } - .icon-laptop:before { - content: "\f109"; + content: "\f109"; } - .icon-tablet:before { - content: "\f10a"; + content: "\f10a"; } - .icon-mobile-phone:before, .icon-mobile:before { - content: "\f10b"; + content: "\f10b"; } - .icon-circle-o:before { - content: "\f10c"; + content: "\f10c"; } - .icon-quote-left:before { - content: "\f10d"; + content: "\f10d"; } - .icon-quote-right:before { - content: "\f10e"; + content: "\f10e"; } - .icon-spinner:before { - content: "\f110"; + content: "\f110"; } - #page-sidebar li ul li a:before, .icon-circle:before { - content: "\f111"; + content: "\f111"; } - .icon-mail-reply:before, .icon-reply:before { - content: "\f112"; + content: "\f112"; } - .icon-github-alt:before { - content: "\f113"; + content: "\f113"; } - .icon-folder-o:before { - content: "\f114"; + content: "\f114"; } - .icon-folder-open-o:before { - content: "\f115"; + content: "\f115"; } - .icon-smile-o:before { - content: "\f118"; + content: "\f118"; } - .icon-frown-o:before { - content: "\f119"; + content: "\f119"; } - .icon-meh-o:before { - content: "\f11a"; + content: "\f11a"; } - .icon-gamepad:before { - content: "\f11b"; + content: "\f11b"; } - .icon-keyboard-o:before { - content: "\f11c"; + content: "\f11c"; } - .icon-flag-o:before { - content: "\f11d"; + content: "\f11d"; } - .icon-flag-checkered:before { - content: "\f11e"; + content: "\f11e"; } - .icon-terminal:before { - content: "\f120"; + content: "\f120"; } - .icon-code:before { - content: "\f121"; + content: "\f121"; } - .icon-mail-reply-all:before, .icon-reply-all:before { - content: "\f122"; + content: "\f122"; } - .icon-star-half-empty:before, .icon-star-half-full:before, .icon-star-half-o:before { - content: "\f123"; + content: "\f123"; } - .icon-location-arrow:before { - content: "\f124"; + content: "\f124"; } - .icon-crop:before { - content: "\f125"; + content: "\f125"; } - .icon-code-fork:before { - content: "\f126"; + content: "\f126"; } - .icon-unlink:before, .icon-chain-broken:before { - content: "\f127"; + content: "\f127"; } - .icon-question:before { - content: "\f128"; + content: "\f128"; } - .icon-info:before { - content: "\f129"; + content: "\f129"; } - .icon-exclamation:before { - content: "\f12a"; + content: "\f12a"; } - .icon-superscript:before { - content: "\f12b"; + content: "\f12b"; } - .icon-subscript:before { - content: "\f12c"; + content: "\f12c"; } - .icon-eraser:before { - content: "\f12d"; + content: "\f12d"; } - .icon-puzzle-piece:before { - content: "\f12e"; + content: "\f12e"; } - .icon-microphone:before { - content: "\f130"; + content: "\f130"; } - .icon-microphone-slash:before { - content: "\f131"; + content: "\f131"; } - .icon-shield:before { - content: "\f132"; + content: "\f132"; } - .icon-calendar-o:before { - content: "\f133"; + content: "\f133"; } - .icon-fire-extinguisher:before { - content: "\f134"; + content: "\f134"; } - .icon-rocket:before { - content: "\f135"; + content: "\f135"; } - .icon-maxcdn:before { - content: "\f136"; + content: "\f136"; } - .ui-icon-circle-triangle-w:before, .icon-chevron-circle-left:before { - content: "\f137"; + content: "\f137"; } - .ui-icon-circle-triangle-e:before, .icon-chevron-circle-right:before { - content: "\f138"; + content: "\f138"; } - .icon-chevron-circle-up:before { - content: "\f139"; + content: "\f139"; } - .icon-chevron-circle-down:before { - content: "\f13a"; + content: "\f13a"; } - .icon-html5:before { - content: "\f13b"; + content: "\f13b"; } - .icon-css3:before { - content: "\f13c"; + content: "\f13c"; } - .icon-anchor:before { - content: "\f13d"; + content: "\f13d"; } - .icon-unlock-alt:before { - content: "\f13e"; + content: "\f13e"; } - .icon-bullseye:before { - content: "\f140"; + content: "\f140"; } - .icon-ellipsis-h:before { - content: "\f141"; + content: "\f141"; } - .icon-ellipsis-v:before { - content: "\f142"; + content: "\f142"; } - .icon-rss-square:before { - content: "\f143"; + content: "\f143"; } - .icon-play-circle:before { - content: "\f144"; + content: "\f144"; } - .icon-ticket:before { - content: "\f145"; + content: "\f145"; } - .icon-minus-square:before { - content: "\f146"; + content: "\f146"; } - .icon-minus-square-o:before { - content: "\f147"; + content: "\f147"; } - .icon-level-up:before { - content: "\f148"; + content: "\f148"; } - .icon-level-down:before { - content: "\f149"; + content: "\f149"; } - .icon-check-square:before { - content: "\f14a"; + content: "\f14a"; } - .icon-pencil-square:before { - content: "\f14b"; + content: "\f14b"; } - .icon-external-link-square:before { - content: "\f14c"; + content: "\f14c"; } - .icon-share-square:before { - content: "\f14d"; + content: "\f14d"; } - .icon-compass:before { - content: "\f14e"; + content: "\f14e"; } - .icon-toggle-down:before, .icon-caret-square-o-down:before { - content: "\f150"; + content: "\f150"; } - .icon-toggle-up:before, .icon-caret-square-o-up:before { - content: "\f151"; + content: "\f151"; } - .icon-toggle-right:before, .icon-caret-square-o-right:before { - content: "\f152"; + content: "\f152"; } - .icon-euro:before, .icon-eur:before { - content: "\f153"; + content: "\f153"; } - .icon-gbp:before { - content: "\f154"; + content: "\f154"; } - .icon-dollar:before, .icon-usd:before { - content: "\f155"; + content: "\f155"; } - .icon-rupee:before, .icon-inr:before { - content: "\f156"; + content: "\f156"; } - .icon-cny:before, .icon-rmb:before, .icon-yen:before, .icon-jpy:before { - content: "\f157"; + content: "\f157"; } - .icon-ruble:before, .icon-rouble:before, .icon-rub:before { - content: "\f158"; + content: "\f158"; } - .icon-won:before, .icon-krw:before { - content: "\f159"; + content: "\f159"; } - .icon-bitcoin:before, .icon-btc:before { - content: "\f15a"; + content: "\f15a"; } - .icon-file:before { - content: "\f15b"; + content: "\f15b"; } - .icon-file-text:before { - content: "\f15c"; + content: "\f15c"; } - .icon-sort-alpha-asc:before { - content: "\f15d"; + content: "\f15d"; } - .icon-sort-alpha-desc:before { - content: "\f15e"; + content: "\f15e"; } - .icon-sort-amount-asc:before { - content: "\f160"; + content: "\f160"; } - .icon-sort-amount-desc:before { - content: "\f161"; + content: "\f161"; } - .icon-sort-numeric-asc:before { - content: "\f162"; + content: "\f162"; } - .icon-sort-numeric-desc:before { - content: "\f163"; + content: "\f163"; } - .icon-thumbs-up:before { - content: "\f164"; + content: "\f164"; } - .icon-thumbs-down:before { - content: "\f165"; + content: "\f165"; } - .icon-youtube-square:before { - content: "\f166"; + content: "\f166"; } - .icon-youtube:before { - content: "\f167"; + content: "\f167"; } - .icon-xing:before { - content: "\f168"; + content: "\f168"; } - .icon-xing-square:before { - content: "\f169"; + content: "\f169"; } - .icon-youtube-play:before { - content: "\f16a"; + content: "\f16a"; } - .icon-dropbox:before { - content: "\f16b"; + content: "\f16b"; } - .icon-stack-overflow:before { - content: "\f16c"; + content: "\f16c"; } - .icon-instagram:before { - content: "\f16d"; + content: "\f16d"; } - .icon-flickr:before { - content: "\f16e"; + content: "\f16e"; } - .icon-adn:before { - content: "\f170"; + content: "\f170"; } - .icon-bitbucket:before { - content: "\f171"; + content: "\f171"; } - .icon-bitbucket-square:before { - content: "\f172"; + content: "\f172"; } - .icon-tumblr:before { - content: "\f173"; + content: "\f173"; } - .icon-tumblr-square:before { - content: "\f174"; + content: "\f174"; } - .icon-long-arrow-down:before { - content: "\f175"; + content: "\f175"; } - .icon-long-arrow-up:before { - content: "\f176"; + content: "\f176"; } - .icon-long-arrow-left:before { - content: "\f177"; + content: "\f177"; } - .icon-long-arrow-right:before { - content: "\f178"; + content: "\f178"; } - .icon-apple:before { - content: "\f179"; + content: "\f179"; } - .icon-windows:before { - content: "\f17a"; + content: "\f17a"; } - .icon-android:before { - content: "\f17b"; + content: "\f17b"; } - .icon-linux:before { - content: "\f17c"; + content: "\f17c"; } - .icon-dribbble:before { - content: "\f17d"; + content: "\f17d"; } - .icon-skype:before { - content: "\f17e"; + content: "\f17e"; } - .icon-foursquare:before { - content: "\f180"; + content: "\f180"; } - .icon-trello:before { - content: "\f181"; + content: "\f181"; } - .icon-female:before { - content: "\f182"; + content: "\f182"; } - .icon-male:before { - content: "\f183"; + content: "\f183"; } - .icon-gittip:before { - content: "\f184"; + content: "\f184"; } - .icon-sun-o:before { - content: "\f185"; + content: "\f185"; } - .icon-moon-o:before { - content: "\f186"; + content: "\f186"; } - .icon-archive:before { - content: "\f187"; + content: "\f187"; } - .icon-bug:before { - content: "\f188"; + content: "\f188"; } - .icon-vk:before { - content: "\f189"; + content: "\f189"; } - .icon-weibo:before { - content: "\f18a"; + content: "\f18a"; } - .icon-renren:before { - content: "\f18b"; + content: "\f18b"; } - .icon-pagelines:before { - content: "\f18c"; + content: "\f18c"; } - .icon-stack-exchange:before { - content: "\f18d"; + content: "\f18d"; } - .icon-arrow-circle-o-right:before { - content: "\f18e"; + content: "\f18e"; } - .icon-arrow-circle-o-left:before { - content: "\f190"; + content: "\f190"; } - .icon-toggle-left:before, .icon-caret-square-o-left:before { - content: "\f191"; + content: "\f191"; } - .icon-dot-circle-o:before { - content: "\f192"; + content: "\f192"; } - .icon-wheelchair:before { - content: "\f193"; + content: "\f193"; } - .icon-vimeo-square:before { - content: "\f194"; + content: "\f194"; } - .icon-turkish-lira:before, .icon-try:before { - content: "\f195"; + content: "\f195"; } - .icon-plus-square-o:before { - content: "\f196"; + content: "\f196"; } - .icon-space-shuttle:before { - content: "\f197"; + content: "\f197"; } - .icon-slack:before { - content: "\f198"; + content: "\f198"; } - .icon-envelope-square:before { - content: "\f199"; + content: "\f199"; } - .icon-wordpress:before { - content: "\f19a"; + content: "\f19a"; } - .icon-openid:before { - content: "\f19b"; + content: "\f19b"; } - .icon-institution:before, .icon-bank:before, .icon-university:before { - content: "\f19c"; + content: "\f19c"; } - .icon-mortar-board:before, .icon-graduation-cap:before { - content: "\f19d"; + content: "\f19d"; } - .icon-yahoo:before { - content: "\f19e"; + content: "\f19e"; } - .icon-google:before { - content: "\f1a0"; + content: "\f1a0"; } - .icon-reddit:before { - content: "\f1a1"; + content: "\f1a1"; } - .icon-reddit-square:before { - content: "\f1a2"; + content: "\f1a2"; } - .icon-stumbleupon-circle:before { - content: "\f1a3"; + content: "\f1a3"; } - .icon-stumbleupon:before { - content: "\f1a4"; + content: "\f1a4"; } - .icon-delicious:before { - content: "\f1a5"; + content: "\f1a5"; } - .icon-digg:before { - content: "\f1a6"; + content: "\f1a6"; } - .icon-pied-piper:before { - content: "\f1a7"; + content: "\f1a7"; } - .icon-pied-piper-alt:before { - content: "\f1a8"; + content: "\f1a8"; } - .icon-drupal:before { - content: "\f1a9"; + content: "\f1a9"; } - .icon-joomla:before { - content: "\f1aa"; + content: "\f1aa"; } - .icon-language:before { - content: "\f1ab"; + content: "\f1ab"; } - .icon-fax:before { - content: "\f1ac"; + content: "\f1ac"; } - .icon-building:before { - content: "\f1ad"; + content: "\f1ad"; } - .icon-child:before { - content: "\f1ae"; + content: "\f1ae"; } - .icon-paw:before { - content: "\f1b0"; + content: "\f1b0"; } - .icon-spoon:before { - content: "\f1b1"; + content: "\f1b1"; } - .icon-cube:before { - content: "\f1b2"; + content: "\f1b2"; } - .icon-cubes:before { - content: "\f1b3"; + content: "\f1b3"; } - .icon-behance:before { - content: "\f1b4"; + content: "\f1b4"; } - .icon-behance-square:before { - content: "\f1b5"; + content: "\f1b5"; } - .icon-steam:before { - content: "\f1b6"; + content: "\f1b6"; } - .icon-steam-square:before { - content: "\f1b7"; + content: "\f1b7"; } - .icon-recycle:before { - content: "\f1b8"; + content: "\f1b8"; } - .icon-automobile:before, .icon-car:before { - content: "\f1b9"; + content: "\f1b9"; } - .icon-cab:before, .icon-taxi:before { - content: "\f1ba"; + content: "\f1ba"; } - .icon-tree:before { - content: "\f1bb"; + content: "\f1bb"; } - .icon-spotify:before { - content: "\f1bc"; + content: "\f1bc"; } - .icon-deviantart:before { - content: "\f1bd"; + content: "\f1bd"; } - .icon-soundcloud:before { - content: "\f1be"; + content: "\f1be"; } - .icon-database:before { - content: "\f1c0"; + content: "\f1c0"; } - .icon-file-pdf-o:before { - content: "\f1c1"; + content: "\f1c1"; } - .icon-file-word-o:before { - content: "\f1c2"; + content: "\f1c2"; } - .icon-file-excel-o:before { - content: "\f1c3"; + content: "\f1c3"; } - .icon-file-powerpoint-o:before { - content: "\f1c4"; + content: "\f1c4"; } - .icon-file-photo-o:before, .icon-file-picture-o:before, .icon-file-image-o:before { - content: "\f1c5"; + content: "\f1c5"; } - .icon-file-zip-o:before, .icon-file-archive-o:before { - content: "\f1c6"; + content: "\f1c6"; } - .icon-file-sound-o:before, .icon-file-audio-o:before { - content: "\f1c7"; + content: "\f1c7"; } - .icon-file-movie-o:before, .icon-file-video-o:before { - content: "\f1c8"; + content: "\f1c8"; } - .icon-file-code-o:before { - content: "\f1c9"; + content: "\f1c9"; } - .icon-vine:before { - content: "\f1ca"; + content: "\f1ca"; } - .icon-codepen:before { - content: "\f1cb"; + content: "\f1cb"; } - .icon-jsfiddle:before { - content: "\f1cc"; + content: "\f1cc"; } - .icon-life-bouy:before, .icon-life-buoy:before, .icon-life-saver:before, .icon-support:before, .icon-life-ring:before { - content: "\f1cd"; + content: "\f1cd"; } - .icon-circle-o-notch:before { - content: "\f1ce"; + content: "\f1ce"; } - .icon-ra:before, .icon-rebel:before { - content: "\f1d0"; + content: "\f1d0"; } - .icon-ge:before, .icon-empire:before { - content: "\f1d1"; + content: "\f1d1"; } - .icon-git-square:before { - content: "\f1d2"; + content: "\f1d2"; } - .icon-git:before { - content: "\f1d3"; + content: "\f1d3"; } - .icon-hacker-news:before { - content: "\f1d4"; + content: "\f1d4"; } - .icon-tencent-weibo:before { - content: "\f1d5"; + content: "\f1d5"; } - .icon-qq:before { - content: "\f1d6"; + content: "\f1d6"; } - .icon-wechat:before, .icon-weixin:before { - content: "\f1d7"; + content: "\f1d7"; } - .icon-send:before, .icon-paper-plane:before { - content: "\f1d8"; + content: "\f1d8"; } - .icon-send-o:before, .icon-paper-plane-o:before { - content: "\f1d9"; + content: "\f1d9"; } - .icon-history:before { - content: "\f1da"; + content: "\f1da"; } - .icon-circle-thin:before { - content: "\f1db"; + content: "\f1db"; } - .icon-header:before { - content: "\f1dc"; + content: "\f1dc"; } - .icon-paragraph:before { - content: "\f1dd"; + content: "\f1dd"; } - .icon-sliders:before { - content: "\f1de"; + content: "\f1de"; } - .icon-share-alt:before { - content: "\f1e0"; + content: "\f1e0"; } - .icon-share-alt-square:before { - content: "\f1e1"; + content: "\f1e1"; } - .icon-bomb:before { - content: "\f1e2"; + content: "\f1e2"; } - .icon-soccer-ball-o:before, .icon-futbol-o:before { - content: "\f1e3"; + content: "\f1e3"; } - .icon-tty:before { - content: "\f1e4"; + content: "\f1e4"; } - .icon-binoculars:before { - content: "\f1e5"; + content: "\f1e5"; } - .icon-plug:before { - content: "\f1e6"; + content: "\f1e6"; } - .icon-slideshare:before { - content: "\f1e7"; + content: "\f1e7"; } - .icon-twitch:before { - content: "\f1e8"; + content: "\f1e8"; } - .icon-yelp:before { - content: "\f1e9"; + content: "\f1e9"; } - .icon-newspaper-o:before { - content: "\f1ea"; + content: "\f1ea"; } - .icon-wifi:before { - content: "\f1eb"; + content: "\f1eb"; } - .icon-calculator:before { - content: "\f1ec"; + content: "\f1ec"; } - .icon-paypal:before { - content: "\f1ed"; + content: "\f1ed"; } - .icon-google-wallet:before { - content: "\f1ee"; + content: "\f1ee"; } - .icon-cc-visa:before { - content: "\f1f0"; + content: "\f1f0"; } - .icon-cc-mastercard:before { - content: "\f1f1"; + content: "\f1f1"; } - .icon-cc-discover:before { - content: "\f1f2"; + content: "\f1f2"; } - .icon-cc-amex:before { - content: "\f1f3"; + content: "\f1f3"; } - .icon-cc-paypal:before { - content: "\f1f4"; + content: "\f1f4"; } - .icon-cc-stripe:before { - content: "\f1f5"; + content: "\f1f5"; } - .icon-bell-slash:before { - content: "\f1f6"; + content: "\f1f6"; } - .icon-bell-slash-o:before { - content: "\f1f7"; + content: "\f1f7"; } - .icon-trash:before { - content: "\f1f8"; + content: "\f1f8"; } - .icon-copyright:before { - content: "\f1f9"; + content: "\f1f9"; } - .icon-at:before { - content: "\f1fa"; + content: "\f1fa"; } - .icon-eyedropper:before { - content: "\f1fb"; + content: "\f1fb"; } - .icon-paint-brush:before { - content: "\f1fc"; + content: "\f1fc"; } - .icon-birthday-cake:before { - content: "\f1fd"; + content: "\f1fd"; } - .icon-area-chart:before { - content: "\f1fe"; + content: "\f1fe"; } - .icon-pie-chart:before { - content: "\f200"; + content: "\f200"; } - .icon-line-chart:before { - content: "\f201"; + content: "\f201"; } - .icon-lastfm:before { - content: "\f202"; + content: "\f202"; } - .icon-lastfm-square:before { - content: "\f203"; + content: "\f203"; } - .icon-toggle-off:before { - content: "\f204"; + content: "\f204"; } - .icon-toggle-on:before { - content: "\f205"; + content: "\f205"; } - .icon-bicycle:before { - content: "\f206"; + content: "\f206"; } - .icon-bus:before { - content: "\f207"; + content: "\f207"; } - .icon-ioxhost:before { - content: "\f208"; + content: "\f208"; } - .icon-angellist:before { - content: "\f209"; + content: "\f209"; } - .icon-cc:before { - content: "\f20a"; + content: "\f20a"; } - .icon-shekel:before, .icon-sheqel:before, .icon-ils:before { - content: "\f20b"; + content: "\f20b"; } - .icon-meanpath:before { - content: "\f20c"; + content: "\f20c"; } /*customized mzou*/ .text-white { - color: #FFFFFF; + color: #FFFFFF; } - .mt-5 { - margin-top: 5px; + margin-top: 5px; } - .mt-10 { - margin-top: 10px; + margin-top: 10px; } - .mt-20 { - margin-top: 20px; + margin-top: 20px; } - .mt-30 { - margin-top: 30px; + margin-top: 30px; } - .mr-10 { - margin-right: 10px; + margin-right: 10px; } - .mb-10 { - margin-bottom: 10px; + margin-bottom: 10px; } - .mb-20 { - margin-bottom: 20px; + margin-bottom: 20px; } - .mb-30 { - margin-bottom: 30px; + margin-bottom: 30px; } - .ml-10 { - margin-left: 10px; + margin-left: 10px; } - .my-10 { - margin-top: 10px; - margin-bottom: 10px; + margin-top: 10px; + margin-bottom: 10px; } - .my-20 { - margin-top: 20px; - margin-bottom: 20px; + margin-top: 20px; + margin-bottom: 20px; } - .my-30 { - margin-top: 30px; - margin-bottom: 30px; + margin-top: 30px; + margin-bottom: 30px; } .mx-5 { - margin-left: 5px; - margin-right: 5px; + margin-left: 5px; + margin-right: 5px; } - .mx-10 { - margin-left: 10px; - margin-right: 10px; + margin-left: 10px; + margin-right: 10px; } - .mx-20 { - margin-left: 20px; - margin-right: 20px; + margin-left: 20px; + margin-right: 20px; } - .mx-30 { - margin-left: 30px; - margin-right: 30px; + margin-left: 30px; + margin-right: 30px; } - .text-bold { - font-weight: 600; + font-weight: 600; } - .rounded { - border-radius: 3px; + border-radius: 3px; } .btn-outline-light { - color: #f8f9fa; - background-color: transparent; - background-image: none; - border-color: #f8f9fa; + color: #f8f9fa; + background-color: transparent; + background-image: none; + border-color: #f8f9fa; } - .btn-outline-light:hover { - color: #212529; - background-color: #f8f9fa; - border-color: #f8f9fa; - text-decoration: none; + color: #212529; + background-color: #f8f9fa; + border-color: #f8f9fa; + text-decoration: none; } .flex { - display: flex; + display: flex; } - .flex-wrap { - flex-wrap: wrap; + flex-wrap: wrap; } - @media (max-width: 992px) { - .hidden-md { +.hidden-md { display: none; - } } - +} .img-thumbnail { - padding: .25rem; - background-color: #fff; - border: 1px solid #dee2e6; - border-radius: .25rem; - max-width: 100%; - height: auto; + padding: .25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: .25rem; + max-width: 100%; + height: auto; } img { - vertical-align: middle; - border-style: none; +vertical-align: middle; +border-style: none; } @media (max-width: 720px) { - .text-center-sm { - text-align: center; - } -} -.col-login{ - height: 100vh; - display: flex; - flex-direction: column; - -} -.col-login-left{ - justify-content: space-between; -} -.col-login-right{ - justify-content: center; -} -ul.login-changelogs{ - border-top: 1px solid #fff + .text-center-sm { + text-align: center; } From 08d493d68be5bf357f158fd56198c1f5c9ace466 Mon Sep 17 00:00:00 2001 From: Jordan Lambrecht Date: Mon, 21 Dec 2020 14:31:13 -0600 Subject: [PATCH 014/107] minified --- install/cyberpanel.repo | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 install/cyberpanel.repo diff --git a/install/cyberpanel.repo b/install/cyberpanel.repo old mode 100755 new mode 100644 From 4cd72a7ad80c91e8feae188d6a8b2f364bf05fe4 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 22 Dec 2020 12:12:41 +0500 Subject: [PATCH 015/107] cloud backups --- cloudAPI/cloudManager.py | 77 ++++++++++++++++++++------------ cloudAPI/views.py | 2 + plogical/applicationInstaller.py | 52 +++++++++++++++++++++ plogical/backupUtilities.py | 1 - s3Backups/s3Backups.py | 4 +- 5 files changed, 106 insertions(+), 30 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index ef37bfdcd..a1153878f 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -24,7 +24,7 @@ from containerization.views import * class CloudManager: - def __init__(self, data=None, admin = None): + def __init__(self, data=None, admin=None): self.data = data self.admin = admin @@ -964,14 +964,14 @@ class CloudManager: request.session['userID'] = self.admin.pk - execPath = "/usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/IncScheduler.py forceRunAWSBackup --planName %s" % (self.data['planName']) + execPath = "/usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/IncScheduler.py forceRunAWSBackup --planName %s" % ( + self.data['planName']) ProcessUtilities.popenExecutioner(execPath) return self.ajaxPre(1, None) except BaseException as msg: return self.ajaxPre(0, str(msg)) - def systemStatus(self, request): try: request.session['userID'] = self.admin.pk @@ -979,7 +979,6 @@ class CloudManager: except BaseException as msg: return self.ajaxPre(0, str(msg)) - def killProcess(self, request): try: request.session['userID'] = self.admin.pk @@ -987,7 +986,6 @@ class CloudManager: except BaseException as msg: return self.ajaxPre(0, str(msg)) - def connectAccountDO(self, request): try: request.session['userID'] = self.admin.pk @@ -1004,7 +1002,6 @@ class CloudManager: except BaseException as msg: return self.ajaxPre(0, str(msg)) - def createPlanDO(self, request): try: request.session['userID'] = self.admin.pk @@ -1073,7 +1070,7 @@ class CloudManager: def showStatus(self, request): try: request.session['userID'] = self.admin.pk - currentACL = ACLManager.loadedACL( self.admin.pk) + currentACL = ACLManager.loadedACL(self.admin.pk) if currentACL['admin'] == 0: return self.ajaxPre(0, 'Only administrators can see MySQL status.') @@ -1088,24 +1085,22 @@ class CloudManager: def fetchRam(self, request): try: request.session['userID'] = self.admin.pk - currentACL = ACLManager.loadedACL( self.admin.pk) + currentACL = ACLManager.loadedACL(self.admin.pk) if currentACL['admin'] == 0: return self.ajaxPre(0, 'Only administrators can see MySQL status.') - #if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: + # if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu: # return self.ajaxPre(0, 'This feature is currently only available on CentOS.') - from psutil import virtual_memory import math finalData = {} mem = virtual_memory() - inGB = math.ceil(float(mem.total)/float(1024 * 1024 * 1024)) + inGB = math.ceil(float(mem.total) / float(1024 * 1024 * 1024)) finalData['ramInGB'] = inGB - if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: finalData['conf'] = ProcessUtilities.outputExecutioner('sudo cat /etc/my.cnf') else: @@ -1121,7 +1116,7 @@ class CloudManager: def applyMySQLChanges(self, request): try: request.session['userID'] = self.admin.pk - currentACL = ACLManager.loadedACL( self.admin.pk) + currentACL = ACLManager.loadedACL(self.admin.pk) if currentACL['admin'] == 0: return self.ajaxPre(0, 'Only administrators can see MySQL status.') @@ -1139,7 +1134,7 @@ class CloudManager: def restartMySQL(self, request): try: request.session['userID'] = self.admin.pk - currentACL = ACLManager.loadedACL( self.admin.pk) + currentACL = ACLManager.loadedACL(self.admin.pk) if currentACL['admin'] == 0: return self.ajaxPre(0, 'Only administrators can see MySQL status.') @@ -1154,7 +1149,7 @@ class CloudManager: def fetchDatabasesMYSQL(self, request): try: request.session['userID'] = self.admin.pk - currentACL = ACLManager.loadedACL( self.admin.pk) + currentACL = ACLManager.loadedACL(self.admin.pk) if currentACL['admin'] == 0: return self.ajaxPre(0, 'Only administrators can see MySQL status.') @@ -1169,7 +1164,7 @@ class CloudManager: def fetchTables(self, request): try: request.session['userID'] = self.admin.pk - currentACL = ACLManager.loadedACL( self.admin.pk) + currentACL = ACLManager.loadedACL(self.admin.pk) if currentACL['admin'] == 0: return self.ajaxPre(0, 'Only administrators can see MySQL status.') @@ -1184,7 +1179,7 @@ class CloudManager: def deleteTable(self, request): try: request.session['userID'] = self.admin.pk - currentACL = ACLManager.loadedACL( self.admin.pk) + currentACL = ACLManager.loadedACL(self.admin.pk) if currentACL['admin'] == 0: return self.ajaxPre(0, 'Only administrators can see MySQL status.') @@ -1199,7 +1194,7 @@ class CloudManager: def fetchTableData(self, request): try: request.session['userID'] = self.admin.pk - currentACL = ACLManager.loadedACL( self.admin.pk) + currentACL = ACLManager.loadedACL(self.admin.pk) if currentACL['admin'] == 0: return self.ajaxPre(0, 'Only administrators can see MySQL status.') @@ -1214,7 +1209,7 @@ class CloudManager: def fetchStructure(self, request): try: request.session['userID'] = self.admin.pk - currentACL = ACLManager.loadedACL( self.admin.pk) + currentACL = ACLManager.loadedACL(self.admin.pk) if currentACL['admin'] == 0: return self.ajaxPre(0, 'Only administrators can see MySQL status.') @@ -1266,7 +1261,6 @@ class CloudManager: except BaseException as msg: return self.ajaxPre(0, str(msg)) - def deletePlanMINIO(self, request): try: request.session['userID'] = self.admin.pk @@ -1340,7 +1334,6 @@ class CloudManager: except BaseException as msg: return self.ajaxPre(0, str(msg)) - def switchServer(self, request): try: request.session['userID'] = self.admin.pk @@ -1666,9 +1659,9 @@ class CloudManager: except: databases = '0' - execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " CloudBackup --backupDomain %s --data %s --emails %s --databases %s --tempStoragePath %s" % (self.data['domain'], data, emails, databases, tempStatusPath) + execPath = execPath + " CloudBackup --backupDomain %s --data %s --emails %s --databases %s --tempStoragePath %s" % ( + self.data['domain'], data, emails, databases, tempStatusPath) ProcessUtilities.popenExecutioner(execPath) final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} @@ -1695,7 +1688,7 @@ class CloudManager: counter = 1 for items in backups: - size = str(int(int(os.path.getsize('%s/%s' % (backupsPath, items)))/int(1048576))) + size = str(int(int(os.path.getsize('%s/%s' % (backupsPath, items))) / int(1048576))) dic = {'id': counter, 'file': items, @@ -1782,7 +1775,8 @@ class CloudManager: writeToFile.close() execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " SubmitCloudBackupRestore --backupDomain %s --backupFile %s --tempStoragePath %s" % (self.data['domain'], self.data['backupFile'], tempStatusPath) + execPath = execPath + " SubmitCloudBackupRestore --backupDomain %s --backupFile %s --tempStoragePath %s" % ( + self.data['domain'], self.data['backupFile'], tempStatusPath) ProcessUtilities.popenExecutioner(execPath) final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} @@ -1874,7 +1868,7 @@ class CloudManager: 's3', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, - endpoint_url = region + endpoint_url=region ) else: s3 = boto3.resource( @@ -1902,7 +1896,8 @@ class CloudManager: writeToFile.close() execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " SubmitS3BackupRestore --backupDomain %s --backupFile '%s' --tempStoragePath %s --planName %s" % (self.data['domain'], self.data['backupFile'], tempStatusPath, self.data['planName']) + execPath = execPath + " SubmitS3BackupRestore --backupDomain %s --backupFile '%s' --tempStoragePath %s --planName %s" % ( + self.data['domain'], self.data['backupFile'], tempStatusPath, self.data['planName']) ProcessUtilities.popenExecutioner(execPath) final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} @@ -1910,4 +1905,30 @@ class CloudManager: return HttpResponse(final_json) except BaseException as msg: - return self.ajaxPre(0, str(msg)) \ No newline at end of file + return self.ajaxPre(0, str(msg)) + + def DeployWordPress(self): + try: + + tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + + writeToFile = open(tempStatusPath, 'w') + writeToFile.write('Starting..,0') + writeToFile.close() + + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/applicationInstaller.py" + execPath = execPath + " DeployWordPress --tempStatusPath %s --appsSet '%s' --domain '%s' --email '%s' --password '%s' " \ + "--pluginUpdates '%s' --themeUpdates '%s' --title '%s' --updates '%s' --userName '%s' " \ + "--version '%s'" % ( + tempStatusPath, self.data['appsSet'], self.data['domain'], self.data['email'], self.data['password'], + self.data['pluginUpdates'], self.data['themeUpdates'], self.data['title'], self.data['updates'], + self.data['userName'], self.data['version']) + + ProcessUtilities.popenExecutioner(execPath) + + final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) diff --git a/cloudAPI/views.py b/cloudAPI/views.py index 77448b142..1bfd9bcab 100755 --- a/cloudAPI/views.py +++ b/cloudAPI/views.py @@ -63,6 +63,8 @@ def router(request): return cm.deleteCloudBackup() elif controller == 'SubmitCloudBackupRestore': return cm.SubmitCloudBackupRestore() + elif controller == 'DeployWordPress': + return cm.DeployWordPress() elif controller == 'getCurrentS3Backups': return cm.getCurrentS3Backups() elif controller == 'deleteS3Backup': diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index a63950d61..7274254bf 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -1,4 +1,5 @@ #!/usr/local/CyberCP/bin/python +import argparse import os, sys sys.path.append('/usr/local/CyberCP') @@ -1217,3 +1218,54 @@ $parameters = array( # statusFile.writelines(str(msg) + " [404]") # statusFile.close() # return 0 + + def DeployWordPress(self): + try: + logging.statusWriter(self.extraArgs['tempStatusPath'], 'Checking if MailServer SSL issued..,10') + + import time + time.sleep(5) + + logging.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].') + + except BaseException as msg: + logging.statusWriter(self.extraArgs['tempStatusPath'], '%s [404].' % (str(msg))) + +def main(): + parser = argparse.ArgumentParser(description='CyberPanel Application Installer') + parser.add_argument('function', help='Specify a function to call!') + parser.add_argument('--tempStatusPath', help='') + parser.add_argument('--appsSet', help='') + parser.add_argument('--domain', help='') + parser.add_argument('--email', help='') + parser.add_argument('--password', help='') + parser.add_argument('--pluginUpdates', help='') + parser.add_argument('--themeUpdates', help='') + parser.add_argument('--title', help='') + parser.add_argument('--updates', help='') + parser.add_argument('--userName', help='') + parser.add_argument('--version', help='') + + + args = parser.parse_args() + + if args.function == "DeployWordPress": + + extraArgs = {} + extraArgs['domain'] = args.domain + extraArgs['tempStatusPath'] = args.tempStatusPath + extraArgs['appsSet'] = args.appsSet + extraArgs['email'] = args.email + extraArgs['password'] = args.password + extraArgs['pluginUpdates'] = args.pluginUpdates + extraArgs['themeUpdates'] = args.themeUpdates + extraArgs['title'] = args.title + extraArgs['updates'] = args.updates + extraArgs['userName'] = args.userName + extraArgs['version'] = args.version + ai = ApplicationInstaller(None, extraArgs) + ai.DeployWordPress() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index d59b9fefe..46655062b 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -2085,6 +2085,5 @@ def main(): bu = backupUtilities(extraArgs) bu.SubmitS3BackupRestore() - if __name__ == "__main__": main() diff --git a/s3Backups/s3Backups.py b/s3Backups/s3Backups.py index 9b2c56d9e..19c543916 100755 --- a/s3Backups/s3Backups.py +++ b/s3Backups/s3Backups.py @@ -148,6 +148,7 @@ class S3Backups(multi.Thread): if currentACL['admin'] == 0: return proc.ajax(0, 'Only administrators can use AWS S3 Backups.') + from botocore.client import Config aws_access_key_id, aws_secret_access_key, region = self.fetchAWSKeys() @@ -156,7 +157,8 @@ class S3Backups(multi.Thread): 's3', aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, - endpoint_url=region + endpoint_url=region, + config=Config(signature_version='v4') ) else: s3 = boto3.resource( From 5f1c0aecb534e3cc25861fe18a2cab7eee659e68 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 22 Dec 2020 12:13:37 +0500 Subject: [PATCH 016/107] static files --- static/loginSystem/login-system.js | 110 +++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 static/loginSystem/login-system.js diff --git a/static/loginSystem/login-system.js b/static/loginSystem/login-system.js new file mode 100644 index 000000000..d5681e4a8 --- /dev/null +++ b/static/loginSystem/login-system.js @@ -0,0 +1,110 @@ +/** + * Created by usman on 7/24/17. + */ + +/* Utilities */ + + +function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie !== '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) === (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; +} + +/* Utilities ends here */ + + +/* Java script code to Check Login status */ +$("#verifyingLogin").hide(); +$("#loginFailed").hide(); + + +var application = angular.module('loginSystem', []); + +application.config(['$interpolateProvider', + + function ($interpolateProvider) { + $interpolateProvider.startSymbol('{$'); + $interpolateProvider.endSymbol('$}'); + } +]); + +application.controller('loginSystem', function ($scope, $http, $window) { + + $scope.verifyCode = true; + + $scope.verifyLoginCredentials = function () { + + $("#verifyingLogin").show(); + + + var username = $scope.username; + var password = $scope.password; + var languageSelection = $scope.languageSelection; + + + url = "/verifyLogin"; + + var data = { + username: username, + password: password, + languageSelection: languageSelection, + twofa: $scope.twofa + }; + + var config = { + headers: { + 'X-CSRFToken': getCookie('csrftoken') + } + }; + + $http.post(url, data, config).then(ListInitialData, cantLoadInitialData); + + + function ListInitialData(response) { + + if (response.data.loginStatus === 0) { + $scope.errorMessage = response.data.error_message; + $("#loginFailed").fadeIn(); + }else if(response.data.loginStatus === 2){ + $scope.verifyCode = false; + } + else { + $("#loginFailed").hide(); + $window.location.href = '/base/'; + } + + + $("#verifyingLogin").hide(); + } + + function cantLoadInitialData(response) { + } + + + }; + + $scope.initiateLogin = function ($event) { + var keyCode = $event.which || $event.keyCode; + if (keyCode === 13) { + $scope.verifyLoginCredentials(); + + } + + }; + + +}); + + +/* Java script code to to Check Login status ends here */ From 9920b52750f93c579b73a049565c29554078ad94 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 23 Dec 2020 19:06:42 +0500 Subject: [PATCH 017/107] wp deploy --- cloudAPI/cloudManager.py | 5 +++ plogical/applicationInstaller.py | 75 +++++++++++++++++++++++--------- 2 files changed, 59 insertions(+), 21 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index a1153878f..9b0409737 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -1924,6 +1924,11 @@ class CloudManager: self.data['pluginUpdates'], self.data['themeUpdates'], self.data['title'], self.data['updates'], self.data['userName'], self.data['version']) + try: + execPath = '%s --path %s' % (execPath, self.data['path']) + except: + pass + ProcessUtilities.popenExecutioner(execPath) final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index 7274254bf..7b64152d6 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -467,7 +467,6 @@ $parameters = array( def installWordPress(self): try: - admin = self.extraArgs['admin'] domainName = self.extraArgs['domainName'] home = self.extraArgs['home'] tempStatusPath = self.extraArgs['tempStatusPath'] @@ -521,7 +520,6 @@ $parameters = array( dbName, dbUser, dbPassword = self.dbCreation(tempStatusPath, website.master) self.permPath = website.path - except: website = Websites.objects.get(domain=domainName) externalApp = website.externalApp @@ -568,7 +566,11 @@ $parameters = array( statusFile.writelines('Downloading WordPress Core,30') statusFile.close() - command = "wp core download --allow-root --path=" + finalPath + try: + command = "wp core download --allow-root --path=%s --version=%s" % (finalPath, self.extraArgs['version']) + except BaseException as msg: + command = "wp core download --allow-root --path=" + finalPath + ProcessUtilities.executioner(command, externalApp) ## @@ -620,18 +622,10 @@ $parameters = array( except BaseException as msg: # remove the downloaded files - FNULL = open(os.devnull, 'w') - homeDir = "/home/" + domainName + "/public_html" - - if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: - groupName = 'nobody' - else: - groupName = 'nogroup' - - if not os.path.exists(homeDir): - command = "chown " + externalApp + ":" + groupName + " " + homeDir - ProcessUtilities.executioner(command, externalApp) + from filemanager.filemanager import FileManager + fm = FileManager(None, None) + fm.fixPermissions(self.masterDomain) try: mysqlUtilities.deleteDatabase(dbName, dbUser) @@ -640,10 +634,6 @@ $parameters = array( except: pass - command = 'chmod 750 %s' % (self.permPath) - ProcessUtilities.executioner(command) - - statusFile = open(self.tempStatusPath, 'w') statusFile.writelines(str(msg) + " [404]") statusFile.close() @@ -1221,10 +1211,45 @@ $parameters = array( def DeployWordPress(self): try: - logging.statusWriter(self.extraArgs['tempStatusPath'], 'Checking if MailServer SSL issued..,10') + logging.statusWriter(self.extraArgs['tempStatusPath'], 'Creating this application..,10') - import time - time.sleep(5) + ## Create site + + import re + from plogical.virtualHostUtilities import virtualHostUtilities + tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + externalApp = "".join(re.findall("[a-zA-Z]+", self.extraArgs['domain']))[:5] + str(randint(1000, 9999)) + + virtualHostUtilities.createVirtualHost(self.extraArgs['domain'], self.extraArgs['email'], 'PHP 7.4', + externalApp, 0, 1, 0, + 'admin', 'Default', 0, tempStatusPath, + 0) + result = open(tempStatusPath, 'r').read() + if result.find('[404]') > -1: + logging.statusWriter(self.extraArgs['tempStatusPath'], 'Failed to create application. Error: %s [404]' % (result)) + return 0 + + ## Install WordPress + + logging.statusWriter(self.extraArgs['tempStatusPath'], 'Installing WordPress.,50') + + currentTemp = self.extraArgs['tempStatusPath'] + self.extraArgs['domainName'] = self.extraArgs['domain'] + self.extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) + self.extraArgs['blogTitle'] = self.extraArgs['title'] + self.extraArgs['adminUser'] = self.extraArgs['userName'] + self.extraArgs['adminPassword'] = self.extraArgs['password'] + self.extraArgs['adminEmail'] = self.extraArgs['email'] + + self.installWordPress() + + result = open(self.extraArgs['tempStatusPath'], 'r').read() + if result.find('[404]') > -1: + logging.statusWriter(self.extraArgs['tempStatusPath'], + 'Failed to install WordPress. Error: %s [404]' % (result)) + return 0 + + self.extraArgs['tempStatusPath'] = currentTemp logging.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].') @@ -1245,6 +1270,7 @@ def main(): parser.add_argument('--updates', help='') parser.add_argument('--userName', help='') parser.add_argument('--version', help='') + parser.add_argument('--path', help='') args = parser.parse_args() @@ -1263,6 +1289,13 @@ def main(): extraArgs['updates'] = args.updates extraArgs['userName'] = args.userName extraArgs['version'] = args.version + + try: + extraArgs['path'] = args.path + extraArgs['home'] = '0' + except: + extraArgs['home'] = '1' + ai = ApplicationInstaller(None, extraArgs) ai.DeployWordPress() From fd71a275d5c482c2e9d5d371daa77e58beb975f2 Mon Sep 17 00:00:00 2001 From: WhatTheServer Date: Thu, 24 Dec 2020 18:42:52 -0500 Subject: [PATCH 018/107] Update cyberPanel.py Fix old datetime format to match current so its uniform and clear. --- cli/cyberPanel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/cyberPanel.py b/cli/cyberPanel.py index 1ac06edd8..ffe62b031 100755 --- a/cli/cyberPanel.py +++ b/cli/cyberPanel.py @@ -335,7 +335,7 @@ class cyberPanel: def createBackup(self, virtualHostName): try: - backupLogPath = "/usr/local/lscp/logs/backup_log."+time.strftime("%I-%M-%S-%a-%b-%Y") + backupLogPath = "/usr/local/lscp/logs/backup_log."+time.strftime("%m.%d.%Y_%H-%M-%S") print('Backup logs to be generated in %s' % (backupLogPath)) From 74f818769bc23c937f6218e08be470c9c8bf4a74 Mon Sep 17 00:00:00 2001 From: WhatTheServer Date: Thu, 24 Dec 2020 19:52:21 -0500 Subject: [PATCH 019/107] Update cyberPanel.py Setup cyberpanel cli createBackup to where it can accept an optional argument for the backup path so scripting full backups to other paths can be done easily. --- cli/cyberPanel.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/cli/cyberPanel.py b/cli/cyberPanel.py index ffe62b031..939f0b7e5 100755 --- a/cli/cyberPanel.py +++ b/cli/cyberPanel.py @@ -333,13 +333,22 @@ class cyberPanel: ## Backup Functions - def createBackup(self, virtualHostName): + def createBackup(self, virtualHostName, backupPath=None): try: - backupLogPath = "/usr/local/lscp/logs/backup_log."+time.strftime("%m.%d.%Y_%H-%M-%S") + # Setup default backup path to /home//backup if not passed in + if backupPath is None: + backupPath = '/home/' + virtualHostName + '/backup' + + # remove trailing slash in path + backupPath = backupPath.rstrip("/") + backuptime = time.strftime("%m.%d.%Y_%H-%M-%S") + backupLogPath = "/usr/local/lscp/logs/backup_log." + backuptime print('Backup logs to be generated in %s' % (backupLogPath)) - - backupSchedule.createLocalBackup(virtualHostName, backupLogPath) + tempStoragePath = backupPath + '/backup-' + virtualHostName + '-' + backuptime + backupName = 'backup-' + virtualHostName + '-' + backuptime + backupDomain = virtualHostName + backupUtilities.submitBackupCreation(tempStoragePath, backupName, backupPath, backupDomain) except BaseException as msg: logger.writeforCLI(str(msg), "Error", stack()[0][3]) From ae728b0c588c0d5011c8f023140ffa368e9bdb77 Mon Sep 17 00:00:00 2001 From: WhatTheServer Date: Thu, 24 Dec 2020 19:56:04 -0500 Subject: [PATCH 020/107] Update cliParser.py Add argument to pass an optional backupPath to cyberpanel cli createBackup function so you can call the createBackup function and specify to backup to a specific path like another mount or path for scripting backups where you want them vs being hardcoded to /home//backup --- cli/cliParser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/cliParser.py b/cli/cliParser.py index 20dae31b6..00c7cb7d7 100755 --- a/cli/cliParser.py +++ b/cli/cliParser.py @@ -22,6 +22,7 @@ class cliParser: parser.add_argument('--dkim', help='DKIM Signing') parser.add_argument('--openBasedir', help='To enable or disable open_basedir protection for domain.') parser.add_argument('--fileName', help='Complete path to a file that needs to be restored.') + parser.add_argument('--backupPath', help='Backup path to use when generating a backup.') ## Package Arguments. @@ -69,4 +70,4 @@ class cliParser: parser.add_argument('--siteTitle', help='Site Title for application installers.') parser.add_argument('--path', help='Path for application installers.') - return parser.parse_args() \ No newline at end of file + return parser.parse_args() From 40708e90b905350c66bebd2966146dca9142e73b Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 25 Dec 2020 14:18:47 +0500 Subject: [PATCH 021/107] bug fix: fetch buckets --- cloudAPI/models.py | 6 ++++-- plogical/applicationInstaller.py | 31 +++++++++++++++++++++++++++---- s3Backups/s3Backups.py | 1 - 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/cloudAPI/models.py b/cloudAPI/models.py index 4e6a8e76d..0e53a264a 100755 --- a/cloudAPI/models.py +++ b/cloudAPI/models.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- - from django.db import models - +from websiteFunctions.models import Websites # Create your models here. +class WPDeployments(models.Model): + owner = models.ForeignKey(Websites, on_delete=models.CASCADE) + config = models.TextField() \ No newline at end of file diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index 7b64152d6..3882d10f5 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -476,6 +476,7 @@ $parameters = array( adminPassword = self.extraArgs['adminPassword'] adminEmail = self.extraArgs['adminEmail'] + FNULL = open(os.devnull, 'w') ### Check WP CLI @@ -520,7 +521,8 @@ $parameters = array( dbName, dbUser, dbPassword = self.dbCreation(tempStatusPath, website.master) self.permPath = website.path - except: + except BaseException as msg: + website = Websites.objects.get(domain=domainName) externalApp = website.externalApp self.masterDomain = website.domain @@ -543,6 +545,7 @@ $parameters = array( dbName, dbUser, dbPassword = self.dbCreation(tempStatusPath, website) self.permPath = '/home/%s/public_html' % (website.domain) + ## Security Check command = 'chmod 755 %s' % (self.permPath) @@ -568,7 +571,7 @@ $parameters = array( try: command = "wp core download --allow-root --path=%s --version=%s" % (finalPath, self.extraArgs['version']) - except BaseException as msg: + except: command = "wp core download --allow-root --path=" + finalPath ProcessUtilities.executioner(command, externalApp) @@ -607,6 +610,7 @@ $parameters = array( command = "wp plugin activate litespeed-cache --allow-root --path=" + finalPath ProcessUtilities.executioner(command, externalApp) + ## from filemanager.filemanager import FileManager @@ -1251,6 +1255,25 @@ $parameters = array( self.extraArgs['tempStatusPath'] = currentTemp + ### Save config in db + + from cloudAPI.models import WPDeployments + from websiteFunctions.models import Websites + import json + + website = Websites.objects.get(domain = self.extraArgs['domain']) + + del self.extraArgs['adminPassword'] + del self.extraArgs['password'] + del self.extraArgs['tempStatusPath'] + del self.extraArgs['domain'] + del self.extraArgs['adminEmail'] + del self.extraArgs['adminUser'] + del self.extraArgs['blogTitle'] + + wpDeploy = WPDeployments(owner=website, config=json.dumps(self.extraArgs)) + wpDeploy.save() + logging.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].') except BaseException as msg: @@ -1290,10 +1313,10 @@ def main(): extraArgs['userName'] = args.userName extraArgs['version'] = args.version - try: + if args.path != None: extraArgs['path'] = args.path extraArgs['home'] = '0' - except: + else: extraArgs['home'] = '1' ai = ApplicationInstaller(None, extraArgs) diff --git a/s3Backups/s3Backups.py b/s3Backups/s3Backups.py index 19c543916..1085c1265 100755 --- a/s3Backups/s3Backups.py +++ b/s3Backups/s3Backups.py @@ -158,7 +158,6 @@ class S3Backups(multi.Thread): aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, endpoint_url=region, - config=Config(signature_version='v4') ) else: s3 = boto3.resource( From 7f8a36f892504aa1b5092947b67de308c0a6b0a9 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 29 Dec 2020 13:56:22 +0500 Subject: [PATCH 022/107] wpmanager: init --- cloudAPI/cloudManager.py | 390 ++++++++++++++++++++++++++++++++++++- cloudAPI/views.py | 22 +++ plogical/mysqlUtilities.py | 21 ++ s3Backups/s3Backups.py | 2 - 4 files changed, 430 insertions(+), 5 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index 9b0409737..031d79d30 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -1920,9 +1920,11 @@ class CloudManager: execPath = execPath + " DeployWordPress --tempStatusPath %s --appsSet '%s' --domain '%s' --email '%s' --password '%s' " \ "--pluginUpdates '%s' --themeUpdates '%s' --title '%s' --updates '%s' --userName '%s' " \ "--version '%s'" % ( - tempStatusPath, self.data['appsSet'], self.data['domain'], self.data['email'], self.data['password'], - self.data['pluginUpdates'], self.data['themeUpdates'], self.data['title'], self.data['updates'], - self.data['userName'], self.data['version']) + tempStatusPath, self.data['appsSet'], self.data['domain'], self.data['email'], + self.data['password'], + self.data['pluginUpdates'], self.data['themeUpdates'], self.data['title'], + self.data['updates'], + self.data['userName'], self.data['version']) try: execPath = '%s --path %s' % (execPath, self.data['path']) @@ -1937,3 +1939,385 @@ class CloudManager: except BaseException as msg: return self.ajaxPre(0, str(msg)) + + def FetchWordPressDetails(self): + try: + + finalDic = {} + domain = self.data['domain'] + finalDic['status'] = 1 + finalDic['maintenanceMode'] = 1 + finalDic['php'] = '7.4' + + + ## Get versopm + + website = Websites.objects.get(domain=domain) + command = 'wp core version --path=/home/%s/public_html' % (domain) + finalDic['version'] = ProcessUtilities.outputExecutioner(command, website.externalApp) + + ## LSCache + + command = 'wp plugin status litespeed-cache --path=/home/%s/public_html' % (domain) + result = ProcessUtilities.outputExecutioner(command, website.externalApp) + + if result.find('Status: Active') > -1: + finalDic['lscache'] = 1 + else: + finalDic['lscache'] = 0 + + ## Debug + + command = 'wp config list --path=/home/%s/public_html' % (domain) + result = ProcessUtilities.outputExecutioner(command, website.externalApp).split('\n') + finalDic['debugging'] = 0 + for items in result: + if items.find('WP_DEBUG') > -1 and items.find('1') > - 1: + finalDic['debugging'] = 1 + break + + ## Search index + + command = 'wp option get blog_public --path=/home/%s/public_html' % (domain) + finalDic['searchIndex'] = int(ProcessUtilities.outputExecutioner(command, website.externalApp).rstrip('\n')) + + ## Maintenece mode + + command = 'wp maintenance-mode status --path=/home/%s/public_html' % (domain) + result = ProcessUtilities.outputExecutioner(command, website.externalApp) + + if result.find('not active') > -1: + finalDic['maintenanceMode'] = 0 + else: + finalDic['maintenanceMode'] = 1 + + ## Get title + + from cloudAPI.models import WPDeployments + import json + wpd = WPDeployments.objects.get(owner=website) + config = json.loads(wpd.config) + finalDic['title'] = config['title'] + + ## + + final_json = json.dumps(finalDic) + return HttpResponse(final_json) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def AutoLogin(self): + try: + + ## Get versopm + + website = Websites.objects.get(domain=self.data['domain']) + + ## Get title + + import plogical.randomPassword as randomPassword + password = randomPassword.generate_pass(32) + + command = 'wp user create cyberpanel support@cyberpanel.cloud --role=administrator --user_pass="%s" --path=/home/%s/public_html' % (password, self.data['domain']) + ProcessUtilities.executioner(command, website.externalApp) + + command = 'wp user update cyberpanel --user_pass="%s" --path=/home/%s/public_html' % (password, self.data['domain']) + ProcessUtilities.executioner(command, website.externalApp) + + finalDic = {'status': 1, 'password': password} + final_json = json.dumps(finalDic) + return HttpResponse(final_json) + + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def UpdateWPSettings(self): + try: + + website = Websites.objects.get(domain=self.data['domain']) + domain = self.data['domain'] + + if self.data['setting'] == 'lscache': + if self.data['settingValue']: + + command = "wp plugin install litespeed-cache --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + + command = "wp plugin activate litespeed-cache --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + + final_dic = {'status': 1, 'message': 'LSCache successfully installed and activated.'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + else: + command = 'wp plugin deactivate litespeed-cache --path=/home/%s/public_html' % (domain) + ProcessUtilities.executioner(command, website.externalApp) + + final_dic = {'status': 1, 'message': 'LSCache successfully deactivated.'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + elif self.data['setting'] == 'debugging': + if self.data['settingValue']: + command = "wp config set WP_DEBUG true --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + + final_dic = {'status': 1, 'message': 'WordPress is now in debug mode.'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + else: + command = "wp config set WP_DEBUG false --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + + final_dic = {'status': 1, 'message': 'WordPress debug mode turned off.'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + elif self.data['setting'] == 'searchIndex': + if self.data['settingValue']: + command = "wp option update blog_public 1 --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + + final_dic = {'status': 1, 'message': 'Search Engine Indexing enabled.'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + else: + command = "wp option update blog_public 0 --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + + final_dic = {'status': 1, 'message': 'Search Engine Indexing disabled.'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + elif self.data['setting'] == 'maintenanceMode': + if self.data['settingValue']: + command = "wp maintenance-mode activate --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + + final_dic = {'status': 1, 'message': 'WordPress Maintenance mode turned on.'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + else: + command = "wp maintenance-mode deactivate --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + + final_dic = {'status': 1, 'message': 'WordPress Maintenance mode turned off.'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def GetCurrentPlugins(self): + try: + website = Websites.objects.get(domain=self.data['domain']) + command = 'wp plugin list --format=json --path=/home/%s/public_html' % (self.data['domain']) + json_data = ProcessUtilities.outputExecutioner(command, website.externalApp) + final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}) + return HttpResponse(final_json) + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def UpdatePlugins(self): + try: + website = Websites.objects.get(domain=self.data['domain']) + + if self.data['plugin'] == 'all': + command = 'wp plugin update --all --path=/home/%s/public_html' % (self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'message': "Plugin updates started in the background."}) + return HttpResponse(final_json) + elif self.data['plugin'] == 'selected': + if self.data['allPluginsChecked']: + command = 'wp plugin update --all --path=/home/%s/public_html' % (self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Plugin updates started in the background."}) + return HttpResponse(final_json) + else: + pluginsList = '' + + for plugin in self.data['plugins']: + pluginsList = '%s %s' % (pluginsList, plugin) + + command = 'wp plugin update %s --path=/home/%s/public_html' % (pluginsList, self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Plugin updates started in the background."}) + return HttpResponse(final_json) + else: + command = 'wp plugin update %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Plugin updates started in the background."}) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def ChangeState(self): + try: + website = Websites.objects.get(domain=self.data['domain']) + + command = 'wp plugin status %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + result = ProcessUtilities.outputExecutioner(command, website.externalApp) + + if result.find('Status: Active') > -1: + command = 'wp plugin deactivate %s --path=/home/%s/public_html' % ( + self.data['plugin'], self.data['domain']) + ProcessUtilities.executioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Plugin successfully deactivated."}) + return HttpResponse(final_json) + else: + command = 'wp plugin activate %s --path=/home/%s/public_html' % ( + self.data['plugin'], self.data['domain']) + ProcessUtilities.executioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Plugin successfully activated."}) + return HttpResponse(final_json) + + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def DeletePlugins(self): + try: + website = Websites.objects.get(domain=self.data['domain']) + + if self.data['plugin'] == 'selected': + pluginsList = '' + + for plugin in self.data['plugins']: + pluginsList = '%s %s' % (pluginsList, plugin) + + command = 'wp plugin delete %s --path=/home/%s/public_html' % (pluginsList, self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Plugin deletion started in the background."}) + return HttpResponse(final_json) + else: + command = 'wp plugin delete %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Plugin deletion started in the background."}) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def GetCurrentThemes(self): + try: + website = Websites.objects.get(domain=self.data['domain']) + command = 'wp theme list --format=json --path=/home/%s/public_html' % (self.data['domain']) + json_data = ProcessUtilities.outputExecutioner(command, website.externalApp) + final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}) + return HttpResponse(final_json) + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def UpdateThemes(self): + try: + website = Websites.objects.get(domain=self.data['domain']) + + if self.data['plugin'] == 'all': + command = 'wp theme update --all --path=/home/%s/public_html' % (self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'message': "Theme updates started in the background."}) + return HttpResponse(final_json) + elif self.data['plugin'] == 'selected': + if self.data['allPluginsChecked']: + command = 'wp theme update --all --path=/home/%s/public_html' % (self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Theme updates started in the background."}) + return HttpResponse(final_json) + else: + pluginsList = '' + + for plugin in self.data['plugins']: + pluginsList = '%s %s' % (pluginsList, plugin) + + command = 'wp theme update %s --path=/home/%s/public_html' % (pluginsList, self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Theme updates started in the background."}) + return HttpResponse(final_json) + else: + command = 'wp theme update %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Theme updates started in the background."}) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def ChangeStateThemes(self): + try: + website = Websites.objects.get(domain=self.data['domain']) + + command = 'wp theme status %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + result = ProcessUtilities.outputExecutioner(command, website.externalApp) + + if result.find('Status: Active') > -1: + command = 'wp theme deactivate %s --path=/home/%s/public_html' % ( + self.data['plugin'], self.data['domain']) + ProcessUtilities.executioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Theme successfully deactivated."}) + return HttpResponse(final_json) + else: + command = 'wp theme activate %s --path=/home/%s/public_html' % ( + self.data['plugin'], self.data['domain']) + ProcessUtilities.executioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Theme successfully activated."}) + return HttpResponse(final_json) + + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def DeleteThemes(self): + try: + website = Websites.objects.get(domain=self.data['domain']) + + if self.data['plugin'] == 'selected': + pluginsList = '' + + for plugin in self.data['plugins']: + pluginsList = '%s %s' % (pluginsList, plugin) + + command = 'wp theme delete %s --path=/home/%s/public_html' % (pluginsList, self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Plugin Theme started in the background."}) + return HttpResponse(final_json) + else: + command = 'wp theme delete %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + ProcessUtilities.popenExecutioner(command, website.externalApp) + final_json = json.dumps( + {'status': 1, 'fetchStatus': 1, 'message': "Theme deletion started in the background."}) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) \ No newline at end of file diff --git a/cloudAPI/views.py b/cloudAPI/views.py index 1bfd9bcab..668f80b48 100755 --- a/cloudAPI/views.py +++ b/cloudAPI/views.py @@ -65,6 +65,28 @@ def router(request): return cm.SubmitCloudBackupRestore() elif controller == 'DeployWordPress': return cm.DeployWordPress() + elif controller == 'FetchWordPressDetails': + return cm.FetchWordPressDetails() + elif controller == 'AutoLogin': + return cm.AutoLogin() + elif controller == 'DeletePlugins': + return cm.DeletePlugins() + elif controller == 'GetCurrentThemes': + return cm.GetCurrentThemes() + elif controller == 'UpdateThemes': + return cm.UpdateThemes() + elif controller == 'ChangeStateThemes': + return cm.ChangeStateThemes() + elif controller == 'DeleteThemes': + return cm.DeleteThemes() + elif controller == 'UpdateWPSettings': + return cm.UpdateWPSettings() + elif controller == 'GetCurrentPlugins': + return cm.GetCurrentPlugins() + elif controller == 'UpdatePlugins': + return cm.UpdatePlugins() + elif controller == 'ChangeState': + return cm.ChangeState() elif controller == 'getCurrentS3Backups': return cm.getCurrentS3Backups() elif controller == 'deleteS3Backup': diff --git a/plogical/mysqlUtilities.py b/plogical/mysqlUtilities.py index 81c8fb9ac..71e75a7b0 100755 --- a/plogical/mysqlUtilities.py +++ b/plogical/mysqlUtilities.py @@ -960,6 +960,27 @@ skip-name-resolve logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[addUserToDB]") return 0 + @staticmethod + def UpdateWPTempPassword(dbname, password): + try: + + ## + + connection, cursor = mysqlUtilities.setupConnection() + + if connection == 0: + return 0 + + cursor.execute("use %s" % (dbname)) + cursor.execute("UPDATE `wp_users` SET `user_pass`= MD5('%s') WHERE `user_login`='usman'" % (password)) + connection.close() + + return 1 + + except BaseException as msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[deleteDatabase]") + return str(msg) + def main(): parser = argparse.ArgumentParser(description='CyberPanel') parser.add_argument('function', help='Specific a function to call!') diff --git a/s3Backups/s3Backups.py b/s3Backups/s3Backups.py index 1085c1265..cdf5922b4 100755 --- a/s3Backups/s3Backups.py +++ b/s3Backups/s3Backups.py @@ -148,8 +148,6 @@ class S3Backups(multi.Thread): if currentACL['admin'] == 0: return proc.ajax(0, 'Only administrators can use AWS S3 Backups.') - from botocore.client import Config - aws_access_key_id, aws_secret_access_key, region = self.fetchAWSKeys() if region.find('http') > -1: From 812d1e4d99291efaf45b2a682de5725f065b66e8 Mon Sep 17 00:00:00 2001 From: WhatTheServer Date: Thu, 31 Dec 2020 10:40:44 -0500 Subject: [PATCH 023/107] Update httpd_config.conf Add the below to support autoload of .htaccess `autoLoadHtaccess 1` https://openlitespeed.org/kb/how-to-autoload-htaccess-with-openlitespeed/ https://feedback.cyberpanel.net/b/requests/p/automatic-restart-of-openlitespeed-server-after-any-change-in-htaccess Also added in missing phpconfigs for later PHP versions --- install/litespeed/conf/httpd_config.conf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/install/litespeed/conf/httpd_config.conf b/install/litespeed/conf/httpd_config.conf index 31783e118..74c4402e3 100755 --- a/install/litespeed/conf/httpd_config.conf +++ b/install/litespeed/conf/httpd_config.conf @@ -32,6 +32,7 @@ expires { enableExpires 1 expiresByType image/*=A604800, text/css=A604800, application/x-javascript=A604800 } +autoLoadHtaccess 1 tuning { eventDispatcher best @@ -199,4 +200,7 @@ include phpconfigs/php55.conf include phpconfigs/php56.conf include phpconfigs/php70.conf include phpconfigs/php71.conf - +include phpconfigs/php72.conf +include phpconfigs/php73.conf +include phpconfigs/php74.conf +include phpconfigs/php80.conf From 1529e86cb2e72e95f3968f58d69c1b161f8c4f2c Mon Sep 17 00:00:00 2001 From: WhatTheServer Date: Thu, 31 Dec 2020 10:41:28 -0500 Subject: [PATCH 024/107] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fa624628a..5ec273ceb 100755 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ Webhosting control panel that uses OpenLiteSpeed as web server. * PHP 7.2 * PHP 7.3 * PHP 7.4 +* PHP 8.0 # Installation Instructions From 96a90f0073900ea5b980e7eaf6fbc1cba303db39 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 31 Dec 2020 22:54:07 +0500 Subject: [PATCH 025/107] feature: finish initial wp manager --- cloudAPI/cloudManager.py | 101 +++++++++++++++++++++++++++---- cloudAPI/views.py | 13 +++- filemanager/filemanager.py | 3 + plogical/applicationInstaller.py | 40 ++++++------ plogical/backupUtilities.py | 46 +++++++++++++- websiteFunctions/website.py | 1 - 6 files changed, 171 insertions(+), 33 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index 031d79d30..1f38b74a8 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -1659,12 +1659,31 @@ class CloudManager: except: databases = '0' + try: + port = str(self.data['port']) + except: + port = '0' + + try: + ip = str(self.data['ip']) + except: + ip = '0' + + try: + destinationDomain = self.data['destinationDomain'] + except: + destinationDomain = '' + + import time + BackupPath = '/home/cyberpanel/backups/%s/backup-' % (self.data['domain']) + self.data['domain'] + "-" + time.strftime("%m.%d.%Y_%H-%M-%S") + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " CloudBackup --backupDomain %s --data %s --emails %s --databases %s --tempStoragePath %s" % ( - self.data['domain'], data, emails, databases, tempStatusPath) + execPath = execPath + " CloudBackup --backupDomain %s --data %s --emails %s --databases %s --tempStoragePath %s " \ + "--path %s --port %s --ip %s --destinationDomain %s" % ( + self.data['domain'], data, emails, databases, tempStatusPath, BackupPath, port, ip, destinationDomain) ProcessUtilities.popenExecutioner(execPath) - final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} + final_dic = {'status': 1, 'tempStatusPath': tempStatusPath, 'path': '%s.tar.gz' % (BackupPath)} final_json = json.dumps(final_dic) return HttpResponse(final_json) @@ -1774,9 +1793,14 @@ class CloudManager: writeToFile.write('Starting..,0') writeToFile.close() + try: + sourceDomain = self.data['sourceDomain'] + except: + sourceDomain = 'None' + execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " SubmitCloudBackupRestore --backupDomain %s --backupFile %s --tempStoragePath %s" % ( - self.data['domain'], self.data['backupFile'], tempStatusPath) + execPath = execPath + " SubmitCloudBackupRestore --backupDomain %s --backupFile %s --sourceDomain %s --tempStoragePath %s" % ( + self.data['domain'], self.data['backupFile'],sourceDomain, tempStatusPath) ProcessUtilities.popenExecutioner(execPath) final_dic = {'status': 1, 'tempStatusPath': tempStatusPath} @@ -1993,11 +2017,8 @@ class CloudManager: ## Get title - from cloudAPI.models import WPDeployments - import json - wpd = WPDeployments.objects.get(owner=website) - config = json.loads(wpd.config) - finalDic['title'] = config['title'] + command = 'wp option get blogname --path=/home/%s/public_html' % (domain) + finalDic['title'] = ProcessUtilities.outputExecutioner(command, website.externalApp) ## @@ -2320,4 +2341,62 @@ class CloudManager: except BaseException as msg: final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) - return HttpResponse(final_json) \ No newline at end of file + return HttpResponse(final_json) + + def GetServerPublicSSHkey(self): + try: + + path = '/root/.ssh/cyberpanel.pub' + command = 'cat %s' % (path) + key = ProcessUtilities.outputExecutioner(command) + + final_dic = {'status': 1, 'key': key} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def SubmitPublicKey(self): + try: + + fm = FirewallManager() + fm.addSSHKey(self.admin.pk, self.data) + + ## Create backup path so that file can be sent here later. + + BackupPath = '/home/cyberpanel/backups/%s' % (self.data['domain']) + command = 'mkdir -p %s' % (BackupPath) + ProcessUtilities.executioner(command, 'cyberpanel') + + ### + + from WebTerminal.CPWebSocket import SSHServer + SSHServer.findSSHPort() + + final_dic = {'status': 1, 'port': SSHServer.DEFAULT_PORT} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def CreateStaging(self, request): + try: + request.session['userID'] = self.admin.pk + wm = WebsiteManager() + return wm.startCloning(self.admin.pk, self.data) + except BaseException as msg: + return self.ajaxPre(0, str(msg)) + + def startSync(self, request): + try: + request.session['userID'] = self.admin.pk + wm = WebsiteManager() + return wm.startSync(self.admin.pk, self.data) + except BaseException as msg: + return self.ajaxPre(0, str(msg)) \ No newline at end of file diff --git a/cloudAPI/views.py b/cloudAPI/views.py index 668f80b48..a866f308d 100755 --- a/cloudAPI/views.py +++ b/cloudAPI/views.py @@ -79,6 +79,10 @@ def router(request): return cm.ChangeStateThemes() elif controller == 'DeleteThemes': return cm.DeleteThemes() + elif controller == 'GetServerPublicSSHkey': + return cm.GetServerPublicSSHkey() + elif controller == 'SubmitPublicKey': + return cm.SubmitPublicKey() elif controller == 'UpdateWPSettings': return cm.UpdateWPSettings() elif controller == 'GetCurrentPlugins': @@ -229,6 +233,10 @@ def router(request): return cm.getLogsFromFile(request) elif controller == 'serverSSL': return cm.serverSSL(request) + elif controller == 'CreateStaging': + return cm.CreateStaging(request) + elif controller == 'startSync': + return cm.startSync(request) elif controller == 'setupNode': return cm.setupManager(request) elif controller == 'fetchManagerTokens': @@ -372,7 +380,6 @@ def router(request): cm = CloudManager(None) return cm.ajaxPre(0, str(msg)) -@csrf_exempt def access(request): try: serverUserName = request.GET.get('serverUserName') @@ -385,6 +392,10 @@ def access(request): return HttpResponse('API Access Disabled.') if token == admin.token.lstrip('Basic ').rstrip('='): + try: + del request.session['userID'] + except: + pass request.session['userID'] = admin.pk from django.shortcuts import redirect from baseTemplate.views import renderBase diff --git a/filemanager/filemanager.py b/filemanager/filemanager.py index e347a6ca8..570d83854 100755 --- a/filemanager/filemanager.py +++ b/filemanager/filemanager.py @@ -711,6 +711,9 @@ class FileManager: else: groupName = 'nogroup' + command = 'chown %s:%s /home/%s' % (website.externalApp, website.externalApp, domainName) + ProcessUtilities.popenExecutioner(command) + command = 'chown -R %s:%s /home/%s/public_html/*' % (externalApp, externalApp, domainName) ProcessUtilities.popenExecutioner(command) diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index 3882d10f5..82b3dd2f2 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -1255,27 +1255,31 @@ $parameters = array( self.extraArgs['tempStatusPath'] = currentTemp - ### Save config in db - - from cloudAPI.models import WPDeployments - from websiteFunctions.models import Websites - import json - - website = Websites.objects.get(domain = self.extraArgs['domain']) - - del self.extraArgs['adminPassword'] - del self.extraArgs['password'] - del self.extraArgs['tempStatusPath'] - del self.extraArgs['domain'] - del self.extraArgs['adminEmail'] - del self.extraArgs['adminUser'] - del self.extraArgs['blogTitle'] - - wpDeploy = WPDeployments(owner=website, config=json.dumps(self.extraArgs)) - wpDeploy.save() logging.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].') + try: + ### Save config in db + + from cloudAPI.models import WPDeployments + from websiteFunctions.models import Websites + import json + + website = Websites.objects.get(domain=self.extraArgs['domain']) + del self.extraArgs['adminPassword'] + del self.extraArgs['password'] + del self.extraArgs['tempStatusPath'] + del self.extraArgs['domain'] + del self.extraArgs['adminEmail'] + del self.extraArgs['adminUser'] + del self.extraArgs['blogTitle'] + del self.extraArgs['appsSet'] + + wpDeploy = WPDeployments(owner=website, config=json.dumps(self.extraArgs)) + wpDeploy.save() + except: + pass + except BaseException as msg: logging.statusWriter(self.extraArgs['tempStatusPath'], '%s [404].' % (str(msg))) diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index 46655062b..e9ffd4c0f 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -1425,7 +1425,7 @@ class backupUtilities: self.cpu = backupUtilities.CPUDefault self.time = int(backupUtilities.time) - self.BackupPath = '/home/cyberpanel/backups/%s/backup-' % (self.extraArgs['domain']) + self.extraArgs['domain'] + "-" + time.strftime("%m.%d.%Y_%H-%M-%S") + self.BackupPath = self.extraArgs['path'] self.website = Websites.objects.get(domain=self.extraArgs['domain']) command = 'mkdir -p %s' % (self.BackupPath) @@ -1486,6 +1486,13 @@ class backupUtilities: command = 'chmod 600:600 %s' % (finalPath) ProcessUtilities.executioner(command) + if self.extraArgs['port'] != 0: + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], + 'Sending file to destination server..,90') + + command = "scp -o StrictHostKeyChecking=no -P %s -i /root/.ssh/cyberpanel %s root@%s:/home/cyberpanel/backups/%s/" % (self.extraArgs['port'], finalPath, self.extraArgs['ip'], self.extraArgs['destinationDomain']) + ProcessUtilities.outputExecutioner(command) + logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], 'Completed [200].') return 1, self.BackupPath + '.tar.gz' @@ -1548,9 +1555,14 @@ class backupUtilities: command = 'rm -rf %s' % (homePath) ProcessUtilities.executioner(command) - command = 'mv %s/%s %s' % (self.dataPath, self.website.domain, '/home') + if self.extraArgs['sourceDomain'] == 'None': + command = 'mv %s/%s %s' % (self.dataPath, self.website.domain, '/home') + else: + command = 'mv %s/%s %s/%s' % (self.dataPath, self.extraArgs['sourceDomain'], '/home', self.extraArgs['domain']) + ProcessUtilities.executioner(command) + from filemanager.filemanager import FileManager fm = FileManager(None, None) @@ -1614,6 +1626,26 @@ class backupUtilities: mysqlUtilities.mysqlUtilities.restoreDatabaseBackup(db['databaseName'], self.databasesPath, db['password']) + if self.extraArgs['sourceDomain'] != 'None': + if self.extraArgs['sourceDomain'] != self.extraArgs['domain']: + + try: + command = 'wp --info' + outout = ProcessUtilities.outputExecutioner(command) + + if not outout.find('WP-CLI root dir:') > -1: + from plogical.applicationInstaller import ApplicationInstaller + ai = ApplicationInstaller(None, None) + ai.installWPCLI() + except subprocess.CalledProcessError: + from plogical.applicationInstaller import ApplicationInstaller + ai = ApplicationInstaller(None, None) + ai.installWPCLI() + + path = '/home/%s/public_html' % (self.extraArgs['domain']) + command = "wp search-replace '%s' '%s' --path=%s --allow-root" % (self.extraArgs['sourceDomain'], self.extraArgs['domain'], path) + ProcessUtilities.outputExecutioner(command) + command = 'rm -rf %s' % (self.extractedPath) ProcessUtilities.executioner(command) @@ -2038,6 +2070,10 @@ def main(): parser.add_argument('--data', help='') parser.add_argument('--emails', help='') parser.add_argument('--databases', help='') + parser.add_argument('--path', help='') + parser.add_argument('--ip', help='') + parser.add_argument('--sourceDomain', help='') + parser.add_argument('--destinationDomain', help='') ## FOR S3 @@ -2067,13 +2103,19 @@ def main(): extraArgs['data'] = int(args.data) extraArgs['emails'] = int(args.emails) extraArgs['databases'] = int(args.databases) + extraArgs['path'] = args.path + extraArgs['port'] = args.port + extraArgs['ip'] = args.ip + extraArgs['destinationDomain'] = args.destinationDomain bu = backupUtilities(extraArgs) bu.CloudBackups() + elif args.function == 'SubmitCloudBackupRestore': extraArgs = {} extraArgs['domain'] = args.backupDomain extraArgs['tempStatusPath'] = args.tempStoragePath extraArgs['backupFile'] = args.backupFile + extraArgs['sourceDomain'] = args.sourceDomain bu = backupUtilities(extraArgs) bu.SubmitCloudBackupRestore() elif args.function == 'SubmitS3BackupRestore': diff --git a/websiteFunctions/website.py b/websiteFunctions/website.py index 48115127b..f05eb7219 100755 --- a/websiteFunctions/website.py +++ b/websiteFunctions/website.py @@ -2712,7 +2712,6 @@ StrictHostKeyChecking no self.domain = data['masterDomain'] - if not validators.domain(self.domain): data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid domain."} json_data = json.dumps(data_ret) From 84a375e0dc6e76f5798adac3accc4f9498cb4183 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 2 Jan 2021 00:45:29 +0500 Subject: [PATCH 026/107] feature: finish wp manager --- cloudAPI/cloudManager.py | 93 ++++++++++++++++++- cloudAPI/views.py | 12 +++ plogical/applicationInstaller.py | 28 ++++++ .../websiteFunctions/listWebsites.html | 2 +- 4 files changed, 132 insertions(+), 3 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index 1f38b74a8..bd306422c 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -1672,7 +1672,7 @@ class CloudManager: try: destinationDomain = self.data['destinationDomain'] except: - destinationDomain = '' + destinationDomain = 'None' import time BackupPath = '/home/cyberpanel/backups/%s/backup-' % (self.data['domain']) + self.data['domain'] + "-" + time.strftime("%m.%d.%Y_%H-%M-%S") @@ -2399,4 +2399,93 @@ class CloudManager: wm = WebsiteManager() return wm.startSync(self.admin.pk, self.data) except BaseException as msg: - return self.ajaxPre(0, str(msg)) \ No newline at end of file + return self.ajaxPre(0, str(msg)) + + def SaveAutoUpdateSettings(self): + try: + website = Websites.objects.get(domain=self.data['domainName']) + domainName = self.data['domainName'] + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + config = json.loads(wpd.config) + config['updates'] = self.data['wpCore'] + config['pluginUpdates'] = self.data['plugins'] + config['themeUpdates'] = self.data['themes'] + wpd.config = json.dumps(config) + wpd.save() + + if self.data['wpCore'] == 'Disabled': + command = "wp config set WP_AUTO_UPDATE_CORE false --raw --path=/home/%s/public_html" % (domainName) + ProcessUtilities.executioner(command, website.externalApp) + elif self.data['wpCore'] == 'Minor and Security Updates': + command = "wp config set WP_AUTO_UPDATE_CORE minor --allow-root --path=/home/%s/public_html" % (domainName) + ProcessUtilities.executioner(command, website.externalApp) + else: + command = "wp config set WP_AUTO_UPDATE_CORE true --raw --allow-root --path=/home/%s/public_html" % (domainName) + ProcessUtilities.executioner(command, website.externalApp) + + final_json = json.dumps( + {'status': 1, 'message': "Autoupdates configured."}) + return HttpResponse(final_json) + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def fetchWPSettings(self): + try: + + cliVersion = ProcessUtilities.outputExecutioner('wp --version --allow-root') + + if cliVersion.find('not found') > -1: + cliVersion = 'WP CLI Not installed.' + + if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: + localCronPath = "/var/spool/cron/root" + else: + localCronPath = "/var/spool/cron/crontabs/root" + + cronData = ProcessUtilities.outputExecutioner('cat %s' % (localCronPath)).split('\n') + + finalCron = '' + for cronLine in cronData: + if cronLine.find('WPAutoUpdates.py') > -1: + finalCron = cronLine + + + if finalCron.find('WPAutoUpdates.py') == -1: + finalCron = 'Not Set' + + final_json = json.dumps( + {'status': 1, 'cliVersion': cliVersion, 'finalCron': finalCron}) + return HttpResponse(final_json) + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def updateWPCLI(self): + try: + + command = 'wp cli update' + ProcessUtilities.executioner(command) + final_json = json.dumps({'status': 1}) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def saveWPSettings(self): + try: + + command = 'wp cli update' + ProcessUtilities.executioner(command) + final_json = json.dumps({'status': 1}) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) \ No newline at end of file diff --git a/cloudAPI/views.py b/cloudAPI/views.py index a866f308d..bf775fe63 100755 --- a/cloudAPI/views.py +++ b/cloudAPI/views.py @@ -14,10 +14,14 @@ def router(request): controller = data['controller'] serverUserName = data['serverUserName'] + admin = Administrator.objects.get(userName=serverUserName) cm = CloudManager(data, admin) + if serverUserName != 'admin': + return cm.ajaxPre(0, 'Only administrator can access API.') + if admin.api == 0: return cm.ajaxPre(0, 'API Access Disabled.') @@ -91,6 +95,8 @@ def router(request): return cm.UpdatePlugins() elif controller == 'ChangeState': return cm.ChangeState() + elif controller == 'saveWPSettings': + return cm.saveWPSettings() elif controller == 'getCurrentS3Backups': return cm.getCurrentS3Backups() elif controller == 'deleteS3Backup': @@ -237,6 +243,12 @@ def router(request): return cm.CreateStaging(request) elif controller == 'startSync': return cm.startSync(request) + elif controller == 'SaveAutoUpdateSettings': + return cm.SaveAutoUpdateSettings() + elif controller == 'fetchWPSettings': + return cm.fetchWPSettings() + elif controller == 'updateWPCLI': + return cm.updateWPCLI() elif controller == 'setupNode': return cm.setupManager(request) elif controller == 'fetchManagerTokens': diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index 82b3dd2f2..ad4039299 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -610,6 +610,18 @@ $parameters = array( command = "wp plugin activate litespeed-cache --allow-root --path=" + finalPath ProcessUtilities.executioner(command, externalApp) + if self.extraArgs['updates']: + + if self.extraArgs['updates'] == 'Disabled': + command = "wp config set WP_AUTO_UPDATE_CORE false --raw --allow-root --path=" + finalPath + ProcessUtilities.executioner(command, externalApp) + elif self.extraArgs['updates'] == 'Minor and Security Updates': + command = "wp config set WP_AUTO_UPDATE_CORE minor --allow-root --path=" + finalPath + ProcessUtilities.executioner(command, externalApp) + else: + command = "wp config set WP_AUTO_UPDATE_CORE true --raw --allow-root --path=" + finalPath + ProcessUtilities.executioner(command, externalApp) + ## @@ -1280,6 +1292,22 @@ $parameters = array( except: pass + ## Set up cron if missing + + if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: + localCronPath = "/var/spool/cron/root" + else: + localCronPath = "/var/spool/cron/crontabs/root" + + cronData = open(localCronPath, 'r').read() + + if cronData.find('WPAutoUpdates.py') == -1: + writeToFile = open(localCronPath, 'a') + writeToFile.write('0 12 * * * /usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/WPAutoUpdates.py\n') + writeToFile.close() + + + except BaseException as msg: logging.statusWriter(self.extraArgs['tempStatusPath'], '%s [404].' % (str(msg))) diff --git a/websiteFunctions/templates/websiteFunctions/listWebsites.html b/websiteFunctions/templates/websiteFunctions/listWebsites.html index 29ac71118..8fd9a21dd 100755 --- a/websiteFunctions/templates/websiteFunctions/listWebsites.html +++ b/websiteFunctions/templates/websiteFunctions/listWebsites.html @@ -57,7 +57,7 @@

-- - /home/{$ web.domain $}/public_html + File Manager
From 5dd37847b4af726e92e5dbf63ec7982f23b5a9b8 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 12 Jan 2021 17:56:36 +0500 Subject: [PATCH 027/107] wp manager cmplt --- cloudAPI/cloudManager.py | 25 +++++++- cloudAPI/views.py | 2 + plogical/IncScheduler.py | 4 ++ plogical/applicationInstaller.py | 99 +++++++++++++++++++++----------- plogical/backupUtilities.py | 8 +++ websiteFunctions/StagingSetup.py | 2 +- 6 files changed, 103 insertions(+), 37 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index bd306422c..5571d016b 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -1943,12 +1943,12 @@ class CloudManager: execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/applicationInstaller.py" execPath = execPath + " DeployWordPress --tempStatusPath %s --appsSet '%s' --domain '%s' --email '%s' --password '%s' " \ "--pluginUpdates '%s' --themeUpdates '%s' --title '%s' --updates '%s' --userName '%s' " \ - "--version '%s'" % ( + "--version '%s' --createSite %s" % ( tempStatusPath, self.data['appsSet'], self.data['domain'], self.data['email'], self.data['password'], self.data['pluginUpdates'], self.data['themeUpdates'], self.data['title'], self.data['updates'], - self.data['userName'], self.data['version']) + self.data['userName'], self.data['version'], str(self.data['createSite'])) try: execPath = '%s --path %s' % (execPath, self.data['path']) @@ -2485,6 +2485,27 @@ class CloudManager: final_json = json.dumps({'status': 1}) return HttpResponse(final_json) + except BaseException as msg: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + def WPScan(self): + try: + + path = '/home/%s/public_html' % (self.data['domainName']) + + command = 'wp core version --allow-root --path=%s' % (path) + result = ProcessUtilities.outputExecutioner(command) + + if result.find('Error:') > -1: + final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': 'This does not seem to be a WordPress installation'} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + else: + final_json = json.dumps({'status': 1}) + return HttpResponse(final_json) + except BaseException as msg: final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) diff --git a/cloudAPI/views.py b/cloudAPI/views.py index bf775fe63..4f756cd2f 100755 --- a/cloudAPI/views.py +++ b/cloudAPI/views.py @@ -97,6 +97,8 @@ def router(request): return cm.ChangeState() elif controller == 'saveWPSettings': return cm.saveWPSettings() + elif controller == 'WPScan': + return cm.WPScan() elif controller == 'getCurrentS3Backups': return cm.getCurrentS3Backups() elif controller == 'deleteS3Backup': diff --git a/plogical/IncScheduler.py b/plogical/IncScheduler.py index 0f3b4a2ef..f24a0d13e 100644 --- a/plogical/IncScheduler.py +++ b/plogical/IncScheduler.py @@ -683,6 +683,10 @@ Automatic backup failed for %s on %s. extraArgs['data'] = int(PlanConfig['data']) extraArgs['emails'] = int(PlanConfig['emails']) extraArgs['databases'] = int(PlanConfig['databases']) + extraArgs['port'] = '0' + extraArgs['ip'] = '0' + extraArgs['destinationDomain'] = 'None' + extraArgs['path'] = '/home/cyberpanel/backups/%s/backup-' % (items.domain) + items.domain + "-" + time.strftime("%m.%d.%Y_%H-%M-%S") bu = backupUtilities(extraArgs) result, fileName = bu.CloudBackups() diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index ad4039299..9b004bf3a 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -574,7 +574,10 @@ $parameters = array( except: command = "wp core download --allow-root --path=" + finalPath - ProcessUtilities.executioner(command, externalApp) + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) ## @@ -583,7 +586,10 @@ $parameters = array( statusFile.close() command = "wp core config --dbname=" + dbName + " --dbuser=" + dbUser + " --dbpass=" + dbPassword + " --dbhost=%s --dbprefix=wp_ --allow-root --path=" % (ApplicationInstaller.LOCALHOST) + finalPath - ProcessUtilities.executioner(command, externalApp) + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) if home == '0': path = self.extraArgs['path'] @@ -592,7 +598,10 @@ $parameters = array( finalURL = domainName command = 'wp core install --url="http://' + finalURL + '" --title="' + blogTitle + '" --admin_user="' + adminUser + '" --admin_password="' + adminPassword + '" --admin_email="' + adminEmail + '" --allow-root --path=' + finalPath - ProcessUtilities.executioner(command, externalApp) + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) ## @@ -601,26 +610,43 @@ $parameters = array( statusFile.close() command = "wp plugin install litespeed-cache --allow-root --path=" + finalPath - ProcessUtilities.executioner(command, externalApp) + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) statusFile = open(tempStatusPath, 'w') statusFile.writelines('Activating LSCache Plugin,90') statusFile.close() command = "wp plugin activate litespeed-cache --allow-root --path=" + finalPath - ProcessUtilities.executioner(command, externalApp) + result = ProcessUtilities.outputExecutioner(command, externalApp) - if self.extraArgs['updates']: + if result.find('Success:') == -1: + raise BaseException(result) - if self.extraArgs['updates'] == 'Disabled': - command = "wp config set WP_AUTO_UPDATE_CORE false --raw --allow-root --path=" + finalPath - ProcessUtilities.executioner(command, externalApp) - elif self.extraArgs['updates'] == 'Minor and Security Updates': - command = "wp config set WP_AUTO_UPDATE_CORE minor --allow-root --path=" + finalPath - ProcessUtilities.executioner(command, externalApp) - else: - command = "wp config set WP_AUTO_UPDATE_CORE true --raw --allow-root --path=" + finalPath - ProcessUtilities.executioner(command, externalApp) + try: + if self.extraArgs['updates']: + if self.extraArgs['updates'] == 'Disabled': + command = "wp config set WP_AUTO_UPDATE_CORE false --raw --allow-root --path=" + finalPath + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) + elif self.extraArgs['updates'] == 'Minor and Security Updates': + command = "wp config set WP_AUTO_UPDATE_CORE minor --allow-root --path=" + finalPath + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) + else: + command = "wp config set WP_AUTO_UPDATE_CORE true --raw --allow-root --path=" + finalPath + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) + except: + pass ## @@ -1227,23 +1253,25 @@ $parameters = array( def DeployWordPress(self): try: - logging.statusWriter(self.extraArgs['tempStatusPath'], 'Creating this application..,10') - ## Create site + if self.extraArgs['createSite']: + logging.statusWriter(self.extraArgs['tempStatusPath'], 'Creating this application..,10') - import re - from plogical.virtualHostUtilities import virtualHostUtilities - tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) - externalApp = "".join(re.findall("[a-zA-Z]+", self.extraArgs['domain']))[:5] + str(randint(1000, 9999)) + ## Create site - virtualHostUtilities.createVirtualHost(self.extraArgs['domain'], self.extraArgs['email'], 'PHP 7.4', - externalApp, 0, 1, 0, - 'admin', 'Default', 0, tempStatusPath, - 0) - result = open(tempStatusPath, 'r').read() - if result.find('[404]') > -1: - logging.statusWriter(self.extraArgs['tempStatusPath'], 'Failed to create application. Error: %s [404]' % (result)) - return 0 + import re + from plogical.virtualHostUtilities import virtualHostUtilities + tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + externalApp = "".join(re.findall("[a-zA-Z]+", self.extraArgs['domain']))[:5] + str(randint(1000, 9999)) + + virtualHostUtilities.createVirtualHost(self.extraArgs['domain'], self.extraArgs['email'], 'PHP 7.4', + externalApp, 1, 1, 0, + 'admin', 'Default', 0, tempStatusPath, + 0) + result = open(tempStatusPath, 'r').read() + if result.find('[404]') > -1: + logging.statusWriter(self.extraArgs['tempStatusPath'], 'Failed to create application. Error: %s [404]' % (result)) + return 0 ## Install WordPress @@ -1261,9 +1289,8 @@ $parameters = array( result = open(self.extraArgs['tempStatusPath'], 'r').read() if result.find('[404]') > -1: - logging.statusWriter(self.extraArgs['tempStatusPath'], - 'Failed to install WordPress. Error: %s [404]' % (result)) - return 0 + self.extraArgs['tempStatusPath'] = currentTemp + raise BaseException('Failed to install WordPress. Error: %s [404]' % (result)) self.extraArgs['tempStatusPath'] = currentTemp @@ -1306,9 +1333,11 @@ $parameters = array( writeToFile.write('0 12 * * * /usr/local/CyberCP/bin/python /usr/local/CyberCP/plogical/WPAutoUpdates.py\n') writeToFile.close() - - except BaseException as msg: + self.extraArgs['websiteName'] = self.extraArgs['domain'] + from websiteFunctions.website import WebsiteManager + wm = WebsiteManager() + wm.submitWebsiteDeletion(1, self.extraArgs) logging.statusWriter(self.extraArgs['tempStatusPath'], '%s [404].' % (str(msg))) def main(): @@ -1326,6 +1355,7 @@ def main(): parser.add_argument('--userName', help='') parser.add_argument('--version', help='') parser.add_argument('--path', help='') + parser.add_argument('--createSite', help='') args = parser.parse_args() @@ -1344,6 +1374,7 @@ def main(): extraArgs['updates'] = args.updates extraArgs['userName'] = args.userName extraArgs['version'] = args.version + extraArgs['createSite'] = int(args.createSite) if args.path != None: extraArgs['path'] = args.path diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index e9ffd4c0f..1160e6631 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -1646,6 +1646,14 @@ class backupUtilities: command = "wp search-replace '%s' '%s' --path=%s --allow-root" % (self.extraArgs['sourceDomain'], self.extraArgs['domain'], path) ProcessUtilities.outputExecutioner(command) + command = "wp search-replace 'www.%s' '%s' --path=%s --allow-root" % ( + self.extraArgs['sourceDomain'], self.extraArgs['domain'], path) + ProcessUtilities.outputExecutioner(command) + + command = "wp search-replace 'www.%s' '%s' --path=%s --allow-root" % ( + self.extraArgs['domain'], self.extraArgs['domain'], path) + ProcessUtilities.outputExecutioner(command) + command = 'rm -rf %s' % (self.extractedPath) ProcessUtilities.executioner(command) diff --git a/websiteFunctions/StagingSetup.py b/websiteFunctions/StagingSetup.py index df6979ca6..9fe1c74b4 100644 --- a/websiteFunctions/StagingSetup.py +++ b/websiteFunctions/StagingSetup.py @@ -50,7 +50,7 @@ class StagingSetup(multi.Thread): execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" execPath = execPath + " createDomain --masterDomain " + masterDomain + " --virtualHostName " + domain + \ - " --phpVersion '" + phpSelection + "' --ssl 0 --dkimCheck 0 --openBasedir 0 --path " + path + ' --websiteOwner ' \ + " --phpVersion '" + phpSelection + "' --ssl 1 --dkimCheck 0 --openBasedir 0 --path " + path + ' --websiteOwner ' \ + admin.userName + ' --tempStatusPath %s' % (tempStatusPath + '1') + " --apache 0" ProcessUtilities.executioner(execPath) From 0c201db72b6a2b048ff68110e699edd7dc119952 Mon Sep 17 00:00:00 2001 From: WhatTheServer Date: Tue, 12 Jan 2021 19:16:15 -0500 Subject: [PATCH 028/107] Update applicationInstaller.py --- plogical/applicationInstaller.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index 9b004bf3a..6cd210f0d 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -385,13 +385,10 @@ $parameters = array( def installWPCLI(self): try: - command = 'wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar' + command = 'wget -O /usr/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar' ProcessUtilities.executioner(command) - command = 'chmod +x wp-cli.phar' - ProcessUtilities.executioner(command) - - command = 'mv wp-cli.phar /usr/bin/wp' + command = 'chmod +x /usr/bin/wp' ProcessUtilities.executioner(command) except BaseException as msg: @@ -1387,4 +1384,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() From a582b7cae96bd5bce37f743c599297bd2754c215 Mon Sep 17 00:00:00 2001 From: WhatTheServer Date: Tue, 12 Jan 2021 20:12:18 -0500 Subject: [PATCH 029/107] Add WHMCS installer core code UI options to provide license key and browse to/enter path to whmcs installer will need added. --- plogical/applicationInstaller.py | 233 +++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index 6cd210f0d..207671c52 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -1336,6 +1336,239 @@ $parameters = array( wm = WebsiteManager() wm.submitWebsiteDeletion(1, self.extraArgs) logging.statusWriter(self.extraArgs['tempStatusPath'], '%s [404].' % (str(msg))) + + + def installWhmcs(self): + try: + + admin = self.extraArgs['admin'] + domainName = self.extraArgs['domainName'] + home = self.extraArgs['home'] + firstName = self.extraArgs['firstName'] + lastName = self.extraArgs['lastName'] + email = self.extraArgs['email'] + username = self.extraArgs['username'] + password = self.extraArgs['password'] + whmcs_installer = self.extraArgs['whmcsinstallerpath'] + whmcs_licensekey = self.extraArgs['whmcslicensekey'] + tempStatusPath = self.extraArgs['tempStatusPath'] + self.tempStatusPath = tempStatusPath + + FNULL = open(os.devnull, 'w') + + ## Open Status File + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines('Setting up paths,0') + statusFile.close() + + finalPath = '' + self.permPath = '' + + try: + website = ChildDomains.objects.get(domain=domainName) + externalApp = website.master.externalApp + self.masterDomain = website.master.domain + + if home == '0': + path = self.extraArgs['path'] + finalPath = website.path.rstrip('/') + "/" + path + "/" + else: + finalPath = website.path + "/" + + if website.master.package.dataBases > website.master.databases_set.all().count(): + pass + else: + raise BaseException("Maximum database limit reached for this website.") + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines('Setting up Database,20') + statusFile.close() + + dbName, dbUser, dbPassword = self.dbCreation(tempStatusPath, website.master) + self.permPath = website.path + + except: + website = Websites.objects.get(domain=domainName) + externalApp = website.externalApp + self.masterDomain = website.domain + + if home == '0': + path = self.extraArgs['path'] + finalPath = "/home/" + domainName + "/public_html/" + path + "/" + else: + finalPath = "/home/" + domainName + "/public_html/" + + if website.package.dataBases > website.databases_set.all().count(): + pass + else: + raise BaseException("Maximum database limit reached for this website.") + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines('Setting up Database,20') + statusFile.close() + + dbName, dbUser, dbPassword = self.dbCreation(tempStatusPath, website) + self.permPath = '/home/%s/public_html' % (website.domain) + + ## Security Check + + command = 'chmod 755 %s' % (self.permPath) + ProcessUtilities.executioner(command) + + if finalPath.find("..") > -1: + raise BaseException('Specified path must be inside virtual host home.') + + if not os.path.exists(finalPath): + command = 'mkdir -p ' + finalPath + ProcessUtilities.executioner(command, externalApp) + + ## checking for directories/files + + if self.dataLossCheck(finalPath, tempStatusPath) == 0: + raise BaseException('Directory is not empty.') + + #### + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines('Extracting WHMCS Installer zip..,30') + statusFile.close() + command = "unzip -qq %s -d %s" % (whmcs_installer, finalPath) + ProcessUtilities.executioner(command, externalApp) + + ## + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines('Configuring the installation,40') + statusFile.close() + + if home == '0': + path = self.extraArgs['path'] + # finalURL = domainName + '/' + path + finalURL = domainName + else: + finalURL = domainName + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines('Installing and configuring WHMCS..,60') + statusFile.close() + + command = "chown -R " + externalApp + ":" + groupName + " " + homeDir + ProcessUtilities.executioner(command, externalApp) + + # Walk through whmcs webinstaller via curl with all except errors hidden https://stackoverflow.com/a/49502232 + # Accept EULA and generate configuration.php + command = "curl %s/install/install.php?step=2 --insecure --silent --output /dev/null --show-error --fail" % (finalURL) + ProcessUtilities.executioner(command, externalApp) + + command = "curl %s/install/install.php?step=2 --insecure --silent --output /dev/null --show-error --fail" % (finalURL) + ProcessUtilities.executioner(command, externalApp) + + command = "mv %s/configuration.php.new %s/configuration.php" % (finalPath, finalPath) + ProcessUtilities.executioner(command, externalApp) + + # Post database and license information to webinstaller form + command = """ + curl %s/install/install.php?step=4" \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + --data "licenseKey=%s&databaseHost=localhost&databasePort=&databaseUsername=%s&databasePassword=%s&databaseName=%s" \ + --compressed \ + --insecure \ + --silent \ + --output /dev/null \ + --show-error \ + --fail + """ % (whmcs_licensekey, dbUser, dbPassword, dbName) + + # Post admin user and password information to webinstaller form + command = """ + curl %s/install/install.php?step=5" \ + -H 'Content-Type: application/x-www-form-urlencoded' \ + --data "firstName=%s&lastName=%s&email=%s&username=%s&password=%s&confirmPassword=%s" \ + --compressed \ + --insecure \ + --silent \ + --output /dev/null \ + --show-error \ + --fail + """ % (firstName, lastName, email, username, password, password) + + ## + + command = "rm -rf " + finalPath + "install" + ProcessUtilities.executioner(command, externalApp) + + + ### Update whmcs urls to siteurl + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines('Update whmcs urls to siteurl..,70') + statusFile.close() + + try: + + import MySQLdb.cursors as cursors + import MySQLdb as mysql + + conn = mysql.connect(host='localhost', user=dbUser, passwd=dbPassword, port=3306, + cursorclass=cursors.SSCursor) + cursor = conn.cursor() + + cursor.execute("use %s;UPDATE tblconfiguration SET value='%s' WHERE setting='SystemURL';" % (dbName, finalURL)) + cursor.execute("use %s;UPDATE tblconfiguration SET value='%s' WHERE setting='Domain';" % (dbName, finalURL)) + cursor.execute("use %s;UPDATE tblconfiguration SET value='%s' WHERE setting='SystemSSLURL';" % (dbName, finalURL)) + + conn.close() + except BaseException as msg: + logging.writeToFile(str(msg)) + + + + # Secure WHMCS configuration.php file : https://docs.whmcs.com/Further_Security_Steps#Secure_the_configuration.php_File + command = "chmod 400 %s/configuration.php" % (finalPath + ProcessUtilities.executioner(command) + + ## + + from filemanager.filemanager import FileManager + + fm = FileManager(None, None) + fm.fixPermissions(self.masterDomain) + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines("Successfully Installed. [200]") + statusFile.close() + return 0 + + + except BaseException as msg: + # remove the downloaded files + + homeDir = "/home/" + domainName + "/public_html" + + if ProcessUtilities.decideDistro() == ProcessUtilities.centos or ProcessUtilities.decideDistro() == ProcessUtilities.cent8: + groupName = 'nobody' + else: + groupName = 'nogroup' + + if not os.path.exists(homeDir): + command = "chown -R " + externalApp + ":" + groupName + " " + homeDir + ProcessUtilities.executioner(command, externalApp) + + try: + mysqlUtilities.deleteDatabase(dbName, dbUser) + db = Databases.objects.get(dbName=dbName) + db.delete() + except: + pass + + command = 'chmod 750 %s' % (self.permPath) + ProcessUtilities.executioner(command) + + statusFile = open(self.tempStatusPath, 'w') + statusFile.writelines(str(msg) + " [404]") + statusFile.close() + return 0 def main(): parser = argparse.ArgumentParser(description='CyberPanel Application Installer') From ce904105445e9eb586fa9f450777b4b6507d13e9 Mon Sep 17 00:00:00 2001 From: WhatTheServer Date: Wed, 13 Jan 2021 09:22:55 -0500 Subject: [PATCH 030/107] Update applicationInstaller.py fix missing ) --- plogical/applicationInstaller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index 207671c52..dd068d90c 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -1525,7 +1525,7 @@ $parameters = array( # Secure WHMCS configuration.php file : https://docs.whmcs.com/Further_Security_Steps#Secure_the_configuration.php_File - command = "chmod 400 %s/configuration.php" % (finalPath + command = "chmod 400 %s/configuration.php" % (finalPath) ProcessUtilities.executioner(command) ## From 35669bb95635437d2fd83502df66b324c078c315 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 18 Jan 2021 00:38:01 +0500 Subject: [PATCH 031/107] bug fix: dont start pdns if service disabled --- plogical/IncScheduler.py | 1 - plogical/dnsUtilities.py | 33 +++++++++++++++++++++++++-------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/plogical/IncScheduler.py b/plogical/IncScheduler.py index f24a0d13e..5c0deb954 100644 --- a/plogical/IncScheduler.py +++ b/plogical/IncScheduler.py @@ -335,7 +335,6 @@ class IncScheduler(): message='Backup for %s successfully sent to Google Drive.' % (website.domain)).save() os.remove(completeFileToSend) - except BaseException as msg: GDriveJobLogs(owner=items, status=backupSchedule.ERROR, message='[Site] Site backup failed, Error message: %s.' % (str(msg))).save() diff --git a/plogical/dnsUtilities.py b/plogical/dnsUtilities.py index 417860b05..4120740c5 100755 --- a/plogical/dnsUtilities.py +++ b/plogical/dnsUtilities.py @@ -637,8 +637,12 @@ class DNS: record.save() if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20: - command = 'sudo systemctl restart pdns' - ProcessUtilities.executioner(command) + command = 'ls -la /etc/systemd/system/multi-user.target.wants/pdns.service' + result = ProcessUtilities.outputExecutioner(command) + + if result.find('No such file') == -1: + command = 'sudo systemctl restart pdns' + ProcessUtilities.executioner(command) return @@ -656,8 +660,12 @@ class DNS: record.save() if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20: - command = 'sudo systemctl restart pdns' - ProcessUtilities.executioner(command) + command = 'ls -la /etc/systemd/system/multi-user.target.wants/pdns.service' + result = ProcessUtilities.outputExecutioner(command) + + if result.find('No such file') == -1: + command = 'sudo systemctl restart pdns' + ProcessUtilities.executioner(command) return if type == 'MX': @@ -673,8 +681,12 @@ class DNS: record.save() if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20: - command = 'sudo systemctl restart pdns' - ProcessUtilities.executioner(command) + command = 'ls -la /etc/systemd/system/multi-user.target.wants/pdns.service' + result = ProcessUtilities.outputExecutioner(command) + + if result.find('No such file') == -1: + command = 'sudo systemctl restart pdns' + ProcessUtilities.executioner(command) return if Records.objects.filter(name=name, type=type).count() == 0: @@ -689,8 +701,13 @@ class DNS: auth=1) record.save() if ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu or ProcessUtilities.decideDistro() == ProcessUtilities.ubuntu20: - command = 'sudo systemctl restart pdns' - ProcessUtilities.executioner(command) + + command = 'ls -la /etc/systemd/system/multi-user.target.wants/pdns.service' + result = ProcessUtilities.outputExecutioner(command) + + if result.find('No such file') == -1: + command = 'sudo systemctl restart pdns' + ProcessUtilities.executioner(command) ## Add Record to CF if SYNC Enabled From 32d0d4af3a794e8d112ab11f4c8986321f0d67c9 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 18 Jan 2021 11:14:52 +0500 Subject: [PATCH 032/107] add config value --- plogical/upgrade.py | 5 +++++ websiteFunctions/models.py | 1 + 2 files changed, 6 insertions(+) diff --git a/plogical/upgrade.py b/plogical/upgrade.py index ed209b651..3fa7f11e1 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -635,6 +635,11 @@ imap_folder_list_limit = 0 except: pass + try: + cursor.execute('ALTER TABLE websiteFunctions_websites ADD config longtext') + except: + pass + try: cursor.execute("ALTER TABLE websiteFunctions_websites MODIFY externalApp varchar(30)") except: diff --git a/websiteFunctions/models.py b/websiteFunctions/models.py index 26f74956f..7dd151336 100755 --- a/websiteFunctions/models.py +++ b/websiteFunctions/models.py @@ -17,6 +17,7 @@ class Websites(models.Model): ssl = models.IntegerField() state = models.IntegerField(default=1) externalApp = models.CharField(max_length=30, default=None) + config = models.TextField() class ChildDomains(models.Model): master = models.ForeignKey(Websites,on_delete=models.CASCADE) From 116d3e5f9d489a7784900751dc283775cb68f1ef Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 18 Jan 2021 12:09:15 +0500 Subject: [PATCH 033/107] add config value --- websiteFunctions/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/websiteFunctions/models.py b/websiteFunctions/models.py index 7dd151336..e6a705e98 100755 --- a/websiteFunctions/models.py +++ b/websiteFunctions/models.py @@ -17,7 +17,7 @@ class Websites(models.Model): ssl = models.IntegerField() state = models.IntegerField(default=1) externalApp = models.CharField(max_length=30, default=None) - config = models.TextField() + config = models.TextField(default='') class ChildDomains(models.Model): master = models.ForeignKey(Websites,on_delete=models.CASCADE) From dd1c8b23514f3a0cb621b1a0cd36c0cc3907b552 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 18 Jan 2021 14:01:26 +0500 Subject: [PATCH 034/107] fix: disk/bw usage to calculate every 12 hour --- cloudAPI/cloudManager.py | 40 +++++----------- plogical/IncScheduler.py | 22 +++++++++ plogical/vhost.py | 7 +++ plogical/virtualHostUtilities.py | 21 ++++++++- userManagment/views.py | 9 ++-- websiteFunctions/website.py | 81 ++++++++++---------------------- 6 files changed, 89 insertions(+), 91 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index 5571d016b..4c54173e4 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -123,6 +123,7 @@ class CloudManager: def fetchWebsiteData(self): try: + currentACL = ACLManager.loadedACL(self.admin.pk) website = Websites.objects.get(domain=self.data['domainName']) admin = Administrator.objects.get(pk=self.admin.pk) @@ -140,39 +141,22 @@ class CloudManager: Data['dbUsed'] = website.databases_set.all().count() Data['dbAllowed'] = website.package.dataBases - diskUsageDetails = virtualHostUtilities.getDiskUsage("/home/" + self.data['domainName'], - website.package.diskSpace) - - ## bw usage calculation - - try: - execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " findDomainBW --virtualHostName " + self.data[ - 'domainName'] + " --bandwidth " + str( - website.package.bandwidth) - - output = ProcessUtilities.outputExecutioner(execPath) - bwData = output.split(",") - except BaseException: - bwData = [0, 0] + DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(website) ## bw usage calculations - Data['bwAllowed'] = website.package.bandwidth - Data['bwUsed'] = bwData[0] - Data['bwUsage'] = bwData[1] + Data['bwInMBTotal'] = website.package.bandwidth + Data['bwInMB'] = bwInMB + Data['bwUsage'] = bwUsage - if diskUsageDetails != None: - if diskUsageDetails[1] > 100: - diskUsageDetails[1] = 100 + if DiskUsagePercentage > 100: + DiskUsagePercentage = 100 - Data['diskUsage'] = diskUsageDetails[1] - Data['diskUsed'] = diskUsageDetails[0] - Data['diskAllowed'] = website.package.diskSpace - else: - Data['diskUsed'] = 0 - Data['diskUsage'] = 0 - Data['diskInMBTotal'] = website.package.diskSpace + Data['diskUsage'] = DiskUsagePercentage + Data['diskInMB'] = DiskUsage + Data['diskInMBTotal'] = website.package.diskSpace + + ## Data['status'] = 1 final_json = json.dumps(Data) diff --git a/plogical/IncScheduler.py b/plogical/IncScheduler.py index 5c0deb954..703d47051 100644 --- a/plogical/IncScheduler.py +++ b/plogical/IncScheduler.py @@ -731,6 +731,27 @@ Automatic backup failed for %s on %s. except BaseException as msg: logging.writeToFile(str(msg) + ' [S3Backups.runAWSBackups]') + @staticmethod + def CalculateAndUpdateDiskUsage(): + for website in Websites.objects.all(): + try: + try: + config = json.loads(website.config) + except: + config = {} + + config['DiskUsage'], config['DiskUsagePercentage'] = virtualHostUtilities.getDiskUsage("/home/" + website.domain, website.package.diskSpace) + + ## Calculate bw usage + + from plogical.vhost import vhost + config['bwInMB'], config['bwUsage'] = vhost.findDomainBW(website.domain, int(website.package.bandwidth)) + + website.config = json.dumps(config) + website.save() + + except BaseException as msg: + logging.writeToFile('%s. [CalculateAndUpdateDiskUsage:753]' % (str(msg))) def main(): @@ -744,6 +765,7 @@ def main(): IncScheduler.forceRunAWSBackup(args.planName) return 0 + IncScheduler.CalculateAndUpdateDiskUsage() IncScheduler.startBackup(args.function) IncScheduler.runGoogleDriveBackups(args.function) IncScheduler.git(args.function) diff --git a/plogical/vhost.py b/plogical/vhost.py index 5e6b3b24c..78f39b980 100755 --- a/plogical/vhost.py +++ b/plogical/vhost.py @@ -721,11 +721,13 @@ class vhost: if not os.path.exists("/home/" + domainName + "/logs"): print("0,0") + return 0,0 bwmeta = "/home/" + domainName + "/logs/bwmeta" if not os.path.exists(path): print("0,0") + return 0, 0 if os.path.exists(bwmeta): try: @@ -741,19 +743,24 @@ class vhost: percentage = float(percentage) * float(inMB) except: print("0,0") + return 0, 0 if percentage > 100.0: percentage = 100 print(str(inMB) + "," + str(percentage)) + return str(inMB), str(percentage) else: print("0,0") + return 0, 0 except OSError as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [findDomainBW]") print("0,0") + return 0, 0 except ValueError as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [findDomainBW]") print("0,0") + return 0, 0 @staticmethod def permissionControl(path): diff --git a/plogical/virtualHostUtilities.py b/plogical/virtualHostUtilities.py index 09d28eb9c..cd875c093 100755 --- a/plogical/virtualHostUtilities.py +++ b/plogical/virtualHostUtilities.py @@ -1308,8 +1308,7 @@ class virtualHostUtilities: def getDiskUsage(path, totalAllowed): try: - totalUsageInMB = ProcessUtilities.outputExecutioner(["sudo", "du", "-hs", path, "--block-size=1M"]).split()[ - 0] + totalUsageInMB = subprocess.check_output('du -hs %s --block-size=1M' % (path), shell=True).decode("utf-8").split()[0] percentage = float(100) / float(totalAllowed) @@ -1347,6 +1346,24 @@ class virtualHostUtilities: except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) + @staticmethod + def FindStats(website): + + import json + try: + config = json.loads(website.config) + DiskUsage = config['DiskUsage'] + DiskUsagePercentage = config['DiskUsagePercentage'] + bwInMB = config['bwInMB'] + bwUsage = config['bwUsage'] + except: + DiskUsage = 0 + DiskUsagePercentage = 0 + bwInMB = 0 + bwUsage = 0 + + return DiskUsage, DiskUsagePercentage, bwInMB, bwUsage + def main(): parser = argparse.ArgumentParser(description='CyberPanel Installer') diff --git a/userManagment/views.py b/userManagment/views.py index 3c5b8c56a..0a9100e2f 100755 --- a/userManagment/views.py +++ b/userManagment/views.py @@ -1035,11 +1035,12 @@ def fetchTableUsers(request): for items in users: - diskUsage = 0 + diskUsageCurrent = 0 for webs in items.websites_set.all(): - #diskUsage = virtualHostUtilities.getDiskUsage("/home/" + webs.domain, webs.package.diskSpace)[0] + diskUsage - diskUsage = 1 + DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(webs) + diskUsageCurrent = DiskUsage + diskUsageCurrent + owner = Administrator.objects.get(pk=items.owner) @@ -1047,7 +1048,7 @@ def fetchTableUsers(request): 'name': items.userName, 'owner': owner.userName, 'acl': items.acl.name, - 'diskUsage': '%sMB' % str(diskUsage), + 'diskUsage': '%sMB' % str(diskUsageCurrent), 'websites': items.initWebsitesLimit, 'state': items.state } diff --git a/websiteFunctions/website.py b/websiteFunctions/website.py index f05eb7219..1f0720c27 100755 --- a/websiteFunctions/website.py +++ b/websiteFunctions/website.py @@ -452,9 +452,9 @@ class WebsiteManager: else: state = "Active" - #diskUsed = "%sMB" % str(virtualHostUtilities.getDiskUsage("/home/" + items.domain, items.package.diskSpace)[0]) + DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(items) + diskUsed = "%sMB" % str(DiskUsage) - diskUsed = '1MB' ## to be fixed later dic = {'domain': items.domain, 'adminEmail': items.adminEmail, 'ipAddress': ipAddress, 'admin': items.admin.userName, 'package': items.package.packageName, 'state': state, 'diskUsed': diskUsed} @@ -830,38 +830,20 @@ class WebsiteManager: Data['domain'] = self.domain - diskUsageDetails = virtualHostUtilities.getDiskUsage("/home/" + self.domain, website.package.diskSpace) - - ## bw usage calculation - - try: - execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " findDomainBW --virtualHostName " + self.domain + " --bandwidth " + str( - website.package.bandwidth) - - output = ProcessUtilities.outputExecutioner(execPath) - bwData = output.split(",") - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - bwData = [0, 0] + DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(website) ## bw usage calculations Data['bwInMBTotal'] = website.package.bandwidth - Data['bwInMB'] = bwData[0] - Data['bwUsage'] = bwData[1] + Data['bwInMB'] = bwInMB + Data['bwUsage'] = bwUsage - if diskUsageDetails != None: - if diskUsageDetails[1] > 100: - diskUsageDetails[1] = 100 + if DiskUsagePercentage > 100: + DiskUsagePercentage = 100 - Data['diskUsage'] = diskUsageDetails[1] - Data['diskInMB'] = diskUsageDetails[0] - Data['diskInMBTotal'] = website.package.diskSpace - else: - Data['diskUsage'] = 0 - Data['diskInMB'] = 0 - Data['diskInMBTotal'] = website.package.diskSpace + Data['diskUsage'] = DiskUsagePercentage + Data['diskInMB'] = DiskUsage + Data['diskInMBTotal'] = website.package.diskSpace Data['phps'] = PHPManager.findPHPVersions() @@ -932,38 +914,20 @@ class WebsiteManager: Data['domain'] = self.domain Data['childDomain'] = self.childDomain - diskUsageDetails = virtualHostUtilities.getDiskUsage("/home/" + self.domain, website.package.diskSpace) - - ## bw usage calculation - - try: - execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " findDomainBW --virtualHostName " + self.domain + " --bandwidth " + str( - website.package.bandwidth) - - output = ProcessUtilities.outputExecutioner(execPath) - bwData = output.split(",") - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - bwData = [0, 0] + DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(website) ## bw usage calculations Data['bwInMBTotal'] = website.package.bandwidth - Data['bwInMB'] = bwData[0] - Data['bwUsage'] = bwData[1] + Data['bwInMB'] = bwInMB + Data['bwUsage'] = bwUsage - if diskUsageDetails != None: - if diskUsageDetails[1] > 100: - diskUsageDetails[1] = 100 + if DiskUsagePercentage > 100: + DiskUsagePercentage = 100 - Data['diskUsage'] = diskUsageDetails[1] - Data['diskInMB'] = diskUsageDetails[0] - Data['diskInMBTotal'] = website.package.diskSpace - else: - Data['diskUsage'] = 0 - Data['diskInMB'] = 0 - Data['diskInMBTotal'] = website.package.diskSpace + Data['diskUsage'] = DiskUsagePercentage + Data['diskInMB'] = DiskUsage + Data['diskInMBTotal'] = website.package.diskSpace Data['phps'] = PHPManager.findPHPVersions() @@ -2393,8 +2357,9 @@ StrictHostKeyChecking no else: state = "Active" - diskUsed = "%sMB" % str( - virtualHostUtilities.getDiskUsage("/home/" + items.domain, items.package.diskSpace)[0]) + DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(items) + + diskUsed = "%sMB" % str(DiskUsage) dic = {'domain': items.domain, 'adminEmail': items.adminEmail, 'ipAddress': ipAddress, 'admin': items.admin.userName, 'package': items.package.packageName, 'state': state, 'diskUsed': diskUsed} @@ -2431,7 +2396,9 @@ StrictHostKeyChecking no else: state = "Active" - diskUsed = "%sMB" % str(virtualHostUtilities.getDiskUsage("/home/" + items.domain, items.package.diskSpace)[0]) + DiskUsage, DiskUsagePercentage, bwInMB, bwUsage = virtualHostUtilities.FindStats(items) + + diskUsed = "%sMB" % str(DiskUsage) dic = {'domain': items.domain, 'adminEmail': items.adminEmail, 'ipAddress': ipAddress, 'admin': items.admin.userName, 'package': items.package.packageName, 'state': state, 'diskUsed': diskUsed} From 43c605c405b3231e9311f2604dc9b862fa490020 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 18 Jan 2021 14:34:33 +0500 Subject: [PATCH 035/107] bug fix: https://github.com/usmannasir/cyberpanel/issues/514 --- filemanager/filemanager.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/filemanager/filemanager.py b/filemanager/filemanager.py index 570d83854..9a6cc3046 100755 --- a/filemanager/filemanager.py +++ b/filemanager/filemanager.py @@ -546,12 +546,18 @@ class FileManager: if self.data['fileName'].find(self.data['home']) == -1 or self.data['fileName'].find('..') > -1: return self.ajaxPre(0, 'Not allowed to move in this path, please choose location inside home!') + command = 'stat -c "%%a" %s' % (self.returnPathEnclosed(self.data['fileName'])) + currentMode = ProcessUtilities.outputExecutioner(command).strip('\n') + command = 'mv ' + tempPath + ' ' + self.returnPathEnclosed(self.data['fileName']) ProcessUtilities.executioner(command) command = 'chown %s:%s %s' % (website.externalApp, website.externalApp, self.data['fileName']) ProcessUtilities.executioner(command) + command = 'chmod %s %s' % (currentMode, self.returnPathEnclosed(self.data['fileName'])) + ProcessUtilities.executioner(command) + self.changeOwner(self.data['fileName']) json_data = json.dumps(finalData) From 931ab008091f8e55ecfe74ee610a2e3094c6dd3d Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 19 Jan 2021 15:24:51 +0500 Subject: [PATCH 036/107] add progress to install --- cyberpanel.sh | 11 ++++++++++- install/install.py | 4 ++-- install/installCyberPanel.py | 3 +++ install/installLog.py | 12 +++++++++++- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/cyberpanel.sh b/cyberpanel.sh index a8bbe272c..1c22dbcf8 100644 --- a/cyberpanel.sh +++ b/cyberpanel.sh @@ -40,6 +40,7 @@ VIRT_TYPE="" MASTER_GIT_URL="github.com/usmannasir/cyberpanel" set_git_repos_and_branch() { + echo 'Setting up Branches,1' >/var/log/installLogs.txt local GIT_DIR local GIT_USER local GIT_REPO @@ -66,6 +67,7 @@ set_git_repos_and_branch() { printf "Github Content URL: %s\n" "$GIT_CONTENT_URL" printf "Github Branch: %s\n" "$BRANCH_NAME" printf "~~~~~~~~~~\n" + echo 'Setting up Branches,1' >/var/log/installLogs.txt } disable_repos() { @@ -404,7 +406,7 @@ root hard nproc 65535" >>/etc/security/limits.conf } install_required() { - + echo 'Installing necessary components..,3' >/var/log/installLogs.txt if [[ -d /etc/yum.repos.d ]]; then yum clean all @@ -504,6 +506,7 @@ EOF check_return fi + echo 'Necessary components installed,5' >/var/log/installLogs.txt } memcached_installation() { @@ -1250,6 +1253,7 @@ EOF } after_install() { + echo 'Finalization..,80' >>/var/log/installLogs.txt if [ ! -d "/var/lib/php" ]; then mkdir /var/lib/php fi @@ -1524,6 +1528,7 @@ options edns0" /etc/resolv.conf echo "something went wrong..." exit fi + } argument_mode() { @@ -1669,6 +1674,8 @@ initialize() { else DOWNLOAD_SERVER="cdn.cyberpanel.sh" fi + + echo 'Initialization completed..,2' >/var/log/installLogs.txt } begin_install() { @@ -1695,3 +1702,5 @@ begin_install() { } begin_install "$@" + +echo 'Completed [200]' >>/var/log/installLogs.txt \ No newline at end of file diff --git a/install/install.py b/install/install.py index fe9c43845..f973a5dd8 100755 --- a/install/install.py +++ b/install/install.py @@ -2157,7 +2157,7 @@ def main(): parser.add_argument('--mysqlport', help='MySQL port if remote is chosen.') args = parser.parse_args() - logging.InstallLog.writeToFile("Starting CyberPanel installation..") + logging.InstallLog.writeToFile("Starting CyberPanel installation..,10") preFlightsChecks.stdOut("Starting CyberPanel installation..") if args.ent == None: @@ -2348,7 +2348,7 @@ echo $oConfig->Save() ? 'Done' : 'Error'; except: pass - logging.InstallLog.writeToFile("CyberPanel installation successfully completed!") + logging.InstallLog.writeToFile("CyberPanel installation successfully completed!,80") if __name__ == "__main__": diff --git a/install/installCyberPanel.py b/install/installCyberPanel.py index d526db048..baeed20d7 100755 --- a/install/installCyberPanel.py +++ b/install/installCyberPanel.py @@ -656,13 +656,16 @@ def Main(cwd, mysql, distro, ent, serial = None, port = "8090", ftp = None, dns installer = InstallCyberPanel("/usr/local/lsws/",cwd, distro, ent, serial, port, ftp, dns, publicip, remotemysql, mysqlhost, mysqldb, mysqluser, mysqlpassword, mysqlport) + logging.InstallLog.writeToFile('Installing LiteSpeed Web server,40') installer.installLiteSpeed() if ent == 0: installer.changePortTo80() + logging.InstallLog.writeToFile('Installing Optimized PHPs..,50') installer.installAllPHPVersions() if ent == 0: installer.fix_ols_configs() + logging.InstallLog.writeToFile('Installing MySQL,60') installer.installMySQL(mysql) installer.changeMYSQLRootPassword() diff --git a/install/installLog.py b/install/installLog.py index 6aa1b7254..eef104cbf 100755 --- a/install/installLog.py +++ b/install/installLog.py @@ -3,9 +3,19 @@ import time class InstallLog: fileName = "/var/log/installLogs.txt" + currentPercent = '10' + @staticmethod def writeToFile(message): + + if message.find(',') == -1: + message = '%s,%s' % (message, InstallLog.currentPercent) + elif message.find('mount -o') > -1 or message.find('usermod -G lscpd,') > -1: + message = '%s,%s' % (message.replace(',', '-'), InstallLog.currentPercent) + else: + InstallLog.currentPercent = message.split(',')[1] + file = open(InstallLog.fileName,'a') file.writelines("[" + time.strftime( - "%m.%d.%Y_%H-%M-%S") + "] "+message + "\n") + "%m.%d.%Y_%H-%M-%S") + "] " + message + "\n") file.close() From 0903ee015fa898ef453ca4f64564964401555a57 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 19 Jan 2021 15:27:04 +0500 Subject: [PATCH 037/107] add progress to install --- install/installLog.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/install/installLog.py b/install/installLog.py index eef104cbf..2c2b8db39 100755 --- a/install/installLog.py +++ b/install/installLog.py @@ -13,7 +13,10 @@ class InstallLog: elif message.find('mount -o') > -1 or message.find('usermod -G lscpd,') > -1: message = '%s,%s' % (message.replace(',', '-'), InstallLog.currentPercent) else: - InstallLog.currentPercent = message.split(',')[1] + try: + InstallLog.currentPercent = message.split(',')[1] + except: + pass file = open(InstallLog.fileName,'a') file.writelines("[" + time.strftime( From 5a67a30ac71b32d88dcb666842bdfd6b072b20d7 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 20 Jan 2021 00:15:59 +0500 Subject: [PATCH 038/107] add progress to install --- cyberpanel.sh | 2 +- plogical/adminPass.py | 66 ++++++++++++++++++++++++++----------------- 2 files changed, 41 insertions(+), 27 deletions(-) diff --git a/cyberpanel.sh b/cyberpanel.sh index 1c22dbcf8..a8dcb845c 100644 --- a/cyberpanel.sh +++ b/cyberpanel.sh @@ -506,7 +506,7 @@ EOF check_return fi - echo 'Necessary components installed,5' >/var/log/installLogs.txt + echo 'Necessary components installed..,5' >/var/log/installLogs.txt } memcached_installation() { diff --git a/plogical/adminPass.py b/plogical/adminPass.py index bf32680c0..446e6329f 100755 --- a/plogical/adminPass.py +++ b/plogical/adminPass.py @@ -22,39 +22,53 @@ def main(): parser = argparse.ArgumentParser(description='Reset admin user password!') parser.add_argument('--password', help='New Password') + parser.add_argument('--api', help='Enable/Disable API') args = parser.parse_args() - adminPass = args.password + if args.api != None: + if args.api == '1': + admin = Administrator.objects.get(userName="admin") + admin.api = 1 + admin.save() + print("API Enabled.") + else: + admin = Administrator.objects.get(userName="admin") + admin.api = 0 + admin.save() + print("API Disabled.") + else: - numberOfAdministrator = Administrator.objects.count() - if numberOfAdministrator == 0: - ACLManager.createDefaultACLs() - acl = ACL.objects.get(name='admin') - token = hashPassword.generateToken('admin', '1234567') + adminPass = args.password - email = 'usman@cyberpersons.com' - admin = Administrator(userName="admin", password=hashPassword.hash_password(adminPass), type=1, email=email, - firstName="Cyber", lastName="Panel", acl=acl, token=token) + numberOfAdministrator = Administrator.objects.count() + if numberOfAdministrator == 0: + ACLManager.createDefaultACLs() + acl = ACL.objects.get(name='admin') + token = hashPassword.generateToken('admin', '1234567') + + email = 'usman@cyberpersons.com' + admin = Administrator(userName="admin", password=hashPassword.hash_password(adminPass), type=1, email=email, + firstName="Cyber", lastName="Panel", acl=acl, token=token) + admin.save() + + vers = version(currentVersion=VERSION, build=BUILD) + vers.save() + + package = Package(admin=admin, packageName="Default", diskSpace=1000, + bandwidth=1000, ftpAccounts=1000, dataBases=1000, + emailAccounts=1000, allowedDomains=20) + package.save() + + print("Admin password successfully changed!") + return 1 + + token = hashPassword.generateToken('admin', adminPass) + admin = Administrator.objects.get(userName="admin") + admin.password = hashPassword.hash_password(adminPass) + admin.token = token admin.save() - vers = version(currentVersion=VERSION, build=BUILD) - vers.save() - - package = Package(admin=admin, packageName="Default", diskSpace=1000, - bandwidth=1000, ftpAccounts=1000, dataBases=1000, - emailAccounts=1000, allowedDomains=20) - package.save() - print("Admin password successfully changed!") - return 1 - - token = hashPassword.generateToken('admin', adminPass) - admin = Administrator.objects.get(userName="admin") - admin.password = hashPassword.hash_password(adminPass) - admin.token = token - admin.save() - - print("Admin password successfully changed!") if __name__ == "__main__": main() From 815eef074092963c1d29a54a6a851b38d2ba8b66 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 20 Jan 2021 00:37:46 +0500 Subject: [PATCH 039/107] add progress to install --- cyberpanel.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cyberpanel.sh b/cyberpanel.sh index a8dcb845c..a8f08b932 100644 --- a/cyberpanel.sh +++ b/cyberpanel.sh @@ -57,6 +57,12 @@ set_git_repos_and_branch() { printf "Found custom provided branch...\n" fi + ### To be removed when branch is merged + + BRANCH_NAME="v2.0.4-dev" + + ### + GIT_DIR=$(dirname "$GIT_URL") GIT_USER=$(basename "$GIT_DIR") GIT_REPO=$(basename "$GIT_URL") From b5b0eb7f9706994825ce84b37dd03173e8b1b608 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 22 Jan 2021 18:26:17 +0500 Subject: [PATCH 040/107] add progress to install --- install/cyberso.pub | 1 + 1 file changed, 1 insertion(+) create mode 100644 install/cyberso.pub diff --git a/install/cyberso.pub b/install/cyberso.pub new file mode 100644 index 000000000..f87da8339 --- /dev/null +++ b/install/cyberso.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3txFD2sk0fG9MX4l8vpvXYn8ymRN8107PCYywxvwIVN2KnWcPvsKreOajdJr6wj07jqXpviolQdkCM+qPRodHmTX5gpRz0GQobik1S1bihc2wTC4CA9WWAolXxBxnUO5FnMJMoB3tWmg+1tpJZnr+ZATFHjCbmTH+Ra5KO/bROt/gYoiiZvEAzLJNrLYOKBZ9Ik6/GBWFLALosjM8wFK6LQrrOzeNSOK7+aActliF0RjssHwi/65H0Hv172GsIecWvWTnOXrkhi134OtQmbSRtnVAMtjaPsWGO1PEJZya2iRa41fslolH2iQV9Bwe5m0pclceE14UV0cEvO7CqavF cyberso@ip-172-26-3-119.eu-west-2.compute.internal \ No newline at end of file From 831c53757f450731439487749a6ca6813a02f33f Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 25 Jan 2021 19:30:06 +0500 Subject: [PATCH 041/107] add better error checking --- cyberpanel.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cyberpanel.sh b/cyberpanel.sh index a8f08b932..90eed2722 100644 --- a/cyberpanel.sh +++ b/cyberpanel.sh @@ -96,6 +96,7 @@ check_return() { : else echo -e "\ncommand failed, exiting..." + echo 'command failed, exiting. For more information read /var/log/installLogs.txt [404]' >>/var/log/installLogs.txt exit fi } @@ -182,6 +183,7 @@ check_virtualization() { echo -e "\nLXC detected..." echo -e "CyberPanel does not support LXC" echo -e "Exiting..." + echo 'CyberPanel does not support LXC.. [404]' >>/var/log/installLogs.txt exit fi @@ -218,6 +220,7 @@ license_validation() { if [[ $LICENSE_KEY == "TRIAL" ]]; then if ./lshttpd -V |& grep "ERROR"; then echo -e "\n\nIt apeears to have some issue with license , please check above result..." + echo 'It appears to have some issue with LiteSpeed License, make sure you are using correct serial key. [404]' >>/var/log/installLogs.txt exit fi LICENSE_KEY="1111-2222-3333-4444" @@ -225,6 +228,7 @@ license_validation() { if ./lshttpd -r |& grep "ERROR"; then ./lshttpd -r echo -e "\n\nIt apeears to have some issue with license , please check above result..." + echo 'It appears to have some issue with LiteSpeed License, make sure you are using correct serial key. [404]' >>/var/log/installLogs.txt exit fi fi @@ -668,6 +672,7 @@ check_OS() { SERVER_OS="Ubuntu" else echo -e "\nUbuntu 18.04 x32 detected...ths only works on x64 system." + echo 'Ubuntu 18.04 x32 detected...ths only works on x64 system. [404]' >>/var/log/installLogs.txt exit fi elif echo $OUTPUT | grep -q "Ubuntu 20.04"; then @@ -677,12 +682,14 @@ check_OS() { UBUNTU_20="True" else echo -e "\nUbuntu 20 x32 detected...ths only works on x64 system." + echo 'Ubuntu 20 x32 detected...ths only works on x64 system. [404]' >>/var/log/installLogs.txt exit fi else cat /etc/*release echo -e "\nUnable to detect your OS...\n" echo -e "\nCyberPanel is supported on Ubuntu 18.04 x86_64, Ubuntu 20.04 x86_64, CentOS 7.x, CentOS 8.x and CloudLinux 7.x...\n" + echo 'CyberPanel is supported on Ubuntu 18.04 x86_64, Ubuntu 20.04 x86_64, CentOS 7.x, CentOS 8.x and CloudLinux 7.x... [404]' >>/var/log/installLogs.txt exit 1 fi @@ -709,10 +716,12 @@ check_root() { check_panel() { if [ -d /usr/local/cpanel ]; then echo -e "\ncPanel detected...exit...\n" + echo 'cPanel detected...exit... [404]' >>/var/log/installLogs.txt exit 1 fi if [ -d /opt/plesk ]; then echo -e "\nPlesk detected...exit...\n" + echo 'Plesk detected...exit... [404]' >>/var/log/installLogs.txt exit 1 fi } @@ -1120,6 +1129,7 @@ main_install() { if [[ -e /usr/local/CyberCP ]]; then echo -e "\n CyberPanel already installed, exiting..." + echo 'CyberPanel already installed, exiting... [404]' >>/var/log/installLogs.txt exit fi @@ -1166,6 +1176,7 @@ main_install() { echo -e "\nCyberPanel installation sucessfully completed..." else echo -e "Oops, something went wrong..." + echo 'Oops, something went wrong... [404]' >>/var/log/installLogs.txt exit fi @@ -1275,6 +1286,7 @@ after_install() { ./install.sh echo -e "\n\n\nIt seems LiteSpeed Enterprise has failed to install, please check your license key is valid" echo -e "\nIf this license key has been used before, you may need to go to store to release it first." + echo 'It seems LiteSpeed Enterprise has failed to install, please check your license key is valid. If this license key has been used before, you may need to go to store to release it first. [404]' >>/var/log/installLogs.txt exit fi @@ -1532,6 +1544,8 @@ options edns0" /etc/resolv.conf else echo "something went wrong..." + echo 'something went wrong... [404]' >>/var/log/installLogs.txt + exit fi From 67f57bc957225c005a7697a9a7e87bdf4cf4608f Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 26 Jan 2021 22:55:01 +0500 Subject: [PATCH 042/107] add better error checking --- cyberpanel.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cyberpanel.sh b/cyberpanel.sh index 90eed2722..1317c06c0 100644 --- a/cyberpanel.sh +++ b/cyberpanel.sh @@ -498,7 +498,7 @@ EOF if [[ $SERVER_OS == "Ubuntu" ]]; then apt update -y - DEBIAN_FRONTEND=noninteractive apt upgrade -y + #DEBIAN_FRONTEND=noninteractive apt upgrade -y DEBIAN_FRONTEND=noninteracitve apt install -y htop telnet libcurl4-gnutls-dev libgnutls28-dev libgcrypt20-dev libattr1 libattr1-dev liblzma-dev libgpgme-dev libmariadbclient-dev libcurl4-gnutls-dev libssl-dev nghttp2 libnghttp2-dev idn2 libidn2-dev libidn2-0-dev librtmp-dev libpsl-dev nettle-dev libgnutls28-dev libldap2-dev libgssapi-krb5-2 libk5crypto3 libkrb5-dev libcomerr2 libldap2-dev virtualenv git socat vim unzip zip check_return From b67d25f104413c4228f759069a8f6cc227a497c9 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 28 Jan 2021 14:43:55 +0500 Subject: [PATCH 043/107] improve wp staging --- websiteFunctions/StagingSetup.py | 210 +++++++++---------------------- 1 file changed, 62 insertions(+), 148 deletions(-) diff --git a/websiteFunctions/StagingSetup.py b/websiteFunctions/StagingSetup.py index 9fe1c74b4..2518104ed 100644 --- a/websiteFunctions/StagingSetup.py +++ b/websiteFunctions/StagingSetup.py @@ -37,16 +37,28 @@ class StagingSetup(multi.Thread): website = Websites.objects.get(domain=masterDomain) masterPath = '/home/%s/public_html' % (masterDomain) + configPath = '%s/wp-config.php' % (masterPath) + + ## Check if WP Detected on Main Site + + command = 'ls -la %s' % (configPath) + output = ProcessUtilities.outputExecutioner(command) + + if output.find('No such file or') > -1: + logging.statusWriter(tempStatusPath, 'WordPress is not detected. [404]') + return 0 + + ## command = 'chmod 755 %s' % (masterPath) ProcessUtilities.executioner(command) ## Creating Child Domain - path = "/home/" + masterDomain + "/public_html/" + domain + path = "/home/" + masterDomain + "/" + domain logging.statusWriter(tempStatusPath, 'Creating domain for staging environment..,5') - phpSelection = 'PHP 7.2' + phpSelection = website.phpSelection execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" execPath = execPath + " createDomain --masterDomain " + masterDomain + " --virtualHostName " + domain + \ @@ -67,127 +79,48 @@ class StagingSetup(multi.Thread): logging.statusWriter(tempStatusPath, 'Domain successfully created..,15') - ## Copying Data + ## Creating WP Site and setting Database - ## Fetch child domain path - - childDomainPaths = [] - - for childs in website.childdomains_set.all(): - childDomainPaths.append(childs.path) - - filesAndFolder = os.listdir(masterPath) - - for items in filesAndFolder: - completePath = '%s/%s' % (masterPath, items) - - if completePath in childDomainPaths: - continue - else: - command = 'cp -r %s %s/' % (completePath, path) - ProcessUtilities.executioner(command, website.externalApp) - - foldersToBeRemoved = ['%s/.git' % (path), '%s/wp-content/backups' % (path), '%s/wp-content/updraft' % (path), '%s/wp-content/cache' % (path), '%s/wp-content/plugins/litespeed-cache' % (path)] - - for rmv in foldersToBeRemoved: - command = 'rm -rf %s' % (rmv) - ProcessUtilities.executioner(command, website.externalApp) - - - logging.statusWriter(tempStatusPath, 'Data copied..,50') - - ## Creating Database + command = 'wp core download --path=%s' % (path) + ProcessUtilities.executioner(command, website.externalApp) logging.statusWriter(tempStatusPath, 'Creating and copying database..,50') dbNameRestore, dbUser, dbPassword = ApplicationInstaller(None, None).dbCreation(tempStatusPath, website) - # Create dump of existing database + command = 'wp core config --dbname=%s --dbuser=%s --dbpass=%s --path=%s' % (dbNameRestore, dbUser, dbPassword, path) + ProcessUtilities.executioner(command, website.externalApp) - configPath = '%s/wp-config.php' % (masterPath) + ## Exporting and importing database - command = 'ls -la %s' % (configPath) - output = ProcessUtilities.outputExecutioner(command) + command = 'wp --allow-root --path=%s db export %s/dbexport-stage.sql' % (masterPath, path) + ProcessUtilities.executioner(command) - if output.find('No such file or') > -1: - logging.statusWriter(tempStatusPath, 'WordPress is not detected. [404]') - return 0 + ## Import - command = 'cat %s' % (configPath) - data = ProcessUtilities.outputExecutioner(command).split('\n') - - for items in data: - if items.find('DB_NAME') > -1 and items[0] != '/': - try: - dbName = items.split("'")[3] - if mysqlUtilities.createDatabaseBackup(dbName, '/home/cyberpanel'): - break - else: - raise BaseException('Failed to create database backup.') - except: - dbName = items.split('"')[1] - if mysqlUtilities.createDatabaseBackup(dbName, '/home/cyberpanel'): - break - else: - raise BaseException('Failed to create database backup.') - - databasePath = '%s/%s.sql' % ('/home/cyberpanel', dbName) - - if not mysqlUtilities.restoreDatabaseBackup(dbNameRestore, '/home/cyberpanel', None, 1, dbName): - try: - os.remove(databasePath) - except: - pass - raise BaseException('Failed to restore database backup.') + command = 'wp --allow-root --path=%s --quiet db import %s/dbexport-stage.sql' % (path, path) + ProcessUtilities.executioner(command) try: - os.remove(databasePath) + command = 'rm -f %s/dbexport-stage.sql' % (path) + ProcessUtilities.executioner(command) except: pass - ## Update final config file + ## Sync WP-Content Folder - pathFinalConfig = '%s/wp-config.php' % (path) - - command = 'cat %s' % (configPath) - data = ProcessUtilities.outputExecutioner(command).split('\n') - - tmp = "/tmp/" + str(randint(1000, 9999)) - writeToFile = open(tmp, 'w') - - for items in data: - if items.find('DB_NAME') > -1: - writeToFile.write("\ndefine( 'DB_NAME', '%s' );\n" % (dbNameRestore)) - elif items.find('DB_USER') > -1: - writeToFile.write("\ndefine( 'DB_USER', '%s' );\n" % (dbUser)) - elif items.find('DB_PASSWORD') > -1: - writeToFile.write("\ndefine( 'DB_PASSWORD', '%s' );\n" % (dbPassword)) - elif items.find('WP_SITEURL') > -1: - continue - elif items.find("table_prefix") > -1: - writeToFile.writelines(items) - content = """ -define('WP_HOME','http://%s'); -define('WP_SITEURL','http://%s'); -""" % (domain, domain) - writeToFile.write(content) - else: - writeToFile.write(items + '\n') - - writeToFile.close() - - command = 'mv %s %s' % (tmp, pathFinalConfig) + command = 'rsync -avz %s/wp-content/ %s/wp-content/' % (masterPath, path) ProcessUtilities.executioner(command) - command = 'chown %s:%s %s' % (website.externalApp, website.externalApp, pathFinalConfig) + ## Search and replace url + + command = 'wp search-replace --allow-root --path=%s "%s" "%s"' % (path, masterDomain, domain) ProcessUtilities.executioner(command) - logging.statusWriter(tempStatusPath, 'Database synced..,100') + command = 'wp search-replace --allow-root --path=%s "www.%s" "%s"' % (path, masterDomain, domain) + ProcessUtilities.executioner(command) - try: - os.remove(databasePath) - except: - pass + logging.statusWriter(tempStatusPath, 'Fixing permissions..,90') from filemanager.filemanager import FileManager @@ -197,7 +130,7 @@ define('WP_SITEURL','http://%s'); from plogical.installUtilities import installUtilities installUtilities.reStartLiteSpeed() - logging.statusWriter(tempStatusPath, 'Data copied..,[200]') + logging.statusWriter(tempStatusPath, 'Completed,[200]') return 0 except BaseException as msg: @@ -208,11 +141,13 @@ define('WP_SITEURL','http://%s'); try: tempStatusPath = self.extraArgs['tempStatusPath'] childDomain = self.extraArgs['childDomain'] - eraseCheck = self.extraArgs['eraseCheck'] + #eraseCheck = self.extraArgs['eraseCheck'] dbCheck = self.extraArgs['dbCheck'] - copyChanged = self.extraArgs['copyChanged'] + #copyChanged = self.extraArgs['copyChanged'] + child = ChildDomains.objects.get(domain=childDomain) + masterPath = '/home/%s/public_html' % (child.master.domain) command = 'chmod 755 /home/%s/public_html' % (child.master.domain) ProcessUtilities.executioner(command) @@ -223,59 +158,38 @@ define('WP_SITEURL','http://%s'); logging.statusWriter(tempStatusPath, 'WordPress is not detected. [404]') return 0 - if dbCheck: - logging.statusWriter(tempStatusPath, 'Syncing databases..,10') + ## Restore db - ## Create backup of child-domain database + logging.statusWriter(tempStatusPath, 'Syncing databases..,10') - configPath = '%s/wp-config.php' % (child.path) + command = 'wp --allow-root --path=%s db export %s/dbexport-stage.sql' % (child.path, masterPath) + ProcessUtilities.executioner(command) - data = open(configPath, 'r').readlines() + ## Restore to master domain - for items in data: - if items.find('DB_NAME') > -1 and items[0] != '/': - dbName = items.split("'")[3] - if mysqlUtilities.createDatabaseBackup(dbName, '/home/cyberpanel'): - break - else: - raise BaseException('Failed to create database backup.') + command = 'wp --allow-root --path=%s --quiet db import %s/dbexport-stage.sql' % (masterPath, masterPath) + ProcessUtilities.executioner(command) - databasePath = '%s/%s.sql' % ('/home/cyberpanel', dbName) + try: + command = 'rm -f %s/dbexport-stage.sql' % (masterPath) + ProcessUtilities.executioner(command) + except: + pass - ## Restore to master domain + ## Sync WP-Content Folder - masterPath = '/home/%s/public_html' % (child.master.domain) + logging.statusWriter(tempStatusPath, 'Syncing data..,50') - configPath = '%s/wp-config.php' % (masterPath) + command = 'rsync -avz %s/wp-content/ %s/wp-content/' % (child.path, masterPath) + ProcessUtilities.executioner(command) - data = open(configPath, 'r').readlines() + ## Search and replace url - for items in data: - if items.find('DB_NAME') > -1 and items[0] != '/': - dbNameRestore = items.split("'")[3] - if not mysqlUtilities.restoreDatabaseBackup(dbNameRestore, '/home/cyberpanel', None, 1, dbName): - try: - os.remove(databasePath) - except: - pass - raise BaseException('Failed to restore database backup.') + command = 'wp search-replace --allow-root --path=%s "%s" "%s"' % (masterPath, child.domain, child.master.domain) + ProcessUtilities.executioner(command) - try: - os.remove(databasePath) - except: - pass - if eraseCheck: - sourcePath = child.path - destinationPath = '/home/%s/public_html' % (child.master.domain) - - command = 'rsync -avzh --exclude "wp-config.php" %s/ %s' % (sourcePath, destinationPath) - ProcessUtilities.executioner(command, child.master.externalApp) - elif copyChanged: - sourcePath = child.path - destinationPath = '/home/%s/public_html' % (child.master.domain) - - command = 'rsync -avzh --exclude "wp-config.php" %s/ %s' % (sourcePath, destinationPath) - ProcessUtilities.executioner(command, child.master.externalApp) + command = 'wp search-replace --allow-root --path=%s "www.%s" "%s"' % (masterPath, child.domain, child.master.domain) + ProcessUtilities.executioner(command) from filemanager.filemanager import FileManager @@ -285,7 +199,7 @@ define('WP_SITEURL','http://%s'); from plogical.installUtilities import installUtilities installUtilities.reStartLiteSpeed() - logging.statusWriter(tempStatusPath, 'Data copied..,[200]') + logging.statusWriter(tempStatusPath, 'Completed,[200]') return 0 except BaseException as msg: From 5d2d806ed45ba8bfc842cf96c3e13f9bd17e5a0f Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 2 Feb 2021 12:10:52 +0500 Subject: [PATCH 044/107] disable lscache when maintenance mode is on --- cloudAPI/cloudManager.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index 4c54173e4..5025645bf 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -2064,6 +2064,10 @@ class CloudManager: final_json = json.dumps(final_dic) return HttpResponse(final_json) elif self.data['setting'] == 'debugging': + + command = "wp litespeed-purge all --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + if self.data['settingValue']: command = "wp config set WP_DEBUG true --path=/home/%s/public_html" % (domain) ProcessUtilities.executioner(command, website.externalApp) @@ -2080,6 +2084,10 @@ class CloudManager: final_json = json.dumps(final_dic) return HttpResponse(final_json) elif self.data['setting'] == 'searchIndex': + + command = "wp litespeed-purge all --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + if self.data['settingValue']: command = "wp option update blog_public 1 --path=/home/%s/public_html" % (domain) ProcessUtilities.executioner(command, website.externalApp) @@ -2096,7 +2104,12 @@ class CloudManager: final_json = json.dumps(final_dic) return HttpResponse(final_json) elif self.data['setting'] == 'maintenanceMode': + + command = "wp litespeed-purge all --path=/home/%s/public_html" % (domain) + ProcessUtilities.executioner(command, website.externalApp) + if self.data['settingValue']: + command = "wp maintenance-mode activate --path=/home/%s/public_html" % (domain) ProcessUtilities.executioner(command, website.externalApp) From e2751a2ba212d19f985c00383fe983d2006add46 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 2 Feb 2021 12:37:56 +0500 Subject: [PATCH 045/107] wp auto updates --- plogical/IncScheduler.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/plogical/IncScheduler.py b/plogical/IncScheduler.py index 703d47051..734c96a58 100644 --- a/plogical/IncScheduler.py +++ b/plogical/IncScheduler.py @@ -753,6 +753,40 @@ Automatic backup failed for %s on %s. except BaseException as msg: logging.writeToFile('%s. [CalculateAndUpdateDiskUsage:753]' % (str(msg))) + @staticmethod + def WPUpdates(): + from cloudAPI.models import WPDeployments + for wp in WPDeployments.objects.all(): + try: + try: + config = json.loads(wp.config) + except: + config = {} + + ### Core Updates + + if config['updates'] == 'Minor and Security Updates': + command = 'wp core update --minor --allow-root --path=/home/%s/public_html' % (config['domainName']) + ProcessUtilities.executioner(command) + elif config['updates'] == 'All (minor and major)': + command = 'wp core update --allow-root --path=/home/%s/public_html' % (config['domainName']) + ProcessUtilities.executioner(command) + + ### Plugins, for plugins we will do minor updates only. + + if config['pluginUpdates'] == 'Enabled': + command = 'wp plugin update --all --minor --allow-root --path=/home/%s/public_html' % (config['domainName']) + ProcessUtilities.executioner(command) + + ### Themes, for plugins we will do minor updates only. + + if config['themeUpdates'] == 'Enabled': + command = 'wp theme update --all --minor --allow-root --path=/home/%s/public_html' % (config['domainName']) + ProcessUtilities.executioner(command) + + except BaseException as msg: + logging.writeToFile('%s. [WPUpdates:767]' % (str(msg))) + def main(): @@ -766,6 +800,7 @@ def main(): return 0 IncScheduler.CalculateAndUpdateDiskUsage() + IncScheduler.WPUpdates() IncScheduler.startBackup(args.function) IncScheduler.runGoogleDriveBackups(args.function) IncScheduler.git(args.function) From 386f8dfdcd1a103aa288bb7266240013ce04369c Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 2 Feb 2021 12:49:08 +0500 Subject: [PATCH 046/107] install default plugins set --- plogical/applicationInstaller.py | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/plogical/applicationInstaller.py b/plogical/applicationInstaller.py index dd068d90c..7450c22f0 100755 --- a/plogical/applicationInstaller.py +++ b/plogical/applicationInstaller.py @@ -645,6 +645,46 @@ $parameters = array( except: pass + try: + if self.extraArgs['appsSet'] == 'WordPress + LSCache + Classic Editor': + + command = "wp plugin install classic-editor --allow-root --path=" + finalPath + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines('Activating Classic Editor Plugin,90') + statusFile.close() + + command = "wp plugin activate classic-editor --allow-root --path=" + finalPath + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) + + elif self.extraArgs['appsSet'] == 'WordPress + LSCache + WooCommerce': + + command = "wp plugin install woocommerce --allow-root --path=" + finalPath + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) + + statusFile = open(tempStatusPath, 'w') + statusFile.writelines('Activating WooCommerce Plugin,90') + statusFile.close() + + command = "wp plugin activate woocommerce --allow-root --path=" + finalPath + result = ProcessUtilities.outputExecutioner(command, externalApp) + + if result.find('Success:') == -1: + raise BaseException(result) + + except: + pass + ## From e8831b36749ad3ee5c4dbff2b271a38c6f40c38d Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 3 Feb 2021 00:35:08 -0500 Subject: [PATCH 047/107] refactored incBackups --- IncBackups/IncBackupPath.py | 7 + IncBackups/IncBackupProvider.py | 8 + IncBackups/IncBackupsControl.py | 23 +- IncBackups/static/IncBackups/IncBackups.js | 23 +- .../IncBackups/restoreRemoteBackups.html | 2 +- IncBackups/urls.py | 40 +- IncBackups/views.py | 832 +++++++----------- static/IncBackups/IncBackups.js | 23 +- 8 files changed, 384 insertions(+), 574 deletions(-) create mode 100644 IncBackups/IncBackupPath.py create mode 100644 IncBackups/IncBackupProvider.py diff --git a/IncBackups/IncBackupPath.py b/IncBackups/IncBackupPath.py new file mode 100644 index 000000000..10cc418b1 --- /dev/null +++ b/IncBackups/IncBackupPath.py @@ -0,0 +1,7 @@ +from enum import Enum + + +class IncBackupPath(Enum): + SFTP = "/home/cyberpanel/sftp" + AWS = "/home/cyberpanel/aws" + # WASABI = "/home/cyberpanel/wasabi" diff --git a/IncBackups/IncBackupProvider.py b/IncBackups/IncBackupProvider.py new file mode 100644 index 000000000..9645be3d5 --- /dev/null +++ b/IncBackups/IncBackupProvider.py @@ -0,0 +1,8 @@ +from enum import Enum, auto + + +class IncBackupProvider(Enum): + LOCAL = auto() + SFTP = auto() + AWS = auto() + # WASABI = auto() diff --git a/IncBackups/IncBackupsControl.py b/IncBackups/IncBackupsControl.py index c8e17ef83..c62152edc 100644 --- a/IncBackups/IncBackupsControl.py +++ b/IncBackups/IncBackupsControl.py @@ -83,9 +83,7 @@ class IncJobs(multi.Thread): result = self.getRemoteBackups() activator = 0 - json_data = "[" - checker = 0 - + json_data = [] if result[0].find('unable to open config file') == -1: for items in reversed(result): @@ -98,20 +96,11 @@ class IncJobs(multi.Thread): if activator: entry = items.split(' ') - - dic = {'id': entry[0], - 'date': "%s %s" % (entry[2], entry[3]), - 'host': entry[5], - 'path': entry[-1] - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' + json_data.append({'id': entry[0], + 'date': "%s %s" % (entry[2], entry[3]), + 'host': entry[5], + 'path': entry[-1] + }) final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data}) return HttpResponse(final_json) diff --git a/IncBackups/static/IncBackups/IncBackups.js b/IncBackups/static/IncBackups/IncBackups.js index 32b01ef70..9031c393d 100644 --- a/IncBackups/static/IncBackups/IncBackups.js +++ b/IncBackups/static/IncBackups/IncBackups.js @@ -101,7 +101,7 @@ app.controller('createIncrementalBackups', function ($scope, $http, $timeout) { function ListInitialDatas(response) { if (response.data.status === 1) { - $scope.records = JSON.parse(response.data.data); + $scope.records = response.data.data; } else { new PNotify({ title: 'Error!', @@ -240,7 +240,7 @@ app.controller('createIncrementalBackups', function ($scope, $http, $timeout) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.jobs = JSON.parse(response.data.data); + $scope.jobs = response.data.data; } else { new PNotify({ title: 'Operation Failed!', @@ -358,7 +358,7 @@ app.controller('incrementalDestinations', function ($scope, $http) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.records = JSON.parse(response.data.data); + $scope.records = response.data.data; } else { new PNotify({ title: 'Operation Failed!', @@ -621,7 +621,7 @@ app.controller('scheduleBackupInc', function ($scope, $http) { if (response.data.status === 1) { new PNotify({ title: 'Success!', - text: 'Destination successfully removed.', + text: 'Operation successful.', type: 'success' }); } else { @@ -668,12 +668,11 @@ app.controller('scheduleBackupInc', function ($scope, $http) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.records = JSON.parse(response.data.data); - var parsed = JSON.parse(response.data.data); - - for (var j = 0; j < parsed.length; j++) { - websitesToBeBackedTemp.push(parsed[j].website); - } + let data = response.data.data; + $scope.records = data; + data.forEach(item => { + websitesToBeBackedTemp.push(item.website) + }) } else { new PNotify({ title: 'Operation Failed!', @@ -766,7 +765,7 @@ app.controller('scheduleBackupInc', function ($scope, $http) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.websites = JSON.parse(response.data.data); + $scope.websites = response.data.data; if(response.data.websiteData === 1){ $scope.websiteData = true; @@ -1074,7 +1073,7 @@ app.controller('restoreRemoteBackupsInc', function ($scope, $http, $timeout) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.records = JSON.parse(response.data.data); + $scope.records = response.data.data; } else { new PNotify({ title: 'Error!', diff --git a/IncBackups/templates/IncBackups/restoreRemoteBackups.html b/IncBackups/templates/IncBackups/restoreRemoteBackups.html index b9e6b9228..7c2b38caa 100755 --- a/IncBackups/templates/IncBackups/restoreRemoteBackups.html +++ b/IncBackups/templates/IncBackups/restoreRemoteBackups.html @@ -55,7 +55,7 @@
- +
diff --git a/IncBackups/urls.py b/IncBackups/urls.py index 2cb3e7928..a8862cf04 100644 --- a/IncBackups/urls.py +++ b/IncBackups/urls.py @@ -2,24 +2,24 @@ from django.conf.urls import url from . import views urlpatterns = [ - url(r'^createBackup$', views.createBackup, name='createBackupInc'), - url(r'^restoreRemoteBackups$', views.restoreRemoteBackups, name='restoreRemoteBackupsInc'), - url(r'^backupDestinations$', views.backupDestinations, name='backupDestinationsInc'), - url(r'^addDestination$', views.addDestination, name='addDestinationInc'), - url(r'^populateCurrentRecords$', views.populateCurrentRecords, name='populateCurrentRecordsInc'), - url(r'^removeDestination$', views.removeDestination, name='removeDestinationInc'), - url(r'^fetchCurrentBackups$', views.fetchCurrentBackups, name='fetchCurrentBackupsInc'), - url(r'^submitBackupCreation$', views.submitBackupCreation, name='submitBackupCreationInc'), - url(r'^getBackupStatus$', views.getBackupStatus, name='getBackupStatusInc'), - url(r'^deleteBackup$', views.deleteBackup, name='deleteBackupInc'), - url(r'^fetchRestorePoints$', views.fetchRestorePoints, name='fetchRestorePointsInc'), - url(r'^restorePoint$', views.restorePoint, name='restorePointInc'), - url(r'^scheduleBackups$', views.scheduleBackups, name='scheduleBackupsInc'), - url(r'^submitBackupSchedule$', views.submitBackupSchedule, name='submitBackupScheduleInc'), - url(r'^scheduleDelete$', views.scheduleDelete, name='scheduleDeleteInc'), - url(r'^getCurrentBackupSchedules$', views.getCurrentBackupSchedules, name='getCurrentBackupSchedulesInc'), - url(r'^fetchSites$', views.fetchSites, name='fetchSites'), - url(r'^saveChanges$', views.saveChanges, name='saveChanges'), - url(r'^removeSite$', views.removeSite, name='removeSite'), - url(r'^addWebsite$', views.addWebsite, name='addWebsite'), + url(r'^createBackup$', views.create_backup, name='createBackupInc'), + url(r'^restoreRemoteBackups$', views.restore_remote_backups, name='restoreRemoteBackupsInc'), + url(r'^backupDestinations$', views.backup_destinations, name='backupDestinationsInc'), + url(r'^addDestination$', views.add_destination, name='addDestinationInc'), + url(r'^populateCurrentRecords$', views.populate_current_records, name='populateCurrentRecordsInc'), + url(r'^removeDestination$', views.remove_destination, name='removeDestinationInc'), + url(r'^fetchCurrentBackups$', views.fetch_current_backups, name='fetchCurrentBackupsInc'), + url(r'^submitBackupCreation$', views.submit_backup_creation, name='submitBackupCreationInc'), + url(r'^getBackupStatus$', views.get_backup_status, name='getBackupStatusInc'), + url(r'^deleteBackup$', views.delete_backup, name='deleteBackupInc'), + url(r'^fetchRestorePoints$', views.fetch_restore_points, name='fetchRestorePointsInc'), + url(r'^restorePoint$', views.restore_point, name='restorePointInc'), + url(r'^scheduleBackups$', views.schedule_backups, name='scheduleBackupsInc'), + url(r'^submitBackupSchedule$', views.submit_backup_schedule, name='submitBackupScheduleInc'), + url(r'^scheduleDelete$', views.schedule_delete, name='scheduleDeleteInc'), + url(r'^getCurrentBackupSchedules$', views.get_current_backup_schedules, name='getCurrentBackupSchedulesInc'), + url(r'^fetchSites$', views.fetch_sites, name='fetchSites'), + url(r'^saveChanges$', views.save_changes, name='saveChanges'), + url(r'^removeSite$', views.remove_site, name='removeSite'), + url(r'^addWebsite$', views.add_website, name='addWebsite'), ] \ No newline at end of file diff --git a/IncBackups/views.py b/IncBackups/views.py index fe229f0c9..bd8630d95 100644 --- a/IncBackups/views.py +++ b/IncBackups/views.py @@ -1,425 +1,339 @@ -# -*- coding: utf-8 -*- - -from django.shortcuts import render -from plogical.acl import ACLManager -from django.shortcuts import HttpResponse, redirect -from plogical.processUtilities import ProcessUtilities -from plogical.virtualHostUtilities import virtualHostUtilities import json import os -from loginSystem.models import Administrator -from websiteFunctions.models import Websites -from .models import IncJob, BackupJob, JobSites -from .IncBackupsControl import IncJobs -from random import randint -import time -from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging -from loginSystem.views import loadLoginPage import stat -# Create your views here. +import time +from pathlib import Path +from random import randint + +from django.shortcuts import HttpResponse, redirect +from django.shortcuts import render + +from loginSystem.models import Administrator +from loginSystem.views import loadLoginPage +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging +from plogical.acl import ACLManager +from plogical.processUtilities import ProcessUtilities as pu +from plogical.virtualHostUtilities import virtualHostUtilities as vhu +from websiteFunctions.models import Websites +from .IncBackupProvider import IncBackupProvider +from .IncBackupPath import IncBackupPath +from .IncBackupsControl import IncJobs +from .models import IncJob, BackupJob, JobSites -def defRenderer(request, templateName, args): +def def_renderer(request, templateName, args): return render(request, templateName, args) -def createBackup(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createBackup') == 0: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - - destinations = [] +def _get_destinations(local: bool = False): + destinations = [] + if local: destinations.append('local') + path = Path(IncBackupPath.SFTP.value) + if path.exists(): + for item in path.iterdir(): + destinations.append('sftp:%s' % item.name) - path = '/home/cyberpanel/sftp' + path = Path(IncBackupPath.AWS.value) + if path.exists(): + for item in path.iterdir(): + destinations.append('s3:s3.amazonaws.com/%s' % item.name) + return destinations - if os.path.exists(path): - for items in os.listdir(path): - destinations.append('sftp:%s' % (items)) - path = '/home/cyberpanel/aws' - if os.path.exists(path): - for items in os.listdir(path): - destinations.append('s3:s3.amazonaws.com/%s' % (items)) +def _get_user_acl(request): + user_id = request.session['userID'] + current_acl = ACLManager.loadedACL(user_id) + return user_id, current_acl - return defRenderer(request, 'IncBackups/createBackup.html', {'websiteList': websitesName, 'destinations': destinations}) - except BaseException as msg: - logging.writeToFile(str(msg)) - return redirect(loadLoginPage) -def backupDestinations(request): +def create_backup(request): try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'createBackup') == 0: return ACLManager.loadError() - return defRenderer(request, 'IncBackups/incrementalDestinations.html', {}) + websites = ACLManager.findAllSites(current_acl, user_id) + + destinations = _get_destinations(local=True) + + return def_renderer(request, 'IncBackups/createBackup.html', + {'websiteList': websites, 'destinations': destinations}) except BaseException as msg: logging.writeToFile(str(msg)) return redirect(loadLoginPage) -def addDestination(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: +def backup_destinations(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'addDeleteDestinations') == 0: + return ACLManager.loadError() + + return def_renderer(request, 'IncBackups/incrementalDestinations.html', {}) + except BaseException as msg: + logging.writeToFile(str(msg)) + return redirect(loadLoginPage) + + +def add_destination(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'addDeleteDestinations') == 0: return ACLManager.loadErrorJson('destStatus', 0) data = json.loads(request.body) - if data['type'] == 'SFTP': + if data['type'].lower() == IncBackupProvider.SFTP.name.lower(): + path = Path(IncBackupPath.SFTP.value) + path.mkdir(exist_ok=True) - ipAddress = data['IPAddress'] + ip_address = data['IPAddress'] password = data['password'] - ipFile = '/home/cyberpanel/sftp/%s' % (ipAddress) + address_file = path / ip_address + port = data.get('backupSSHPort', '22') - try: - port = data['backupSSHPort'] - except: - port = "22" - - if os.path.exists(ipFile): + if address_file.exists(): final_dic = {'status': 0, 'error_message': 'This destination already exists.'} final_json = json.dumps(final_dic) return HttpResponse(final_json) + python_path = Path('/usr/local/CyberCP/bin/python') + backup_utils = Path(vhu.cyberPanel) / "plogical/backupUtilities.py" - try: - os.mkdir('/home/cyberpanel/sftp') - except: - pass + exec_args = "submitDestinationCreation --ipAddress %s --password %s --port %s --user %s" % \ + (ip_address, password, port, 'root') + exec_cmd = "%s %s %s" % (python_path, backup_utils, exec_args) - execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " submitDestinationCreation --ipAddress " + ipAddress + " --password " \ - + password + " --port " + port + ' --user %s' % ('root') + if Path(pu.debugPath).exists(): + logging.writeToFile(exec_cmd) - if os.path.exists(ProcessUtilities.debugPath): - logging.writeToFile(execPath) + output = pu.outputExecutioner(exec_cmd) - output = ProcessUtilities.outputExecutioner(execPath) - - if os.path.exists(ProcessUtilities.debugPath): + if Path(pu.debugPath).exists(): logging.writeToFile(output) if output.find('1,') > -1: - - content = '%s\n%s' % (ipAddress, port) - writeToFile = open(ipFile, 'w') - writeToFile.write(content) - writeToFile.close() + content = '%s\n%s' % (ip_address, port) + with open(address_file, 'w') as outfile: + outfile.write(content) command = 'cat /root/.ssh/config' - currentConfig = ProcessUtilities.outputExecutioner(command) + current_config = pu.outputExecutioner(command) - tmpFile = '/home/cyberpanel/sshconfig' + tmp_file = '/home/cyberpanel/sshconfig' + with open(tmp_file, 'w') as outfile: + if current_config.find('cat') == -1: + outfile.write(current_config) - writeToFile = open(tmpFile, 'w') - if currentConfig.find('cat') == -1: - writeToFile.write(currentConfig) + content = "Host %s\n" \ + " IdentityFile ~/.ssh/cyberpanel\n" \ + " Port %s\n" % (ip_address, port) + if current_config.find(ip_address) == -1: + outfile.write(content) - content = """Host %s - IdentityFile ~/.ssh/cyberpanel - Port %s -""" % (ipAddress, port) - if currentConfig.find(ipAddress) == -1: - writeToFile.write(content) - writeToFile.close() - - - command = 'mv %s /root/.ssh/config' % (tmpFile) - ProcessUtilities.executioner(command) + command = 'mv %s /root/.ssh/config' % tmp_file + pu.executioner(command) command = 'chown root:root /root/.ssh/config' - ProcessUtilities.executioner(command) + pu.executioner(command) final_dic = {'status': 1, 'error_message': 'None'} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - else: final_dic = {'status': 0, 'error_message': output} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - else: - aws = '/home/cyberpanel/aws' + final_json = json.dumps(final_dic) + return HttpResponse(final_json) - try: - os.mkdir(aws) - except: - pass + if data['type'].lower() == IncBackupProvider.AWS.name.lower(): + path = Path(IncBackupPath.AWS.value) + path.mkdir(exist_ok=True) - AWS_ACCESS_KEY_ID = data['AWS_ACCESS_KEY_ID'] - AWS_SECRET_ACCESS_KEY = data['AWS_SECRET_ACCESS_KEY'] + access_key = data['AWS_ACCESS_KEY_ID'] + secret_key = data['AWS_SECRET_ACCESS_KEY'] - awsFile = '/home/cyberpanel/aws/%s' % (AWS_ACCESS_KEY_ID) + aws_file = path / access_key - writeToFile = open(awsFile, 'w') - writeToFile.write(AWS_SECRET_ACCESS_KEY) - writeToFile.close() + with open(aws_file, 'w') as outfile: + outfile.write(secret_key) - os.chmod(awsFile, stat.S_IRUSR | stat.S_IWUSR) + aws_file.chmod(stat.S_IRUSR | stat.S_IWUSR) final_dic = {'status': 1} final_json = json.dumps(final_dic) return HttpResponse(final_json) - except BaseException as msg: final_dic = {'status': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) -def populateCurrentRecords(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: +def populate_current_records(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'addDeleteDestinations') == 0: return ACLManager.loadErrorJson('fetchStatus', 0) data = json.loads(request.body) - if data['type'] == 'SFTP': + json_data = [] + if data['type'].lower() == IncBackupProvider.SFTP.name.lower(): + path = Path(IncBackupPath.SFTP.value) - path = '/home/cyberpanel/sftp' - - if os.path.exists(path): - - json_data = "[" - checker = 0 - - for items in os.listdir(path): - fullPath = '/home/cyberpanel/sftp/%s' % (items) - - data = open(fullPath, 'r').readlines() - dic = { - 'ip': data[0].strip('\n'), - 'port': data[1], - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - else: - final_json = json.dumps({'status': 1, 'error_message': "None", "data": ''}) - return HttpResponse(final_json) - else: - path = '/home/cyberpanel/aws' - - if os.path.exists(path): - - json_data = "[" - checker = 0 - - for items in os.listdir(path): - dic = { - 'AWS_ACCESS_KEY_ID': items - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) + if path.exists(): + for item in path.iterdir(): + with open(item, 'r') as infile: + _file = infile.readlines() + json_data.append({ + 'ip': _file[0].strip('\n'), + 'port': _file[1], + }) + else: + final_json = json.dumps({'status': 1, 'error_message': "None", "data": ''}) + return HttpResponse(final_json) + + if data['type'].lower() == IncBackupProvider.AWS.name.lower(): + path = Path(IncBackupPath.AWS.value) + + if path.exists(): + for item in path.iterdir(): + json_data.append({'AWS_ACCESS_KEY_ID': item.name}) else: final_json = json.dumps({'status': 1, 'error_message': "None", "data": ''}) return HttpResponse(final_json) - json_data = json_data + ']' final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data}) return HttpResponse(final_json) - except BaseException as msg: final_dic = {'status': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) -def removeDestination(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: +def remove_destination(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'addDeleteDestinations') == 0: return ACLManager.loadErrorJson('destStatus', 0) data = json.loads(request.body) - ipAddress = data['IPAddress'] + if 'IPAddress' in data: + file_name = data['IPAddress'] - if data['type'] == 'SFTP': - ipFile = '/home/cyberpanel/sftp/%s' % (ipAddress) - else: - ipFile = '/home/cyberpanel/aws/%s' % (ipAddress) + if data['type'].lower() == IncBackupProvider.SFTP.name.lower(): + dest_file = Path(IncBackupPath.SFTP.value) / file_name + dest_file.unlink() - - os.remove(ipFile) + if data['type'].lower() == IncBackupProvider.AWS.name.lower(): + dest_file = Path(IncBackupPath.AWS.value) / file_name + dest_file.unlink() final_dic = {'status': 1, 'error_message': 'None'} final_json = json.dumps(final_dic) return HttpResponse(final_json) - except BaseException as msg: final_dic = {'destStatus': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) -def fetchCurrentBackups(request): + +def fetch_current_backups(request): try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + user_id, current_acl = _get_user_acl(request) + admin = Administrator.objects.get(pk=user_id) data = json.loads(request.body) - backupDomain = data['websiteToBeBacked'] + backup_domain = data['websiteToBeBacked'] - if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1: pass else: return ACLManager.loadErrorJson('fetchStatus', 0) - if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson() + if 'backupDestinations' in data: + backup_destinations = data['backupDestinations'] + extra_args = {'website': backup_domain, 'backupDestinations': backup_destinations} - try: - backupDestinations = data['backupDestinations'] - - extraArgs = {} - extraArgs['website'] = backupDomain - extraArgs['backupDestinations'] = backupDestinations - try: - extraArgs['password'] = data['password'] - except: + if 'password' in data: + extra_args['password'] = data['password'] + else: final_json = json.dumps({'status': 0, 'error_message': "Please supply the password."}) return HttpResponse(final_json) - startJob = IncJobs('Dummpy', extraArgs) - return startJob.fetchCurrentBackups() - - except: - - website = Websites.objects.get(domain=backupDomain) - + start_job = IncJobs('Dummy', extra_args) + return start_job.fetchCurrentBackups() + else: + website = Websites.objects.get(domain=backup_domain) backups = website.incjob_set.all() - - json_data = "[" - checker = 0 - - for items in reversed(backups): - - includes = "" - - jobs = items.jobsnapshots_set.all() - + json_data = [] + for backup in reversed(backups): + snapshots = [] + jobs = backup.jobsnapshots_set.all() for job in jobs: - includes = '%s,%s:%s' % (includes, job.type, job.snapshotid) - - dic = {'id': items.id, - 'date': str(items.date), - 'includes': includes - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' + snapshots.append({'type': job.type, 'snapshotid': job.snapshotid, 'destination': job.destination}) + json_data.append({'id': backup.id, + 'date': str(backup.date), + 'snapshots': snapshots + }) final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data}) return HttpResponse(final_json) - - except BaseException as msg: final_dic = {'status': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) -def submitBackupCreation(request): + +def submit_backup_creation(request): try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + user_id, current_acl = _get_user_acl(request) + admin = Administrator.objects.get(pk=user_id) data = json.loads(request.body) - backupDomain = data['websiteToBeBacked'] - backupDestinations = data['backupDestinations'] + backup_domain = data['websiteToBeBacked'] + backup_destinations = data['backupDestinations'] - if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1: pass else: return ACLManager.loadErrorJson('metaStatus', 0) - tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + temp_path = Path("/home/cyberpanel/") / str(randint(1000, 9999)) - try: - websiteData = data['websiteData'] - except: - websiteData = False + extra_args = {} + extra_args['website'] = backup_domain + extra_args['tempPath'] = str(temp_path) + extra_args['backupDestinations'] = backup_destinations + extra_args['websiteData'] = data['websiteData'] if 'websiteData' in data else False + extra_args['websiteEmails'] = data['websiteEmails'] if 'websiteEmails' in data else False + extra_args['websiteSSLs'] = data['websiteSSLs'] if 'websiteSSLs' in data else False + extra_args['websiteDatabases'] = data['websiteDatabases'] if 'websiteDatabases' in data else False - try: - websiteEmails = data['websiteEmails'] - except: - websiteEmails = False - - try: - websiteSSLs = data['websiteSSLs'] - except: - websiteSSLs = False - - - try: - websiteDatabases = data['websiteDatabases'] - except: - websiteDatabases = False - - extraArgs = {} - extraArgs['website'] = backupDomain - extraArgs['tempPath'] = tempPath - extraArgs['backupDestinations'] = backupDestinations - extraArgs['websiteData'] = websiteData - extraArgs['websiteEmails'] = websiteEmails - extraArgs['websiteSSLs'] = websiteSSLs - extraArgs['websiteDatabases'] = websiteDatabases - - startJob = IncJobs('createBackup', extraArgs) - startJob.start() + start_job = IncJobs('createBackup', extra_args) + start_job.start() time.sleep(2) - final_json = json.dumps({'status': 1, 'error_message': "None", 'tempPath': tempPath}) + final_json = json.dumps({'status': 1, 'error_message': "None", 'tempPath': str(temp_path)}) return HttpResponse(final_json) - except BaseException as msg: logging.writeToFile(str(msg)) final_dic = {'status': 0, 'metaStatus': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) -def getBackupStatus(request): + +def get_backup_status(request): try: data = json.loads(request.body) status = data['tempPath'] - backupDomain = data['websiteToBeBacked'] + backup_domain = data['websiteToBeBacked'] - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + user_id, current_acl = _get_user_acl(request) + admin = Administrator.objects.get(pk=user_id) + if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1: pass else: return ACLManager.loadErrorJson('fetchStatus', 0) @@ -437,7 +351,7 @@ def getBackupStatus(request): if os.path.exists(status): command = "cat " + status - result = ProcessUtilities.outputExecutioner(command, 'cyberpanel') + result = pu.outputExecutioner(command, 'cyberpanel') if result.find("Completed") > -1: @@ -468,77 +382,65 @@ def getBackupStatus(request): else: final_json = json.dumps({'backupStatus': 1, 'error_message': "None", "status": 1, "abort": 0}) return HttpResponse(final_json) - except BaseException as msg: final_dic = {'backupStatus': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) logging.writeToFile(str(msg) + " [backupStatus]") return HttpResponse(final_json) -def deleteBackup(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - data = json.loads(request.body) - backupDomain = data['websiteToBeBacked'] - if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: +def delete_backup(request): + try: + user_id, current_acl = _get_user_acl(request) + admin = Administrator.objects.get(pk=user_id) + data = json.loads(request.body) + backup_domain = data['websiteToBeBacked'] + + if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1: pass else: return ACLManager.loadErrorJson('fetchStatus', 0) - id = data['backupID'] + backup_id = data['backupID'] - IncJob.objects.get(id=id).delete() + IncJob.objects.get(id=backup_id).delete() final_dic = {'status': 1, 'error_message': 'None'} final_json = json.dumps(final_dic) return HttpResponse(final_json) - except BaseException as msg: final_dic = {'destStatus': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) -def fetchRestorePoints(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - data = json.loads(request.body) - backupDomain = data['websiteToBeBacked'] - if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: +def fetch_restore_points(request): + try: + user_id, current_acl = _get_user_acl(request) + admin = Administrator.objects.get(pk=user_id) + data = json.loads(request.body) + backup_domain = data['websiteToBeBacked'] + + if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1: pass else: return ACLManager.loadErrorJson('fetchStatus', 0) data = json.loads(request.body) - id = data['id'] + job_id = data['id'] - incJob = IncJob.objects.get(id=id) + inc_job = IncJob.objects.get(id=job_id) - backups = incJob.jobsnapshots_set.all() - - json_data = "[" - checker = 0 + backups = inc_job.jobsnapshots_set.all() + json_data = [] for items in backups: + json_data.append({'id': items.id, + 'snapshotid': items.snapshotid, + 'type': items.type, + 'destination': items.destination, + }) - dic = {'id': items.id, - 'snapshotid': items.snapshotid, - 'type': items.type, - 'destination': items.destination, - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data}) return HttpResponse(final_json) except BaseException as msg: @@ -546,350 +448,256 @@ def fetchRestorePoints(request): final_json = json.dumps(final_dic) return HttpResponse(final_json) -def restorePoint(request): + +def restore_point(request): try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + user_id, current_acl = _get_user_acl(request) + admin = Administrator.objects.get(pk=user_id) data = json.loads(request.body) - backupDomain = data['websiteToBeBacked'] - jobid = data['jobid'] + backup_domain = data['websiteToBeBacked'] + job_id = data['jobid'] - if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: + if ACLManager.checkOwnership(backup_domain, admin, current_acl) == 1: pass else: return ACLManager.loadErrorJson('metaStatus', 0) - tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) + temp_path = Path("/home/cyberpanel/") / str(randint(1000, 9999)) if data['reconstruct'] == 'remote': extraArgs = {} - extraArgs['website'] = backupDomain - extraArgs['jobid'] = jobid - extraArgs['tempPath'] = tempPath + extraArgs['website'] = backup_domain + extraArgs['jobid'] = job_id + extraArgs['tempPath'] = str(temp_path) extraArgs['reconstruct'] = data['reconstruct'] extraArgs['backupDestinations'] = data['backupDestinations'] extraArgs['password'] = data['password'] extraArgs['path'] = data['path'] else: extraArgs = {} - extraArgs['website'] = backupDomain - extraArgs['jobid'] = jobid - extraArgs['tempPath'] = tempPath + extraArgs['website'] = backup_domain + extraArgs['jobid'] = job_id + extraArgs['tempPath'] = str(temp_path) extraArgs['reconstruct'] = data['reconstruct'] - - startJob = IncJobs('restorePoint', extraArgs) - startJob.start() - + start_job = IncJobs('restorePoint', extraArgs) + start_job.start() time.sleep(2) - final_json = json.dumps({'status': 1, 'error_message': "None", 'tempPath': tempPath}) + final_json = json.dumps({'status': 1, 'error_message': "None", 'tempPath': str(temp_path)}) return HttpResponse(final_json) - except BaseException as msg: logging.writeToFile(str(msg)) final_dic = {'status': 0, 'metaStatus': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) -def scheduleBackups(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: +def schedule_backups(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'scheDuleBackups') == 0: return ACLManager.loadError() - websitesName = ACLManager.findAllSites(currentACL, userID) + websites = ACLManager.findAllSites(current_acl, user_id) - destinations = [] - destinations.append('local') + destinations = _get_destinations(local=True) - path = '/home/cyberpanel/sftp' - - if os.path.exists(path): - for items in os.listdir(path): - destinations.append('sftp:%s' % (items)) - - path = '/home/cyberpanel/aws' - if os.path.exists(path): - for items in os.listdir(path): - destinations.append('s3:s3.amazonaws.com/%s' % (items)) - - websitesName = ACLManager.findAllSites(currentACL, userID) - - return defRenderer(request, 'IncBackups/backupSchedule.html', {'websiteList': websitesName, 'destinations': destinations}) + return def_renderer(request, 'IncBackups/backupSchedule.html', + {'websiteList': websites, 'destinations': destinations}) except BaseException as msg: logging.writeToFile(str(msg)) return redirect(loadLoginPage) -def submitBackupSchedule(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: +def submit_backup_schedule(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'scheDuleBackups') == 0: return ACLManager.loadErrorJson('scheduleStatus', 0) data = json.loads(request.body) - backupDest = data['backupDestinations'] - backupFreq = data['backupFreq'] - websitesToBeBacked = data['websitesToBeBacked'] + backup_dest = data['backupDestinations'] + backup_freq = data['backupFreq'] + backup_sites = data['websitesToBeBacked'] - try: - websiteData = data['websiteData'] - websiteData = 1 - except: - websiteData = False - websiteData = 0 + backup_data = 1 if 'websiteData' in data else 0 + backup_emails = 1 if 'websiteEmails' in data else 0 + backup_databases = 1 if 'websiteDatabases' in data else 0 - try: - websiteEmails = data['websiteEmails'] - websiteEmails = 1 - except: - websiteEmails = False - websiteEmails = 0 + backup_job = BackupJob(websiteData=backup_data, websiteDataEmails=backup_emails, + websiteDatabases=backup_databases, destination=backup_dest, frequency=backup_freq) + backup_job.save() - try: - websiteDatabases = data['websiteDatabases'] - websiteDatabases = 1 - except: - websiteDatabases = False - websiteDatabases = 0 - - newJob = BackupJob(websiteData=websiteData, websiteDataEmails=websiteEmails, websiteDatabases=websiteDatabases, destination=backupDest, frequency=backupFreq) - newJob.save() - - for items in websitesToBeBacked: - jobsite = JobSites(job=newJob, website=items) - jobsite.save() + for site in backup_sites: + backup_site_job = JobSites(job=backup_job, website=site) + backup_site_job.save() final_json = json.dumps({'status': 1, 'error_message': "None"}) return HttpResponse(final_json) - - except BaseException as msg: final_json = json.dumps({'status': 0, 'error_message': str(msg)}) return HttpResponse(final_json) -def getCurrentBackupSchedules(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: +def get_current_backup_schedules(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'scheDuleBackups') == 0: return ACLManager.loadErrorJson('fetchStatus', 0) records = BackupJob.objects.all() - json_data = "[" - checker = 0 - + json_data = [] for items in records: - dic = {'id': items.id, - 'destination': items.destination, - 'frequency': items.frequency, - 'numberOfSites': items.jobsites_set.all().count() - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' + json_data.append({'id': items.id, + 'destination': items.destination, + 'frequency': items.frequency, + 'numberOfSites': items.jobsites_set.all().count() + }) final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data}) return HttpResponse(final_json) - except BaseException as msg: final_dic = {'status': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) -def fetchSites(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: +def fetch_sites(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'scheDuleBackups') == 0: return ACLManager.loadErrorJson('fetchStatus', 0) data = json.loads(request.body) job = BackupJob.objects.get(pk=data['id']) - json_data = "[" - checker = 0 - - for items in job.jobsites_set.all(): - dic = {'id': items.id, - 'website': items.website, - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' + json_data = [] + for jobsite in job.jobsites_set.all(): + json_data.append({'id': jobsite.id, + 'website': jobsite.website, + }) final_json = json.dumps({'status': 1, 'error_message': "None", "data": json_data, 'websiteData': job.websiteData, 'websiteDatabases': job.websiteDatabases, 'websiteEmails': job.websiteDataEmails}) return HttpResponse(final_json) - except BaseException as msg: final_dic = {'status': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) -def scheduleDelete(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: +def schedule_delete(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'scheDuleBackups') == 0: return ACLManager.loadErrorJson('scheduleStatus', 0) data = json.loads(request.body) - id = data['id'] + job_id = data['id'] - backupJob = BackupJob.objects.get(id=id) - backupJob.delete() + backup_job = BackupJob.objects.get(id=job_id) + backup_job.delete() final_json = json.dumps({'status': 1, 'error_message': "None"}) return HttpResponse(final_json) - except BaseException as msg: final_json = json.dumps({'status': 0, 'error_message': str(msg)}) return HttpResponse(final_json) -def restoreRemoteBackups(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createBackup') == 0: +def restore_remote_backups(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'createBackup') == 0: return ACLManager.loadError() - websitesName = ACLManager.findAllSites(currentACL, userID) + websites = ACLManager.findAllSites(current_acl, user_id) - destinations = [] + destinations = _get_destinations() - path = '/home/cyberpanel/sftp' - - if os.path.exists(path): - for items in os.listdir(path): - destinations.append('sftp:%s' % (items)) - - path = '/home/cyberpanel/aws' - if os.path.exists(path): - for items in os.listdir(path): - destinations.append('s3:s3.amazonaws.com/%s' % (items)) - - return defRenderer(request, 'IncBackups/restoreRemoteBackups.html', {'websiteList': websitesName, 'destinations': destinations}) + return def_renderer(request, 'IncBackups/restoreRemoteBackups.html', + {'websiteList': websites, 'destinations': destinations}) except BaseException as msg: logging.writeToFile(str(msg)) return redirect(loadLoginPage) -def saveChanges(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: +def save_changes(request): + try: + user_id, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'scheDuleBackups') == 0: return ACLManager.loadErrorJson('scheduleStatus', 0) data = json.loads(request.body) - id = data['id'] - try: - websiteData = data['websiteData'] - except: - websiteData = 0 - try: - websiteDatabases = data['websiteDatabases'] - except: - websiteDatabases = 0 - try: - websiteEmails = data['websiteEmails'] - except: - websiteEmails = 0 + job_id = data['id'] - job = BackupJob.objects.get(pk=id) + backup_data = data['websiteData'] if 'websiteData' in data else 0 + backup_emails = data['websiteEmails'] if 'websiteEmails' in data else 0 + backup_databases = data['websiteDatabases'] if 'websiteDatabases' in data else 0 - job.websiteData = int(websiteData) - job.websiteDatabases = int(websiteDatabases) - job.websiteDataEmails = int(websiteEmails) + job = BackupJob.objects.get(pk=job_id) + + job.websiteData = int(backup_data) + job.websiteDatabases = int(backup_databases) + job.websiteDataEmails = int(backup_emails) job.save() final_json = json.dumps({'status': 1, 'error_message': "None"}) return HttpResponse(final_json) - - except BaseException as msg: final_json = json.dumps({'status': 0, 'error_message': str(msg)}) return HttpResponse(final_json) -def removeSite(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: +def remove_site(request): + try: + _, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'scheDuleBackups') == 0: return ACLManager.loadErrorJson('scheduleStatus', 0) data = json.loads(request.body) - id = data['id'] + job_id = data['id'] website = data['website'] - - - job = BackupJob.objects.get(pk=id) - + job = BackupJob.objects.get(pk=job_id) site = JobSites.objects.get(job=job, website=website) site.delete() final_json = json.dumps({'status': 1, 'error_message': "None"}) return HttpResponse(final_json) - - except BaseException as msg: final_json = json.dumps({'status': 0, 'error_message': str(msg)}) return HttpResponse(final_json) -def addWebsite(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: +def add_website(request): + try: + _, current_acl = _get_user_acl(request) + if ACLManager.currentContextPermission(current_acl, 'scheDuleBackups') == 0: return ACLManager.loadErrorJson('scheduleStatus', 0) data = json.loads(request.body) - id = data['id'] + job_id = data['id'] website = data['website'] - - job = BackupJob.objects.get(pk=id) + job = BackupJob.objects.get(pk=job_id) try: JobSites.objects.get(job=job, website=website) - except: + except BaseException: site = JobSites(job=job, website=website) site.save() final_json = json.dumps({'status': 1, 'error_message': "None"}) return HttpResponse(final_json) - - except BaseException as msg: final_json = json.dumps({'status': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) \ No newline at end of file + return HttpResponse(final_json) diff --git a/static/IncBackups/IncBackups.js b/static/IncBackups/IncBackups.js index 32b01ef70..9031c393d 100644 --- a/static/IncBackups/IncBackups.js +++ b/static/IncBackups/IncBackups.js @@ -101,7 +101,7 @@ app.controller('createIncrementalBackups', function ($scope, $http, $timeout) { function ListInitialDatas(response) { if (response.data.status === 1) { - $scope.records = JSON.parse(response.data.data); + $scope.records = response.data.data; } else { new PNotify({ title: 'Error!', @@ -240,7 +240,7 @@ app.controller('createIncrementalBackups', function ($scope, $http, $timeout) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.jobs = JSON.parse(response.data.data); + $scope.jobs = response.data.data; } else { new PNotify({ title: 'Operation Failed!', @@ -358,7 +358,7 @@ app.controller('incrementalDestinations', function ($scope, $http) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.records = JSON.parse(response.data.data); + $scope.records = response.data.data; } else { new PNotify({ title: 'Operation Failed!', @@ -621,7 +621,7 @@ app.controller('scheduleBackupInc', function ($scope, $http) { if (response.data.status === 1) { new PNotify({ title: 'Success!', - text: 'Destination successfully removed.', + text: 'Operation successful.', type: 'success' }); } else { @@ -668,12 +668,11 @@ app.controller('scheduleBackupInc', function ($scope, $http) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.records = JSON.parse(response.data.data); - var parsed = JSON.parse(response.data.data); - - for (var j = 0; j < parsed.length; j++) { - websitesToBeBackedTemp.push(parsed[j].website); - } + let data = response.data.data; + $scope.records = data; + data.forEach(item => { + websitesToBeBackedTemp.push(item.website) + }) } else { new PNotify({ title: 'Operation Failed!', @@ -766,7 +765,7 @@ app.controller('scheduleBackupInc', function ($scope, $http) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.websites = JSON.parse(response.data.data); + $scope.websites = response.data.data; if(response.data.websiteData === 1){ $scope.websiteData = true; @@ -1074,7 +1073,7 @@ app.controller('restoreRemoteBackupsInc', function ($scope, $http, $timeout) { function ListInitialDatas(response) { $scope.cyberpanelLoading = true; if (response.data.status === 1) { - $scope.records = JSON.parse(response.data.data); + $scope.records = response.data.data; } else { new PNotify({ title: 'Error!', From a1cedf7ad8dd4200903a245f495d6b8f499911d6 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 5 Feb 2021 18:30:07 +0500 Subject: [PATCH 048/107] bug fix: add missing table --- plogical/upgrade.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plogical/upgrade.py b/plogical/upgrade.py index 3fa7f11e1..971e4187d 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -682,6 +682,19 @@ imap_folder_list_limit = 0 `config` longtext NOT NULL, PRIMARY KEY (`id`) )""" + try: + cursor.execute(query) + except: + pass + + query = """CREATE TABLE `cloudAPI_wpdeployments` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `config` longtext NOT NULL, + `owner_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `cloudAPI_wpdeploymen_owner_id_506ddf01_fk_websiteFu` (`owner_id`), + CONSTRAINT `cloudAPI_wpdeploymen_owner_id_506ddf01_fk_websiteFu` FOREIGN KEY (`owner_id`) REFERENCES `websiteFunctions_websites` (`id`) +)""" try: cursor.execute(query) From 65de8a44956bcee036dbc80a57de3ea8539ff518 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 5 Feb 2021 18:33:20 +0500 Subject: [PATCH 049/107] bug fix: wp manager config save --- cloudAPI/cloudManager.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index 5025645bf..0c192cb2d 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -2403,8 +2403,14 @@ class CloudManager: website = Websites.objects.get(domain=self.data['domainName']) domainName = self.data['domainName'] from cloudAPI.models import WPDeployments - wpd = WPDeployments.objects.get(owner=website) - config = json.loads(wpd.config) + + try: + wpd = WPDeployments.objects.get(owner=website) + config = json.loads(wpd.config) + except: + wpd = WPDeployments(owner=website) + config = {} + config['updates'] = self.data['wpCore'] config['pluginUpdates'] = self.data['plugins'] config['themeUpdates'] = self.data['themes'] From 3c85055aea382ba7ba37849d2975ab9d4e529511 Mon Sep 17 00:00:00 2001 From: Jordan Lambrecht Date: Fri, 5 Feb 2021 14:38:26 -0600 Subject: [PATCH 050/107] Added Favicon.png to admin dashboard --- baseTemplate/templates/baseTemplate/index.html | 4 +++- static/baseTemplate/assets/finalBase/favicon.png | Bin 0 -> 2448 bytes 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 static/baseTemplate/assets/finalBase/favicon.png diff --git a/baseTemplate/templates/baseTemplate/index.html b/baseTemplate/templates/baseTemplate/index.html index 915172653..1402ece59 100755 --- a/baseTemplate/templates/baseTemplate/index.html +++ b/baseTemplate/templates/baseTemplate/index.html @@ -97,6 +97,9 @@ + {% block styles %} {% endblock %} @@ -997,4 +1000,3 @@ {% endblock %} - diff --git a/static/baseTemplate/assets/finalBase/favicon.png b/static/baseTemplate/assets/finalBase/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..f72790ed54813b032ab58664123609ca4a960999 GIT binary patch literal 2448 zcmV;B32*j^P)LIQ@=E2#;1M+7`bP%%q5%FHa6*ngxNY3R;Ox4TP=Sil5n3fgOMldK88^WMa zYzTuwu_27KLUD=QLJGq?3<|}DFenro!q9}WpwTxB6njud@moD2cRwo0l>2>C;P=hS zGK+`jUZ5~C1En3-Qs%2&mz!tT6daT^z%T=)!5#43rFCtdP}NX)O?SaSNh1tBC^a6D z-Lg2~Emi)llP_N0!8_aFXJ5SxUfY;lCC*DI8GxY)#dWN@Ncnq9X!OtyzQhYKWEehK zcJ#Xx5Y!F=0G(>3`@Dh@tJ;R7nlu4ufpJtZPQYlW3U%D5b}e8HGXO$!97Y3z(+3XP zi1I%AA`Igq7mn`p1*MftFglwFOQY4k(;JWn?>~BGxC#t3MRmtu2+oKk481e)x3T~; z9+ZAsZ;>mfErl42uyl$GMc-w@otB#5WZqHIDHLyxTLl`uo&MrE%G||37fWti3LzK~ zE*yEg`j}i~^*W;d(!0Sjf(jUNyHK+Bif~t8e#-0Qkpv8Qf7PCbjvH{U1FT>kz>t(M zz*4H^YRAAnzag?q^E#s^0OJDqi6t`h>{`7BIp7%F;dicAf{2e3QNDCcQZo1(PUD2F zeF^~>?d*}r(>T}ARaZ0-6n{tsMmJc@^yJrHs(rEh@~-wpAkR3%2HWn#xrTOs$rGUX z78MvWSj_8M??VYASV~>qSW32GKw{S)p8iS{J*mRro!{zxM!XTPIp-}U+c1z%0LOhm z0|d%9{*sS53`J?L*83ictsds8rDPihL`)BY(vNGx;GL&C#o}>hJ`8Usl7EG648 zAeUGH3crv7#s#pRN6mh2yqcIR%JB^0&h3{dst%372;6%G zE2+S>j0#!q5BgdMMbJ5U=QBXryuM{P+hMA@m&E;+2dZuZMfV!D3|IZGY0CFkSIYxI zU%w=()V@$;L0%<&pzNKxK>W_HNIrz1=ztZ=NP-~~g<=O7v69H)q6r43tS;ndNC9#2 z+&V%qF0bbVBlB$s!^JbtSghX8)wL4A8IWrn#YBLJtOsM7l8Hj8t(6DCn-5xr!G@$L z84L(i!Z@!3vf-%t2W4+lbPOoE-b!c-KBF>4$he(Ut^mp4Y6BVkek-*tPd)pHn$PeBBU>RN{TU0H{r1Ep0p=@Zybjnsc!b-O1L zvyw|wmu{UadbspjtKR|T;{mpSp#i0pX=s~zm5Gb&M~17TJhzD8wDr9KAgI4b=q! zBO!};-&mD>d8UR(;Fg$xQJw-u8`QX-$MKIj4TGSioJU!)E{r#nqa0-PG8o%kV zs}S%hN8RGiaY<|Gl`1frtY+Q`K^sE>2A8)m2w6%%xxpV`yri-^xV81qkyyR6yTj7M zpwMGjCG=oqsUug!B9w?SFF_kNLHSVyi1TP`GftZ*+DaX7M(8OR7=6>1SaqEVD7`L$ z=?huU)Lt_j{6km)h4W!U=vnRHh6#w9Y+=gKk3al=MmFJNFgq4ZHAdCvNDs8-P z?3>uh4k5|gH-ggkc!Ne4;Uhfq1BRjLOXQYaRl$X$FHomqN-KaPG(b^1GjO0y4@6_- zj(ig>OYsQ4rxez)4ebl;t{Zau73(d$?}6B!@}!VB15ol4Mk*-E#yPc&8(9#%?p*x! zO&Nre-!M`@X-qy`3<=t&2mZyYGROQ>t5Layi!TLGTbiO$jqrLbTm zK}p{6+8!T9a+h>KDNGni(O1BF?Tb5}T#$^1#5*XA+=kKvCHO@SD(QuCDN&>_vIYgB zvRh0-p)k@5g>5zgg~G@t6j1&)3d2TF6rG3^hFzeb6HeizQ~Hlv>;#1hro>O3#yP{P zk>q|9Dsd>#oc*^&AU)6>>7rV+$MgmNfsL6*wPz0~)G}-Yr3czm-BerlfYO6b@}XMF zu#`7&6I2=}y3K5Fph8$;2Ufz4UI4KPqOkX^?8u@*g$flaRH#r%i~J9schw>$ATPoI O0000FkZ literal 0 HcmV?d00001 From e33538c4c4d54bd5ad2e44d99335e3211884cf90 Mon Sep 17 00:00:00 2001 From: Jordan Lambrecht Date: Fri, 5 Feb 2021 14:51:22 -0600 Subject: [PATCH 051/107] added favicon.png to the admin dashboard --- baseTemplate/templates/baseTemplate/index.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/baseTemplate/templates/baseTemplate/index.html b/baseTemplate/templates/baseTemplate/index.html index 1402ece59..8d2fb2653 100755 --- a/baseTemplate/templates/baseTemplate/index.html +++ b/baseTemplate/templates/baseTemplate/index.html @@ -97,9 +97,7 @@ - + {% block styles %} {% endblock %} From e922b47a8cdbf17632760b1b056df7d14d40b2ad Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 15 Feb 2021 20:57:30 +0500 Subject: [PATCH 052/107] bug fix: sub folder wp manager installations --- cloudAPI/cloudManager.py | 208 ++++++++++++++++++++++++------- plogical/test.py | 111 +++++++++++++++++ websiteFunctions/StagingSetup.py | 41 +++++- websiteFunctions/website.py | 1 - 4 files changed, 306 insertions(+), 55 deletions(-) diff --git a/cloudAPI/cloudManager.py b/cloudAPI/cloudManager.py index 0c192cb2d..b8a7e08e4 100755 --- a/cloudAPI/cloudManager.py +++ b/cloudAPI/cloudManager.py @@ -1961,12 +1961,22 @@ class CloudManager: ## Get versopm website = Websites.objects.get(domain=domain) - command = 'wp core version --path=/home/%s/public_html' % (domain) + + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + + command = 'wp core version --path=%s' % (path) finalDic['version'] = ProcessUtilities.outputExecutioner(command, website.externalApp) ## LSCache - command = 'wp plugin status litespeed-cache --path=/home/%s/public_html' % (domain) + command = 'wp plugin status litespeed-cache --path=%s' % (path) result = ProcessUtilities.outputExecutioner(command, website.externalApp) if result.find('Status: Active') > -1: @@ -1976,7 +1986,7 @@ class CloudManager: ## Debug - command = 'wp config list --path=/home/%s/public_html' % (domain) + command = 'wp config list --path=%s' % (path) result = ProcessUtilities.outputExecutioner(command, website.externalApp).split('\n') finalDic['debugging'] = 0 for items in result: @@ -1986,12 +1996,12 @@ class CloudManager: ## Search index - command = 'wp option get blog_public --path=/home/%s/public_html' % (domain) + command = 'wp option get blog_public --path=%s' % (path) finalDic['searchIndex'] = int(ProcessUtilities.outputExecutioner(command, website.externalApp).rstrip('\n')) ## Maintenece mode - command = 'wp maintenance-mode status --path=/home/%s/public_html' % (domain) + command = 'wp maintenance-mode status --path=%s' % (path) result = ProcessUtilities.outputExecutioner(command, website.externalApp) if result.find('not active') > -1: @@ -2001,7 +2011,7 @@ class CloudManager: ## Get title - command = 'wp option get blogname --path=/home/%s/public_html' % (domain) + command = 'wp option get blogname --path=%s' % (path) finalDic['title'] = ProcessUtilities.outputExecutioner(command, website.externalApp) ## @@ -2019,15 +2029,24 @@ class CloudManager: website = Websites.objects.get(domain=self.data['domain']) + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + ## Get title import plogical.randomPassword as randomPassword password = randomPassword.generate_pass(32) - command = 'wp user create cyberpanel support@cyberpanel.cloud --role=administrator --user_pass="%s" --path=/home/%s/public_html' % (password, self.data['domain']) + command = 'wp user create cyberpanel support@cyberpanel.cloud --role=administrator --user_pass="%s" --path=%s' % (password, path) ProcessUtilities.executioner(command, website.externalApp) - command = 'wp user update cyberpanel --user_pass="%s" --path=/home/%s/public_html' % (password, self.data['domain']) + command = 'wp user update cyberpanel --user_pass="%s" --path=%s' % (password, path) ProcessUtilities.executioner(command, website.externalApp) finalDic = {'status': 1, 'password': password} @@ -2044,20 +2063,30 @@ class CloudManager: website = Websites.objects.get(domain=self.data['domain']) domain = self.data['domain'] + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + + if self.data['setting'] == 'lscache': if self.data['settingValue']: - command = "wp plugin install litespeed-cache --path=/home/%s/public_html" % (domain) + command = "wp plugin install litespeed-cache --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) - command = "wp plugin activate litespeed-cache --path=/home/%s/public_html" % (domain) + command = "wp plugin activate litespeed-cache --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) final_dic = {'status': 1, 'message': 'LSCache successfully installed and activated.'} final_json = json.dumps(final_dic) return HttpResponse(final_json) else: - command = 'wp plugin deactivate litespeed-cache --path=/home/%s/public_html' % (domain) + command = 'wp plugin deactivate litespeed-cache --path=%s' % (path) ProcessUtilities.executioner(command, website.externalApp) final_dic = {'status': 1, 'message': 'LSCache successfully deactivated.'} @@ -2065,11 +2094,11 @@ class CloudManager: return HttpResponse(final_json) elif self.data['setting'] == 'debugging': - command = "wp litespeed-purge all --path=/home/%s/public_html" % (domain) + command = "wp litespeed-purge all --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) if self.data['settingValue']: - command = "wp config set WP_DEBUG true --path=/home/%s/public_html" % (domain) + command = "wp config set WP_DEBUG true --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) final_dic = {'status': 1, 'message': 'WordPress is now in debug mode.'} @@ -2077,7 +2106,7 @@ class CloudManager: return HttpResponse(final_json) else: - command = "wp config set WP_DEBUG false --path=/home/%s/public_html" % (domain) + command = "wp config set WP_DEBUG false --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) final_dic = {'status': 1, 'message': 'WordPress debug mode turned off.'} @@ -2085,11 +2114,11 @@ class CloudManager: return HttpResponse(final_json) elif self.data['setting'] == 'searchIndex': - command = "wp litespeed-purge all --path=/home/%s/public_html" % (domain) + command = "wp litespeed-purge all --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) if self.data['settingValue']: - command = "wp option update blog_public 1 --path=/home/%s/public_html" % (domain) + command = "wp option update blog_public 1 --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) final_dic = {'status': 1, 'message': 'Search Engine Indexing enabled.'} @@ -2097,7 +2126,7 @@ class CloudManager: return HttpResponse(final_json) else: - command = "wp option update blog_public 0 --path=/home/%s/public_html" % (domain) + command = "wp option update blog_public 0 --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) final_dic = {'status': 1, 'message': 'Search Engine Indexing disabled.'} @@ -2105,12 +2134,12 @@ class CloudManager: return HttpResponse(final_json) elif self.data['setting'] == 'maintenanceMode': - command = "wp litespeed-purge all --path=/home/%s/public_html" % (domain) + command = "wp litespeed-purge all --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) if self.data['settingValue']: - command = "wp maintenance-mode activate --path=/home/%s/public_html" % (domain) + command = "wp maintenance-mode activate --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) final_dic = {'status': 1, 'message': 'WordPress Maintenance mode turned on.'} @@ -2118,7 +2147,7 @@ class CloudManager: return HttpResponse(final_json) else: - command = "wp maintenance-mode deactivate --path=/home/%s/public_html" % (domain) + command = "wp maintenance-mode deactivate --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) final_dic = {'status': 1, 'message': 'WordPress Maintenance mode turned off.'} @@ -2131,9 +2160,20 @@ class CloudManager: def GetCurrentPlugins(self): try: website = Websites.objects.get(domain=self.data['domain']) - command = 'wp plugin list --format=json --path=/home/%s/public_html' % (self.data['domain']) + + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + + command = 'wp plugin list --format=json --path=%s' % (path) json_data = ProcessUtilities.outputExecutioner(command, website.externalApp) final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}) + return HttpResponse(final_json) except BaseException as msg: final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} @@ -2144,14 +2184,23 @@ class CloudManager: try: website = Websites.objects.get(domain=self.data['domain']) + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + if self.data['plugin'] == 'all': - command = 'wp plugin update --all --path=/home/%s/public_html' % (self.data['domain']) + command = 'wp plugin update --all --path=%s' % (path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'message': "Plugin updates started in the background."}) return HttpResponse(final_json) elif self.data['plugin'] == 'selected': if self.data['allPluginsChecked']: - command = 'wp plugin update --all --path=/home/%s/public_html' % (self.data['domain']) + command = 'wp plugin update --all --path=%s' % (path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Plugin updates started in the background."}) @@ -2162,13 +2211,13 @@ class CloudManager: for plugin in self.data['plugins']: pluginsList = '%s %s' % (pluginsList, plugin) - command = 'wp plugin update %s --path=/home/%s/public_html' % (pluginsList, self.data['domain']) + command = 'wp plugin update %s --path=%s' % (pluginsList, path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Plugin updates started in the background."}) return HttpResponse(final_json) else: - command = 'wp plugin update %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + command = 'wp plugin update %s --path=%s' % (self.data['plugin'], path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Plugin updates started in the background."}) @@ -2183,25 +2232,32 @@ class CloudManager: try: website = Websites.objects.get(domain=self.data['domain']) - command = 'wp plugin status %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + + command = 'wp plugin status %s --path=%s' % (self.data['plugin'], path) result = ProcessUtilities.outputExecutioner(command, website.externalApp) if result.find('Status: Active') > -1: - command = 'wp plugin deactivate %s --path=/home/%s/public_html' % ( - self.data['plugin'], self.data['domain']) + command = 'wp plugin deactivate %s --path=%s' % (self.data['plugin'], path) ProcessUtilities.executioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Plugin successfully deactivated."}) return HttpResponse(final_json) else: - command = 'wp plugin activate %s --path=/home/%s/public_html' % ( - self.data['plugin'], self.data['domain']) + command = 'wp plugin activate %s --path=%s' % ( + self.data['plugin'], path) ProcessUtilities.executioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Plugin successfully activated."}) return HttpResponse(final_json) - except BaseException as msg: final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) @@ -2211,19 +2267,28 @@ class CloudManager: try: website = Websites.objects.get(domain=self.data['domain']) + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + if self.data['plugin'] == 'selected': pluginsList = '' for plugin in self.data['plugins']: pluginsList = '%s %s' % (pluginsList, plugin) - command = 'wp plugin delete %s --path=/home/%s/public_html' % (pluginsList, self.data['domain']) + command = 'wp plugin delete %s --path=%s' % (pluginsList, path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Plugin deletion started in the background."}) return HttpResponse(final_json) else: - command = 'wp plugin delete %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + command = 'wp plugin delete %s --path=%s' % (self.data['plugin'], path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Plugin deletion started in the background."}) @@ -2236,8 +2301,19 @@ class CloudManager: def GetCurrentThemes(self): try: + website = Websites.objects.get(domain=self.data['domain']) - command = 'wp theme list --format=json --path=/home/%s/public_html' % (self.data['domain']) + + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + + command = 'wp theme list --format=json --path=%s' % (path) json_data = ProcessUtilities.outputExecutioner(command, website.externalApp) final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}) return HttpResponse(final_json) @@ -2250,14 +2326,23 @@ class CloudManager: try: website = Websites.objects.get(domain=self.data['domain']) + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + if self.data['plugin'] == 'all': - command = 'wp theme update --all --path=/home/%s/public_html' % (self.data['domain']) + command = 'wp theme update --all --path=%s' % (path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'message': "Theme updates started in the background."}) return HttpResponse(final_json) elif self.data['plugin'] == 'selected': if self.data['allPluginsChecked']: - command = 'wp theme update --all --path=/home/%s/public_html' % (self.data['domain']) + command = 'wp theme update --all --path=%s' % (path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Theme updates started in the background."}) @@ -2268,13 +2353,13 @@ class CloudManager: for plugin in self.data['plugins']: pluginsList = '%s %s' % (pluginsList, plugin) - command = 'wp theme update %s --path=/home/%s/public_html' % (pluginsList, self.data['domain']) + command = 'wp theme update %s --path=%s' % (pluginsList, path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Theme updates started in the background."}) return HttpResponse(final_json) else: - command = 'wp theme update %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + command = 'wp theme update %s --path=%s' % (self.data['plugin'], path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Theme updates started in the background."}) @@ -2289,19 +2374,28 @@ class CloudManager: try: website = Websites.objects.get(domain=self.data['domain']) - command = 'wp theme status %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + + command = 'wp theme status %s --path=%s' % (self.data['plugin'], path) result = ProcessUtilities.outputExecutioner(command, website.externalApp) if result.find('Status: Active') > -1: - command = 'wp theme deactivate %s --path=/home/%s/public_html' % ( - self.data['plugin'], self.data['domain']) + command = 'wp theme deactivate %s --path=%s' % ( + self.data['plugin'], path) ProcessUtilities.executioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Theme successfully deactivated."}) return HttpResponse(final_json) else: - command = 'wp theme activate %s --path=/home/%s/public_html' % ( - self.data['plugin'], self.data['domain']) + command = 'wp theme activate %s --path=%s' % ( + self.data['plugin'], path) ProcessUtilities.executioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Theme successfully activated."}) @@ -2317,19 +2411,28 @@ class CloudManager: try: website = Websites.objects.get(domain=self.data['domain']) + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + if self.data['plugin'] == 'selected': pluginsList = '' for plugin in self.data['plugins']: pluginsList = '%s %s' % (pluginsList, plugin) - command = 'wp theme delete %s --path=/home/%s/public_html' % (pluginsList, self.data['domain']) + command = 'wp theme delete %s --path=%s' % (pluginsList, path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Plugin Theme started in the background."}) return HttpResponse(final_json) else: - command = 'wp theme delete %s --path=/home/%s/public_html' % (self.data['plugin'], self.data['domain']) + command = 'wp theme delete %s --path=%s' % (self.data['plugin'], path) ProcessUtilities.popenExecutioner(command, website.externalApp) final_json = json.dumps( {'status': 1, 'fetchStatus': 1, 'message': "Theme deletion started in the background."}) @@ -2411,6 +2514,15 @@ class CloudManager: wpd = WPDeployments(owner=website) config = {} + try: + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + path = '/home/%s/public_html/%s' % (self.data['domain'], path) + + except: + path = '/home/%s/public_html' % (self.data['domain']) + config['updates'] = self.data['wpCore'] config['pluginUpdates'] = self.data['plugins'] config['themeUpdates'] = self.data['themes'] @@ -2418,13 +2530,13 @@ class CloudManager: wpd.save() if self.data['wpCore'] == 'Disabled': - command = "wp config set WP_AUTO_UPDATE_CORE false --raw --path=/home/%s/public_html" % (domainName) + command = "wp config set WP_AUTO_UPDATE_CORE false --raw --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) elif self.data['wpCore'] == 'Minor and Security Updates': - command = "wp config set WP_AUTO_UPDATE_CORE minor --allow-root --path=/home/%s/public_html" % (domainName) + command = "wp config set WP_AUTO_UPDATE_CORE minor --allow-root --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) else: - command = "wp config set WP_AUTO_UPDATE_CORE true --raw --allow-root --path=/home/%s/public_html" % (domainName) + command = "wp config set WP_AUTO_UPDATE_CORE true --raw --allow-root --path=%s" % (path) ProcessUtilities.executioner(command, website.externalApp) final_json = json.dumps( diff --git a/plogical/test.py b/plogical/test.py index e69de29bb..27be6ec77 100755 --- a/plogical/test.py +++ b/plogical/test.py @@ -0,0 +1,111 @@ +import requests +import re +import sys +import warnings +from flask import Flask, request, render_template, redirect, url_for +from io_parser import FormParser +from urllib3.exceptions import InsecureRequestWarning + +warnings.simplefilter('ignore', InsecureRequestWarning) + +app = Flask(__name__) +app.debug = True +app.config.update( + JSON_SORT_KEYS=False, + JSONIFY_PRETTYPRINT_REGULAR=True +) + +view = 'index.html' + + +@app.route('/', methods=['GET']) +def explore(): + error = { + 'types': set(), + 'input': [], + } + http = None + x_lsadc_cache, x_qc_cache, x_litespeed_cache, cf_cache_cache, browser_cache, cache_support, x_sucuri_cache = ( + False,) * 7 + fp = FormParser(host=request.args.get('host'), ip=request.args.get('ip'), + port=request.args.get('port'), + advanced=request.args.get('advanced')) + + if not fp.host: + return render_template(view, form=fp.__dict__()) + if fp.check_error(): + error['types'].add('input') + error['input'] = fp.error_msgs + return render_template(view, form=fp.__dict__(), error=error) + form = fp.__dict__() + + finalURL = '' + + if form['url'].find('http') == -1: + finalURL = 'https://%s' % (form['url']) + else: + finalURL = form['url'] + + try: + + resp = requests.get('' + (finalURL, form['ip'])[form['advanced']], headers={ + 'Host': form['host'], + 'User-Agent': 'wget/http3check.net', + }, verify=False) + + http = [key + ': ' + value for key, value in resp.headers.items() if key != 'Link'] + http.insert(0, 'HTTP/1.1 {} {}'.format(resp.status_code, resp.reason)) + for key, value in resp.headers.items(): + key = key.lower() + value = value.lower() + if key == 'x-lsadc-cache': + if value == 'hit': + x_lsadc_cache = True + cache_support = True + elif key == 'x-qc-cache': + if value == 'hit': + x_qc_cache = True + cache_support = True + elif key == 'x-litespeed-cache': + if value == 'hit': + x_litespeed_cache = True + cache_support = True + elif key == 'cf-cache-status': + if value == 'hit': + cf_cache_cache = True + elif key == 'cache-control': + if 'no-cache' not in value and 'max-age=0' not in value: + browser_cache = True + elif key == 'x-sucuri-cache': + if value == 'hit': + x_sucuri_cache = True + + finalHTTP = [] + from flask import Markup + + for items in http: + if items.lower().find('x-litespeed-cache:') > -1 or items.lower().find('x-lsadc-cache:') > -1 or items.lower().find( + 'x-qc-cache:') > -1: + finalHTTP.append(Markup('%s' % (items))) + elif items.lower().find('link:') > -1: + pass + else: + finalHTTP.append(items) + + return render_template(view, cache_support=cache_support, x_lsadc_cache=x_lsadc_cache, x_qc_cache=x_qc_cache, + x_litespeed_cache=x_litespeed_cache, cf_cache_cache=cf_cache_cache, + x_sucuri_cache=x_sucuri_cache, + browser_cache=browser_cache, form=form, http=finalHTTP) + except BaseException as msg: + return render_template(view, form={}, error=str(msg)) + + +@app.route('/', methods=['GET']) +def home(page): + if page == 'about' or page == 'about.html': + return render_template(view, about=True) + # return redirect("https://lscache.io/", code=302) + return redirect(url_for('explore')) + +if __name__ == '__main__': + app.run(host= '0.0.0.0') \ No newline at end of file diff --git a/websiteFunctions/StagingSetup.py b/websiteFunctions/StagingSetup.py index 2518104ed..7e68fe7f6 100644 --- a/websiteFunctions/StagingSetup.py +++ b/websiteFunctions/StagingSetup.py @@ -36,7 +36,17 @@ class StagingSetup(multi.Thread): website = Websites.objects.get(domain=masterDomain) - masterPath = '/home/%s/public_html' % (masterDomain) + try: + import json + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=website) + path = json.loads(wpd.config)['path'] + masterPath = '/home/%s/public_html/%s' % (masterDomain, path) + replaceDomain = '%s/%s' % (masterDomain, path) + except: + masterPath = '/home/%s/public_html' % (masterDomain) + replaceDomain = masterDomain + configPath = '%s/wp-config.php' % (masterPath) ## Check if WP Detected on Main Site @@ -114,10 +124,10 @@ class StagingSetup(multi.Thread): ## Search and replace url - command = 'wp search-replace --allow-root --path=%s "%s" "%s"' % (path, masterDomain, domain) + command = 'wp search-replace --allow-root --path=%s "%s" "%s"' % (path, replaceDomain, domain) ProcessUtilities.executioner(command) - command = 'wp search-replace --allow-root --path=%s "www.%s" "%s"' % (path, masterDomain, domain) + command = 'wp search-replace --allow-root --path=%s "www.%s" "%s"' % (path, replaceDomain, domain) ProcessUtilities.executioner(command) logging.statusWriter(tempStatusPath, 'Fixing permissions..,90') @@ -147,7 +157,17 @@ class StagingSetup(multi.Thread): child = ChildDomains.objects.get(domain=childDomain) - masterPath = '/home/%s/public_html' % (child.master.domain) + + try: + import json + from cloudAPI.models import WPDeployments + wpd = WPDeployments.objects.get(owner=child.master) + path = json.loads(wpd.config)['path'] + masterPath = '/home/%s/public_html/%s' % (child.master.domain, path) + replaceDomain = '%s/%s' % (child.master.domain, path) + except: + masterPath = '/home/%s/public_html' % (child.master.domain) + replaceDomain = child.master.domain command = 'chmod 755 /home/%s/public_html' % (child.master.domain) ProcessUtilities.executioner(command) @@ -185,10 +205,10 @@ class StagingSetup(multi.Thread): ## Search and replace url - command = 'wp search-replace --allow-root --path=%s "%s" "%s"' % (masterPath, child.domain, child.master.domain) + command = 'wp search-replace --allow-root --path=%s "%s" "%s"' % (masterPath, child.domain, replaceDomain) ProcessUtilities.executioner(command) - command = 'wp search-replace --allow-root --path=%s "www.%s" "%s"' % (masterPath, child.domain, child.master.domain) + command = 'wp search-replace --allow-root --path=%s "www.%s" "%s"' % (masterPath, child.domain, replaceDomain) ProcessUtilities.executioner(command) from filemanager.filemanager import FileManager @@ -201,6 +221,15 @@ class StagingSetup(multi.Thread): logging.statusWriter(tempStatusPath, 'Completed,[200]') + http = [] + finalHTTP = [] + + for items in http: + if items.find('x-litespeed-cache') > -1 or items.find('x-lsadc-cache') > -1 or items.find('x-qc-cache') > -1: + finalHTTP.append('%s' % (items)) + else: + finalHTTP.append(items) + return 0 except BaseException as msg: mesg = '%s. [404]' % (str(msg)) diff --git a/websiteFunctions/website.py b/websiteFunctions/website.py index 1f0720c27..32bdb4ec0 100755 --- a/websiteFunctions/website.py +++ b/websiteFunctions/website.py @@ -2701,7 +2701,6 @@ StrictHostKeyChecking no extraArgs['masterDomain'] = data['masterDomain'] extraArgs['admin'] = admin - tempStatusPath = "/tmp/" + str(randint(1000, 9999)) writeToFile = open(tempStatusPath, 'a') message = 'Cloning process has started..,5' From 638fa5bf24d71b7cfbce3ed27380456935fe7a17 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 18 Feb 2021 14:46:15 +0500 Subject: [PATCH 053/107] bug fix: add website owner email for vhost ssl config --- plogical/sslUtilities.py | 8 +++ plogical/test.py | 111 --------------------------------------- 2 files changed, 8 insertions(+), 111 deletions(-) diff --git a/plogical/sslUtilities.py b/plogical/sslUtilities.py index 961afa096..af96da488 100755 --- a/plogical/sslUtilities.py +++ b/plogical/sslUtilities.py @@ -64,6 +64,14 @@ class sslUtilities: @staticmethod def installSSLForDomain(virtualHostName, adminEmail='usman@cyberpersons.com'): + + try: + website = Websites.objects.get(domain=virtualHostName) + adminEmail = website.adminEmail + except BaseException as msg: + logging.CyberCPLogFileWriter.writeToFile('%s [installSSLForDomain:72]' % (str(msg))) + + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: confPath = sslUtilities.Server_root + "/conf/vhosts/" + virtualHostName completePathToConfigFile = confPath + "/vhost.conf" diff --git a/plogical/test.py b/plogical/test.py index 27be6ec77..e69de29bb 100755 --- a/plogical/test.py +++ b/plogical/test.py @@ -1,111 +0,0 @@ -import requests -import re -import sys -import warnings -from flask import Flask, request, render_template, redirect, url_for -from io_parser import FormParser -from urllib3.exceptions import InsecureRequestWarning - -warnings.simplefilter('ignore', InsecureRequestWarning) - -app = Flask(__name__) -app.debug = True -app.config.update( - JSON_SORT_KEYS=False, - JSONIFY_PRETTYPRINT_REGULAR=True -) - -view = 'index.html' - - -@app.route('/', methods=['GET']) -def explore(): - error = { - 'types': set(), - 'input': [], - } - http = None - x_lsadc_cache, x_qc_cache, x_litespeed_cache, cf_cache_cache, browser_cache, cache_support, x_sucuri_cache = ( - False,) * 7 - fp = FormParser(host=request.args.get('host'), ip=request.args.get('ip'), - port=request.args.get('port'), - advanced=request.args.get('advanced')) - - if not fp.host: - return render_template(view, form=fp.__dict__()) - if fp.check_error(): - error['types'].add('input') - error['input'] = fp.error_msgs - return render_template(view, form=fp.__dict__(), error=error) - form = fp.__dict__() - - finalURL = '' - - if form['url'].find('http') == -1: - finalURL = 'https://%s' % (form['url']) - else: - finalURL = form['url'] - - try: - - resp = requests.get('' + (finalURL, form['ip'])[form['advanced']], headers={ - 'Host': form['host'], - 'User-Agent': 'wget/http3check.net', - }, verify=False) - - http = [key + ': ' + value for key, value in resp.headers.items() if key != 'Link'] - http.insert(0, 'HTTP/1.1 {} {}'.format(resp.status_code, resp.reason)) - for key, value in resp.headers.items(): - key = key.lower() - value = value.lower() - if key == 'x-lsadc-cache': - if value == 'hit': - x_lsadc_cache = True - cache_support = True - elif key == 'x-qc-cache': - if value == 'hit': - x_qc_cache = True - cache_support = True - elif key == 'x-litespeed-cache': - if value == 'hit': - x_litespeed_cache = True - cache_support = True - elif key == 'cf-cache-status': - if value == 'hit': - cf_cache_cache = True - elif key == 'cache-control': - if 'no-cache' not in value and 'max-age=0' not in value: - browser_cache = True - elif key == 'x-sucuri-cache': - if value == 'hit': - x_sucuri_cache = True - - finalHTTP = [] - from flask import Markup - - for items in http: - if items.lower().find('x-litespeed-cache:') > -1 or items.lower().find('x-lsadc-cache:') > -1 or items.lower().find( - 'x-qc-cache:') > -1: - finalHTTP.append(Markup('%s' % (items))) - elif items.lower().find('link:') > -1: - pass - else: - finalHTTP.append(items) - - return render_template(view, cache_support=cache_support, x_lsadc_cache=x_lsadc_cache, x_qc_cache=x_qc_cache, - x_litespeed_cache=x_litespeed_cache, cf_cache_cache=cf_cache_cache, - x_sucuri_cache=x_sucuri_cache, - browser_cache=browser_cache, form=form, http=finalHTTP) - except BaseException as msg: - return render_template(view, form={}, error=str(msg)) - - -@app.route('/', methods=['GET']) -def home(page): - if page == 'about' or page == 'about.html': - return render_template(view, about=True) - # return redirect("https://lscache.io/", code=302) - return redirect(url_for('explore')) - -if __name__ == '__main__': - app.run(host= '0.0.0.0') \ No newline at end of file From d927423fd4c5806a032cc51480160e1b3904db50 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 18 Feb 2021 14:56:01 +0500 Subject: [PATCH 054/107] add config to administrator --- loginSystem/models.py | 1 + plogical/upgrade.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/loginSystem/models.py b/loginSystem/models.py index abd302914..ba109d9da 100755 --- a/loginSystem/models.py +++ b/loginSystem/models.py @@ -93,6 +93,7 @@ class Administrator(models.Model): acl = models.ForeignKey(ACL, default=1, on_delete=models.PROTECT) twoFA = models.IntegerField(default=0) secretKey = models.CharField(max_length=50, default='None') + config = models.TextField() diff --git a/plogical/upgrade.py b/plogical/upgrade.py index 971e4187d..65aecd7e4 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -1210,6 +1210,11 @@ imap_folder_list_limit = 0 except: pass + try: + cursor.execute('ALTER TABLE loginSystem_administrator ADD config longtext') + except: + pass + try: cursor.execute('ALTER TABLE dockerManager_containers ADD volumes longtext') except: From 99be482b2c1bbf7f66034c678bd8d48c81670a94 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Thu, 18 Feb 2021 23:43:59 +0500 Subject: [PATCH 055/107] add config to administrator --- loginSystem/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loginSystem/models.py b/loginSystem/models.py index ba109d9da..74c64c4e0 100755 --- a/loginSystem/models.py +++ b/loginSystem/models.py @@ -93,7 +93,7 @@ class Administrator(models.Model): acl = models.ForeignKey(ACL, default=1, on_delete=models.PROTECT) twoFA = models.IntegerField(default=0) secretKey = models.CharField(max_length=50, default='None') - config = models.TextField() + config = models.TextField(default='{}') From 982627f388565eb7d56fd64a8c68c72b408ed0cc Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 19 Feb 2021 15:56:19 +0500 Subject: [PATCH 056/107] improvement: cron interface --- static/websiteFunctions/websiteFunctions.js | 4 +++- .../websiteFunctions/websiteFunctions.js | 4 +++- .../templates/websiteFunctions/listCron.html | 19 +++++-------------- .../templates/websiteFunctions/website.html | 4 ++-- websiteFunctions/website.py | 10 +++++++++- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/static/websiteFunctions/websiteFunctions.js b/static/websiteFunctions/websiteFunctions.js index d1f948405..ca0fed440 100644 --- a/static/websiteFunctions/websiteFunctions.js +++ b/static/websiteFunctions/websiteFunctions.js @@ -2830,6 +2830,8 @@ app.controller('manageCronController', function ($scope, $http) { $("#cronEditSuccess").hide(); $("#fetchCronFailure").hide(); + $scope.websiteToBeModified = $("#domain").text(); + $scope.fetchWebsites = function () { $("#manageCronLoading").show(); @@ -2880,6 +2882,7 @@ app.controller('manageCronController', function ($scope, $http) { $("#cronEditSuccess").hide(); } }; + $scope.fetchWebsites(); $scope.fetchCron = function (cronLine) { @@ -3033,7 +3036,6 @@ app.controller('manageCronController', function ($scope, $http) { } }; - $scope.removeCron = function (line) { $("#manageCronLoading").show(); diff --git a/websiteFunctions/static/websiteFunctions/websiteFunctions.js b/websiteFunctions/static/websiteFunctions/websiteFunctions.js index d1f948405..ca0fed440 100755 --- a/websiteFunctions/static/websiteFunctions/websiteFunctions.js +++ b/websiteFunctions/static/websiteFunctions/websiteFunctions.js @@ -2830,6 +2830,8 @@ app.controller('manageCronController', function ($scope, $http) { $("#cronEditSuccess").hide(); $("#fetchCronFailure").hide(); + $scope.websiteToBeModified = $("#domain").text(); + $scope.fetchWebsites = function () { $("#manageCronLoading").show(); @@ -2880,6 +2882,7 @@ app.controller('manageCronController', function ($scope, $http) { $("#cronEditSuccess").hide(); } }; + $scope.fetchWebsites(); $scope.fetchCron = function (cronLine) { @@ -3033,7 +3036,6 @@ app.controller('manageCronController', function ($scope, $http) { } }; - $scope.removeCron = function (line) { $("#manageCronLoading").show(); diff --git a/websiteFunctions/templates/websiteFunctions/listCron.html b/websiteFunctions/templates/websiteFunctions/listCron.html index 44e9a1fd2..e03076a98 100755 --- a/websiteFunctions/templates/websiteFunctions/listCron.html +++ b/websiteFunctions/templates/websiteFunctions/listCron.html @@ -16,27 +16,19 @@

- {% trans "Cron Management" %} + {% trans "Cron Management" %} - {{ domain }}

- -
- -
- -
- - +
+
@@ -74,7 +66,6 @@
-
diff --git a/websiteFunctions/templates/websiteFunctions/website.html b/websiteFunctions/templates/websiteFunctions/website.html index 9e9459d46..d28d5a925 100755 --- a/websiteFunctions/templates/websiteFunctions/website.html +++ b/websiteFunctions/templates/websiteFunctions/website.html @@ -272,11 +272,11 @@
- - {% trans "Cron Jobs" %} diff --git a/websiteFunctions/website.py b/websiteFunctions/website.py index 32bdb4ec0..082de360c 100755 --- a/websiteFunctions/website.py +++ b/websiteFunctions/website.py @@ -131,9 +131,17 @@ class WebsiteManager: def listCron(self, request=None, userID=None, data=None): try: + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + + if ACLManager.checkOwnership(request.GET.get('domain'), admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() + websitesName = ACLManager.findAllSites(currentACL, userID) - return render(request, 'websiteFunctions/listCron.html', {'websiteList': websitesName}) + return render(request, 'websiteFunctions/listCron.html', {'domain': request.GET.get('domain'), 'websiteList': websitesName}) except BaseException as msg: return HttpResponse(str(msg)) From a333adcaf72183f98821bc8ee1f66df5b132a83a Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 19 Feb 2021 21:52:11 +0500 Subject: [PATCH 057/107] feature: add search and ordering to dropdowns --- .../baseTemplate/custom-js/system-status.js | 17 ++++ .../templates/baseTemplate/index.html | 3 +- databases/static/databases/databases.js | 92 +++++++++---------- .../templates/databases/createDatabase.html | 41 ++------- ftp/static/ftp/ftp.js | 70 +++++++------- ftp/templates/ftp/createFTPAccount.html | 35 ++----- plogical/acl.py | 33 ++++--- .../baseTemplate/custom-js/system-status.js | 17 ++++ static/databases/databases.js | 92 +++++++++---------- static/ftp/ftp.js | 70 +++++++------- websiteFunctions/website.py | 3 +- 11 files changed, 225 insertions(+), 248 deletions(-) diff --git a/baseTemplate/static/baseTemplate/custom-js/system-status.js b/baseTemplate/static/baseTemplate/custom-js/system-status.js index 41680df3f..1f6fe8d9d 100755 --- a/baseTemplate/static/baseTemplate/custom-js/system-status.js +++ b/baseTemplate/static/baseTemplate/custom-js/system-status.js @@ -98,6 +98,23 @@ app.filter('getwebsitename', function () { }; }); +function getWebsiteName(domain){ + if (domain !== undefined) { + + domain = domain.replace(/-/g, ''); + + var domainName = domain.split("."); + + var finalDomainName = domainName[0]; + + if (finalDomainName.length > 5) { + finalDomainName = finalDomainName.substring(0, 4); + } + + return finalDomainName; + } +} + app.controller('systemStatusInfo', function ($scope, $http, $timeout) { //getStuff(); diff --git a/baseTemplate/templates/baseTemplate/index.html b/baseTemplate/templates/baseTemplate/index.html index 8d2fb2653..357572f37 100755 --- a/baseTemplate/templates/baseTemplate/index.html +++ b/baseTemplate/templates/baseTemplate/index.html @@ -98,7 +98,7 @@ - + {% block styles %} {% endblock %} @@ -963,6 +963,7 @@ + diff --git a/databases/static/databases/databases.js b/databases/static/databases/databases.js index d42958142..7b10cf48a 100755 --- a/databases/static/databases/databases.js +++ b/databases/static/databases/databases.js @@ -6,25 +6,31 @@ /* Java script code to create database */ app.controller('createDatabase', function ($scope, $http) { - $scope.createDatabaseLoading = true; - $scope.dbDetails = true; - $scope.databaseCreationFailed = true; - $scope.databaseCreated = true; - $scope.couldNotConnect = true; - $scope.generatedPasswordView = true; + $(document).ready(function () { + $(".dbDetails").hide(); + $(".generatedPasswordDetails").hide(); + $('#create-database-select').select2(); + }); + + $('#create-database-select').on('select2:select', function (e) { + var data = e.params.data; + $scope.databaseWebsite = data.text; + $(".dbDetails").show(); + $("#domainDatabase").text(getWebsiteName(data.text)); + $("#domainUsername").text(getWebsiteName(data.text)); + }); $scope.showDetailsBoxes = function () { $scope.dbDetails = false; - }; + } + + $scope.createDatabaseLoading = true; $scope.createDatabase = function () { $scope.createDatabaseLoading = false; $scope.dbDetails = false; - $scope.databaseCreationFailed = true; - $scope.databaseCreated = true; - $scope.couldNotConnect = true; var databaseWebsite = $scope.databaseWebsite; @@ -65,26 +71,24 @@ app.controller('createDatabase', function ($scope, $http) { function ListInitialDatas(response) { - if (response.data.createDBStatus == 1) { + if (response.data.createDBStatus === 1) { $scope.createDatabaseLoading = true; $scope.dbDetails = false; - $scope.databaseCreationFailed = true; - $scope.databaseCreated = false; - $scope.couldNotConnect = true; - - - } - - else { - + new PNotify({ + title: 'Success!', + text: 'Database successfully created.', + type: 'success' + }); + } else { $scope.createDatabaseLoading = true; $scope.dbDetails = false; - $scope.databaseCreationFailed = false; - $scope.databaseCreated = true; - $scope.couldNotConnect = true; - $scope.errorMessage = response.data.error_message; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); } @@ -96,21 +100,23 @@ app.controller('createDatabase', function ($scope, $http) { $scope.createDatabaseLoading = true; $scope.dbDetails = true; - $scope.databaseCreationFailed = true; - $scope.databaseCreated = true; - $scope.couldNotConnect = false; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); } }; $scope.generatePassword = function () { - $scope.generatedPasswordView = false; + $(".generatedPasswordDetails").show(); $scope.dbPassword = randomPassword(16); }; $scope.usePassword = function () { - $scope.generatedPasswordView = true; + $(".generatedPasswordDetails").hide(); }; }); @@ -170,9 +176,7 @@ app.controller('deleteDatabase', function ($scope, $http) { $scope.couldNotConnect = true; - } - - else { + } else { $scope.deleteDatabaseLoading = true; $scope.fetchedDatabases = true; $scope.databaseDeletionFailed = false; @@ -240,9 +244,7 @@ app.controller('deleteDatabase', function ($scope, $http) { $scope.couldNotConnect = true; - } - - else { + } else { $scope.deleteDatabaseLoading = true; $scope.fetchedDatabases = true; $scope.databaseDeletionFailed = false; @@ -344,8 +346,7 @@ app.controller('listDBs', function ($scope, $http) { $scope.dbLoading = true; $scope.domainFeteched = $scope.selectedDomain; - } - else { + } else { $scope.notificationsBox = false; $scope.canNotChangePassword = false; $scope.dbLoading = true; @@ -411,8 +412,7 @@ app.controller('listDBs', function ($scope, $http) { $scope.domainFeteched = $scope.selectedDomain; - } - else { + } else { $scope.recordsFetched = true; $scope.passwordChanged = true; $scope.canNotChangePassword = true; @@ -481,8 +481,7 @@ app.controller('listDBs', function ($scope, $http) { $scope.dbHost = response.data.dbHost; - } - else { + } else { new PNotify({ title: 'Operation Failed!', text: response.data.error_message, @@ -537,8 +536,7 @@ app.controller('listDBs', function ($scope, $http) { type: 'success' }); - } - else { + } else { new PNotify({ title: 'Operation Failed!', text: response.data.error_message, @@ -570,7 +568,7 @@ app.controller('listDBs', function ($scope, $http) { app.controller('phpMyAdmin', function ($scope, $http, $window) { $scope.cyberPanelLoading = true; - $scope.generateAccess = function() { + $scope.generateAccess = function () { $scope.cyberPanelLoading = false; @@ -593,12 +591,14 @@ app.controller('phpMyAdmin', function ($scope, $http, $window) { if (response.data.status === 1) { var rUrl = '/phpmyadmin/phpmyadminsignin.php?username=' + response.data.username + '&token=' + response.data.token; $window.location.href = rUrl; + } else { } - else {} } - function cantLoadInitialDatas(response) {$scope.cyberPanelLoading = true;} + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + } } diff --git a/databases/templates/databases/createDatabase.html b/databases/templates/databases/createDatabase.html index ab809bba2..14f5451bb 100755 --- a/databases/templates/databases/createDatabase.html +++ b/databases/templates/databases/createDatabase.html @@ -25,7 +25,7 @@
- {% for items in websitesList %} {% endfor %} @@ -35,24 +35,23 @@ - -
+
-
{$databaseWebsite|getwebsitename$}_{$ dbName $}
+
_{$ dbName $}
-
+
-
{$databaseWebsite|getwebsitename$}_{$ dbUsername $}
+
_{$ dbUsername $}
-
+
@@ -62,7 +61,7 @@
-
+
@@ -73,37 +72,13 @@
-
+
- - -
- -
-
-

{% trans "Cannot create database. Error message:" %} {$ errorMessage $}

-
- -
-

{% trans "Database created successfully." %}

-
- - -
-

{% trans "Could not connect to server. Please refresh this page." %}

-
-
- - - -
- - diff --git a/ftp/static/ftp/ftp.js b/ftp/static/ftp/ftp.js index a80377e6b..113845c8f 100755 --- a/ftp/static/ftp/ftp.js +++ b/ftp/static/ftp/ftp.js @@ -6,22 +6,22 @@ /* Java script code to create account */ app.controller('createFTPAccount', function ($scope, $http) { + + + $(document).ready(function () { + $( ".ftpDetails" ).hide(); + $( ".ftpPasswordView" ).hide(); + $('.create-ftp-acct-select').select2(); + }); + + $('.create-ftp-acct-select').on('select2:select', function (e) { + var data = e.params.data; + $scope.ftpDomain = data.text; + $( ".ftpDetails" ).show(); + + }); + $scope.ftpLoading = true; - $scope.ftpDetails = true; - $scope.canNotCreate = true; - $scope.successfullyCreated = true; - $scope.couldNotConnect = true; - - $scope.showFTPDetails = function () { - - $scope.ftpLoading = true; - $scope.ftpDetails = false; - $scope.canNotCreate = true; - $scope.successfullyCreated = true; - $scope.couldNotConnect = true; - - - }; $scope.createFTPAccount = function () { @@ -62,37 +62,35 @@ app.controller('createFTPAccount', function ($scope, $http) { function ListInitialDatas(response) { - if (response.data.creatFTPStatus == 1) { - + if (response.data.creatFTPStatus === 1) { $scope.ftpLoading = true; - $scope.ftpDetails = false; - $scope.canNotCreate = true; - $scope.successfullyCreated = false; - $scope.couldNotConnect = true; + new PNotify({ + title: 'Success!', + text: 'FTP account successfully created.', + type: 'success' + }); } else { $scope.ftpLoading = true; - $scope.ftpDetails = false; - $scope.canNotCreate = false; - $scope.successfullyCreated = true; - $scope.couldNotConnect = true; - - $scope.errorMessage = response.data.error_message; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); } - } - function cantLoadInitialDatas(response) { $scope.ftpLoading = true; - $scope.ftpDetails = false; - $scope.canNotCreate = true; - $scope.successfullyCreated = true; - $scope.couldNotConnect = false; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); } @@ -109,15 +107,13 @@ app.controller('createFTPAccount', function ($scope, $http) { /// - $scope.generatedPasswordView = true; - $scope.generatePassword = function () { - $scope.generatedPasswordView = false; + $( ".ftpPasswordView" ).show(); $scope.ftpPassword = randomPassword(16); }; $scope.usePassword = function () { - $scope.generatedPasswordView = true; + $(".ftpPasswordView" ).hide(); }; }); diff --git a/ftp/templates/ftp/createFTPAccount.html b/ftp/templates/ftp/createFTPAccount.html index d82425c7b..eb32ccad3 100755 --- a/ftp/templates/ftp/createFTPAccount.html +++ b/ftp/templates/ftp/createFTPAccount.html @@ -41,7 +41,7 @@
- {% for items in websiteList %} {% endfor %} @@ -53,7 +53,7 @@ -
+
-
+
@@ -74,7 +74,7 @@
-
+
-
+
-
+
-
- -
-
-

{% trans "Cannot create FTP account. Error message:" %} {$ errorMessage - $}

-
- -
-

{% trans "FTP Account with username:" %} {$ ftpUserName - $} {% trans "is successfully created." %}

-
-
-

{% trans "FTP Account with username:" %} {$ ftpUserName - $} {% trans "is successfully created." %}

-
- -
- - -
- - {% endif %} diff --git a/plogical/acl.py b/plogical/acl.py index e02c95782..b87a85f72 100755 --- a/plogical/acl.py +++ b/plogical/acl.py @@ -409,35 +409,34 @@ class ACLManager: websiteNames = [] if currentACL['admin'] == 1: - allWebsites = Websites.objects.all() + allWebsites = Websites.objects.all().order_by('domain') for items in allWebsites: websiteNames.append(items.domain) if fetchChilds: - for child in items.childdomains_set.all(): + 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() + 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(): + for child in items.childdomains_set.all().order_by('domain'): websiteNames.append(child.domain) for items in admins: - webs = items.websites_set.all() + 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(): + for child in web.childdomains_set.all().order_by('domain'): websiteNames.append(child.domain) @@ -469,13 +468,13 @@ class ACLManager: @staticmethod def findWebsiteObjects(currentACL, userID): if currentACL['admin'] == 1: - return Websites.objects.all() + return Websites.objects.all().order_by('domain') else: websiteList = [] admin = Administrator.objects.get(pk=userID) - websites = admin.websites_set.all() + websites = admin.websites_set.all().order_by('domain') for items in websites: websiteList.append(items) @@ -483,7 +482,7 @@ class ACLManager: admins = Administrator.objects.filter(owner=admin.pk) for items in admins: - webs = items.websites_set.all() + webs = items.websites_set.all().order_by('domain') for web in webs: websiteList.append(web) @@ -494,12 +493,12 @@ class ACLManager: domainsList = [] if currentACL['admin'] == 1: - domains = Websites.objects.all() + 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() + domains = admin.websites_set.all().order_by('domain') for items in domains: domainsList.append(items.domain) @@ -507,7 +506,7 @@ class ACLManager: admins = Administrator.objects.filter(owner=admin.pk) for items in admins: - doms = items.websites_set.all() + doms = items.websites_set.all().order_by('domain') for dom in doms: domainsList.append(dom.domain) @@ -518,12 +517,12 @@ class ACLManager: domainsList = [] if currentACL['admin'] == 1: - domains = Websites.objects.order_by('domain').all() + 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() + domains = admin.websites_set.all().order_by('domain') for items in domains: domainsList.append(items.domain) @@ -531,7 +530,7 @@ class ACLManager: admins = Administrator.objects.filter(owner=admin.pk) for items in admins: - doms = items.websites_set.all() + doms = items.websites_set.all().order_by('domain') for dom in doms: domainsList.append(dom.domain) return domainsList @@ -675,7 +674,7 @@ class ACLManager: for items in websiteNames: website = Websites.objects.get(domain = items) - for childDomain in website.childdomains_set.all(): + for childDomain in website.childdomains_set.all().order_by('domain'): childDomains.append(childDomain.domain) return childDomains diff --git a/static/baseTemplate/custom-js/system-status.js b/static/baseTemplate/custom-js/system-status.js index 41680df3f..1f6fe8d9d 100644 --- a/static/baseTemplate/custom-js/system-status.js +++ b/static/baseTemplate/custom-js/system-status.js @@ -98,6 +98,23 @@ app.filter('getwebsitename', function () { }; }); +function getWebsiteName(domain){ + if (domain !== undefined) { + + domain = domain.replace(/-/g, ''); + + var domainName = domain.split("."); + + var finalDomainName = domainName[0]; + + if (finalDomainName.length > 5) { + finalDomainName = finalDomainName.substring(0, 4); + } + + return finalDomainName; + } +} + app.controller('systemStatusInfo', function ($scope, $http, $timeout) { //getStuff(); diff --git a/static/databases/databases.js b/static/databases/databases.js index d42958142..7b10cf48a 100644 --- a/static/databases/databases.js +++ b/static/databases/databases.js @@ -6,25 +6,31 @@ /* Java script code to create database */ app.controller('createDatabase', function ($scope, $http) { - $scope.createDatabaseLoading = true; - $scope.dbDetails = true; - $scope.databaseCreationFailed = true; - $scope.databaseCreated = true; - $scope.couldNotConnect = true; - $scope.generatedPasswordView = true; + $(document).ready(function () { + $(".dbDetails").hide(); + $(".generatedPasswordDetails").hide(); + $('#create-database-select').select2(); + }); + + $('#create-database-select').on('select2:select', function (e) { + var data = e.params.data; + $scope.databaseWebsite = data.text; + $(".dbDetails").show(); + $("#domainDatabase").text(getWebsiteName(data.text)); + $("#domainUsername").text(getWebsiteName(data.text)); + }); $scope.showDetailsBoxes = function () { $scope.dbDetails = false; - }; + } + + $scope.createDatabaseLoading = true; $scope.createDatabase = function () { $scope.createDatabaseLoading = false; $scope.dbDetails = false; - $scope.databaseCreationFailed = true; - $scope.databaseCreated = true; - $scope.couldNotConnect = true; var databaseWebsite = $scope.databaseWebsite; @@ -65,26 +71,24 @@ app.controller('createDatabase', function ($scope, $http) { function ListInitialDatas(response) { - if (response.data.createDBStatus == 1) { + if (response.data.createDBStatus === 1) { $scope.createDatabaseLoading = true; $scope.dbDetails = false; - $scope.databaseCreationFailed = true; - $scope.databaseCreated = false; - $scope.couldNotConnect = true; - - - } - - else { - + new PNotify({ + title: 'Success!', + text: 'Database successfully created.', + type: 'success' + }); + } else { $scope.createDatabaseLoading = true; $scope.dbDetails = false; - $scope.databaseCreationFailed = false; - $scope.databaseCreated = true; - $scope.couldNotConnect = true; - $scope.errorMessage = response.data.error_message; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); } @@ -96,21 +100,23 @@ app.controller('createDatabase', function ($scope, $http) { $scope.createDatabaseLoading = true; $scope.dbDetails = true; - $scope.databaseCreationFailed = true; - $scope.databaseCreated = true; - $scope.couldNotConnect = false; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); } }; $scope.generatePassword = function () { - $scope.generatedPasswordView = false; + $(".generatedPasswordDetails").show(); $scope.dbPassword = randomPassword(16); }; $scope.usePassword = function () { - $scope.generatedPasswordView = true; + $(".generatedPasswordDetails").hide(); }; }); @@ -170,9 +176,7 @@ app.controller('deleteDatabase', function ($scope, $http) { $scope.couldNotConnect = true; - } - - else { + } else { $scope.deleteDatabaseLoading = true; $scope.fetchedDatabases = true; $scope.databaseDeletionFailed = false; @@ -240,9 +244,7 @@ app.controller('deleteDatabase', function ($scope, $http) { $scope.couldNotConnect = true; - } - - else { + } else { $scope.deleteDatabaseLoading = true; $scope.fetchedDatabases = true; $scope.databaseDeletionFailed = false; @@ -344,8 +346,7 @@ app.controller('listDBs', function ($scope, $http) { $scope.dbLoading = true; $scope.domainFeteched = $scope.selectedDomain; - } - else { + } else { $scope.notificationsBox = false; $scope.canNotChangePassword = false; $scope.dbLoading = true; @@ -411,8 +412,7 @@ app.controller('listDBs', function ($scope, $http) { $scope.domainFeteched = $scope.selectedDomain; - } - else { + } else { $scope.recordsFetched = true; $scope.passwordChanged = true; $scope.canNotChangePassword = true; @@ -481,8 +481,7 @@ app.controller('listDBs', function ($scope, $http) { $scope.dbHost = response.data.dbHost; - } - else { + } else { new PNotify({ title: 'Operation Failed!', text: response.data.error_message, @@ -537,8 +536,7 @@ app.controller('listDBs', function ($scope, $http) { type: 'success' }); - } - else { + } else { new PNotify({ title: 'Operation Failed!', text: response.data.error_message, @@ -570,7 +568,7 @@ app.controller('listDBs', function ($scope, $http) { app.controller('phpMyAdmin', function ($scope, $http, $window) { $scope.cyberPanelLoading = true; - $scope.generateAccess = function() { + $scope.generateAccess = function () { $scope.cyberPanelLoading = false; @@ -593,12 +591,14 @@ app.controller('phpMyAdmin', function ($scope, $http, $window) { if (response.data.status === 1) { var rUrl = '/phpmyadmin/phpmyadminsignin.php?username=' + response.data.username + '&token=' + response.data.token; $window.location.href = rUrl; + } else { } - else {} } - function cantLoadInitialDatas(response) {$scope.cyberPanelLoading = true;} + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = true; + } } diff --git a/static/ftp/ftp.js b/static/ftp/ftp.js index a80377e6b..113845c8f 100644 --- a/static/ftp/ftp.js +++ b/static/ftp/ftp.js @@ -6,22 +6,22 @@ /* Java script code to create account */ app.controller('createFTPAccount', function ($scope, $http) { + + + $(document).ready(function () { + $( ".ftpDetails" ).hide(); + $( ".ftpPasswordView" ).hide(); + $('.create-ftp-acct-select').select2(); + }); + + $('.create-ftp-acct-select').on('select2:select', function (e) { + var data = e.params.data; + $scope.ftpDomain = data.text; + $( ".ftpDetails" ).show(); + + }); + $scope.ftpLoading = true; - $scope.ftpDetails = true; - $scope.canNotCreate = true; - $scope.successfullyCreated = true; - $scope.couldNotConnect = true; - - $scope.showFTPDetails = function () { - - $scope.ftpLoading = true; - $scope.ftpDetails = false; - $scope.canNotCreate = true; - $scope.successfullyCreated = true; - $scope.couldNotConnect = true; - - - }; $scope.createFTPAccount = function () { @@ -62,37 +62,35 @@ app.controller('createFTPAccount', function ($scope, $http) { function ListInitialDatas(response) { - if (response.data.creatFTPStatus == 1) { - + if (response.data.creatFTPStatus === 1) { $scope.ftpLoading = true; - $scope.ftpDetails = false; - $scope.canNotCreate = true; - $scope.successfullyCreated = false; - $scope.couldNotConnect = true; + new PNotify({ + title: 'Success!', + text: 'FTP account successfully created.', + type: 'success' + }); } else { $scope.ftpLoading = true; - $scope.ftpDetails = false; - $scope.canNotCreate = false; - $scope.successfullyCreated = true; - $scope.couldNotConnect = true; - - $scope.errorMessage = response.data.error_message; + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); } - } - function cantLoadInitialDatas(response) { $scope.ftpLoading = true; - $scope.ftpDetails = false; - $scope.canNotCreate = true; - $scope.successfullyCreated = true; - $scope.couldNotConnect = false; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); } @@ -109,15 +107,13 @@ app.controller('createFTPAccount', function ($scope, $http) { /// - $scope.generatedPasswordView = true; - $scope.generatePassword = function () { - $scope.generatedPasswordView = false; + $( ".ftpPasswordView" ).show(); $scope.ftpPassword = randomPassword(16); }; $scope.usePassword = function () { - $scope.generatedPasswordView = true; + $(".ftpPasswordView" ).hide(); }; }); diff --git a/websiteFunctions/website.py b/websiteFunctions/website.py index 082de360c..13e27403d 100755 --- a/websiteFunctions/website.py +++ b/websiteFunctions/website.py @@ -140,8 +140,7 @@ class WebsiteManager: else: return ACLManager.loadError() - websitesName = ACLManager.findAllSites(currentACL, userID) - return render(request, 'websiteFunctions/listCron.html', {'domain': request.GET.get('domain'), 'websiteList': websitesName}) + return render(request, 'websiteFunctions/listCron.html', {'domain': request.GET.get('domain')}) except BaseException as msg: return HttpResponse(str(msg)) From 44d1558af21e83dd0e4f421cb36183fbcfc206b2 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 21 Feb 2021 13:09:50 +0500 Subject: [PATCH 058/107] change acl permissions to json --- backup/static/backup/backup.js | 21 +++-- backup/templates/backup/backup.html | 6 +- .../templates/baseTemplate/homePage.html | 1 - .../templates/baseTemplate/index.html | 65 ++++++-------- loginSystem/models.py | 3 + plogical/acl.py | 0 plogical/httpProc.py | 24 +++++ plogical/test.py | 0 plogical/test1.py | 0 plogical/upgrade.py | 90 ++++++++++++++----- plogical/virtualHostUtilities.py | 0 .../templates/websiteFunctions/listCron.html | 0 12 files changed, 141 insertions(+), 69 deletions(-) mode change 100755 => 100644 plogical/acl.py mode change 100755 => 100644 plogical/test.py mode change 100755 => 100644 plogical/test1.py mode change 100755 => 100644 plogical/virtualHostUtilities.py mode change 100755 => 100644 websiteFunctions/templates/websiteFunctions/listCron.html diff --git a/backup/static/backup/backup.js b/backup/static/backup/backup.js index 9105a96c5..49980c5f9 100755 --- a/backup/static/backup/backup.js +++ b/backup/static/backup/backup.js @@ -6,6 +6,21 @@ app.controller('backupWebsiteControl', function ($scope, $http, $timeout) { + $(document).ready(function () { + $(".destinationHide").hide(); + $('#create-backup-select').select2(); + }); + + $('#create-backup-select').on('select2:select', function (e) { + var data = e.params.data; + $scope.websiteToBeBacked = data.text; + $(".destinationHide").show(); + getBackupStatus(); + populateCurrentRecords(); + $scope.destination = false; + $scope.runningBackup = true; + }); + $scope.destination = true; $scope.backupButton = true; $scope.backupLoading = true; @@ -43,7 +58,6 @@ app.controller('backupWebsiteControl', function ($scope, $http, $timeout) { }; - function getBackupStatus() { $scope.backupLoadingBottom = false; @@ -111,12 +125,10 @@ app.controller('backupWebsiteControl', function ($scope, $http, $timeout) { }; - $scope.destinationSelection = function () { $scope.backupButton = false; }; - function populateCurrentRecords() { var websiteToBeBacked = $scope.websiteToBeBacked; @@ -152,7 +164,6 @@ app.controller('backupWebsiteControl', function ($scope, $http, $timeout) { }; - $scope.createBackup = function () { var websiteToBeBacked = $scope.websiteToBeBacked; @@ -189,10 +200,8 @@ app.controller('backupWebsiteControl', function ($scope, $http, $timeout) { }; - $scope.deleteBackup = function (id) { - url = "/backup/deleteBackup"; var data = { diff --git a/backup/templates/backup/backup.html b/backup/templates/backup/backup.html index 5d83cb414..76dc4a5bc 100755 --- a/backup/templates/backup/backup.html +++ b/backup/templates/backup/backup.html @@ -29,7 +29,7 @@
- {% for items in websiteList %} {% endfor %} @@ -37,7 +37,7 @@
-
+
+ {% trans "Google Drive Backups" %} + +
+
+
diff --git a/userManagment/templates/userManagment/modifyACL.html b/userManagment/templates/userManagment/modifyACL.html index e2043cedc..9c1f3156d 100755 --- a/userManagment/templates/userManagment/modifyACL.html +++ b/userManagment/templates/userManagment/modifyACL.html @@ -357,6 +357,17 @@
+ + +
+
+ +
+
+
diff --git a/userManagment/views.py b/userManagment/views.py index 0a9100e2f..01256fd46 100755 --- a/userManagment/views.py +++ b/userManagment/views.py @@ -514,74 +514,12 @@ def createACLFunc(request): ## Version Management - newACL = ACL(name=data['aclName'], - adminStatus=int(data['makeAdmin']), + if data['makeAdmin']: + data['adminStatus'] = 1 + else: + data['adminStatus'] = 0 - versionManagement=int(data['versionManagement']), - - ## User Management - createNewUser=int(data['createNewUser']), - listUsers=int(data['listUsers']), - resellerCenter=int(data['resellerCenter']), - deleteUser=int(data['deleteUser']), - changeUserACL=int(data['changeUserACL']), - - ## Website Management - - createWebsite=int(data['createWebsite']), - modifyWebsite=int(data['modifyWebsite']), - suspendWebsite=int(data['suspendWebsite']), - deleteWebsite=int(data['deleteWebsite']), - - ## Package Management - - createPackage=int(data['createPackage']), - listPackages=int(data['listPackages']), - deletePackage=int(data['deletePackage']), - modifyPackage=int(data['modifyPackage']), - - ## Database Management - - createDatabase=int(data['createDatabase']), - deleteDatabase=int(data['deleteDatabase']), - listDatabases=int(data['listDatabases']), - - ## DNS Management - - createNameServer=int(data['createNameServer']), - createDNSZone=int(data['createDNSZone']), - deleteZone=int(data['deleteZone']), - addDeleteRecords=int(data['addDeleteRecords']), - - ## Email Management - - createEmail=int(data['createEmail']), - listEmails=int(data['listEmails']), - deleteEmail=int(data['deleteEmail']), - emailForwarding=int(data['emailForwarding']), - changeEmailPassword=int(data['changeEmailPassword']), - dkimManager=int(data['dkimManager']), - - ## FTP Management - - createFTPAccount=int(data['createFTPAccount']), - deleteFTPAccount=int(data['deleteFTPAccount']), - listFTPAccounts=int(data['listFTPAccounts']), - - ## Backup Management - - createBackup=int(data['createBackup']), - restoreBackup=int(data['restoreBackup']), - addDeleteDestinations=int(data['addDeleteDestinations']), - scheDuleBackups=int(data['scheDuleBackups']), - remoteBackups=int(data['remoteBackups']), - - ## SSL Management - - manageSSL=int(data['manageSSL']), - hostnameSSL=int(data['hostnameSSL']), - mailServerSSL=int(data['mailServerSSL']), - ) + newACL = ACL(name=data['aclName'],config=json.dumps(data)) newACL.save() finalResponse = {'status': 1} @@ -658,75 +596,8 @@ def fetchACLDetails(request): ## Version Management finalResponse = {} - acl = ACL.objects.get(name=data['aclToModify']) - finalResponse['versionManagement'] = acl.versionManagement - finalResponse['adminStatus'] = acl.adminStatus - - ## User Management - - finalResponse['createNewUser'] = acl.createNewUser - finalResponse['listUsers'] = acl.listUsers - finalResponse['resellerCenter'] = acl.resellerCenter - finalResponse['deleteUser'] = acl.deleteUser - finalResponse['changeUserACL'] = acl.changeUserACL - - ## Website Management - - finalResponse['createWebsite'] = acl.createWebsite - finalResponse['modifyWebsite'] = acl.modifyWebsite - finalResponse['suspendWebsite'] = acl.suspendWebsite - finalResponse['deleteWebsite'] = acl.deleteWebsite - - ## Package Management - - finalResponse['createPackage'] = acl.createPackage - finalResponse['listPackages'] = acl.listPackages - finalResponse['deletePackage'] = acl.deletePackage - finalResponse['modifyPackage'] = acl.modifyPackage - - ## Database Management - - finalResponse['createDatabase'] = acl.createDatabase - finalResponse['deleteDatabase'] = acl.deleteDatabase - finalResponse['listDatabases'] = acl.listDatabases - - ## DNS Management - - finalResponse['createNameServer'] = acl.createNameServer - finalResponse['createDNSZone'] = acl.createDNSZone - finalResponse['deleteZone'] = acl.deleteZone - finalResponse['addDeleteRecords'] = acl.addDeleteRecords - - ## Email Management - - finalResponse['createEmail'] = acl.createEmail - finalResponse['listEmails'] = acl.listEmails - finalResponse['deleteEmail'] = acl.deleteEmail - finalResponse['emailForwarding'] = acl.emailForwarding - finalResponse['changeEmailPassword'] = acl.changeEmailPassword - finalResponse['dkimManager'] = acl.dkimManager - - ## FTP Management - - finalResponse['createFTPAccount'] = acl.createFTPAccount - finalResponse['deleteFTPAccount'] = acl.deleteFTPAccount - finalResponse['listFTPAccounts'] = acl.listFTPAccounts - - ## Backup Management - - finalResponse['createBackup'] = acl.createBackup - finalResponse['restoreBackup'] = acl.restoreBackup - finalResponse['addDeleteDestinations'] = acl.addDeleteDestinations - finalResponse['scheDuleBackups'] = acl.scheDuleBackups - finalResponse['remoteBackups'] = acl.remoteBackups - - ## SSL Management - - finalResponse['manageSSL'] = acl.manageSSL - finalResponse['hostnameSSL'] = acl.hostnameSSL - finalResponse['mailServerSSL'] = acl.mailServerSSL - + finalResponse = json.loads(acl.config) finalResponse['status'] = 1 else: return ACLManager.loadErrorJson() @@ -750,73 +621,7 @@ def submitACLModifications(request): ## Version Management acl = ACL.objects.get(name=data['aclToModify']) - acl.adminStatus = int(data['adminStatus']) - acl.versionManagement = int(data['versionManagement']) - - ## User Management - - acl.createNewUser = int(data['createNewUser']) - acl.listUsers = int(data['listUsers']) - acl.resellerCenter = int(data['resellerCenter']) - acl.deleteUser = int(data['deleteUser']) - acl.changeUserACL = int(data['changeUserACL']) - - ## Website Management - - acl.createWebsite = int(data['createWebsite']) - acl.modifyWebsite = int(data['modifyWebsite']) - acl.suspendWebsite = int(data['suspendWebsite']) - acl.deleteWebsite = int(data['deleteWebsite']) - - ## Package Management - - acl.createPackage = int(data['createPackage']) - acl.listPackages = int(data['listPackages']) - acl.deletePackage = int(data['deletePackage']) - acl.modifyPackage = int(data['modifyPackage']) - - ## Database Management - - acl.createDatabase = int(data['createDatabase']) - acl.deleteDatabase = int(data['deleteDatabase']) - acl.listDatabases = int(data['listDatabases']) - - ## DNS Management - - acl.createNameServer = int(data['createNameServer']) - acl.createDNSZone = int(data['createDNSZone']) - acl.deleteZone = int(data['deleteZone']) - acl.addDeleteRecords = int(data['addDeleteRecords']) - - ## Email Management - - acl.createEmail = int(data['createEmail']) - acl.listEmails = int(data['listEmails']) - acl.deleteEmail = int(data['deleteEmail']) - acl.emailForwarding = int(data['emailForwarding']) - acl.changeEmailPassword = int(data['changeEmailPassword']) - acl.dkimManager = int(data['dkimManager']) - - ## FTP Management - - acl.createFTPAccount = int(data['createFTPAccount']) - acl.deleteFTPAccount = int(data['deleteFTPAccount']) - acl.listFTPAccounts = int(data['listFTPAccounts']) - - ## Backup Management - - acl.createBackup = int(data['createBackup']) - acl.restoreBackup = int(data['restoreBackup']) - acl.addDeleteDestinations = int(data['addDeleteDestinations']) - acl.scheDuleBackups = int(data['scheDuleBackups']) - acl.remoteBackups = int(data['remoteBackups']) - - ## SSL Management - - acl.manageSSL = int(data['manageSSL']) - acl.hostnameSSL = int(data['hostnameSSL']) - acl.mailServerSSL = int(data['mailServerSSL']) - + acl.config=json.dumps(data) acl.save() if int(data['adminStatus']) == 1: From 07b5b278b5198f6769c37b2a0c4959164a970d72 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Tue, 23 Feb 2021 23:38:58 +0500 Subject: [PATCH 071/107] centralize acl control --- CLManager/CLManagerMain.py | 26 +- .../templates/baseTemplate/error.html | 42 + .../templates/baseTemplate/homePage.html | 366 +++---- .../templates/baseTemplate/index.html | 923 ++++++++++-------- baseTemplate/views.py | 38 +- containerization/containerManager.py | 20 +- databases/databaseManager.py | 63 +- dns/dnsManager.py | 206 ++-- plogical/acl.py | 8 +- plogical/httpProc.py | 28 +- static/userManagment/userManagment.js | 6 + 11 files changed, 900 insertions(+), 826 deletions(-) create mode 100755 baseTemplate/templates/baseTemplate/error.html diff --git a/CLManager/CLManagerMain.py b/CLManager/CLManagerMain.py index 2a02fd91c..a2809033f 100644 --- a/CLManager/CLManagerMain.py +++ b/CLManager/CLManagerMain.py @@ -10,7 +10,7 @@ from django.shortcuts import HttpResponse from math import ceil from websiteFunctions.models import Websites from CLManager.models import CLPackages - +from plogical.httpProc import httpProc class CLManagerMain(multi.Thread): @@ -27,29 +27,14 @@ class CLManagerMain(multi.Thread): self.submitCageFSInstall() elif self.function == 'enableOrDisable': self.enableOrDisable() - except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + ' [ContainerManager.run]') def renderC(self): - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - ipFile = "/etc/cyberpanel/machineIP" - f = open(ipFile) - ipData = f.read() - ipAddress = ipData.split('\n', 1)[0] - data = {} data['CL'] = 0 data['activatedPath'] = 0 - data['ipAddress'] = ipAddress CLPath = '/etc/sysconfig/cloudlinux' activatedPath = '/home/cyberpanel/cloudlinux' @@ -60,11 +45,14 @@ class CLManagerMain(multi.Thread): data['activatedPath'] = 1 if data['CL'] == 0: - return render(self.request, 'CLManager/notAvailable.html', data) + proc = httpProc(self.request, 'CLManager/notAvailable.html', data, 'admin') + return proc.render() elif data['activatedPath'] == 0: - return render(self.request, 'CLManager/notAvailable.html', data) + proc = httpProc(self.request, 'CLManager/notAvailable.html', data, 'admin') + return proc.render() else: - return render(self.request, 'CLManager/cloudLinux.html', data) + proc = httpProc(self.request, 'CLManager/cloudLinux.html', data, 'admin') + return proc.render() def submitCageFSInstall(self): try: diff --git a/baseTemplate/templates/baseTemplate/error.html b/baseTemplate/templates/baseTemplate/error.html new file mode 100755 index 000000000..4ccefce2f --- /dev/null +++ b/baseTemplate/templates/baseTemplate/error.html @@ -0,0 +1,42 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Home - CyberPanel" %}{% endblock %} +{% block content %} + + +{% get_current_language as LANGUAGE_CODE %} + + +
+
+

{% trans "Home" %}

+

{% trans "Use the tabs to navigate through the control panel." %}

+
+ + + + +
+
+

+ {% trans "Something went wrong..." %} +

+ +
+
+

Error

+

Error: {{ error_message }}

+
+
+ +
+ +
+ + + + +
+ + +{% endblock %} diff --git a/baseTemplate/templates/baseTemplate/homePage.html b/baseTemplate/templates/baseTemplate/homePage.html index 5e9b74c3c..fb0ec8827 100755 --- a/baseTemplate/templates/baseTemplate/homePage.html +++ b/baseTemplate/templates/baseTemplate/homePage.html @@ -4,28 +4,28 @@ {% block content %} -{% get_current_language as LANGUAGE_CODE %} - + {% get_current_language as LANGUAGE_CODE %} + -
-
-

{% trans "Home" %}

-

{% trans "Use the tabs to navigate through the control panel." %}

-
+ - - - {% if admin %} -
-
-

- {% trans "Resources" %} -

- -
- -
-
-
-

- {% trans "CPU Usage" %} -

-
-
-
-
- {$ cpuUsage $}% -
-
-
-
-
-
-
-
-
-
- -
-
-

- {% trans "Ram Usage" %} -

-
-
-
-
- {$ ramUsage $}% -
-
-
-
-
-
-
-
-
-
- -
-
-

- {% trans "Disk Usage '/'" %} -

-
-
-
-
- {$ diskUsage $}% -
-
-
-
-
-
-
-
-
-
- -
- -
+ + + {% if admin %} +
+
+

+ {% trans "Resources" %} +

+ +
+ +
+
+
+

+ {% trans "CPU Usage" %} +

+
+
+
+
+ {$ cpuUsage $}% +
+
+
+
+
+
+
+
+
+
+ +
+
+

+ {% trans "Ram Usage" %} +

+
+
+
+
+ {$ ramUsage $}% +
+
+
+
+
+
+
+
+
+
+ +
+
+

+ {% trans "Disk Usage '/'" %} +

+
+
+
+
+ {$ diskUsage $}% +
+
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+ {% endif %} + +
- {% endif %} - - - - -
{% endblock %} diff --git a/baseTemplate/templates/baseTemplate/index.html b/baseTemplate/templates/baseTemplate/index.html index 171a83149..4a5250080 100755 --- a/baseTemplate/templates/baseTemplate/index.html +++ b/baseTemplate/templates/baseTemplate/index.html @@ -344,19 +344,21 @@ {% trans "Dashboard" %} - - - {% trans "Version Management" %} - - - - {% trans "Connect" %} - + {% if admin or versionManagement %} + + + {% trans "Version Management" %} + + + + {% trans "Connect" %} + + {% endif %}
  • {% trans "Main" %}
  • @@ -381,29 +383,31 @@ {% endif %} {% if admin or listUsers %}
  • {% trans "List Users" %} + title="{% trans 'List Users' %}">{% trans "List Users" %}
  • {% endif %}
  • {% trans "Modify User" %}
  • {% if admin or resellerCenter %} -
  • {% trans "Reseller Center" %} -
  • - {% endif %} -
  • {% trans "Create New ACL" %} -
  • -
  • {% trans "Delete ACL" %} -
  • -
  • {% trans "Modify ACL" %} -
  • -
  • {% trans "API Access" %} -
  • +
  • {% trans "Reseller Center" %} +
  • + {% endif %} + {% if admin %} +
  • {% trans "Create New ACL" %} +
  • +
  • {% trans "Delete ACL" %} +
  • +
  • {% trans "Modify ACL" %} +
  • +
  • {% trans "API Access" %} +
  • + {% endif %}
    @@ -417,24 +421,32 @@ @@ -447,23 +459,30 @@ -
  • @@ -472,19 +491,26 @@ @@ -498,24 +524,36 @@ @@ -529,49 +567,69 @@
  • - + {% trans "FTP" %} @@ -585,24 +643,36 @@ @@ -617,18 +687,26 @@ @@ -643,319 +721,328 @@
  • -
  • {% trans "Server" %}
  • + {% if admin %} +
  • {% trans "Server" %}
  • -
  • - - - {% trans "Web Terminal" %} - {% trans "NEW" %} - -
  • + + + {% trans "Web Terminal" %} + {% trans "NEW" %} + + -
  • + +
    + -
  • - - - {% trans "CloudLinux" %} - {% trans "NEW" %} - -
  • + + + {% trans "CloudLinux" %} + {% trans "NEW" %} + + -
  • +
    + +
  • + + + {% trans "Containerization" %} + {% trans "NEW" %} + +
  • - - - {% trans "Containerization" %} - {% trans "NEW" %} - - +
  • -
    - +
  • + + + {% trans "Docker Manager" %} + {% trans "NEW" %} + +
  • - - - {% trans "Docker Manager" %} - {% trans "NEW" %} - - +
  • -
    - +
  • + + + {% trans "Tuning" %} + +
  • - - - {% trans "Tuning" %} - - +
  • -
    - +
  • + + + {% trans "Server Status" %} + +
  • - - - {% trans "Server Status" %} - - +
  • -
    - +
  • + + + {% trans "PHP" %} + +
  • - - - {% trans "PHP" %} - - +
  • -
    - +
  • + + + {% trans "Logs" %} + +
  • - - - {% trans "Logs" %} - - +
  • -
    - +
  • + + + {% trans "Security" %} + +
  • - - - {% trans "Security" %} - - +
  • -
    - +
  • + + + {% trans "Mail Settings" %} + {% trans "NEW" %} + +
  • - - - {% trans "Mail Settings" %} - {% trans "NEW" %} - - +
  • -
    - +
  • + + + {% trans "Manage Services" %} + +
  • - - - {% trans "Manage Services" %} - - +
  • -
    - +
  • + + + {% trans "Plugins" %} + +
  • - - - {% trans "Plugins" %} - - +
  • -
    - + {% endif %} diff --git a/baseTemplate/views.py b/baseTemplate/views.py index 5e28396ca..74d18de28 100755 --- a/baseTemplate/views.py +++ b/baseTemplate/views.py @@ -88,38 +88,26 @@ def getLoadAverage(request): @ensure_csrf_cookie def versionManagment(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + ## Get latest version - if currentACL['admin'] == 1: - pass - elif currentACL['versionManagement'] == 1: - pass - else: - return ACLManager.loadError() + getVersion = requests.get('https://cyberpanel.net/version.txt') - ## Get latest version + latest = getVersion.json() - getVersion = requests.get('https://cyberpanel.net/version.txt') + latestVersion = latest['version'] + latestBuild = latest['build'] - latest = getVersion.json() + ## Get local version - latestVersion = latest['version'] - latestBuild = latest['build'] + currentVersion = VERSION + currentBuild = str(BUILD) - ## Get local version + template = 'baseTemplate/versionManagment.html' + finalData = {'build': currentBuild, 'currentVersion': currentVersion, 'latestVersion': latestVersion, + 'latestBuild': latestBuild} - currentVersion = VERSION - currentBuild = str(BUILD) - - return render(request, 'baseTemplate/versionManagment.html', {'build': currentBuild, - 'currentVersion': currentVersion, - 'latestVersion': latestVersion, - 'latestBuild': latestBuild}) - - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, template, finalData, 'versionManagement') + return proc.render() def upgrade(request): try: diff --git a/containerization/containerManager.py b/containerization/containerManager.py index 252b810fc..8922516a5 100755 --- a/containerization/containerManager.py +++ b/containerization/containerManager.py @@ -5,7 +5,7 @@ from plogical.acl import ACLManager import plogical.CyberCPLogFileWriter as logging from serverStatus.serverStatusUtil import ServerStatusUtil import os, stat - +from plogical.httpProc import httpProc class ContainerManager(multi.Thread): defaultConf = """group {groupName}{ @@ -84,14 +84,6 @@ class ContainerManager(multi.Thread): def renderC(self): - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - data = {} data['OLS'] = 0 data['notInstalled'] = 0 @@ -99,17 +91,20 @@ class ContainerManager(multi.Thread): if ProcessUtilities.decideServer() == ProcessUtilities.OLS: data['OLS'] = 1 data['notInstalled'] = 0 - return render(self.request, 'containerization/notAvailable.html', data) + proc = httpProc(self.request, 'containerization/notAvailable.html', data, 'admin') + return proc.render() elif not ProcessUtilities.containerCheck(): data['OLS'] = 0 data['notInstalled'] = 1 - return render(self.request, 'containerization/notAvailable.html', data) + proc = httpProc(self.request, 'containerization/notAvailable.html', data, 'admin') + return proc.render() else: if self.data == None: self.data = {} self.data['OLS'] = 0 self.data['notInstalled'] = 0 - return render(self.request, self.templateName, self.data) + proc = httpProc(self.request, self.templateName, data, 'admin') + return proc.render() def submitContainerInstall(self): try: @@ -165,7 +160,6 @@ class ContainerManager(multi.Thread): # self.data['classID']) + ' protocol ip prio 10 handle 1: cgroup' command = 'sudo tc filter add dev eth0 parent 10: protocol ip prio 10 handle 1: cgroup' - #logging.CyberCPLogFileWriter.writeToFile(command) ProcessUtilities.executioner(command) self.restartServices() diff --git a/databases/databaseManager.py b/databases/databaseManager.py index 1a85cf5d1..55c11bfb7 100755 --- a/databases/databaseManager.py +++ b/databases/databaseManager.py @@ -5,7 +5,6 @@ import django sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() -from django.shortcuts import render from django.http import HttpResponse import json from plogical.acl import ACLManager @@ -16,34 +15,28 @@ from databases.models import Databases, DBMeta import argparse from loginSystem.models import Administrator import plogical.randomPassword as randomPassword +from plogical.httpProc import httpProc class DatabaseManager: REMOTE_ACCESS = 'remote_access' def loadDatabaseHome(self, request = None, userID = None): - try: - return render(request, 'databases/index.html') - except BaseException as msg: - return HttpResponse(str(msg)) + template = 'databases/index.html' + proc = httpProc(request, template, None, 'createDatabase') + return proc.render() def phpMyAdmin(self, request = None, userID = None): - try: - return render(request, 'databases/phpMyAdmin.html') - except BaseException as msg: - return HttpResponse(str(msg)) + template = 'databases/phpMyAdmin.html' + proc = httpProc(request, template, None, 'createDatabase') + return proc.render() def createDatabase(self, request = None, userID = None): - try: - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createDatabase') == 0: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - - return render(request, 'databases/createDatabase.html', {'websitesList': websitesName}) - except BaseException as msg: - return HttpResponse(str(msg)) + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID) + template = 'databases/createDatabase.html' + proc = httpProc(request, template, {'websitesList': websitesName}, 'createDatabase') + return proc.render() def submitDBCreation(self, userID = None, data = None, rAPI = None): try: @@ -84,18 +77,11 @@ class DatabaseManager: return HttpResponse(json_data) def deleteDatabase(self, request = None, userID = None): - try: - - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'deleteDatabase') == 0: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - - return render(request, 'databases/deleteDatabase.html', {'websitesList': websitesName}) - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse(str(msg)) + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID) + template = 'databases/deleteDatabase.html' + proc = httpProc(request, template, {'websitesList': websitesName}, 'deleteDatabase') + return proc.render() def fetchDatabases(self, userID = None, data = None): try: @@ -171,16 +157,11 @@ class DatabaseManager: return HttpResponse(json_data) def listDBs(self, request = None, userID = None): - try: - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'listDatabases') == 0: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - - return render(request, 'databases/listDataBases.html', {'websiteList': websitesName}) - except BaseException as msg: - return HttpResponse(str(msg)) + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID) + template = 'databases/listDataBases.html' + proc = httpProc(request, template, {'websitesList': websitesName}, 'listDatabases') + return proc.render() def changePassword(self, userID = None, data = None): try: diff --git a/dns/dnsManager.py b/dns/dnsManager.py index acdca57a9..05009251c 100755 --- a/dns/dnsManager.py +++ b/dns/dnsManager.py @@ -4,10 +4,10 @@ import errno import os.path import sys import django + sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() -from django.shortcuts import render from django.http import HttpResponse import json try: @@ -24,6 +24,7 @@ import CloudFlare import re import plogical.CyberCPLogFileWriter as logging from plogical.processUtilities import ProcessUtilities +from plogical.httpProc import httpProc class DNSManager: defaultNameServersPath = '/home/cyberpanel/defaultNameservers' @@ -37,29 +38,23 @@ class DNSManager: self.email = data[0].rstrip('\n') self.key = data[1].rstrip('\n') - def loadDNSHome(self, request = None, userID = None): - try: - admin = Administrator.objects.get(pk=userID) - return render(request, 'dns/index.html', {"type": admin.type}) - except BaseException as msg: - return HttpResponse(str(msg)) + admin = Administrator.objects.get(pk=userID) + template = 'dns/index.html' + proc = httpProc(request, template, {"type": admin.type}, 'createDNSZone') + return proc.render() def createNameserver(self, request = None, userID = None): - try: - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createNameServer') == 0: - return ACLManager.loadError() + mailUtilities.checkHome() - mailUtilities.checkHome() + if os.path.exists('/home/cyberpanel/powerdns'): + finalData = {"status": 1} + else: + finalData = {"status": 0} - if os.path.exists('/home/cyberpanel/powerdns'): - return render(request, "dns/createNameServer.html", {"status": 1}) - else: - return render(request, "dns/createNameServer.html", {"status": 0}) - - except BaseException as msg: - return HttpResponse(str(msg)) + template = 'dns/createNameServer.html' + proc = httpProc(request, template, finalData, 'createNameServer') + return proc.render() def NSCreation(self, userID = None, data = None): try: @@ -118,17 +113,13 @@ class DNSManager: return HttpResponse(final_json) def createDNSZone(self, request = None, userID = None): - try: - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createDNSZone') == 0: - return ACLManager.loadError() - - if os.path.exists('/home/cyberpanel/powerdns'): - return render(request, 'dns/createDNSZone.html', {"status": 1}) - else: - return render(request, 'dns/createDNSZone.html', {"status": 0}) - except BaseException as msg: - return HttpResponse(str(msg)) + if os.path.exists('/home/cyberpanel/powerdns'): + finalData = {'status': 1} + else: + finalData = {'status': 0} + template = 'dns/createDNSZone.html' + proc = httpProc(request, template, finalData, 'createDNSZone') + return proc.render() def zoneCreation(self, userID = None, data = None): try: @@ -166,21 +157,16 @@ class DNSManager: return HttpResponse(final_json) def addDeleteDNSRecords(self, request = None, userID = None): - try: + currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/powerdns'): + finalData = {"status": 0} + else: + finalData = {"status": 1} - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0: - return ACLManager.loadError() - - if not os.path.exists('/home/cyberpanel/powerdns'): - return render(request, 'dns/addDeleteDNSRecords.html', {"status": 0}) - - domainsList = ACLManager.findAllDomains(currentACL, userID) - - return render(request, 'dns/addDeleteDNSRecords.html', {"domainsList": domainsList, "status": 1}) - - except BaseException as msg: - return HttpResponse(str(msg)) + finalData['domainsList'] = ACLManager.findAllDomains(currentACL, userID) + template = 'dns/addDeleteDNSRecords.html' + proc = httpProc(request, template, finalData, 'addDeleteRecords') + return proc.render() def getCurrentRecordsForDomain(self, userID = None, data = None): try: @@ -499,22 +485,16 @@ class DNSManager: return HttpResponse(final_json) def deleteDNSZone(self, request = None, userID = None): + currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/powerdns'): + finalData = {"status": 0} + else: + finalData = {"status": 1} - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'deleteZone') == 0: - return ACLManager.loadError() - - if not os.path.exists('/home/cyberpanel/powerdns'): - return render(request, 'dns/addDeleteDNSRecords.html', {"status": 0}) - - domainsList = ACLManager.findAllDomains(currentACL, userID) - - return render(request, 'dns/deleteDNSZone.html', {"domainsList": domainsList, "status": 1}) - - except BaseException as msg: - return HttpResponse(str(msg)) + finalData['domainsList'] = ACLManager.findAllDomains(currentACL, userID) + template = 'dns/deleteDNSZone.html' + proc = httpProc(request, template, finalData, 'deleteZone') + return proc.render() def submitZoneDeletion(self, userID = None, data = None): try: @@ -549,46 +529,36 @@ class DNSManager: return HttpResponse(final_json) def configureDefaultNameServers(self, request=None, userID=None): + currentACL = ACLManager.loadedACL(userID) - try: - currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/powerdns'): + data = {"status": 0} + else: + data = {"status": 1} - if currentACL['admin'] == 1: + data['domainsList'] = ACLManager.findAllDomains(currentACL, userID) + if os.path.exists(DNSManager.defaultNameServersPath): + nsData = open(DNSManager.defaultNameServersPath, 'r').readlines() + try: + data['firstNS'] = nsData[0].rstrip('\n') + except: + pass + try: + data['secondNS'] = nsData[1].rstrip('\n') + except: + pass + try: + data['thirdNS'] = nsData[2].rstrip('\n') + except: + pass + try: + data['forthNS'] = nsData[3].rstrip('\n') + except: pass - else: - return ACLManager.loadError() - - if not os.path.exists('/home/cyberpanel/powerdns'): - return render(request, 'dns/addDeleteDNSRecords.html', {"status": 0}) - - data = {} - data['domainsList'] = ACLManager.findAllDomains(currentACL, userID) - data['status'] = 1 - - if os.path.exists(DNSManager.defaultNameServersPath): - nsData = open(DNSManager.defaultNameServersPath, 'r').readlines() - try: - data['firstNS'] = nsData[0].rstrip('\n') - except: - pass - try: - data['secondNS'] = nsData[1].rstrip('\n') - except: - pass - try: - data['thirdNS'] = nsData[2].rstrip('\n') - except: - pass - try: - data['forthNS'] = nsData[3].rstrip('\n') - except: - pass - - return render(request, 'dns/configureDefaultNameServers.html', data) - - except BaseException as msg: - return HttpResponse(str(msg)) + template = 'dns/configureDefaultNameServers.html' + proc = httpProc(request, template, data, 'admin') + return proc.render() def saveNSConfigurations(self, userID = None, data = None): try: @@ -615,7 +585,6 @@ class DNSManager: except: pass - writeToFile = open(DNSManager.defaultNameServersPath, 'w') writeToFile.write(nsContent.rstrip('\n')) writeToFile.close() @@ -631,35 +600,30 @@ class DNSManager: return HttpResponse(final_json) def addDeleteDNSRecordsCloudFlare(self, request = None, userID = None): - try: + currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/powerdns'): + status = 0 + else: + status = 1 + admin = Administrator.objects.get(pk=userID) - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0: - return ACLManager.loadError() + CloudFlare = 0 - if not os.path.exists('/home/cyberpanel/powerdns'): - return render(request, 'dns/addDeleteDNSRecordsCloudFlare.html', {"status": 0}) + cfPath = '%s%s' % (DNS.CFPath, admin.userName) - admin = Administrator.objects.get(pk=userID) + if os.path.exists(cfPath): + CloudFlare = 1 + domainsList = ACLManager.findAllDomains(currentACL, userID) + self.admin = admin + self.loadCFKeys() + data = {"domainsList": domainsList, "status": status, 'CloudFlare': CloudFlare, 'cfEmail': self.email, + 'cfToken': self.key} + else: + data = {"status": status, 'CloudFlare': CloudFlare} - CloudFlare = 0 - - cfPath = '%s%s' %(DNS.CFPath, admin.userName) - - if os.path.exists(cfPath): - CloudFlare = 1 - domainsList = ACLManager.findAllDomains(currentACL, userID) - - self.admin = admin - self.loadCFKeys() - - return render(request, 'dns/addDeleteDNSRecordsCloudFlare.html', - {"domainsList": domainsList, "status": 1, 'CloudFlare': CloudFlare, 'cfEmail': self.email, 'cfToken': self.key}) - else: - return render(request, 'dns/addDeleteDNSRecordsCloudFlare.html', {"status": 1, 'CloudFlare': CloudFlare}) - - except BaseException as msg: - return HttpResponse(str(msg)) + template = 'dns/addDeleteDNSRecordsCloudFlare.html' + proc = httpProc(request, template, data, 'addDeleteRecords') + return proc.render() def saveCFConfigs(self, userID = None, data = None): try: diff --git a/plogical/acl.py b/plogical/acl.py index bb2436806..36dd7a3a9 100644 --- a/plogical/acl.py +++ b/plogical/acl.py @@ -71,14 +71,12 @@ class ACLManager: finalResponse['serverIPAddress'] = serverIPAddress finalResponse['adminName'] = admin.firstName - if admin.acl.adminStatus == 1: + config = json.loads(admin.acl.config) + + if config['adminStatus']: finalResponse['admin'] = 1 else: finalResponse['admin'] = 0 - - config = json.loads(admin.acl.config) - - acl = ACL.objects.get(name=admin.acl.name) finalResponse['versionManagement'] = config['versionManagement'] ## User Management diff --git a/plogical/httpProc.py b/plogical/httpProc.py index c4b980a81..81b1714de 100755 --- a/plogical/httpProc.py +++ b/plogical/httpProc.py @@ -2,12 +2,14 @@ from django.shortcuts import render, HttpResponse import json +from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter class httpProc: - def __init__(self, request, templateName, data = None): + def __init__(self, request, templateName, data = None, function = None): self.request = request self.templateName = templateName self.data = data + self.function = function def render(self): @@ -15,19 +17,33 @@ class httpProc: from loginSystem.models import Administrator from plogical.acl import ACLManager userID = self.request.session['userID'] - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + + ### Permissions Check + + if self.function != None: + if not currentACL['admin']: + if not currentACL[self.function]: + templateName = 'baseTemplate/error.html' + return render(self.request, templateName, {'error_message': 'You are not authorized to access %s' % (self.function)}) ### if self.data == None: self.data = {} - self.data.update(ACLManager.loadedACL(userID)) - return render(self.request, self.templateName, self.data) + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddress = ipData.split('\n', 1)[0] + self.data['ipAddress'] = ipAddress + self.data.update(currentACL) + + return render(self.request, self.templateName, self.data) except BaseException as msg: - templateName = 'UserManagement/login.html' - return render(self.request, templateName) + templateName = 'baseTemplate/error.html' + return render(self.request, templateName, {'error_message': str(msg)}) def renderPre(self): if self.data == None: diff --git a/static/userManagment/userManagment.js b/static/userManagment/userManagment.js index 2dfc503b2..221d0e34b 100644 --- a/static/userManagment/userManagment.js +++ b/static/userManagment/userManagment.js @@ -458,6 +458,7 @@ app.controller('deleteUser', function ($scope, $http) { /* Java script code to create acl */ + app.controller('createACLCTRL', function ($scope, $http) { $scope.aclLoading = true; @@ -520,11 +521,13 @@ app.controller('createACLCTRL', function ($scope, $http) { // Backup Management $scope.createBackup = true; + $scope.googleDriveBackups = true; $scope.restoreBackup = false; $scope.addDeleteDestinations = false; $scope.scheDuleBackups = false; $scope.remoteBackups = false; + // SSL Management $scope.manageSSL = true; @@ -599,6 +602,7 @@ app.controller('createACLCTRL', function ($scope, $http) { // Backup Management createBackup: $scope.createBackup, + googleDriveBackups: $scope.googleDriveBackups, restoreBackup: $scope.restoreBackup, addDeleteDestinations: $scope.addDeleteDestinations, scheDuleBackups: $scope.scheDuleBackups, @@ -976,6 +980,7 @@ app.controller('modifyACLCtrl', function ($scope, $http) { // Backup Management $scope.createBackup = Boolean(response.data.createBackup); + $scope.googleDriveBackups = Boolean(response.data.googleDriveBackups); $scope.restoreBackup = Boolean(response.data.restoreBackup); $scope.addDeleteDestinations = Boolean(response.data.addDeleteDestinations); $scope.scheDuleBackups = Boolean(response.data.scheDuleBackups); @@ -1076,6 +1081,7 @@ app.controller('modifyACLCtrl', function ($scope, $http) { // Backup Management createBackup: $scope.createBackup, + googleDriveBackups: $scope.googleDriveBackups, restoreBackup: $scope.restoreBackup, addDeleteDestinations: $scope.addDeleteDestinations, scheDuleBackups: $scope.scheDuleBackups, From fdecde86bcc56c87d1cda35750595db438a2489e Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 24 Feb 2021 20:49:18 +0500 Subject: [PATCH 072/107] before checkout --- dockerManager/container.py | 165 ++++++++++++------------ dockerManager/views.py | 18 ++- emailMarketing/emailMarketingManager.py | 43 +++--- emailPremium/views.py | 34 +++-- firewall/firewallManager.py | 86 ++++++------ ftp/ftpManager.py | 35 +++-- 6 files changed, 207 insertions(+), 174 deletions(-) diff --git a/dockerManager/container.py b/dockerManager/container.py index 65fb3d787..9b9e6c7fe 100755 --- a/dockerManager/container.py +++ b/dockerManager/container.py @@ -6,6 +6,8 @@ import sys import django import mimetypes +from plogical.httpProc import httpProc + sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() @@ -91,59 +93,53 @@ class ContainerManager(multi.Thread): logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath, str(msg) + ' [404].', 1) def createContainer(self, request=None, userID=None, data=None): + client = docker.from_env() + dockerAPI = docker.APIClient() + + adminNames = ACLManager.loadAllUsers(userID) + tag = request.GET.get('tag') + image = request.GET.get('image') + tag = tag.split(" (")[0] + + if "/" in image: + name = image.split("/")[0] + "." + image.split("/")[1] + else: + name = image + try: - admin = Administrator.objects.get(pk=userID) - if admin.acl.adminStatus != 1: - return ACLManager.loadError() + inspectImage = dockerAPI.inspect_image(image + ":" + tag) + except docker.errors.ImageNotFound: + val = request.session['userID'] + admin = Administrator.objects.get(pk=val) + return render(request, 'dockerManager/images.html', {"type": admin.type, + 'image': image, + 'tag': tag}) - client = docker.from_env() - dockerAPI = docker.APIClient() + envList = {}; + if 'Env' in inspectImage['Config']: + for item in inspectImage['Config']['Env']: + if '=' in item: + splitedItem = item.split('=', 1) + print(splitedItem) + envList[splitedItem[0]] = splitedItem[1] + else: + envList[item] = "" - adminNames = ACLManager.loadAllUsers(userID) - tag = request.GET.get('tag') - image = request.GET.get('image') - tag = tag.split(" (")[0] + portConfig = {}; + if 'ExposedPorts' in inspectImage['Config']: + for item in inspectImage['Config']['ExposedPorts']: + portDef = item.split('/') + portConfig[portDef[0]] = portDef[1] - if "/" in image: - name = image.split("/")[0] + "." + image.split("/")[1] - else: - name = image + if image is None or image is '' or tag is None or tag is '': + return redirect(loadImages) - try: - inspectImage = dockerAPI.inspect_image(image + ":" + tag) - except docker.errors.ImageNotFound: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - return render(request, 'dockerManager/images.html', {"type": admin.type, - 'image': image, - 'tag': tag}) + Data = {"ownerList": adminNames, "image": image, "name": name, "tag": tag, "portConfig": portConfig, + "envList": envList} - envList = {}; - if 'Env' in inspectImage['Config']: - for item in inspectImage['Config']['Env']: - if '=' in item: - splitedItem = item.split('=', 1) - print(splitedItem) - envList[splitedItem[0]] = splitedItem[1] - else: - envList[item] = "" - - portConfig = {}; - if 'ExposedPorts' in inspectImage['Config']: - for item in inspectImage['Config']['ExposedPorts']: - portDef = item.split('/') - portConfig[portDef[0]] = portDef[1] - - if image is None or image is '' or tag is None or tag is '': - return redirect(loadImages) - - Data = {"ownerList": adminNames, "image": image, "name": name, "tag": tag, "portConfig": portConfig, - "envList": envList} - - return render(request, 'dockerManager/runContainer.html', Data) - - except BaseException as msg: - return HttpResponse(str(msg)) + template = 'dockerManager/runContainer.html' + proc = httpProc(request, template, Data, 'admin') + return proc.render() def loadContainerHome(self, request=None, userID=None, data=None): name = self.name @@ -196,51 +192,52 @@ class ContainerManager(multi.Thread): data['memoryUsage'] = 0 data['cpuUsage'] = 0 - return render(request, 'dockerManager/viewContainer.html', data) + template = 'dockerManager/viewContainer.html' + proc = httpProc(request, template, data, 'admin') + return proc.render() def listContainers(self, request=None, userID=None, data=None): - try: - client = docker.from_env() - dockerAPI = docker.APIClient() + client = docker.from_env() + dockerAPI = docker.APIClient() - currentACL = ACLManager.loadedACL(userID) - containers = ACLManager.findAllContainers(currentACL, userID) + currentACL = ACLManager.loadedACL(userID) + containers = ACLManager.findAllContainers(currentACL, userID) - allContainers = client.containers.list() - containersList = [] - showUnlistedContainer = True + allContainers = client.containers.list() + containersList = [] + showUnlistedContainer = True - # TODO: Add condition to show unlisted Containers only if user has admin level access + # TODO: Add condition to show unlisted Containers only if user has admin level access - unlistedContainers = [] - for container in allContainers: - if container.name not in containers: - unlistedContainers.append(container) + unlistedContainers = [] + for container in allContainers: + if container.name not in containers: + unlistedContainers.append(container) - if not unlistedContainers: - showUnlistedContainer = False + if not unlistedContainers: + showUnlistedContainer = False - adminNames = ACLManager.loadAllUsers(userID) + adminNames = ACLManager.loadAllUsers(userID) - pages = float(len(containers)) / float(10) - pagination = [] + pages = float(len(containers)) / float(10) + pagination = [] - if pages <= 1.0: - pages = 1 - pagination.append('
  • ') - else: - pages = ceil(pages) - finalPages = int(pages) + 1 + if pages <= 1.0: + pages = 1 + pagination.append('
  • ') + else: + pages = ceil(pages) + finalPages = int(pages) + 1 - for i in range(1, finalPages): - pagination.append('
  • ' + str(i) + '
  • ') + for i in range(1, finalPages): + pagination.append('
  • ' + str(i) + '
  • ') - return render(request, 'dockerManager/listContainers.html', {"pagination": pagination, - "unlistedContainers": unlistedContainers, - "adminNames": adminNames, - "showUnlistedContainer": showUnlistedContainer}) - except BaseException as msg: - return HttpResponse(str(msg)) + template = 'dockerManager/listContainers.html' + proc = httpProc(request, template, {"pagination": pagination, + "unlistedContainers": unlistedContainers, + "adminNames": adminNames, + "showUnlistedContainer": showUnlistedContainer}, 'admin') + return proc.render() def getContainerLogs(self, userID=None, data=None): try: @@ -774,7 +771,9 @@ class ContainerManager(multi.Thread): except: continue - return render(request, 'dockerManager/images.html', {"images": images, "test": ''}) + template = 'dockerManager/images.html' + proc = httpProc(request, template, {"images": images, "test": ''}, 'admin') + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -808,7 +807,9 @@ class ContainerManager(multi.Thread): except: continue - return render(request, 'dockerManager/manageImages.html', {"images": images}) + template = 'dockerManager/manageImages.html' + proc = httpProc(request, template, {"images": images}, 'admin') + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) diff --git a/dockerManager/views.py b/dockerManager/views.py index 976b27206..ed871a900 100755 --- a/dockerManager/views.py +++ b/dockerManager/views.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -from django.shortcuts import render, redirect, HttpResponse +from django.shortcuts import redirect, HttpResponse from loginSystem.models import Administrator from loginSystem.views import loadLoginPage +from plogical.httpProc import httpProc from .container import ContainerManager from .decorators import preDockerRun from plogical.acl import ACLManager @@ -25,15 +26,12 @@ def dockerPermission(request, userID, context): @preDockerRun def loadDockerHome(request): - try: - userID = request.session['userID'] - perm = dockerPermission(request, userID, 'loadDockerHome') - if perm: return perm - - admin = Administrator.objects.get(pk=userID) - return render(request,'dockerManager/index.html',{"type":admin.type}) - except KeyError: - return redirect(loadLoginPage) + userID = request.session['userID'] + admin = Administrator.objects.get(pk=userID) + template = 'dockerManager/index.html' + + proc = httpProc(request, template, {"type": admin.type}, 'admin') + return proc.render() def installDocker(request): try: diff --git a/emailMarketing/emailMarketingManager.py b/emailMarketing/emailMarketingManager.py index ef2061be9..cfb19b343 100755 --- a/emailMarketing/emailMarketingManager.py +++ b/emailMarketing/emailMarketingManager.py @@ -4,6 +4,8 @@ from loginSystem.views import loadLoginPage import json from random import randint import time + +from plogical.httpProc import httpProc from .models import EmailMarketing, EmailLists, EmailsInList, EmailJobs from websiteFunctions.models import Websites from .emailMarketing import emailMarketing as EM @@ -21,18 +23,8 @@ class EmailMarketingManager: self.domain = domain def emailMarketing(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(self.request, 'emailMarketing/emailMarketing.html') - except KeyError as msg: - return redirect(loadLoginPage) + proc = httpProc(self.request, 'emailMarketing/emailMarketing.html', None, 'admin') + return proc.render() def fetchUsers(self): try: @@ -123,7 +115,8 @@ class EmailMarketingManager: if emACL.checkIfEMEnabled(admin.userName) == 0: return ACLManager.loadError() - return render(self.request, 'emailMarketing/createEmailList.html', {'domain': self.domain}) + proc = httpProc(self.request, 'emailMarketing/createEmailList.html', {'domain': self.domain}, 'admin') + return proc.render() except KeyError as msg: return redirect(loadLoginPage) @@ -178,7 +171,9 @@ class EmailMarketingManager: listNames = emACL.getEmailsLists(self.domain) - return render(self.request, 'emailMarketing/manageLists.html', {'listNames': listNames, 'domain': self.domain}) + proc = httpProc(self.request, 'emailMarketing/manageLists.html', {'listNames': listNames, 'domain': self.domain}, 'admin') + return proc.render() + except KeyError as msg: return redirect(loadLoginPage) @@ -196,7 +191,10 @@ class EmailMarketingManager: if emACL.checkIfEMEnabled(admin.userName) == 0: return ACLManager.loadError() - return render(self.request, 'emailMarketing/configureVerify.html', {'domain': self.domain}) + proc = httpProc(self.request, 'emailMarketing/configureVerify.html', + {'domain': self.domain}, 'admin') + return proc.render() + except KeyError as msg: return redirect(loadLoginPage) @@ -490,7 +488,10 @@ class EmailMarketingManager: for items in emailLists: listNames.append(items.listName) - return render(self.request, 'emailMarketing/manageSMTPHosts.html', {'listNames': listNames, 'domain': self.domain}) + + proc = httpProc(self.request, 'emailMarketing/manageSMTPHosts.html', + {'listNames': listNames, 'domain': self.domain}, 'admin') + return proc.render() except KeyError as msg: return redirect(loadLoginPage) @@ -657,7 +658,9 @@ class EmailMarketingManager: if emACL.checkIfEMEnabled(admin.userName) == 0: return ACLManager.loadErrorJson() - return render(self.request, 'emailMarketing/composeMessages.html') + proc = httpProc(self.request, 'emailMarketing/composeMessages.html', + None, 'admin') + return proc.render() except KeyError as msg: return redirect(loadLoginPage) @@ -709,7 +712,11 @@ class EmailMarketingManager: Data['templateNames'] = templateNames Data['hostNames'] = hostNames Data['listNames'] = listNames - return render(self.request, 'emailMarketing/sendEmails.html', Data) + + proc = httpProc(self.request, 'emailMarketing/sendEmails.html', + Data, 'admin') + return proc.render() + except KeyError as msg: return redirect(loadLoginPage) diff --git a/emailPremium/views.py b/emailPremium/views.py index 62f224844..bbe8b1ccc 100755 --- a/emailPremium/views.py +++ b/emailPremium/views.py @@ -6,6 +6,7 @@ from django.http import HttpResponse from mailServer.models import Domains, EUsers # Create your views here. from loginSystem.models import Administrator +from plogical.httpProc import httpProc from websiteFunctions.models import Websites from loginSystem.views import loadLoginPage import plogical.CyberCPLogFileWriter as logging @@ -34,7 +35,9 @@ def emailPolicyServer(request): else: return ACLManager.loadError() - return render(request, 'emailPremium/policyServer.html') + proc = httpProc(request, 'emailPremium/policyServer.html', + None, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -171,8 +174,9 @@ def listDomains(request): for i in range(1, finalPages): pagination.append('
  • ' + str(i) + '
  • ') - - return render(request,'emailPremium/listDomains.html',{"pagination":pagination, "installCheck": installCheck}) + proc = httpProc(request, 'emailPremium/listDomains.html', + {"pagination":pagination, "installCheck": installCheck}, 'admin') + return proc.render() except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) @@ -350,9 +354,12 @@ def emailLimits(request,domain): Data['pagination'] = pagination - return render(request, 'emailPremium/emailLimits.html', Data) + proc = httpProc(request, 'emailPremium/emailLimits.html', Data, 'admin') + return proc.render() + else: - return render(request, 'emailPremium/emailLimits.html', {"error":1,"domain": "This domain does not exists"}) + proc = httpProc(request, 'emailPremium/emailLimits.html', {"error":1,"domain": "This domain does not exists"}, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -525,7 +532,9 @@ def emailPage(request, emailAddress): Data['pagination'] = pagination - return render(request, 'emailPremium/emailPage.html', Data) + proc = httpProc(request, 'emailPremium/emailPage.html', Data, 'admin') + return proc.render() + except KeyError: return redirect(loadLoginPage) @@ -785,8 +794,8 @@ def spamAssassinHome(request): if mailUtilities.checkIfSpamAssassinInstalled() == 1: checkIfSpamAssassinInstalled = 1 - return render(request, 'emailPremium/SpamAssassin.html',{'checkIfSpamAssassinInstalled': checkIfSpamAssassinInstalled}) - + proc = httpProc(request, 'emailPremium/SpamAssassin.html', {'checkIfSpamAssassinInstalled': checkIfSpamAssassinInstalled}, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -1037,8 +1046,9 @@ def mailQueue(request): else: return ACLManager.loadError() - return render(request, 'emailPremium/mailQueue.html') - + proc = httpProc(request, 'emailPremium/mailQueue.html', + None, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -1195,7 +1205,9 @@ def MailScanner(request): if mailUtilities.checkIfMailScannerInstalled() == 1: checkIfMailScannerInstalled = 1 - return render(request, 'emailPremium/MailScanner.html',{'checkIfMailScannerInstalled': checkIfMailScannerInstalled, 'ipAddress': ipAddress}) + proc = httpProc(request, 'emailPremium/MailScanner.html', + {'checkIfMailScannerInstalled': checkIfMailScannerInstalled, 'ipAddress': ipAddress}, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) diff --git a/firewall/firewallManager.py b/firewall/firewallManager.py index 821b6a4fb..b269e6d1d 100755 --- a/firewall/firewallManager.py +++ b/firewall/firewallManager.py @@ -3,6 +3,9 @@ import os import os.path import sys import django + +from plogical.httpProc import httpProc + sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() @@ -31,30 +34,14 @@ class FirewallManager: self.request = request def securityHome(self, request = None, userID = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(request, 'firewall/index.html') - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'firewall/index.html', + None, 'admin') + return proc.render() def firewallHome(self, request = None, userID = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(request, 'firewall/firewall.html') - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'firewall/firewall.html', + None, 'admin') + return proc.render() def getCurrentRules(self, userID = None): try: @@ -265,17 +252,9 @@ class FirewallManager: return HttpResponse(final_json) def secureSSH(self, request = None, userID = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(request, 'firewall/secureSSH.html') - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'firewall/secureSSH.html', + None, 'admin') + return proc.render() def getSSHConfigs(self, userID = None, data = None): try: @@ -512,7 +491,10 @@ class FirewallManager: OLS = 0 modSecInstalled = 1 - return render(request, 'firewall/modSecurity.html', {'modSecInstalled': modSecInstalled, 'OLS': OLS}) + proc = httpProc(request, 'firewall/modSecurity.html', + {'modSecInstalled': modSecInstalled, 'OLS': OLS}, 'admin') + return proc.render() + except BaseException as msg: return HttpResponse(str(msg)) @@ -894,8 +876,9 @@ class FirewallManager: else: modSecInstalled = 1 - return render(request, 'firewall/modSecurityRules.html', {'modSecInstalled': modSecInstalled}) - + proc = httpProc(request, 'firewall/modSecurityRules.html', + {'modSecInstalled': modSecInstalled}, 'admin') + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -1019,7 +1002,9 @@ class FirewallManager: else: modSecInstalled = 1 - return render(request, 'firewall/modSecurityRulesPacks.html', {'modSecInstalled': modSecInstalled}) + proc = httpProc(request, 'firewall/modSecurityRulesPacks.html', + {'modSecInstalled': modSecInstalled}, 'admin') + return proc.render() except BaseException as msg: return HttpResponse(msg) @@ -1316,7 +1301,11 @@ class FirewallManager: csfInstalled = 0 except subprocess.CalledProcessError: csfInstalled = 0 - return render(self.request,'firewall/csf.html', {'csfInstalled' : csfInstalled}) + + proc = httpProc(self.request, 'firewall/csf.html', + {'csfInstalled' : csfInstalled}, 'admin') + return proc.render() + except BaseException as msg: return HttpResponse(str(msg)) @@ -1575,11 +1564,17 @@ class FirewallManager: data['imunify'] = 0 if data['CL'] == 0: - return render(self.request, 'firewall/notAvailable.html', data) + proc = httpProc(self.request, 'firewall/notAvailable.html', + data, 'admin') + return proc.render() elif data['imunify'] == 0: - return render(self.request, 'firewall/notAvailable.html', data) + proc = httpProc(self.request, 'firewall/notAvailable.html', + data, 'admin') + return proc.render() else: - return render(self.request, 'firewall/imunify.html', data) + proc = httpProc(self.request, 'firewall/imunify.html', + data, 'admin') + return proc.render() except BaseException as msg: @@ -1639,9 +1634,14 @@ class FirewallManager: data['imunify'] = 0 if data['imunify'] == 0: - return render(self.request, 'firewall/notAvailableAV.html', data) + proc = httpProc(self.request, 'firewall/notAvailableAV.html', + data, 'admin') + return proc.render() else: - return render(self.request, 'firewall/imunifyAV.html', data) + proc = httpProc(self.request, 'firewall/imunifyAV.html', + data, 'admin') + return proc.render() + except BaseException as msg: diff --git a/ftp/ftpManager.py b/ftp/ftpManager.py index 3812d57a9..86e583906 100755 --- a/ftp/ftpManager.py +++ b/ftp/ftpManager.py @@ -2,6 +2,9 @@ import os.path import sys import django + +from plogical.httpProc import httpProc + sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() @@ -33,8 +36,9 @@ class FTPManager: def loadFTPHome(self): try: - val = self.request.session['userID'] - return render(self.request, 'ftp/index.html') + proc = httpProc(self.request, 'ftp/index.html', + None, 'createFTPAccount') + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -49,12 +53,15 @@ class FTPManager: admin = Administrator.objects.get(pk=userID) if not os.path.exists('/home/cyberpanel/pureftpd'): - return render(self.request, "ftp/createFTPAccount.html", {"status": 0}) + proc = httpProc(self.request, 'ftp/createFTPAccount.html', + { "status": 0}, 'createFTPAccount') + return proc.render() websitesName = ACLManager.findAllSites(currentACL, userID) - return render(self.request, 'ftp/createFTPAccount.html', - {'websiteList': websitesName, 'admin': admin.userName, "status": 1}) + proc = httpProc(self.request, 'ftp/createFTPAccount.html', + {'websiteList': websitesName, 'admin': admin.userName, "status": 1}, 'createFTPAccount') + return proc.render() except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) return HttpResponse(str(msg)) @@ -123,11 +130,16 @@ class FTPManager: return ACLManager.loadError() if not os.path.exists('/home/cyberpanel/pureftpd'): - return render(self.request, "ftp/deleteFTPAccount.html", {"status": 0}) + proc = httpProc(self.request, 'ftp/deleteFTPAccount.html', + { "status": 0}, 'deleteFTPAccount') + return proc.render() websitesName = ACLManager.findAllSites(currentACL, userID) - return render(self.request, 'ftp/deleteFTPAccount.html', {'websiteList': websitesName, "status": 1}) + proc = httpProc(self.request, 'ftp/deleteFTPAccount.html', + {'websiteList': websitesName, "status": 1}, 'deleteFTPAccount') + return proc.render() + except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) return HttpResponse(str(msg)) @@ -212,11 +224,14 @@ class FTPManager: return ACLManager.loadError() if not os.path.exists('/home/cyberpanel/pureftpd'): - return render(self.request, "ftp/listFTPAccounts.html", {"status": 0}) + proc = httpProc(self.request, 'ftp/listFTPAccounts.html', + {"status": 0}, 'listFTPAccounts') + return proc.render() websitesName = ACLManager.findAllSites(currentACL, userID) - - return render(self.request, 'ftp/listFTPAccounts.html', {'websiteList': websitesName, "status": 1}) + proc = httpProc(self.request, 'ftp/listFTPAccounts.html', + {'websiteList': websitesName, "status": 1}, 'listFTPAccounts') + return proc.render() except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) return HttpResponse(str(msg)) From 3809fe44f25dd95bd1eb2403633e846d50b6e4b5 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 13:42:02 +0500 Subject: [PATCH 073/107] add default renderer to IncBackups --- IncBackups/views.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/IncBackups/views.py b/IncBackups/views.py index bd8630d95..ee1d45f53 100644 --- a/IncBackups/views.py +++ b/IncBackups/views.py @@ -12,6 +12,7 @@ from loginSystem.models import Administrator from loginSystem.views import loadLoginPage from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging from plogical.acl import ACLManager +from plogical.httpProc import httpProc from plogical.processUtilities import ProcessUtilities as pu from plogical.virtualHostUtilities import virtualHostUtilities as vhu from websiteFunctions.models import Websites @@ -21,8 +22,10 @@ from .IncBackupsControl import IncJobs from .models import IncJob, BackupJob, JobSites -def def_renderer(request, templateName, args): - return render(request, templateName, args) +def def_renderer(request, templateName, args, context=None): + proc = httpProc(request, templateName, + args, context) + return proc.render() def _get_destinations(local: bool = False): @@ -48,6 +51,7 @@ def _get_user_acl(request): def create_backup(request): + try: user_id, current_acl = _get_user_acl(request) if ACLManager.currentContextPermission(current_acl, 'createBackup') == 0: @@ -58,7 +62,7 @@ def create_backup(request): destinations = _get_destinations(local=True) return def_renderer(request, 'IncBackups/createBackup.html', - {'websiteList': websites, 'destinations': destinations}) + {'websiteList': websites, 'destinations': destinations}, 'createBackup') except BaseException as msg: logging.writeToFile(str(msg)) return redirect(loadLoginPage) @@ -70,7 +74,7 @@ def backup_destinations(request): if ACLManager.currentContextPermission(current_acl, 'addDeleteDestinations') == 0: return ACLManager.loadError() - return def_renderer(request, 'IncBackups/incrementalDestinations.html', {}) + return def_renderer(request, 'IncBackups/incrementalDestinations.html', {}, 'addDeleteDestinations') except BaseException as msg: logging.writeToFile(str(msg)) return redirect(loadLoginPage) @@ -506,7 +510,7 @@ def schedule_backups(request): destinations = _get_destinations(local=True) return def_renderer(request, 'IncBackups/backupSchedule.html', - {'websiteList': websites, 'destinations': destinations}) + {'websiteList': websites, 'destinations': destinations}, 'scheDuleBackups') except BaseException as msg: logging.writeToFile(str(msg)) return redirect(loadLoginPage) @@ -622,7 +626,7 @@ def restore_remote_backups(request): destinations = _get_destinations() return def_renderer(request, 'IncBackups/restoreRemoteBackups.html', - {'websiteList': websites, 'destinations': destinations}) + {'websiteList': websites, 'destinations': destinations}, 'createBackup') except BaseException as msg: logging.writeToFile(str(msg)) return redirect(loadLoginPage) From 3fb7236b43406d2b7f9a4ccd4e288a531451b5f6 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 18:58:37 +0500 Subject: [PATCH 074/107] add default renderer to mailserver --- mailServer/mailserverManager.py | 71 +++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 29 deletions(-) diff --git a/mailServer/mailserverManager.py b/mailServer/mailserverManager.py index c76325ae5..4245c7342 100755 --- a/mailServer/mailserverManager.py +++ b/mailServer/mailserverManager.py @@ -3,6 +3,9 @@ import os.path import sys import django + +from plogical.httpProc import httpProc + sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() @@ -56,8 +59,9 @@ class MailServerManager(multi.Thread): def loadEmailHome(self): try: - val = self.request.session['userID'] - return render(self.request, 'mailServer/index.html') + proc = httpProc(self.request, 'mailServer/index.html', + None, 'createEmail') + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -67,17 +71,18 @@ class MailServerManager(multi.Thread): userID = self.request.session['userID'] currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createEmail') == 0: - return ACLManager.loadError() - if not os.path.exists('/home/cyberpanel/postfix'): - return render(self.request, "mailServer/createEmailAccount.html", {"status": 0}) + proc = httpProc(self.request, 'mailServer/createEmailAccount.html', + { "status": 0}, 'createEmail') + return proc.render() websitesName = ACLManager.findAllSites(currentACL, userID) websitesName = websitesName + ACLManager.findChildDomains(websitesName) - return render(self.request, 'mailServer/createEmailAccount.html', - {'websiteList': websitesName, "status": 1}) + proc = httpProc(self.request, 'mailServer/createEmailAccount.html', + {'websiteList': websitesName, "status": 1}, 'createEmail') + return proc.render() + except BaseException as msg: return redirect(loadLoginPage) @@ -86,17 +91,18 @@ class MailServerManager(multi.Thread): userID = self.request.session['userID'] currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'listEmails') == 0: - return ACLManager.loadError() - if not os.path.exists('/home/cyberpanel/postfix'): - return render(self.request, "mailServer/listEmails.html", {"status": 0}) + proc = httpProc(self.request, 'mailServer/listEmails.html', + { "status": 0}, 'listEmails') + return proc.render() websitesName = ACLManager.findAllSites(currentACL, userID) websitesName = websitesName + ACLManager.findChildDomains(websitesName) - return render(self.request, 'mailServer/listEmails.html', - {'websiteList': websitesName, "status": 1}) + proc = httpProc(self.request, 'mailServer/listEmails.html', + {'websiteList': websitesName, "status": 1}, 'listEmails') + return proc.render() + except BaseException as msg: return redirect(loadLoginPage) @@ -147,17 +153,19 @@ class MailServerManager(multi.Thread): userID = self.request.session['userID'] currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'deleteEmail') == 0: - return ACLManager.loadError() if not os.path.exists('/home/cyberpanel/postfix'): - return render(self.request, "mailServer/deleteEmailAccount.html", {"status": 0}) + proc = httpProc(self.request, 'mailServer/deleteEmailAccount.html', + { "status": 0}, 'deleteEmail') + return proc.render() websitesName = ACLManager.findAllSites(currentACL, userID) websitesName = websitesName + ACLManager.findChildDomains(websitesName) - return render(self.request, 'mailServer/deleteEmailAccount.html', - {'websiteList': websitesName, "status": 1}) + proc = httpProc(self.request, 'mailServer/deleteEmailAccount.html', + {'websiteList': websitesName, "status": 1}, 'deleteEmail') + return proc.render() + except BaseException as msg: return redirect(loadLoginPage) @@ -288,16 +296,17 @@ class MailServerManager(multi.Thread): userID = self.request.session['userID'] currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'emailForwarding') == 0: - return ACLManager.loadError() - if not os.path.exists('/home/cyberpanel/postfix'): - return render(self.request, "mailServer/emailForwarding.html", {"status": 0}) + proc = httpProc(self.request, 'mailServer/emailForwarding.html', + { "status": 0}, 'emailForwarding') + return proc.render() websitesName = ACLManager.findAllSites(currentACL, userID) websitesName = websitesName + ACLManager.findChildDomains(websitesName) - return render(self.request, 'mailServer/emailForwarding.html', {'websiteList': websitesName, "status": 1}) + proc = httpProc(self.request, 'mailServer/emailForwarding.html', + {'websiteList': websitesName, "status": 1}, 'emailForwarding') + return proc.render() except BaseException as msg: return redirect(loadLoginPage) @@ -581,13 +590,16 @@ class MailServerManager(multi.Thread): return ACLManager.loadError() if not os.path.exists('/home/cyberpanel/postfix'): - return render(self.request, "mailServer/changeEmailPassword.html", {"status": 0}) + proc = httpProc(self.request, 'mailServer/changeEmailPassword.html', + {"status": 0}, 'changeEmailPassword') + return proc.render() websitesName = ACLManager.findAllSites(currentACL, userID) websitesName = websitesName + ACLManager.findChildDomains(websitesName) - return render(self.request, 'mailServer/changeEmailPassword.html', - {'websiteList': websitesName, "status": 1}) + proc = httpProc(self.request, 'mailServer/changeEmailPassword.html', + {'websiteList': websitesName, "status": 1}, 'changeEmailPassword') + return proc.render() except BaseException as msg: return redirect(loadLoginPage) @@ -653,8 +665,9 @@ class MailServerManager(multi.Thread): websitesName = ACLManager.findAllSites(currentACL, userID) websitesName = websitesName + ACLManager.findChildDomains(websitesName) - return render(self.request, 'mailServer/dkimManager.html', - {'websiteList': websitesName, 'openDKIMInstalled': openDKIMInstalled}) + proc = httpProc(self.request, 'mailServer/dkimManager.html', + {'websiteList': websitesName, 'openDKIMInstalled': openDKIMInstalled}, 'dkimManager') + return proc.render() except BaseException as msg: return redirect(loadLoginPage) From 7271478f1c4bbe76369da17e6cf9280047805540 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 19:02:42 +0500 Subject: [PATCH 075/107] add default renderer to phpmanager --- managePHP/views.py | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/managePHP/views.py b/managePHP/views.py index 9f672a3c9..2549da31a 100755 --- a/managePHP/views.py +++ b/managePHP/views.py @@ -20,6 +20,7 @@ from xml.etree import ElementTree from plogical.acl import ACLManager from plogical.processUtilities import ProcessUtilities from .phpManager import PHPManager +from plogical.httpProc import httpProc # Create your views here. @@ -29,12 +30,10 @@ def loadPHPHome(request): userID = request.session['userID'] currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + proc = httpProc(request, 'managePHP/index.html', + None, 'admin') + return proc.render() - return render(request, 'managePHP/index.html') except KeyError: return redirect(loadLoginPage) @@ -43,11 +42,6 @@ def installExtensions(request): userID = request.session['userID'] currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - if PHP.objects.count() == 0: for i in range(3, 7): php = "php" + str(5) + str(i) @@ -1247,7 +1241,10 @@ def installExtensions(request): except: pass - return render(request, 'managePHP/installExtensions.html', {'phps': PHPManager.findPHPVersions()}) + proc = httpProc(request, 'managePHP/installExtensions.html', + {'phps': PHPManager.findPHPVersions()}, 'admin') + return proc.render() + except KeyError: return redirect(loadLoginPage) @@ -1601,14 +1598,10 @@ def getRequestStatusApache(request): def editPHPConfigs(request): try: userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + proc = httpProc(request, 'managePHP/editPHPConfig.html', + {'phps': PHPManager.findPHPVersions()}, 'admin') + return proc.render() - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(request, 'managePHP/editPHPConfig.html', {'phps': PHPManager.findPHPVersions()}) except KeyError: return redirect(loadLoginPage) @@ -1695,7 +1688,9 @@ def getCurrentPHPConfig(request): return HttpResponse(final_json) - return render(request, 'managePHP/editPHPConfig.html') + proc = httpProc(request, 'managePHP/editPHPConfig.html', + None, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) From 4424d84db975c64f666b3d677818de788b7fec50 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 19:06:44 +0500 Subject: [PATCH 076/107] add default renderer to manageservices --- manageServices/views.py | 60 +++++++++++------------------------------ 1 file changed, 15 insertions(+), 45 deletions(-) diff --git a/manageServices/views.py b/manageServices/views.py index c4bc2f697..7df91bb98 100755 --- a/manageServices/views.py +++ b/manageServices/views.py @@ -6,6 +6,8 @@ import plogical.CyberCPLogFileWriter as logging from loginSystem.views import loadLoginPage import os import json + +from plogical.httpProc import httpProc from plogical.mailUtilities import mailUtilities from plogical.acl import ACLManager from .models import PDNSStatus, SlaveServers @@ -18,11 +20,6 @@ def managePowerDNS(request): userID = request.session['userID'] currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() try: data = {} @@ -47,7 +44,10 @@ def managePowerDNS(request): data['slaveServerNS'] = pdnsStatus.masterServer data['masterServerIP'] = pdnsStatus.masterIP - return render(request, 'manageServices/managePowerDNS.html', data) + proc = httpProc(request, 'manageServices/managePowerDNS.html', + data, 'admin') + return proc.render() + except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) return HttpResponse("See CyberCP main log file.") @@ -56,42 +56,14 @@ def managePowerDNS(request): return redirect(loadLoginPage) def managePostfix(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - try: - - return render(request, 'manageServices/managePostfix.html', {"status": 1}) - - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse("See CyberCP main log file.") - - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'manageServices/managePostfix.html', + {"status": 1}, 'admin') + return proc.render() def managePureFtpd(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - try: - return render(request, 'manageServices/managePureFtpd.html', {"status": 1}) - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse("See CyberCP main log file.") - - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'manageServices/managePureFtpd.html', + {"status": 1}, 'admin') + return proc.render() def fetchStatus(request): try: @@ -333,11 +305,9 @@ def manageApplications(request): services.append(elasticSearch) services.append(redis) - try: - return render(request, 'manageServices/applications.html', {'services': services}) - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse("See CyberCP main log file.") + proc = httpProc(request, 'manageServices/applications.html', + {'services': services}, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) From 06d44af3c29286cbbda991b99a823e5999578617 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 19:11:49 +0500 Subject: [PATCH 077/107] add default renderer to manageSSL --- manageSSL/views.py | 85 ++++++++++++++-------------------------------- 1 file changed, 25 insertions(+), 60 deletions(-) diff --git a/manageSSL/views.py b/manageSSL/views.py index 0dfdb16c5..9688278d6 100755 --- a/manageSSL/views.py +++ b/manageSSL/views.py @@ -1,49 +1,31 @@ # -*- coding: utf-8 -*- - -from django.shortcuts import render, redirect -from loginSystem.views import loadLoginPage +from plogical.httpProc import httpProc from websiteFunctions.models import Websites, ChildDomains from loginSystem.models import Administrator from plogical.virtualHostUtilities import virtualHostUtilities from django.http import HttpResponse import json -import shlex -import subprocess from plogical.acl import ACLManager -from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging from plogical.processUtilities import ProcessUtilities - # Create your views here. - def loadSSLHome(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - return render(request, 'manageSSL/index.html', currentACL) - except KeyError: - return redirect(loadLoginPage) + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + proc = httpProc(request, 'manageSSL/index.html', + currentACL, 'admin') + return proc.render() def manageSSL(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - elif currentACL['manageSSL'] == 1: - pass - else: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - - return render(request, 'manageSSL/manageSSL.html', {'websiteList': websitesName}) - except KeyError: - return redirect(loadLoginPage) + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID) + proc = httpProc(request, 'manageSSL/manageSSL.html', + {'websiteList': websitesName}, 'manageSSL') + return proc.render() def issueSSL(request): @@ -115,22 +97,13 @@ def issueSSL(request): def sslForHostName(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID, 1) - if currentACL['admin'] == 1: - pass - elif currentACL['hostnameSSL'] == 1: - pass - else: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID, 1) - - return render(request, 'manageSSL/sslForHostName.html', {'websiteList': websitesName}) - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'manageSSL/sslForHostName.html', + {'websiteList': websitesName}, 'hostnameSSL') + return proc.render() def obtainHostNameSSL(request): @@ -197,23 +170,15 @@ def obtainHostNameSSL(request): def sslForMailServer(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - pass - elif currentACL['mailServerSSL'] == 1: - pass - else: - return ACLManager.loadError() + websitesName = ACLManager.findAllSites(currentACL, userID) + websitesName = websitesName + ACLManager.findChildDomains(websitesName) - websitesName = ACLManager.findAllSites(currentACL, userID) - websitesName = websitesName + ACLManager.findChildDomains(websitesName) - - return render(request, 'manageSSL/sslForMailServer.html', {'websiteList': websitesName}) - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'manageSSL/sslForMailServer.html', + {'websiteList': websitesName}, 'mailServerSSL') + return proc.render() def obtainMailServerSSL(request): From 91a47ddd2d399205d3116a2bd239c2a05bc4812b Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 19:16:00 +0500 Subject: [PATCH 078/107] add default renderer to packages --- packages/packagesManager.py | 80 +++++++++++++------------------------ 1 file changed, 27 insertions(+), 53 deletions(-) diff --git a/packages/packagesManager.py b/packages/packagesManager.py index 69d798f35..249557650 100755 --- a/packages/packagesManager.py +++ b/packages/packagesManager.py @@ -4,6 +4,7 @@ import sys import django from plogical import hashPassword +from plogical.httpProc import httpProc sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") @@ -21,39 +22,24 @@ class PackagesManager: self.request = request def packagesHome(self): - try: - val = self.request.session['userID'] - return render(self.request, 'packages/index.html', {}) - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(self.request, 'packages/index.html', + None, 'admin') + return proc.render() def createPacakge(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'createPackage') == 0: - return ACLManager.loadError() - - admin = Administrator.objects.get(pk=userID) - return render(self.request, 'packages/createPackage.html', {"admin": admin.userName}) - - except KeyError: - return redirect(loadLoginPage) + userID = self.request.session['userID'] + admin = Administrator.objects.get(pk=userID) + proc = httpProc(self.request, 'packages/createPackage.html', + {"admin": admin.userName}, 'createPackage') + return proc.render() def deletePacakge(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'deletePackage') == 0: - return ACLManager.loadError() - - packageList = ACLManager.loadPackages(userID, currentACL) - return render(self.request, 'packages/deletePackage.html', {"packageList": packageList}) - - except BaseException as msg: - return HttpResponse(str(msg)) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + packageList = ACLManager.loadPackages(userID, currentACL) + proc = httpProc(self.request, 'packages/deletePackage.html', + {"packageList": packageList}, 'deletePackage') + return proc.render() def submitPackage(self): try: @@ -134,18 +120,12 @@ class PackagesManager: return HttpResponse(json_data) def modifyPackage(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'modifyPackage') == 0: - return ACLManager.loadError() - - packageList = ACLManager.loadPackages(userID, currentACL) - return render(self.request, 'packages/modifyPackage.html', {"packList": packageList}) - - except BaseException as msg: - return HttpResponse(str(msg)) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + packageList = ACLManager.loadPackages(userID, currentACL) + proc = httpProc(self.request, 'packages/modifyPackage.html', + {"packageList": packageList}, 'modifyPackage') + return proc.render() def submitModify(self): try: @@ -225,18 +205,12 @@ class PackagesManager: def listPackages(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'listPackages') == 0: - return ACLManager.loadError() - - packageList = ACLManager.loadPackages(userID, currentACL) - return render(self.request, 'packages/listPackages.html', {"packList": packageList}) - - except BaseException as msg: - return redirect(loadLoginPage) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + packageList = ACLManager.loadPackages(userID, currentACL) + proc = httpProc(self.request, 'packages/listPackages.html', + {"packageList": packageList}, 'listPackages') + return proc.render() def listPackagesAPI(self,data=None): """ From 2801c33bbb16d43c73a36a47a1b5ac9ddab6600c Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 19:20:45 +0500 Subject: [PATCH 079/107] add default renderer to serverLogs --- serverLogs/views.py | 143 ++++++++++---------------------------------- 1 file changed, 30 insertions(+), 113 deletions(-) diff --git a/serverLogs/views.py b/serverLogs/views.py index c376fb36a..425eb2bfb 100755 --- a/serverLogs/views.py +++ b/serverLogs/views.py @@ -1,117 +1,45 @@ # -*- coding: utf-8 -*- - -from django.shortcuts import render,redirect -from loginSystem.views import loadLoginPage from django.http import HttpResponse import json import plogical.CyberCPLogFileWriter as logging +from plogical.httpProc import httpProc from plogical.installUtilities import installUtilities -import subprocess -import shlex from plogical.virtualHostUtilities import virtualHostUtilities from plogical.acl import ACLManager from plogical.processUtilities import ProcessUtilities import os # Create your views here. - def logsHome(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - except KeyError: - return redirect(loadLoginPage) - - return render(request,'serverLogs/index.html') + proc = httpProc(request, 'serverLogs/index.html', + None, 'admin') + return proc.render() def accessLogs(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(request,'serverLogs/accessLogs.html') - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[accessLogs]") - return redirect(loadLoginPage) + proc = httpProc(request, 'serverLogs/accessLogs.html', + None, 'admin') + return proc.render() def errorLogs(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - - return render(request,'serverLogs/errorLogs.html') - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[accessLogs]") - return redirect(loadLoginPage) + proc = httpProc(request, 'serverLogs/errorLogs.html', + None, 'admin') + return proc.render() def ftplogs(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(request,'serverLogs/ftplogs.html') - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[accessLogs]") - return redirect(loadLoginPage) + proc = httpProc(request, 'serverLogs/ftplogs.html', + None, 'admin') + return proc.render() def emailLogs(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - - return render(request,'serverLogs/emailLogs.html') - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[accessLogs]") - return redirect(loadLoginPage) + proc = httpProc(request, 'serverLogs/emailLogs.html', + None, 'admin') + return proc.render() def modSecAuditLogs(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(request,'serverLogs/modSecAuditLog.html') - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[accessLogs]") - return redirect(loadLoginPage) + proc = httpProc(request, 'serverLogs/modSecAuditLog.html', + None, 'admin') + return proc.render() def getLogsFromFile(request): try: @@ -205,30 +133,19 @@ def clearLogFile(request): return HttpResponse(json_data) def serverMail(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + smtpPath = '/home/cyberpanel/smtpDetails' + data = {} - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + if os.path.exists(smtpPath): + mailSettings = json.loads(open(smtpPath, 'r').read()) + data['smtpHost'] = mailSettings['smtpHost'] + data['smtpPort'] = mailSettings['smtpPort'] + data['smtpUserName'] = mailSettings['smtpUserName'] + data['smtpPassword'] = mailSettings['smtpPassword'] - smtpPath = '/home/cyberpanel/smtpDetails' - data = {} - - if os.path.exists(smtpPath): - mailSettings = json.loads(open(smtpPath, 'r').read()) - data['smtpHost'] = mailSettings['smtpHost'] - data['smtpPort'] = mailSettings['smtpPort'] - data['smtpUserName'] = mailSettings['smtpUserName'] - data['smtpPassword'] = mailSettings['smtpPassword'] - - return render(request,'serverLogs/serverMail.html', data) - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[accessLogs]") - return redirect(loadLoginPage) + proc = httpProc(request, 'serverLogs/serverMail.html', + data, 'admin') + return proc.render() def saveSMTPSettings(request): try: From db9ecbdfa84b4658548f096bab3acda0aced0d05 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 19:26:45 +0500 Subject: [PATCH 080/107] add default renderer to serverStatus --- serverStatus/views.py | 111 +++++++++--------------------------------- 1 file changed, 24 insertions(+), 87 deletions(-) diff --git a/serverStatus/views.py b/serverStatus/views.py index a5b144866..d86a50f12 100755 --- a/serverStatus/views.py +++ b/serverStatus/views.py @@ -1,12 +1,11 @@ # -*- coding: utf-8 -*- - from django.shortcuts import render, redirect from django.http import HttpResponse import plogical.CyberCPLogFileWriter as logging from loginSystem.views import loadLoginPage import json -import subprocess, shlex +import subprocess import psutil import socket from plogical.acl import ACLManager @@ -18,7 +17,6 @@ from plogical.processUtilities import ProcessUtilities from plogical.httpProc import httpProc from plogical.installUtilities import installUtilities - # Create your views here. NOTHING = 0 @@ -31,11 +29,9 @@ VERSION = '2.0' BUILD = 3 def serverStatusHome(request): - try: - userID = request.session['userID'] - return render(request, 'serverStatus/index.html') - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'serverStatus/index.html', + None, 'admin') + return proc.render() def litespeedStatus(request): @@ -43,11 +39,6 @@ def litespeedStatus(request): userID = request.session['userID'] currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - processList = ProcessUtilities.getLitespeedProcessNumber() OLS = 0 @@ -82,17 +73,21 @@ def litespeedStatus(request): except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[litespeedStatus]") - return render(request, "serverStatus/litespeedStatus.html", {"processList": processList, - "liteSpeedVersionStatus": "For some reaons not able to load version details, see CyberCP main log file.", - 'OLS': OLS , 'message': message}) + proc = httpProc(request, 'serverStatus/litespeedStatus.html', + {"processList": processList, + "liteSpeedVersionStatus": "For some reaons not able to load version details, see CyberCP main log file.", + 'OLS': OLS, 'message': message}, 'admin') + return proc.render() if (processList != 0): dataForHtml = {"processList": processList, "lsversion": lsversion, "modules": modules, "loadedModules": loadedModules, 'OLS': OLS, 'message': message} - return render(request, "serverStatus/litespeedStatus.html", dataForHtml) + proc = httpProc(request, 'serverStatus/litespeedStatus.html', dataForHtml, 'admin') + return proc.render() else: dataForHtml = {"lsversion": lsversion, "modules": modules, "loadedModules": loadedModules, 'OLS': OLS, 'message': message} - return render(request, "serverStatus/litespeedStatus.html", dataForHtml) + proc = httpProc(request, 'serverStatus/litespeedStatus.html', dataForHtml, 'admin') + return proc.render() except KeyError as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[litespeedStatus]") @@ -132,21 +127,8 @@ def stopOrRestartLitespeed(request): return HttpResponse("Not Logged in as admin") def cyberCPMainLogFile(request): - try: - userID = request.session['userID'] - - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(request, 'serverStatus/cybercpmainlogfile.html') - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[cyberCPMainLogFile]") - return redirect(loadLoginPage) + proc = httpProc(request, 'serverStatus/cybercpmainlogfile.html', None, 'admin') + return proc.render() def getFurtherDataFromLogFile(request): try: @@ -177,10 +159,6 @@ def services(request): userID = request.session['userID'] currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() data = {} if ProcessUtilities.decideServer() == ProcessUtilities.OLS: @@ -194,7 +172,8 @@ def services(request): else: data['isDocker'] = True - return render(request, 'serverStatus/services.html', data) + proc = httpProc(request, 'serverStatus/services.html', data, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -536,22 +515,8 @@ def changeLicense(request): def topProcesses(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - templateName = "serverStatus/topProcesses.html" - proc = httpProc(request, templateName) - return proc.renderPre() - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[litespeedStatus]") - return redirect(loadLoginPage) + proc = httpProc(request, "serverStatus/topProcesses.html", None, 'admin') + return proc.render() def topProcessesStatus(request): try: @@ -764,22 +729,8 @@ def killProcess(request): return HttpResponse(final_json) def packageManager(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - templateName = "serverStatus/packageManager.html" - proc = httpProc(request, templateName) - return proc.renderPre() - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[packageManager]") - return redirect(loadLoginPage) + proc = httpProc(request, "serverStatus/packageManager.html", None, 'admin') + return proc.render() def fetchPackages(request): try: @@ -1181,23 +1132,9 @@ def lockStatus(request): def CyberPanelPort(request): - try: - userID = request.session['userID'] - - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - port = ProcessUtilities.fetchCurrentPort() - - return render(request, 'serverStatus/changeCyberPanelPort.html', {'port': port}) - - except KeyError as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + "[CyberPanelPort]") - return redirect(loadLoginPage) + port = ProcessUtilities.fetchCurrentPort() + proc = httpProc(request, "serverStatus/changeCyberPanelPort.html", {'port': port}, 'admin') + return proc.render() def submitPortChange(request): From 35bcc1f6c37228770aa391060e0a284b49e59d81 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 19:29:48 +0500 Subject: [PATCH 081/107] add default renderer to tuning --- tuning/tuning.py | 47 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/tuning/tuning.py b/tuning/tuning.py index 74eedbeed..76956181b 100755 --- a/tuning/tuning.py +++ b/tuning/tuning.py @@ -2,10 +2,13 @@ import os.path import sys import django + +from plogical.httpProc import httpProc + sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() -from django.shortcuts import render,redirect +from django.shortcuts import redirect from django.http import HttpResponse import json import plogical.CyberCPLogFileWriter as logging @@ -18,49 +21,31 @@ from plogical.processUtilities import ProcessUtilities class tuningManager: def loadTuningHome(self, request, userID): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - return render(request, 'tuning/index.html', {}) - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'tuning/index.html', + None, 'admin') + return proc.render() def liteSpeedTuning(self, request, userID): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - return render(request, 'tuning/liteSpeedTuning.html', {}) - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'tuning/liteSpeedTuning.html', + None, 'admin') + return proc.render() def phpTuning(self, request, userID): try: userID = request.session['userID'] currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - if ProcessUtilities.decideServer() == ProcessUtilities.OLS: websitesName = ACLManager.findAllSites(currentACL, userID) OLS = 1 - return render(request, 'tuning/phpTuning.html', {'websiteList': websitesName, 'OLS': OLS}) + proc = httpProc(request, 'tuning/phpTuning.html', + {'websiteList': websitesName, 'OLS': OLS}, 'admin') + return proc.render() else: OLS = 0 - return render(request, 'tuning/phpTuning.html', {'OLS': OLS}) + proc = httpProc(request, 'tuning/phpTuning.html', + {'OLS': OLS}, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) From 8d446d8232690a71f417ca67ce3c7e2c582a4e7c Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 19:45:05 +0500 Subject: [PATCH 082/107] add default renderer to userManagement --- WebTerminal/views.py | 16 +++--- plogical/httpProc.py | 1 - userManagment/views.py | 109 ++++++++++++++++++++++------------------- 3 files changed, 64 insertions(+), 62 deletions(-) diff --git a/WebTerminal/views.py b/WebTerminal/views.py index 145cfc3bf..33c69b821 100644 --- a/WebTerminal/views.py +++ b/WebTerminal/views.py @@ -7,6 +7,8 @@ from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging from loginSystem.views import loadLoginPage from random import randint import os + +from plogical.httpProc import httpProc from plogical.processUtilities import ProcessUtilities from plogical.firewallUtilities import FirewallUtilities from firewall.models import FirewallRules @@ -17,13 +19,6 @@ import plogical.randomPassword def terminal(request): try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() password = plogical.randomPassword.generate_pass() @@ -48,13 +43,14 @@ def terminal(request): newFWRule = FirewallRules(name='terminal', proto='tcp', port='5678', ipAddress='0.0.0.0/0') newFWRule.save() - return render(request, 'WebTerminal/WebTerminal.html', {'verifyPath': verifyPath, 'password': password}) + proc = httpProc(request, 'WebTerminal/WebTerminal.html', + {'verifyPath': verifyPath, 'password': password}) + return proc.render() + except BaseException as msg: logging.writeToFile(str(msg)) return redirect(loadLoginPage) - - def restart(request): try: diff --git a/plogical/httpProc.py b/plogical/httpProc.py index 81b1714de..5b94b0ff9 100755 --- a/plogical/httpProc.py +++ b/plogical/httpProc.py @@ -2,7 +2,6 @@ from django.shortcuts import render, HttpResponse import json -from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter class httpProc: def __init__(self, request, templateName, data = None, function = None): diff --git a/userManagment/views.py b/userManagment/views.py index 01256fd46..ad06d3843 100755 --- a/userManagment/views.py +++ b/userManagment/views.py @@ -9,6 +9,7 @@ import json from plogical import hashPassword from plogical import CyberCPLogFileWriter as logging from plogical.acl import ACLManager +from plogical.httpProc import httpProc from plogical.virtualHostUtilities import virtualHostUtilities from CyberCP.secMiddleware import secMiddleware from CyberCP.SecurityLevel import SecurityLevel @@ -25,7 +26,10 @@ def loadUserHome(request): listUsers = 1 else: listUsers = currentACL['listUsers'] - return render(request, 'userManagment/index.html', {"type": admin.type, 'listUsers': listUsers}) + + proc = httpProc(request, 'userManagment/index.html', + {"type": admin.type, 'listUsers': listUsers}, 'admin') + return proc.render() except BaseException as msg: logging.CyberCPLogFileWriter.writeToFile(str(msg)) return HttpResponse(str(msg)) @@ -48,7 +52,9 @@ def viewProfile(request): AdminData['email'] = admin.email AdminData['accountACL'] = admin.acl.name - return render(request, 'userManagment/userProfile.html', AdminData) + proc = httpProc(request, 'userManagment/userProfile.html', + AdminData) + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -59,16 +65,19 @@ def createUser(request): if currentACL['admin'] == 1: aclNames = ACLManager.unFileteredACLs() - return render(request, 'userManagment/createUser.html', - {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) + proc = httpProc(request, 'userManagment/createUser.html', + {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) + return proc.render() elif currentACL['changeUserACL'] == 1: aclNames = ACLManager.unFileteredACLs() - return render(request, 'userManagment/createUser.html', - {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) + proc = httpProc(request, 'userManagment/createUser.html', + {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) + return proc.render() elif currentACL['createNewUser'] == 1: aclNames = ['user'] - return render(request, 'userManagment/createUser.html', - {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) + proc = httpProc(request, 'userManagment/createUser.html', + {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) + return proc.render() else: return ACLManager.loadError() @@ -84,7 +93,9 @@ def apiAccess(request): if currentACL['admin'] == 1: adminNames = ACLManager.loadDeletionUsers(userID, currentACL) adminNames.append("admin") - return render(request, 'userManagment/apiAccess.html', {'acctNames': adminNames}) + proc = httpProc(request, 'userManagment/apiAccess.html', + {'acctNames': adminNames}) + return proc.render() else: return ACLManager.loadError() @@ -253,8 +264,9 @@ def modifyUsers(request): try: userID = request.session['userID'] userNames = ACLManager.loadAllUsers(userID) - return render(request, 'userManagment/modifyUser.html', - {"acctNames": userNames, 'securityLevels': SecurityLevel.list()}) + proc = httpProc(request, 'userManagment/modifyUser.html', + {"acctNames": userNames, 'securityLevels': SecurityLevel.list()}) + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -412,10 +424,14 @@ def deleteUser(request): if currentACL['admin'] == 1: adminNames = ACLManager.loadDeletionUsers(userID, currentACL) - return render(request, 'userManagment/deleteUser.html', {"acctNames": adminNames}) + proc = httpProc(request, 'userManagment/deleteUser.html', + {"acctNames": adminNames}) + return proc.render() elif currentACL['deleteUser'] == 1: adminNames = ACLManager.loadDeletionUsers(userID, currentACL) - return render(request, 'userManagment/deleteUser.html', {"acctNames": adminNames}) + proc = httpProc(request, 'userManagment/deleteUser.html', + {"acctNames": adminNames}) + return proc.render() else: return ACLManager.loadError() @@ -493,13 +509,9 @@ def submitUserDeletion(request): def createNewACL(request): try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - return render(request, 'userManagment/createACL.html') - else: - return ACLManager.loadError() + proc = httpProc(request, 'userManagment/createACL.html', + None, 'admin') + return proc.render() except KeyError: return redirect(loadLoginPage) @@ -534,17 +546,10 @@ def createACLFunc(request): return HttpResponse(json_data) def deleteACL(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - aclNames = ACLManager.findAllACLs() - return render(request, 'userManagment/deleteACL.html', {'aclNames': aclNames}) - else: - return ACLManager.loadError() - except KeyError: - return redirect(loadLoginPage) + aclNames = ACLManager.findAllACLs() + proc = httpProc(request, 'userManagment/deleteACL.html', + {'aclNames': aclNames}, 'admin') + return proc.render() def deleteACLFunc(request): try: @@ -573,17 +578,10 @@ def deleteACLFunc(request): return HttpResponse(json_data) def modifyACL(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - aclNames = ACLManager.findAllACLs() - return render(request, 'userManagment/modifyACL.html', {'aclNames': aclNames}) - else: - return ACLManager.loadError() - except KeyError: - return redirect(loadLoginPage) + aclNames = ACLManager.findAllACLs() + proc = httpProc(request, 'userManagment/modifyACL.html', + {'aclNames': aclNames}, 'admin') + return proc.render() def fetchACLDetails(request): try: @@ -656,12 +654,15 @@ def changeUserACL(request): if currentACL['admin'] == 1: aclNames = ACLManager.unFileteredACLs() userNames = ACLManager.findAllUsers() - return render(request, 'userManagment/changeUserACL.html', {'aclNames': aclNames, 'usersList': userNames}) + proc = httpProc(request, 'userManagment/changeUserACL.html', + {'aclNames': aclNames, 'usersList': userNames}, 'admin') + return proc.render() elif currentACL['changeUserACL'] == 1: aclNames = ACLManager.unFileteredACLs() userNames = ACLManager.findAllUsers() - - return render(request, 'userManagment/changeUserACL.html', {'aclNames': aclNames, 'usersList': userNames}) + proc = httpProc(request, 'userManagment/changeUserACL.html', + {'aclNames': aclNames, 'usersList': userNames}) + return proc.render() else: return ACLManager.loadError() @@ -717,13 +718,15 @@ def resellerCenter(request): if currentACL['admin'] == 1: userNames = ACLManager.loadDeletionUsers(userID, currentACL) resellerPrivUsers = ACLManager.userWithResellerPriv(userID) - return render(request, 'userManagment/resellerCenter.html', - {'userToBeModified': userNames, 'resellerPrivUsers': resellerPrivUsers}) + proc = httpProc(request, 'userManagment/resellerCenter.html', + {'userToBeModified': userNames, 'resellerPrivUsers': resellerPrivUsers}) + return proc.render() elif currentACL['resellerCenter'] == 1: userNames = ACLManager.loadDeletionUsers(userID, currentACL) resellerPrivUsers = ACLManager.userWithResellerPriv(userID) - return render(request, 'userManagment/resellerCenter.html', - {'userToBeModified': userNames, 'resellerPrivUsers': resellerPrivUsers}) + proc = httpProc(request, 'userManagment/resellerCenter.html', + {'userToBeModified': userNames, 'resellerPrivUsers': resellerPrivUsers}) + return proc.render() else: return ACLManager.loadError() @@ -810,9 +813,13 @@ def listUsers(request): resellerPrivUsers = [] if currentACL['admin'] == 1: - return render(request, 'userManagment/listUsers.html', {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers}) + proc = httpProc(request, 'userManagment/listUsers.html', + {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers}) + return proc.render() elif currentACL['listUsers'] == 1: - return render(request, 'userManagment/listUsers.html', {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers}) + proc = httpProc(request, 'userManagment/listUsers.html', + {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers}) + return proc.render() else: return ACLManager.loadError() From 8284755dad299ae48398f251c9ccb1b306ac8df6 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 20:09:13 +0500 Subject: [PATCH 083/107] add default renderer to websites --- backup/backupManager.py | 29 +- dockerManager/container.py | 8 +- emailPremium/views.py | 10 +- plogical/backupManager.py | 1312 -------------------- plogical/website.py | 2333 ----------------------------------- websiteFunctions/views.py | 15 +- websiteFunctions/website.py | 98 +- 7 files changed, 94 insertions(+), 3711 deletions(-) delete mode 100644 plogical/backupManager.py delete mode 100755 plogical/website.py diff --git a/backup/backupManager.py b/backup/backupManager.py index 6d0a93d50..438c41729 100755 --- a/backup/backupManager.py +++ b/backup/backupManager.py @@ -4,6 +4,8 @@ import os.path import sys import django +from plogical.httpProc import httpProc + sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() @@ -39,7 +41,8 @@ class BackupManager: def loadBackupHome(self, request=None, userID=None, data=None): try: currentACL = ACLManager.loadedACL(userID) - return render(request, 'backup/index.html', currentACL) + proc = httpProc(request, 'backup/index.html', currentACL) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -51,7 +54,8 @@ class BackupManager: return ACLManager.loadError() websitesName = ACLManager.findAllSites(currentACL, userID) - return render(request, 'backup/backup.html', {'websiteList': websitesName}) + proc = httpProc(request, 'backup/backup.html', {'websiteList': websitesName}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -73,7 +77,8 @@ class BackupManager: websitesName = ACLManager.findAllSites(currentACL, userID) - return render(request, 'backup/googleDrive.html', {'accounts': gDriveAcctsList, 'websites': websitesName}) + proc = httpProc(request, 'backup/googleDrive.html', {'accounts': gDriveAcctsList, 'websites': websitesName}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -365,7 +370,8 @@ class BackupManager: path = os.path.join("/home", "backup") if not os.path.exists(path): - return render(request, 'backup/restore.html') + proc = httpProc(request, 'backup/restore.html') + return proc.render() else: all_files = [] ext = ".tar.gz" @@ -378,7 +384,8 @@ class BackupManager: if filename.endswith(ext): all_files.append(filename) - return render(request, 'backup/restore.html', {'backups': all_files}) + proc = httpProc(request, 'backup/restore.html', {'backups': all_files}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -701,7 +708,8 @@ class BackupManager: if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: return ACLManager.loadError() - return render(request, 'backup/backupDestinations.html', {}) + proc = httpProc(request, 'backup/backupDestinations.html', {}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -883,7 +891,8 @@ class BackupManager: websitesName = ACLManager.findAllSites(currentACL, userID) - return render(request, 'backup/backupSchedule.html', {'destinations': dests, 'websites': websitesName}) + proc = httpProc(request, 'backup/backupSchedule.html', {'destinations': dests, 'websites': websitesName}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -1015,7 +1024,8 @@ class BackupManager: if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: return ACLManager.loadError() - return render(request, 'backup/remoteBackups.html') + proc = httpProc(request, 'backup/remoteBackups.html') + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -1386,7 +1396,8 @@ class BackupManager: for logFile in logFiles: all_files.append(logFile.logFile) - return render(request, 'backup/backupLogs.html', {'backups': all_files}) + proc = httpProc(request, 'backup/backupLogs.html', {'backups': all_files}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) diff --git a/dockerManager/container.py b/dockerManager/container.py index 9b9e6c7fe..8cc1ceb73 100755 --- a/dockerManager/container.py +++ b/dockerManager/container.py @@ -27,7 +27,7 @@ import requests from plogical.processUtilities import ProcessUtilities from serverStatus.serverStatusUtil import ServerStatusUtil import threading as multi - +from plogical.httpProc import httpProc # Use default socket to connect class ContainerManager(multi.Thread): @@ -50,7 +50,8 @@ class ContainerManager(multi.Thread): else: return ACLManager.loadError() - return render(self.request, self.templateName, self.data) + proc = httpProc(self.request, self.templateName, self.data) + return proc.render() def run(self): try: @@ -111,9 +112,10 @@ class ContainerManager(multi.Thread): except docker.errors.ImageNotFound: val = request.session['userID'] admin = Administrator.objects.get(pk=val) - return render(request, 'dockerManager/images.html', {"type": admin.type, + proc = httpProc(request, 'dockerManager/images.html', {"type": admin.type, 'image': image, 'tag': tag}) + return proc.render() envList = {}; if 'Env' in inspectImage['Config']: diff --git a/emailPremium/views.py b/emailPremium/views.py index bbe8b1ccc..ac230318e 100755 --- a/emailPremium/views.py +++ b/emailPremium/views.py @@ -5,8 +5,6 @@ from django.shortcuts import render,redirect from django.http import HttpResponse from mailServer.models import Domains, EUsers # Create your views here. -from loginSystem.models import Administrator -from plogical.httpProc import httpProc from websiteFunctions.models import Websites from loginSystem.views import loadLoginPage import plogical.CyberCPLogFileWriter as logging @@ -20,7 +18,7 @@ from plogical.virtualHostUtilities import virtualHostUtilities from random import randint from plogical.acl import ACLManager from plogical.processUtilities import ProcessUtilities - +from plogical.httpProc import httpProc # Create your views here. ## Email Policy Server @@ -157,7 +155,8 @@ def listDomains(request): break if installCheck == 0: - return render(request, 'emailPremium/listDomains.html', {"installCheck": installCheck}) + proc = httpProc(request, 'emailPremium/listDomains.html', {"installCheck": installCheck}) + return proc.render() ### @@ -962,7 +961,8 @@ def fetchSpamAssassinSettings(request): return HttpResponse(final_json) - return render(request,'managePHP/editPHPConfig.html') + proc = httpProc(request,'managePHP/editPHPConfig.html') + return proc.render() except KeyError: return redirect(loadLoginPage) diff --git a/plogical/backupManager.py b/plogical/backupManager.py deleted file mode 100644 index 3e2c6fd30..000000000 --- a/plogical/backupManager.py +++ /dev/null @@ -1,1312 +0,0 @@ -#!/usr/local/CyberCP/bin/python -import os -import os.path -import sys -import django -sys.path.append('/usr/local/CyberCP') -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") -django.setup() -import json -from plogical.acl import ACLManager -from plogical import CyberCPLogFileWriter as logging -from websiteFunctions.models import Websites, Backups, dest, backupSchedules -from plogical.virtualHostUtilities import virtualHostUtilities -import subprocess -import shlex -from django.shortcuts import HttpResponse, render -from loginSystem.models import Administrator -from plogical.mailUtilities import mailUtilities -from random import randint -import time -import plogical.backupUtilities as backupUtil -import requests - -class BackupManager: - def __init__(self, domain = None, childDomain = None): - self.domain = domain - self.childDomain = childDomain - - def loadBackupHome(self, request = None, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - return render(request, 'backup/index.html', currentACL) - except BaseException as msg: - return HttpResponse(str(msg)) - - def backupSite(self, request = None, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'createBackup') == 0: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - return render(request, 'backup/backup.html', {'websiteList': websitesName}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def restoreSite(self, request = None, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'restoreBackup') == 0: - return ACLManager.loadError() - - path = os.path.join("/home", "backup") - - if not os.path.exists(path): - return render(request, 'backup/restore.html') - else: - all_files = [] - ext = ".tar.gz" - - command = 'sudo chown -R cyberpanel:cyberpanel ' + path - ACLManager.executeCall(command) - - files = os.listdir(path) - for filename in files: - if filename.endswith(ext): - all_files.append(filename) - - return render(request, 'backup/restore.html', {'backups': all_files}) - - except BaseException as msg: - return HttpResponse(str(msg)) - - def getCurrentBackups(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - backupDomain = data['websiteToBeBacked'] - - if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('fetchStatus', 0) - - website = Websites.objects.get(domain=backupDomain) - - backups = website.backups_set.all() - - json_data = "[" - checker = 0 - - for items in backups: - if items.status == 0: - status = "Pending" - else: - status = "Completed" - dic = {'id': items.id, - 'file': items.fileName, - 'date': items.date, - 'size': items.size, - 'status': status - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' - final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}) - return HttpResponse(final_json) - except BaseException as msg: - final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def submitBackupCreation(self, userID = None, data = None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - backupDomain = data['websiteToBeBacked'] - website = Websites.objects.get(domain=backupDomain) - - if ACLManager.checkOwnership(backupDomain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('metaStatus', 0) - - ## defining paths - - ## /home/example.com/backup - backupPath = os.path.join("/home", backupDomain, "backup/") - domainUser = website.externalApp - backupName = 'backup-' + domainUser + "-" + time.strftime("%I-%M-%S-%a-%b-%Y") - - ## /home/example.com/backup/backup-example-06-50-03-Thu-Feb-2018 - tempStoragePath = os.path.join(backupPath, backupName) - - execPath = "sudo nice -n 10 python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " submitBackupCreation --tempStoragePath " + tempStoragePath + " --backupName " \ - + backupName + " --backupPath " + backupPath + ' --backupDomain ' + backupDomain - - subprocess.Popen(shlex.split(execPath)) - - time.sleep(2) - - final_json = json.dumps({'status': 1, 'metaStatus': 1, 'error_message': "None", 'tempStorage': tempStoragePath}) - return HttpResponse(final_json) - - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - final_dic = {'status': 0, 'metaStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def backupStatus(self, userID = None, data = None): - try: - - backupDomain = data['websiteToBeBacked'] - status = os.path.join("/home", backupDomain, "backup/status") - - ## read file name - - try: - backupFileNamePath = os.path.join("/home", backupDomain, "backup/backupFileName") - command = "sudo cat " + backupFileNamePath - fileName = subprocess.check_output(shlex.split(command)).decode("utf-8") - except: - fileName = "Fetching.." - - ## file name read ends - - if os.path.exists(status): - command = "sudo cat " + status - status = subprocess.check_output(shlex.split(command)).decode("utf-8") - - if status.find("Completed") > -1: - - command = 'sudo rm -f ' + status - subprocess.call(shlex.split(command)) - - backupOb = Backups.objects.get(fileName=fileName) - backupOb.status = 1 - - ## adding backup data to database. - try: - backupOb.size = str(int(float( - os.path.getsize("/home/" + backupDomain + "/backup/" + fileName + ".tar.gz")) / ( - 1024.0 * 1024.0))) + "MB" - backupOb.save() - except: - backupOb.size = str( - int(os.path.getsize("/home/" + backupDomain + "/backup/" + fileName + ".tar.gz"))) - backupOb.save() - - final_json = json.dumps( - {'backupStatus': 1, 'error_message': "None", "status": status, "abort": 1, - 'fileName': fileName, }) - return HttpResponse(final_json) - - elif status.find("[5009]") > -1: - ## removing status file, so that backup can re-run - try: - command = 'sudo rm -f ' + status - cmd = shlex.split(command) - subprocess.call(cmd) - - backupObs = Backups.objects.filter(fileName=fileName) - for items in backupObs: - items.delete() - - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupStatus]") - - final_json = json.dumps( - {'backupStatus': 1, 'fileName': fileName, 'error_message': "None", "status": status, - "abort": 1}) - return HttpResponse(final_json) - else: - final_json = json.dumps( - {'backupStatus': 1, 'error_message': "None", 'fileName': fileName, "status": status, - "abort": 0}) - return HttpResponse(final_json) - else: - final_json = json.dumps({'backupStatus': 0, 'error_message': "None", "status": 0, "abort": 0}) - return HttpResponse(final_json) - - except BaseException as msg: - final_dic = {'backupStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [backupStatus]") - return HttpResponse(final_json) - - def cancelBackupCreation(self, userID = None, data = None): - try: - - backupCancellationDomain = data['backupCancellationDomain'] - fileName = data['fileName'] - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - - execPath = execPath + " cancelBackupCreation --backupCancellationDomain " + backupCancellationDomain + " --fileName " + fileName - - subprocess.call(shlex.split(execPath)) - - try: - backupOb = Backups.objects.get(fileName=fileName) - backupOb.delete() - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg) + " [cancelBackupCreation]") - - final_json = json.dumps({'abortStatus': 1, 'error_message': "None", "status": 0}) - return HttpResponse(final_json) - - except BaseException as msg: - final_dic = {'abortStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def deleteBackup(self, userID = None, data = None): - try: - backupID = data['backupID'] - backup = Backups.objects.get(id=backupID) - - domainName = backup.website.domain - - path = "/home/" + domainName + "/backup/" + backup.fileName + ".tar.gz" - command = 'sudo rm -f ' + path - ACLManager.executeCall(command) - - backup.delete() - - final_json = json.dumps({'status': 1, 'deleteStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - except BaseException as msg: - final_dic = {'status': 0, 'deleteStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - - return HttpResponse(final_json) - - def submitRestore(self, data = None): - try: - backupFile = data['backupFile'] - originalFile = "/home/backup/" + backupFile - - if not os.path.exists(originalFile): - dir = data['dir'] - else: - dir = "CyberPanelRestore" - - execPath = "sudo nice -n 10 python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " submitRestore --backupFile " + backupFile + " --dir " + dir - subprocess.Popen(shlex.split(execPath)) - time.sleep(4) - - final_dic = {'restoreStatus': 1, 'error_message': "None"} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - except BaseException as msg: - final_dic = {'restoreStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def restoreStatus(self, data = None): - try: - backupFile = data['backupFile'].strip(".tar.gz") - - path = os.path.join("/home", "backup", data['backupFile']) - - if os.path.exists(path): - path = os.path.join("/home", "backup", backupFile) - elif os.path.exists(data['backupFile']): - path = data['backupFile'].strip(".tar.gz") - else: - dir = data['dir'] - path = "/home/backup/transfer-" + str(dir) + "/" + backupFile - - if os.path.exists(path): - try: - execPath = "sudo cat " + path + "/status" - status = subprocess.check_output(shlex.split(execPath)).decode("utf-8") - - if status.find("Done") > -1: - - command = "sudo rm -rf " + path - subprocess.call(shlex.split(command)) - - final_json = json.dumps( - {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 1, - 'running': 'Completed'}) - return HttpResponse(final_json) - elif status.find("[5009]") > -1: - ## removing temporarily generated files while restoring - command = "sudo rm -rf " + path - subprocess.call(shlex.split(command)) - final_json = json.dumps({'restoreStatus': 1, 'error_message': "None", - "status": status, 'abort': 1, 'alreadyRunning': 0, - 'running': 'Error'}) - return HttpResponse(final_json) - else: - final_json = json.dumps( - {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 0, - 'running': 'Running..'}) - return HttpResponse(final_json) - - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - status = "Just Started" - final_json = json.dumps( - {'restoreStatus': 1, 'error_message': "None", "status": status, 'abort': 0, - 'running': 'Running..'}) - return HttpResponse(final_json) - else: - final_json = json.dumps( - {'restoreStatus': 1, 'error_message': "None", "status": "OK To Run", 'running': 'Halted', - 'abort': 1}) - return HttpResponse(final_json) - - except BaseException as msg: - final_dic = {'restoreStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def backupDestinations(self, request = None, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: - return ACLManager.loadError() - - return render(request, 'backup/backupDestinations.html', {}) - - except BaseException as msg: - return HttpResponse(str(msg)) - - def submitDestinationCreation(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: - return ACLManager.loadErrorJson('destStatus', 0) - - destinations = backupUtil.backupUtilities.destinationsPath - - ipAddress = data['IPAddress'] - password = data['password'] - - if dest.objects.all().count() == 2: - final_dic = {'destStatus': 0, - 'error_message': "Currently only one remote destination is allowed."} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - try: - d = dest.objects.get(destLoc=ipAddress) - final_dic = {'destStatus': 0, 'error_message': "This destination already exists."} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - except: - - try: - port = data['backupSSHPort'] - except: - port = "22" - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " submitDestinationCreation --ipAddress " + ipAddress + " --password " \ - + password + " --port " + port - - output = subprocess.check_output(shlex.split(execPath)).decode("utf-8") - - if output.find('1,') > -1: - try: - writeToFile = open(destinations, "w") - writeToFile.writelines(ipAddress + "\n") - writeToFile.writelines(data['backupSSHPort'] + "\n") - writeToFile.close() - newDest = dest(destLoc=ipAddress) - newDest.save() - except: - writeToFile = open(destinations, "w") - writeToFile.writelines(ipAddress + "\n") - writeToFile.writelines("22" + "\n") - writeToFile.close() - newDest = dest(destLoc=ipAddress) - newDest.save() - - final_dic = {'destStatus': 1, 'error_message': "None"} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - else: - final_dic = {'destStatus': 0, 'error_message': output} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - except BaseException as msg: - final_dic = {'destStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def getCurrentBackupDestinations(self, userID = None, data = None): - try: - - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: - return ACLManager.loadErrorJson('fetchStatus', 0) - - records = dest.objects.all() - - json_data = "[" - checker = 0 - - for items in records: - if items.destLoc == "Home": - continue - dic = {'id': items.id, - 'ip': items.destLoc, - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' - final_json = json.dumps({'fetchStatus': 1, 'error_message': "None", "data": json_data}) - return HttpResponse(final_json) - - except BaseException as msg: - final_dic = {'fetchStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def getConnectionStatus(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: - return ACLManager.loadErrorJson('connStatus', 0) - - ipAddress = data['IPAddress'] - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/backupUtilities.py" - execPath = execPath + " getConnectionStatus --ipAddress " + ipAddress - - output = subprocess.check_output(shlex.split(execPath)).decode("utf-8") - - if output.find('1,') > -1: - final_dic = {'connStatus': 1, 'error_message': "None"} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - else: - final_dic = {'connStatus': 0, 'error_message': output} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - except BaseException as msg: - final_dic = {'connStatus': 1, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def deleteDestination(self, userID = None, data = None): - try: - - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: - return ACLManager.loadErrorJson('delStatus', 0) - - ipAddress = data['IPAddress'] - - delDest = dest.objects.get(destLoc=ipAddress) - delDest.delete() - - path = "/usr/local/CyberCP/backup/" - destinations = path + "destinations" - - data = open(destinations, 'r').readlines() - - writeToFile = open(destinations, 'r') - - for items in data: - if items.find(ipAddress) > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - ## Deleting Cron Tab Entries for this destination - - path = "/etc/crontab" - - data = open(path, 'r').readlines() - - writeToFile = open(path, 'w') - - for items in data: - if items.find("backupSchedule.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - final_dic = {'delStatus': 1, 'error_message': "None"} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - except BaseException as msg: - final_dic = {'delStatus': 1, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def scheduleBackup(self, request, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: - return ACLManager.loadError() - - if dest.objects.all().count() <= 1: - try: - homeDest = dest(destLoc="Home") - homeDest.save() - except: - pass - backups = dest.objects.all() - - destinations = [] - - for items in backups: - destinations.append(items.destLoc) - - return render(request, 'backup/backupSchedule.html', {'destinations': destinations}) - - except BaseException as msg: - return HttpResponse(str(msg)) - - def getCurrentBackupSchedules(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: - return ACLManager.loadErrorJson('fetchStatus', 0) - - records = backupSchedules.objects.all() - - json_data = "[" - checker = 0 - - for items in records: - dic = {'id': items.id, - 'destLoc': items.dest.destLoc, - 'frequency': items.frequency, - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' - final_json = json.dumps({'fetchStatus': 1, 'error_message': "None", "data": json_data}) - return HttpResponse(final_json) - - except BaseException as msg: - final_dic = {'fetchStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def submitBackupSchedule(self, userID = None, data = None): - try: - backupDest = data['backupDest'] - backupFreq = data['backupFreq'] - - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: - return ACLManager.loadErrorJson('scheduleStatus', 0) - - path = "/etc/crontab" - - ## check if already exists - try: - schedule = backupSchedules.objects.get(frequency=backupFreq) - if schedule.dest.destLoc == backupDest: - final_json = json.dumps( - {'scheduleStatus': 0, 'error_message': "This schedule already exists"}) - return HttpResponse(final_json) - else: - if backupDest == "Home" and backupFreq == "Daily": - cronJob = "0 3 * * 0-6 root python /usr/local/CyberCP/plogical/backupScheduleLocal.py" - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest == "Home" and backupFreq == "Weekly": - cronJob = "0 3 * * 3 root python /usr/local/CyberCP/plogical/backupScheduleLocal.py " - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Daily": - cronJob = "0 3 * * 0-6 root python /usr/local/CyberCP/plogical/backupSchedule.py" - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Weekly": - cronJob = "0 3 * * 3 root python /usr/local/CyberCP/plogical/backupSchedule.py " - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - except: - if backupDest == "Home" and backupFreq == "Daily": - cronJob = "0 3 * * 0-6 root python /usr/local/CyberCP/plogical/backupScheduleLocal.py" - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest == "Home" and backupFreq == "Weekly": - cronJob = "0 3 * * 3 root python /usr/local/CyberCP/plogical/backupScheduleLocal.py " - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Daily": - cronJob = "0 3 * * 0-6 root python /usr/local/CyberCP/plogical/backupSchedule.py" - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Weekly": - cronJob = "0 3 * * 3 root python /usr/local/CyberCP/plogical/backupSchedule.py " - - virtualHostUtilities.permissionControl(path) - - writeToFile = open(path, 'a') - writeToFile.writelines(cronJob + "\n") - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules(dest=destination, frequency=backupFreq) - newSchedule.save() - - final_json = json.dumps({'scheduleStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - except BaseException as msg: - final_json = json.dumps({'scheduleStatus': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) - - def scheduleDelete(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: - return ACLManager.loadErrorJson('scheduleStatus', 0) - - backupDest = data['destLoc'] - backupFreq = data['frequency'] - - path = "/etc/crontab" - - if backupDest == "Home" and backupFreq == "Daily": - - virtualHostUtilities.permissionControl(path) - - data = open(path, "r").readlines() - writeToFile = open(path, 'w') - - for items in data: - if items.find("0-6") > -1 and items.find("backupScheduleLocal.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq) - newSchedule.delete() - - final_json = json.dumps({'delStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest == "Home" and backupFreq == "Weekly": - - virtualHostUtilities.permissionControl(path) - - data = open(path, "r").readlines() - writeToFile = open(path, 'w') - - for items in data: - if items.find("* 3") > -1 and items.find("backupScheduleLocal.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq) - newSchedule.delete() - - final_json = json.dumps({'delStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Daily": - - virtualHostUtilities.permissionControl(path) - - data = open(path, "r").readlines() - writeToFile = open(path, 'w') - - for items in data: - if items.find("0-6") > -1 and items.find("backupSchedule.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq) - newSchedule.delete() - - final_json = json.dumps({'delStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - elif backupDest != "Home" and backupFreq == "Weekly": - - virtualHostUtilities.permissionControl(path) - - data = open(path, "r").readlines() - writeToFile = open(path, 'w') - - for items in data: - if items.find("* 3") > -1 and items.find("backupSchedule.py") > -1: - continue - else: - writeToFile.writelines(items) - - writeToFile.close() - - virtualHostUtilities.leaveControl(path) - - command = "sudo systemctl restart crond" - - subprocess.call(shlex.split(command)) - - destination = dest.objects.get(destLoc=backupDest) - newSchedule = backupSchedules.objects.get(dest=destination, frequency=backupFreq) - newSchedule.delete() - - final_json = json.dumps({'delStatus': 1, 'error_message': "None"}) - return HttpResponse(final_json) - - except BaseException as msg: - final_json = json.dumps({'delStatus': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) - - def remoteBackups(self, request, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: - return ACLManager.loadError() - - return render(request, 'backup/remoteBackups.html') - - except BaseException as msg: - return HttpResponse(str(msg)) - - def submitRemoteBackups(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: - return ACLManager.loadErrorJson() - - ipAddress = data['ipAddress'] - password = data['password'] - - ## Ask for Remote version of CyberPanel - - try: - finalData = json.dumps({'username': "admin", "password": password}) - - url = "https://" + ipAddress + ":8090/api/cyberPanelVersion" - - r = requests.post(url, data=finalData, verify=False) - - data = json.loads(r.text) - - if data['getVersion'] == 1: - - if float(data['currentVersion']) >= 1.6 and data['build'] >= 0: - pass - else: - data_ret = {'status': 0, - 'error_message': "Your version does not match with version of remote server.", - "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - else: - data_ret = {'status': 0, - 'error_message': "Not able to fetch version of remote server. Error Message: " + - data[ - 'error_message'], "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - - - except BaseException as msg: - data_ret = {'status': 0, - 'error_message': "Not able to fetch version of remote server. Error Message: " + str( - msg), - "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - - ## Fetch public key of remote server! - - finalData = json.dumps({'username': "admin", "password": password}) - - url = "https://" + ipAddress + ":8090/api/fetchSSHkey" - r = requests.post(url, data=finalData, verify=False) - data = json.loads(r.text) - - if data['pubKeyStatus'] == 1: - pubKey = data["pubKey"].strip("\n") - else: - final_json = json.dumps({'status': 0, - 'error_message': "I am sorry, I could not fetch key from remote server. Error Message: " + - data['error_message'] - }) - return HttpResponse(final_json) - - ## write key - - ## Writing key to a temporary location, to be read later by backup process. - - mailUtilities.checkHome() - - pathToKey = "/home/cyberpanel/" + str(randint(1000, 9999)) - - vhost = open(pathToKey, "w") - vhost.write(pubKey) - vhost.close() - - ## - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py" - execPath = execPath + " writeAuthKey --pathToKey " + pathToKey - output = subprocess.check_output(shlex.split(execPath)).decode("utf-8") - - if output.find("1,None") > -1: - pass - else: - final_json = json.dumps({'status': 0, 'error_message': output}) - return HttpResponse(final_json) - - ## - - try: - finalData = json.dumps({'username': "admin", "password": password}) - - url = "https://" + ipAddress + ":8090/api/fetchAccountsFromRemoteServer" - - r = requests.post(url, data=finalData, verify=False) - - data = json.loads(r.text) - - if data['fetchStatus'] == 1: - json_data = data['data'] - data_ret = {'status': 1, 'error_message': "None", - "dir": "Null", 'data': json_data} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - else: - data_ret = {'status': 0, - 'error_message': "Not able to fetch accounts from remote server. Error Message: " + - data['error_message'], "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - except BaseException as msg: - data_ret = {'status': 0, - 'error_message': "Not able to fetch accounts from remote server. Error Message: " + str( - msg), "dir": "Null"} - data_ret = json.dumps(data_ret) - return HttpResponse(data_ret) - - except BaseException as msg: - final_json = json.dumps({'status': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) - - def starRemoteTransfer(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: - return ACLManager.loadErrorJson('remoteTransferStatus', 0) - - ipAddress = data['ipAddress'] - password = data['password'] - accountsToTransfer = data['accountsToTransfer'] - - try: - - ipFile = os.path.join("/etc", "cyberpanel", "machineIP") - f = open(ipFile) - ownIP = f.read() - - finalData = json.dumps({'username': "admin", "password": password, "ipAddress": ownIP, - "accountsToTransfer": accountsToTransfer}) - - url = "https://" + ipAddress + ":8090/api/remoteTransfer" - - r = requests.post(url, data=finalData, verify=False) - - data = json.loads(r.text) - - if data['transferStatus'] == 1: - - ## Create local backup dir - - localBackupDir = os.path.join("/home", "backup") - - if not os.path.exists(localBackupDir): - command = "sudo mkdir " + localBackupDir - subprocess.call(shlex.split(command)) - - ## create local directory that will host backups - - localStoragePath = "/home/backup/transfer-" + str(data['dir']) - - ## making local storage directory for backups - - command = "sudo mkdir " + localStoragePath - subprocess.call(shlex.split(command)) - - final_json = json.dumps( - {'remoteTransferStatus': 1, 'error_message': "None", "dir": data['dir']}) - return HttpResponse(final_json) - else: - final_json = json.dumps({'remoteTransferStatus': 0, - 'error_message': "Can not initiate remote transfer. Error message: " + - data['error_message']}) - return HttpResponse(final_json) - - except BaseException as msg: - final_json = json.dumps({'remoteTransferStatus': 0, - 'error_message': "Can not initiate remote transfer. Error message: " + - str(msg)}) - return HttpResponse(final_json) - - except BaseException as msg: - final_json = json.dumps({'remoteTransferStatus': 0, 'error_message': str(msg)}) - return HttpResponse(final_json) - - def getRemoteTransferStatus(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: - return ACLManager.loadErrorJson('remoteTransferStatus', 0) - - ipAddress = data['ipAddress'] - password = data['password'] - dir = data['dir'] - username = "admin" - - finalData = json.dumps({'dir': dir, "username": username, "password": password}) - r = requests.post("https://" + ipAddress + ":8090/api/FetchRemoteTransferStatus", data=finalData, - verify=False) - - data = json.loads(r.text) - - if data['fetchStatus'] == 1: - if data['status'].find("Backups are successfully generated and received on") > -1: - - data = {'remoteTransferStatus': 1, 'error_message': "None", "status": data['status'], - 'backupsSent': 1} - json_data = json.dumps(data) - return HttpResponse(json_data) - elif data['status'].find("[5010]") > -1: - data = {'remoteTransferStatus': 0, 'error_message': data['status'], - 'backupsSent': 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - else: - data = {'remoteTransferStatus': 1, 'error_message': "None", "status": data['status'], - 'backupsSent': 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - else: - data = {'remoteTransferStatus': 0, 'error_message': data['error_message'], - 'backupsSent': 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - except BaseException as msg: - data = {'remoteTransferStatus': 0, 'error_message': str(msg), 'backupsSent': 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - - def remoteBackupRestore(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: - return ACLManager.loadErrorJson('remoteTransferStatus', 0) - - backupDir = data['backupDir'] - - backupDirComplete = "/home/backup/transfer-" + str(backupDir) - # adminEmail = admin.email - - ## - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py" - - execPath = execPath + " remoteBackupRestore --backupDirComplete " + backupDirComplete + " --backupDir " + str( - backupDir) - - subprocess.Popen(shlex.split(execPath)) - - time.sleep(3) - - data = {'remoteRestoreStatus': 1, 'error_message': 'None'} - json_data = json.dumps(data) - return HttpResponse(json_data) - - except BaseException as msg: - data = {'remoteRestoreStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data) - return HttpResponse(json_data) - - def localRestoreStatus(self, userID = None, data = None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: - return ACLManager.loadErrorJson('remoteTransferStatus', 0) - - backupDir = data['backupDir'] - - # admin = Administrator.objects.get(userName=username) - backupLogPath = "/home/backup/transfer-" + backupDir + "/" + "backup_log" - - removalPath = "/home/backup/transfer-" + str(backupDir) - - time.sleep(3) - - if os.path.isfile(backupLogPath): - command = "sudo cat " + backupLogPath - status = subprocess.check_output(shlex.split(command)).decode("utf-8") - - if status.find("completed[success]") > -1: - command = "sudo rm -rf " + removalPath - # subprocess.call(shlex.split(command)) - data_ret = {'remoteTransferStatus': 1, 'error_message': "None", "status": status, "complete": 1} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - elif status.find("[5010]") > -1: - command = "sudo rm -rf " + removalPath - # subprocess.call(shlex.split(command)) - data = {'remoteTransferStatus': 0, 'error_message': status, - "status": "None", "complete": 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - else: - data_ret = {'remoteTransferStatus': 1, 'error_message': "None", "status": status, "complete": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - else: - data_ret = {'remoteTransferStatus': 0, 'error_message': "No such log found", "status": "None", - "complete": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - except BaseException as msg: - data = {'remoteTransferStatus': 0, 'error_message': str(msg), "status": "None", "complete": 0} - json_data = json.dumps(data) - return HttpResponse(json_data) - - def cancelRemoteBackup(self, userID = None, data = None): - try: - - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: - return ACLManager.loadErrorJson('cancelStatus', 0) - - ipAddress = data['ipAddress'] - password = data['password'] - dir = data['dir'] - username = "admin" - - finalData = json.dumps({'dir': dir, "username": username, "password": password}) - r = requests.post("https://" + ipAddress + ":8090/api/cancelRemoteTransfer", data=finalData, - verify=False) - - data = json.loads(r.text) - - if data['cancelStatus'] == 1: - pass - else: - logging.CyberCPLogFileWriter.writeToFile( - "Some error cancelling at remote server, see the log file for remote server.") - - path = "/home/backup/transfer-" + str(dir) - pathpid = path + "/pid" - - command = "sudo cat " + pathpid - pid = subprocess.check_output(shlex.split(command)).decode("utf-8") - - command = "sudo kill -KILL " + pid - subprocess.call(shlex.split(command)) - - command = "sudo rm -rf " + path - subprocess.call(shlex.split(command)) - - data = {'cancelStatus': 1, 'error_message': "None"} - json_data = json.dumps(data) - return HttpResponse(json_data) - - except BaseException as msg: - data = {'cancelStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data) - return HttpResponse(json_data) diff --git a/plogical/website.py b/plogical/website.py deleted file mode 100755 index ae1216d7b..000000000 --- a/plogical/website.py +++ /dev/null @@ -1,2333 +0,0 @@ -#!/usr/local/CyberCP/bin/python -import os -import os.path -import sys -import django - -sys.path.append('/usr/local/CyberCP') -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") -django.setup() -import json -from plogical.acl import ACLManager -from plogical import CyberCPLogFileWriter as logging -from websiteFunctions.models import Websites, ChildDomains -from plogical.virtualHostUtilities import virtualHostUtilities -import subprocess -import shlex -from plogical.installUtilities import installUtilities -from django.shortcuts import HttpResponse, render -from loginSystem.models import Administrator, ACL -from packages.models import Package -from plogical.mailUtilities import mailUtilities -from random import randint -import time -import re -from plogical.childDomain import ChildDomainManager -from math import ceil -from plogical.alias import AliasManager -from plogical.applicationInstaller import ApplicationInstaller -from databases.models import Databases -from plogical import randomPassword as randomPassword -import hashlib -from plogical.mysqlUtilities import mysqlUtilities -from plogical import hashPassword -from emailMarketing.emACL import emACL -from plogical.processUtilities import ProcessUtilities -from managePHP.phpManager import PHPManager -from ApachController.ApacheVhosts import ApacheVhost -from plogical.vhostConfs import vhostConfs -from plogical.cronUtil import CronUtil -from re import match,I,M - - -class WebsiteManager: - apache = 1 - ols = 2 - lsws = 3 - - def __init__(self, domain=None, childDomain=None): - self.domain = domain - self.childDomain = childDomain - - def createWebsite(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createWebsite') == 0: - return ACLManager.loadError() - - adminNames = ACLManager.loadAllUsers(userID) - packagesName = ACLManager.loadPackages(userID, currentACL) - phps = PHPManager.findPHPVersions() - - Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps} - return render(request, 'websiteFunctions/createWebsite.html', Data) - - except BaseException as msg: - return HttpResponse(str(msg)) - - def modifyWebsite(self, request=None, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'modifyWebsite') == 0: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - phps = PHPManager.findPHPVersions() - - return render(request, 'websiteFunctions/modifyWebsite.html', {'websiteList': websitesName, 'phps': phps}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def deleteWebsite(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'deleteWebsite') == 0: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - - return render(request, 'websiteFunctions/deleteWebsite.html', {'websiteList': websitesName}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def siteState(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'suspendWebsite') == 0: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - - return render(request, 'websiteFunctions/suspendWebsite.html', {'websiteList': websitesName}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def listWebsites(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - pagination = self.websitePagination(currentACL, userID) - - return render(request, 'websiteFunctions/listWebsites.html', {"pagination": pagination}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def listCron(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - websitesName = ACLManager.findAllSites(currentACL, userID) - return render(request, 'websiteFunctions/listCron.html', {'websiteList': websitesName}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def domainAlias(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() - - aliasManager = AliasManager(self.domain) - noAlias, finalAlisList = aliasManager.fetchAlisForDomains() - - path = "/home/" + self.domain + "/public_html" - - return render(request, 'websiteFunctions/domainAlias.html', { - 'masterDomain': self.domain, - 'aliases': finalAlisList, - 'path': path, - 'noAlias': noAlias - }) - except BaseException as msg: - return HttpResponse(str(msg)) - - def submitWebsiteCreation(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createWebsite') == 0: - return ACLManager.loadErrorJson('createWebSiteStatus', 0) - - domain = data['domainName'] - adminEmail = data['adminEmail'] - phpSelection = data['phpSelection'] - packageName = data['package'] - websiteOwner = data['websiteOwner'] - - if not match(r'^[a-zA-Z0-9-]*[a-zA-Z0-9-]{0,61}[a-zA-Z0-9-](?:\.[a-zA-Z0-9-]{2,})+$', domain, - M | I): - data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid domain."} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - if not match(r'\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b', adminEmail, - M | I): - data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid email."} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - try: - HA = data['HA'] - externalApp = 'nobody' - except: - externalApp = "".join(re.findall("[a-zA-Z]+", domain))[:7] - - try: - counter = 0 - while 1: - tWeb = Websites.objects.get(externalApp=externalApp) - externalApp = '%s%s' % (tWeb.externalApp, str(counter)) - counter = counter + 1 - except: - pass - - tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) - - try: - apacheBackend = str(data['apacheBackend']) - except: - apacheBackend = "0" - - ## Create Configurations - - execPath = "sudo /usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " createVirtualHost --virtualHostName " + domain + \ - " --administratorEmail " + adminEmail + " --phpVersion '" + phpSelection + \ - "' --virtualHostUser " + externalApp + " --ssl " + str(data['ssl']) + " --dkimCheck " \ - + str(data['dkimCheck']) + " --openBasedir " + str(data['openBasedir']) + \ - ' --websiteOwner ' + websiteOwner + ' --package ' + packageName + ' --tempStatusPath ' + tempStatusPath + " --apache " + apacheBackend - - ProcessUtilities.popenExecutioner(execPath) - time.sleep(2) - - data_ret = {'status': 1, 'createWebSiteStatus': 1, 'error_message': "None", - 'tempStatusPath': tempStatusPath} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - except BaseException as msg: - data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def submitDomainCreation(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - masterDomain = data['masterDomain'] - domain = data['domainName'] - phpSelection = data['phpSelection'] - path = data['path'] - tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) - - if not match(r'^[a-zA-Z0-9-]*[a-zA-Z0-9-]{0,61}[a-zA-Z0-9-](?:\.[a-zA-Z0-9-]{2,})+$', domain, - M | I): - data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': "Invalid domain."} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - if ACLManager.checkOwnership(masterDomain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('createWebSiteStatus', 0) - - if currentACL['admin'] != 1: - data['openBasedir'] = 1 - - if len(path) > 0: - path = path.lstrip("/") - path = "/home/" + masterDomain + "/public_html/" + path - else: - path = "/home/" + masterDomain + "/public_html/" + domain - - try: - apacheBackend = str(data['apacheBackend']) - except: - apacheBackend = "0" - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - - execPath = execPath + " createDomain --masterDomain " + masterDomain + " --virtualHostName " + domain + \ - " --phpVersion '" + phpSelection + "' --ssl " + str(data['ssl']) + " --dkimCheck " + str( - data['dkimCheck']) \ - + " --openBasedir " + str(data['openBasedir']) + ' --path ' + path + ' --websiteOwner ' \ - + admin.userName + ' --tempStatusPath ' + tempStatusPath + " --apache " + apacheBackend - - ProcessUtilities.popenExecutioner(execPath) - time.sleep(2) - - data_ret = {'status': 1, 'createWebSiteStatus': 1, 'error_message': "None", - 'tempStatusPath': tempStatusPath} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'status': 0, 'createWebSiteStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def fetchDomains(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - masterDomain = data['masterDomain'] - - if ACLManager.checkOwnership(masterDomain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('fetchStatus', 0) - - cdManager = ChildDomainManager(masterDomain) - json_data = cdManager.findChildDomainsJson() - - final_json = json.dumps({'status': 1, 'fetchStatus': 1, 'error_message': "None", "data": json_data}) - return HttpResponse(final_json) - - except BaseException as msg: - final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - - def searchWebsites(self, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - try: - json_data = self.searchWebsitesJson(currentACL, userID, data['patternAdded']) - except BaseException as msg: - tempData = {} - tempData['page'] = 1 - return self.getFurtherAccounts(userID, tempData) - - pagination = self.websitePagination(currentACL, userID) - final_dic = {'status': 1, 'listWebSiteStatus': 1, 'error_message': "None", "data": json_data, - 'pagination': pagination} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - except BaseException as msg: - dic = {'status': 1, 'listWebSiteStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - def getFurtherAccounts(self, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - pageNumber = int(data['page']) - json_data = self.findWebsitesJson(currentACL, userID, pageNumber) - pagination = self.websitePagination(currentACL, userID) - final_dic = {'status': 1, 'listWebSiteStatus': 1, 'error_message': "None", "data": json_data, - 'pagination': pagination} - final_json = json.dumps(final_dic) - return HttpResponse(final_json) - except BaseException as msg: - dic = {'status': 1, 'listWebSiteStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - def submitWebsiteDeletion(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'deleteWebsite') == 0: - return ACLManager.loadErrorJson('websiteDeleteStatus', 0) - - websiteName = data['websiteName'] - - admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(websiteName, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('websiteDeleteStatus', 0) - - ## Deleting master domain - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " deleteVirtualHostConfigurations --virtualHostName " + websiteName - ProcessUtilities.popenExecutioner(execPath) - - data_ret = {'status': 1, 'websiteDeleteStatus': 1, 'error_message': "None"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'status': 0, 'websiteDeleteStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def submitDomainDeletion(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - websiteName = data['websiteName'] - - if ACLManager.checkOwnership(websiteName, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('websiteDeleteStatus', 0) - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " deleteDomain --virtualHostName " + websiteName - ProcessUtilities.outputExecutioner(execPath) - - data_ret = {'status': 1, 'websiteDeleteStatus': 1, 'error_message': "None"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'status': 0, 'websiteDeleteStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def submitWebsiteStatus(self, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'suspendWebsite') == 0: - return ACLManager.loadErrorJson('websiteStatus', 0) - - websiteName = data['websiteName'] - state = data['state'] - - website = Websites.objects.get(domain=websiteName) - - if state == "Suspend": - confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + websiteName - command = "sudo mv " + confPath + " " + confPath + "-suspended" - ProcessUtilities.popenExecutioner(command) - installUtilities.reStartLiteSpeedSocket() - website.state = 0 - else: - confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + websiteName - - command = "sudo mv " + confPath + "-suspended" + " " + confPath - ProcessUtilities.executioner(command) - - command = "chown -R " + "lsadm" + ":" + "lsadm" + " " + confPath - ProcessUtilities.popenExecutioner(command) - - installUtilities.reStartLiteSpeedSocket() - website.state = 1 - - website.save() - - data_ret = {'websiteStatus': 1, 'error_message': "None"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - - data_ret = {'websiteStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def submitWebsiteModify(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'modifyWebsite') == 0: - return ACLManager.loadErrorJson('modifyStatus', 0) - - admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(data['websiteToBeModified'], admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('websiteDeleteStatus', 0) - - packs = ACLManager.loadPackages(userID, currentACL) - admins = ACLManager.loadAllUsers(userID) - - ## Get packs name - - json_data = "[" - checker = 0 - - for items in packs: - dic = {"pack": items} - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' - - ### Get admin names - - admin_data = "[" - checker = 0 - - for items in admins: - dic = {"adminNames": items} - - if checker == 0: - admin_data = admin_data + json.dumps(dic) - checker = 1 - else: - admin_data = admin_data + ',' + json.dumps(dic) - - admin_data = admin_data + ']' - - websiteToBeModified = data['websiteToBeModified'] - - modifyWeb = Websites.objects.get(domain=websiteToBeModified) - - email = modifyWeb.adminEmail - currentPack = modifyWeb.package.packageName - owner = modifyWeb.admin.userName - - data_ret = {'status': 1, 'modifyStatus': 1, 'error_message': "None", "adminEmail": email, - "packages": json_data, "current_pack": currentPack, "adminNames": admin_data, - 'currentAdmin': owner} - final_json = json.dumps(data_ret) - return HttpResponse(final_json) - - except BaseException as msg: - dic = {'status': 0, 'modifyStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - def fetchWebsiteDataJSON(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createWebsite') == 0: - return ACLManager.loadErrorJson('createWebSiteStatus', 0) - - packs = ACLManager.loadPackages(userID, currentACL) - admins = ACLManager.loadAllUsers(userID) - - ## Get packs name - - json_data = "[" - checker = 0 - - for items in packs: - dic = {"pack": items} - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' - - ### Get admin names - - admin_data = "[" - checker = 0 - - for items in admins: - dic = {"adminNames": items} - - if checker == 0: - admin_data = admin_data + json.dumps(dic) - checker = 1 - else: - admin_data = admin_data + ',' + json.dumps(dic) - - admin_data = admin_data + ']' - - data_ret = {'status': 1, 'error_message': "None", - "packages": json_data, "adminNames": admin_data} - final_json = json.dumps(data_ret) - return HttpResponse(final_json) - - except BaseException as msg: - dic = {'status': 0, 'error_message': str(msg)} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - def saveWebsiteChanges(self, userID=None, data=None): - try: - domain = data['domain'] - package = data['packForWeb'] - email = data['email'] - phpVersion = data['phpVersion'] - newUser = data['admin'] - - currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'modifyWebsite') == 0: - return ACLManager.loadErrorJson('saveStatus', 0) - - admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('websiteDeleteStatus', 0) - - confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + domain - completePathToConfigFile = confPath + "/vhost.conf" - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " changePHP --phpVersion '" + phpVersion + "' --path " + completePathToConfigFile - ProcessUtilities.popenExecutioner(execPath) - - #### - - newOwner = Administrator.objects.get(userName=newUser) - - modifyWeb = Websites.objects.get(domain=domain) - webpack = Package.objects.get(packageName=package) - - modifyWeb.package = webpack - modifyWeb.adminEmail = email - modifyWeb.phpSelection = phpVersion - modifyWeb.admin = newOwner - - modifyWeb.save() - - data_ret = {'status': 1, 'saveStatus': 1, 'error_message': "None"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'status': 0, 'saveStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def loadDomainHome(self, request=None, userID=None, data=None): - - if Websites.objects.filter(domain=self.domain).exists(): - - currentACL = ACLManager.loadedACL(userID) - website = Websites.objects.get(domain=self.domain) - admin = Administrator.objects.get(pk=userID) - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() - - Data = {} - - marketingStatus = emACL.checkIfEMEnabled(admin.userName) - - Data['marketingStatus'] = marketingStatus - Data['ftpTotal'] = website.package.ftpAccounts - Data['ftpUsed'] = website.users_set.all().count() - - Data['databasesUsed'] = website.databases_set.all().count() - Data['databasesTotal'] = website.package.dataBases - - Data['domain'] = self.domain - - diskUsageDetails = virtualHostUtilities.getDiskUsage("/home/" + self.domain, website.package.diskSpace) - - ## bw usage calculation - - try: - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " findDomainBW --virtualHostName " + self.domain + " --bandwidth " + str( - website.package.bandwidth) - - output = ProcessUtilities.outputExecutioner(execPath) - bwData = output.split(",") - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - bwData = [0, 0] - - ## bw usage calculations - - Data['bwInMBTotal'] = website.package.bandwidth - Data['bwInMB'] = bwData[0] - Data['bwUsage'] = bwData[1] - - if diskUsageDetails != None: - if diskUsageDetails[1] > 100: - diskUsageDetails[1] = 100 - - Data['diskUsage'] = diskUsageDetails[1] - Data['diskInMB'] = diskUsageDetails[0] - Data['diskInMBTotal'] = website.package.diskSpace - else: - Data['diskUsage'] = 0 - Data['diskInMB'] = 0 - Data['diskInMBTotal'] = website.package.diskSpace - - Data['phps'] = PHPManager.findPHPVersions() - - servicePath = '/home/cyberpanel/postfix' - if os.path.exists(servicePath): - Data['email'] = 1 - else: - Data['email'] = 0 - - servicePath = '/home/cyberpanel/pureftpd' - if os.path.exists(servicePath): - Data['ftp'] = 1 - else: - Data['ftp'] = 0 - - return render(request, 'websiteFunctions/website.html', Data) - - else: - return render(request, 'websiteFunctions/website.html', - {"error": 1, "domain": "This domain does not exists."}) - - def launchChild(self, request=None, userID=None, data=None): - - if ChildDomains.objects.filter(domain=self.childDomain).exists(): - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() - - website = Websites.objects.get(domain=self.domain) - - Data = {} - - Data['ftpTotal'] = website.package.ftpAccounts - Data['ftpUsed'] = website.users_set.all().count() - - Data['databasesUsed'] = website.databases_set.all().count() - Data['databasesTotal'] = website.package.dataBases - - Data['domain'] = self.domain - Data['childDomain'] = self.childDomain - - diskUsageDetails = virtualHostUtilities.getDiskUsage("/home/" + self.domain, website.package.diskSpace) - - ## bw usage calculation - - try: - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " findDomainBW --virtualHostName " + self.domain + " --bandwidth " + str( - website.package.bandwidth) - - output = ProcessUtilities.outputExecutioner(execPath) - bwData = output.split(",") - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - bwData = [0, 0] - - ## bw usage calculations - - Data['bwInMBTotal'] = website.package.bandwidth - Data['bwInMB'] = bwData[0] - Data['bwUsage'] = bwData[1] - - if diskUsageDetails != None: - if diskUsageDetails[1] > 100: - diskUsageDetails[1] = 100 - - Data['diskUsage'] = diskUsageDetails[1] - Data['diskInMB'] = diskUsageDetails[0] - Data['diskInMBTotal'] = website.package.diskSpace - else: - Data['diskUsage'] = 0 - Data['diskInMB'] = 0 - Data['diskInMBTotal'] = website.package.diskSpace - - Data['phps'] = PHPManager.findPHPVersions() - - servicePath = '/home/cyberpanel/postfix' - if os.path.exists(servicePath): - Data['email'] = 1 - else: - Data['email'] = 0 - - servicePath = '/home/cyberpanel/pureftpd' - if os.path.exists(servicePath): - Data['ftp'] = 1 - else: - Data['ftp'] = 0 - - return render(request, 'websiteFunctions/launchChild.html', Data) - else: - return render(request, 'websiteFunctions/launchChild.html', - {"error": 1, "domain": "This child domain does not exists"}) - - def getDataFromLogFile(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - logType = data['logType'] - self.domain = data['virtualHost'] - page = data['page'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('logstatus', 0) - - if logType == 1: - fileName = "/home/" + self.domain + "/logs/" + self.domain + ".access_log" - else: - fileName = "/home/" + self.domain + "/logs/" + self.domain + ".error_log" - - ## get Logs - website = Websites.objects.get(domain=self.domain) - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " getAccessLogs --path " + fileName + " --page " + str(page) - output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) - - if output.find("1,None") > -1: - final_json = json.dumps( - {'status': 0, 'logstatus': 0, 'error_message': "Not able to fetch logs, see CyberPanel main log file!"}) - return HttpResponse(final_json) - - ## get log ends here. - - data = output.split("\n") - - json_data = "[" - checker = 0 - - for items in reversed(data): - if len(items) > 10: - logData = items.split(" ") - domain = logData[0].strip('"') - ipAddress = logData[1] - time = (logData[4]).strip("[").strip("]") - resource = logData[7].strip('"') - size = logData[10].replace('"', '') - - dic = {'domain': domain, - 'ipAddress': ipAddress, - 'time': time, - 'resource': resource, - 'size': size, - } - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' - final_json = json.dumps({'status': 1, 'logstatus': 1, 'error_message': "None", "data": json_data}) - return HttpResponse(final_json) - - def fetchErrorLogs(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['virtualHost'] - page = data['page'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('logstatus', 0) - - fileName = "/home/" + self.domain + "/logs/" + self.domain + ".error_log" - - ## get Logs - website = Websites.objects.get(domain=self.domain) - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " getErrorLogs --path " + fileName + " --page " + str(page) - - output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) - - if output.find("1,None") > -1: - final_json = json.dumps( - {'status': 0, 'logstatus': 0, 'error_message': "Not able to fetch logs, see CyberPanel main log file!"}) - return HttpResponse(final_json) - - ## get log ends here. - - final_json = json.dumps({'status': 1, 'logstatus': 1, 'error_message': "None", "data": output}) - return HttpResponse(final_json) - - def getDataFromConfigFile(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - self.domain = data['virtualHost'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('configstatus', 0) - - filePath = installUtilities.Server_root_path + "/conf/vhosts/" + self.domain + "/vhost.conf" - - command = 'sudo cat ' + filePath - configData = ProcessUtilities.outputExecutioner(command, 'lsadm') - - if len(configData) == 0: - status = {'status': 0, "configstatus": 0, "error_message": "Configuration file is currently empty!"} - - final_json = json.dumps(status) - return HttpResponse(final_json) - - status = {'status': 1, "configstatus": 1, "configData": configData} - final_json = json.dumps(status) - return HttpResponse(final_json) - - def saveConfigsToFile(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] != 1: - return ACLManager.loadErrorJson('configstatus', 0) - - configData = data['configData'] - self.domain = data['virtualHost'] - - mailUtilities.checkHome() - - tempPath = "/home/cyberpanel/" + str(randint(1000, 9999)) - - vhost = open(tempPath, "w") - - vhost.write(configData) - - vhost.close() - - ## writing data temporary to file - - filePath = installUtilities.Server_root_path + "/conf/vhosts/" + self.domain + "/vhost.conf" - - ## save configuration data - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " saveVHostConfigs --path " + filePath + " --tempPath " + tempPath - - output = ProcessUtilities.outputExecutioner(execPath) - - if output.find("1,None") > -1: - status = {"configstatus": 1} - - final_json = json.dumps(status) - return HttpResponse(final_json) - else: - data_ret = {'configstatus': 0, 'error_message': output} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - ## save configuration data ends - - def getRewriteRules(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - self.domain = data['virtualHost'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('rewriteStatus', 0) - - try: - childDom = ChildDomains.objects.get(domain=self.domain) - filePath = childDom.path + '/.htaccess' - except: - filePath = "/home/" + self.domain + "/public_html/.htaccess" - - try: - rewriteRules = open(filePath, "r").read() - - if len(rewriteRules) == 0: - status = {"rewriteStatus": 1, "error_message": "Rules file is currently empty"} - final_json = json.dumps(status) - return HttpResponse(final_json) - - status = {"rewriteStatus": 1, "rewriteRules": rewriteRules} - - final_json = json.dumps(status) - return HttpResponse(final_json) - - except IOError: - status = {"rewriteStatus": 1, "error_message": "none", "rewriteRules": ""} - final_json = json.dumps(status) - return HttpResponse(final_json) - - def saveRewriteRules(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - self.domain = data['virtualHost'] - rewriteRules = data['rewriteRules'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('rewriteStatus', 0) - - ## writing data temporary to file - - mailUtilities.checkHome() - tempPath = "/tmp/" + str(randint(1000, 9999)) - vhost = open(tempPath, "w") - vhost.write(rewriteRules) - vhost.close() - - ## writing data temporary to file - - try: - childDomain = ChildDomains.objects.get(domain=self.domain) - filePath = childDomain.path + '/.htaccess' - externalApp = childDomain.master.externalApp - except: - filePath = "/home/" + self.domain + "/public_html/.htaccess" - website = Websites.objects.get(domain=self.domain) - externalApp = website.externalApp - - ## save configuration data - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " saveRewriteRules --virtualHostName " + self.domain + " --path " + filePath + " --tempPath " + tempPath - - output = ProcessUtilities.outputExecutioner(execPath, externalApp) - - if output.find("1,None") > -1: - installUtilities.reStartLiteSpeedSocket() - status = {"rewriteStatus": 1, 'error_message': output} - final_json = json.dumps(status) - return HttpResponse(final_json) - else: - data_ret = {'rewriteStatus': 0, 'error_message': output} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def saveSSL(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - self.domain = data['virtualHost'] - key = data['key'] - cert = data['cert'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('sslStatus', 0) - - mailUtilities.checkHome() - - ## writing data temporary to file - - tempKeyPath = "/home/cyberpanel/" + str(randint(1000, 9999)) - vhost = open(tempKeyPath, "w") - vhost.write(key) - vhost.close() - - tempCertPath = "/home/cyberpanel/" + str(randint(1000, 9999)) - vhost = open(tempCertPath, "w") - vhost.write(cert) - vhost.close() - - ## writing data temporary to file - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " saveSSL --virtualHostName " + self.domain + " --tempKeyPath " + tempKeyPath + " --tempCertPath " + tempCertPath - output = ProcessUtilities.outputExecutioner(execPath) - - if output.find("1,None") > -1: - data_ret = {'sslStatus': 1, 'error_message': "None"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - else: - logging.CyberCPLogFileWriter.writeToFile( - output) - data_ret = {'sslStatus': 0, 'error_message': output} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def changePHP(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - self.domain = data['childDomain'] - phpVersion = data['phpSelection'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('changePHP', 0) - - confPath = virtualHostUtilities.Server_root + "/conf/vhosts/" + self.domain - completePathToConfigFile = confPath + "/vhost.conf" - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " changePHP --phpVersion '" + phpVersion + "' --path " + completePathToConfigFile - ProcessUtilities.popenExecutioner(execPath) - - data_ret = {'status': 1, 'changePHP': 1, 'error_message': "None"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def getWebsiteCron(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - self.domain = data['domain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('getWebsiteCron', 0) - - website = Websites.objects.get(domain=self.domain) - - if Websites.objects.filter(domain=self.domain).exists(): - pass - else: - dic = {'getWebsiteCron': 0, 'error_message': 'You do not own this domain'} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - CronUtil.CronPrem(1) - - crons = [] - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" - execPath = execPath + " getWebsiteCron --externalApp " + website.externalApp - - f = ProcessUtilities.outputExecutioner(execPath, website.externalApp) - - CronUtil.CronPrem(0) - - if f.find("0,CyberPanel,") > -1: - data_ret = {'getWebsiteCron': 0, "user": website.externalApp, "crons": {}} - final_json = json.dumps(data_ret) - return HttpResponse(final_json) - - counter = 0 - for line in f.split("\n"): - if line: - split = line.split(" ", 5) - if len(split) == 6: - counter += 1 - crons.append({"line": counter, - "minute": split[0], - "hour": split[1], - "monthday": split[2], - "month": split[3], - "weekday": split[4], - "command": split[5]}) - - data_ret = {'getWebsiteCron': 1, "user": website.externalApp, "crons": crons} - final_json = json.dumps(data_ret) - return HttpResponse(final_json) - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - dic = {'getWebsiteCron': 0, 'error_message': str(msg)} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - def getCronbyLine(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - line = data['line'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('getWebsiteCron', 0) - - if Websites.objects.filter(domain=self.domain).exists(): - pass - else: - dic = {'getWebsiteCron': 0, 'error_message': 'You do not own this domain'} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - line -= 1 - website = Websites.objects.get(domain=self.domain) - - try: - CronUtil.CronPrem(1) - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" - execPath = execPath + " getWebsiteCron --externalApp " + website.externalApp - - f = ProcessUtilities.outputExecutioner(execPath, website.externalApp) - CronUtil.CronPrem(0) - except subprocess.CalledProcessError as error: - dic = {'getWebsiteCron': 0, 'error_message': 'Unable to access Cron file'} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - f = f.split("\n") - cron = f[line] - - cron = cron.split(" ", 5) - if len(cron) != 6: - dic = {'getWebsiteCron': 0, 'error_message': 'Cron line incorrect'} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - data_ret = {"getWebsiteCron": 1, - "user": website.externalApp, - "cron": { - "minute": cron[0], - "hour": cron[1], - "monthday": cron[2], - "month": cron[3], - "weekday": cron[4], - "command": cron[5], - }, - "line": line} - final_json = json.dumps(data_ret) - return HttpResponse(final_json) - except BaseException as msg: - print(msg) - dic = {'getWebsiteCron': 0, 'error_message': str(msg)} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - def saveCronChanges(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - line = data['line'] - - minute = data['minute'] - hour = data['hour'] - monthday = data['monthday'] - month = data['month'] - weekday = data['weekday'] - command = data['cronCommand'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('getWebsiteCron', 0) - - website = Websites.objects.get(domain=self.domain) - - finalCron = "%s %s %s %s %s %s" % (minute, hour, monthday, month, weekday, command) - - CronUtil.CronPrem(1) - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" - execPath = execPath + " saveCronChanges --externalApp " + website.externalApp + " --line " + str( - line) + " --finalCron '" + finalCron + "'" - output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) - CronUtil.CronPrem(0) - - if output.find("1,") > -1: - data_ret = {"getWebsiteCron": 1, - "user": website.externalApp, - "cron": finalCron, - "line": line} - final_json = json.dumps(data_ret) - return HttpResponse(final_json) - else: - dic = {'getWebsiteCron': 0, 'error_message': output} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - except BaseException as msg: - dic = {'getWebsiteCron': 0, 'error_message': str(msg)} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - def remCronbyLine(self, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - line = data['line'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('addNewCron', 0) - - website = Websites.objects.get(domain=self.domain) - - CronUtil.CronPrem(1) - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" - execPath = execPath + " remCronbyLine --externalApp " + website.externalApp + " --line " + str( - line) - output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) - - CronUtil.CronPrem(0) - - if output.find("1,") > -1: - data_ret = {"remCronbyLine": 1, - "user": website.externalApp, - "removeLine": output.split(',')[1], - "line": line} - final_json = json.dumps(data_ret) - return HttpResponse(final_json) - else: - dic = {'remCronbyLine': 0, 'error_message': output} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - - except BaseException as msg: - dic = {'remCronbyLine': 0, 'error_message': str(msg)} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - def addNewCron(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - minute = data['minute'] - hour = data['hour'] - monthday = data['monthday'] - month = data['month'] - weekday = data['weekday'] - command = data['cronCommand'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('addNewCron', 0) - - website = Websites.objects.get(domain=self.domain) - - CronPath = '/var/spool/cron/%s' % (website.externalApp) - - commandT = 'touch %s' % (CronPath) - ProcessUtilities.executioner(commandT, 'root') - commandT = 'chown %s:%s %s' % (website.externalApp, website.externalApp, CronPath) - ProcessUtilities.executioner(commandT, 'root') - - CronUtil.CronPrem(1) - - finalCron = "%s %s %s %s %s %s" % (minute, hour, monthday, month, weekday, command) - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/cronUtil.py" - execPath = execPath + " addNewCron --externalApp " + website.externalApp + " --finalCron '" + finalCron + "'" - output = ProcessUtilities.outputExecutioner(execPath, website.externalApp) - - CronUtil.CronPrem(0) - - if output.find("1,") > -1: - - data_ret = {"addNewCron": 1, - "user": website.externalApp, - "cron": finalCron} - final_json = json.dumps(data_ret) - return HttpResponse(final_json) - else: - dic = {'addNewCron': 0, 'error_message': output} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - - except BaseException as msg: - dic = {'addNewCron': 0, 'error_message': str(msg)} - json_data = json.dumps(dic) - return HttpResponse(json_data) - - def submitAliasCreation(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['masterDomain'] - aliasDomain = data['aliasDomain'] - ssl = data['ssl'] - - if not match(r'^[a-zA-Z0-9-]*[a-zA-Z0-9-]{0,61}[a-zA-Z0-9-](?:\.[a-zA-Z0-9-]{2,})+$', aliasDomain, - M | I): - data_ret = {'status': 0, 'createAliasStatus': 0, 'error_message': "Invalid domain."} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('createAliasStatus', 0) - - sslpath = "/home/" + self.domain + "/public_html" - - ## Create Configurations - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - - execPath = execPath + " createAlias --masterDomain " + self.domain + " --aliasDomain " + aliasDomain + " --ssl " + str( - ssl) + " --sslPath " + sslpath + " --administratorEmail " + admin.email + ' --websiteOwner ' + admin.userName - - output = ProcessUtilities.outputExecutioner(execPath) - - if output.find("1,None") > -1: - pass - else: - data_ret = {'createAliasStatus': 0, 'error_message': output, "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - ## Create Configurations ends here - - data_ret = {'createAliasStatus': 1, 'error_message': "None", "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - - except BaseException as msg: - data_ret = {'createAliasStatus': 0, 'error_message': str(msg), "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def issueAliasSSL(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['masterDomain'] - aliasDomain = data['aliasDomain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('sslStatus', 0) - - sslpath = "/home/" + self.domain + "/public_html" - - ## Create Configurations - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " issueAliasSSL --masterDomain " + self.domain + " --aliasDomain " + aliasDomain + " --sslPath " + sslpath + " --administratorEmail " + admin.email - - output = ProcessUtilities.outputExecutioner(execPath) - - if output.find("1,None") > -1: - data_ret = {'sslStatus': 1, 'error_message': "None", "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - else: - data_ret = {'sslStatus': 0, 'error_message': output, "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'sslStatus': 0, 'error_message': str(msg), "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def delateAlias(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['masterDomain'] - aliasDomain = data['aliasDomain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('deleteAlias', 0) - - ## Create Configurations - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " deleteAlias --masterDomain " + self.domain + " --aliasDomain " + aliasDomain - output = ProcessUtilities.outputExecutioner(execPath) - - if output.find("1,None") > -1: - data_ret = {'deleteAlias': 1, 'error_message': "None", "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - else: - data_ret = {'deleteAlias': 0, 'error_message': output, "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - except BaseException as msg: - data_ret = {'deleteAlias': 0, 'error_message': str(msg), "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def changeOpenBasedir(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - - self.domain = data['domainName'] - openBasedirValue = data['openBasedirValue'] - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadErrorJson('changeOpenBasedir', 0) - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " changeOpenBasedir --virtualHostName '" + self.domain + "' --openBasedirValue " + openBasedirValue - output = ProcessUtilities.popenExecutioner(execPath) - - data_ret = {'status': 1, 'changeOpenBasedir': 1, 'error_message': "None"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'status': 0, 'changeOpenBasedir': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def wordpressInstall(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() - - return render(request, 'websiteFunctions/installWordPress.html', {'domainName': self.domain}) - - except BaseException as msg: - return HttpResponse(str(msg)) - - def installWordpress(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('installStatus', 0) - - mailUtilities.checkHome() - - extraArgs = {} - extraArgs['admin'] = admin - extraArgs['domainName'] = data['domain'] - extraArgs['home'] = data['home'] - extraArgs['blogTitle'] = data['blogTitle'] - extraArgs['adminUser'] = data['adminUser'] - extraArgs['adminPassword'] = data['passwordByPass'] - extraArgs['adminEmail'] = data['adminEmail'] - extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) - - if data['home'] == '0': - extraArgs['path'] = data['path'] - - background = ApplicationInstaller('wordpress', extraArgs) - background.start() - - time.sleep(2) - - data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', - 'tempStatusPath': extraArgs['tempStatusPath']} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - except BaseException as msg: - data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def installWordpressStatus(self, userID=None, data=None): - try: - statusFile = data['statusFile'] - - statusData = ProcessUtilities.outputExecutioner("sudo cat " + statusFile).splitlines() - - lastLine = statusData[-1] - - if lastLine.find('[200]') > -1: - command = 'sudo rm -f ' + statusFile - subprocess.call(shlex.split(command)) - data_ret = {'abort': 1, 'installStatus': 1, 'installationProgress': "100", - 'currentStatus': 'Successfully Installed.'} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - elif lastLine.find('[404]') > -1: - data_ret = {'abort': 1, 'installStatus': 0, 'installationProgress': "0", - 'error_message': lastLine} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - else: - progress = lastLine.split(',') - currentStatus = progress[0] - try: - installationProgress = progress[1] - except: - installationProgress = 0 - data_ret = {'abort': 0, 'installStatus': 0, 'installationProgress': installationProgress, - 'currentStatus': currentStatus} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'abort': 1, 'installStatus': 0, 'installationProgress': "0", 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def joomlaInstall(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() - - return render(request, 'websiteFunctions/installJoomla.html', {'domainName': self.domain}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def installJoomla(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('installStatus', 0) - - domainName = data['domain'] - home = data['home'] - - sitename = data['sitename'] - username = data['username'] - password = data['passwordByPass'] - prefix = data['prefix'] - - mailUtilities.checkHome() - - tempStatusPath = "/tmp/" + str(randint(1000, 9999)) - - statusFile = open(tempStatusPath, 'w') - statusFile.writelines('Setting up paths,0') - statusFile.close() - os.chmod(tempStatusPath, 0o777) - - finalPath = "" - - admin = Administrator.objects.get(pk=userID) - - ## DB Creation - - statusFile = open(tempStatusPath, 'w') - statusFile.writelines('Creating database..,10') - statusFile.close() - - dbName = randomPassword.generate_pass() - dbUser = dbName - dbPassword = randomPassword.generate_pass() - - if Databases.objects.filter(dbName=dbName).exists() or Databases.objects.filter( - dbUser=dbUser).exists(): - data_ret = {'status': 0, 'installStatus': 0, - 'error_message': "0,This database or user is already taken."} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - result = mysqlUtilities.createDatabase(dbName, dbUser, dbPassword) - - if result == 1: - pass - else: - data_ret = {'status': 0, 'installStatus': 0, - 'error_message': "0,Not able to create database."} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - ## - - try: - website = ChildDomains.objects.get(domain=domainName) - externalApp = website.master.externalApp - - if website.master.package.dataBases > website.master.databases_set.all().count(): - pass - else: - data_ret = {'status': 0, 'installStatus': 0, - 'error_message': "0,Maximum database limit reached for this website."} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - if home == '0': - path = data['path'] - finalPath = website.path.rstrip('/') + "/" + path + "/" - else: - finalPath = website.path + "/" - - db = Databases(website=website.master, dbName=dbName, dbUser=dbUser) - db.save() - - except: - website = Websites.objects.get(domain=domainName) - externalApp = website.externalApp - - if website.package.dataBases > website.databases_set.all().count(): - pass - else: - data_ret = {'status': 0, 'installStatus': 0, - 'error_message': "0,Maximum database limit reached for this website."} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - if home == '0': - path = data['path'] - finalPath = "/home/" + domainName + "/public_html/" + path + "/" - else: - finalPath = "/home/" + domainName + "/public_html/" - - db = Databases(website=website, dbName=dbName, dbUser=dbUser) - db.save() - - if finalPath.find("..") > -1: - data_ret = {'status': 0, 'installStatus': 0, - 'error_message': "Specified path must be inside virtual host home!"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - ## Installation - salt = randomPassword.generate_pass(32) - # return salt - password_hash = hashlib.md5((password + salt).encode('utf-8')).hexdigest() - password = password_hash + ":" + salt - - statusFile = open(tempStatusPath, 'w') - statusFile.writelines('Downloading Joomla Core..,20') - statusFile.close() - - execPath = "/usr/local/CyberCP/bin/python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - - execPath = execPath + " installJoomla --virtualHostName " + domainName + \ - " --virtualHostUser " + externalApp + " --path " + finalPath + " --dbName " + dbName + \ - " --dbUser " + dbUser + " --dbPassword " + dbPassword + " --username " + username + \ - " --password " + password + " --prefix " + prefix + " --sitename '" + sitename + "'" \ - + " --tempStatusPath " + tempStatusPath - - # return execPath - - ProcessUtilities.popenExecutioner(execPath, externalApp) - - data_ret = {'status': 1, "installStatus": 1, 'tempStatusPath': tempStatusPath} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - ## Installation ends - - except BaseException as msg: - data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def setupGit(self, request=None, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - website = Websites.objects.get(domain=self.domain) - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson() - - path = '/home/cyberpanel/' + self.domain + '.git' - - if os.path.exists(path): - ipFile = "/etc/cyberpanel/machineIP" - f = open(ipFile) - ipData = f.read() - ipAddress = ipData.split('\n', 1)[0] - - port = ProcessUtilities.fetchCurrentPort() - - webhookURL = 'https://' + ipAddress + ':%s/websites/' % (port) + self.domain + '/gitNotify' - - return render(request, 'websiteFunctions/setupGit.html', - {'domainName': self.domain, 'installed': 1, 'webhookURL': webhookURL}) - else: - - command = "ssh-keygen -f /home/%s/.ssh/%s -t rsa -N ''" % (self.domain, website.externalApp) - ProcessUtilities.executioner(command, website.externalApp) - - ### - - configContent = """Host github.com -IdentityFile /home/%s/.ssh/%s -""" % (self.domain, website.externalApp) - - path = "/home/cyberpanel/config" - writeToFile = open(path, 'w') - writeToFile.writelines(configContent) - writeToFile.close() - - command = 'mv %s /home/%s/.ssh/config' % (path, self.domain) - ProcessUtilities.executioner(command) - - command = 'sudo chown %s:%s /home/%s/.ssh/config' % (website.externalApp, website.externalApp, self.domain) - ProcessUtilities.executioner(command) - - command = 'cat /home/%s/.ssh/%s.pub' % (self.domain, website.externalApp) - deploymentKey = ProcessUtilities.outputExecutioner(command, website.externalApp) - - return render(request, 'websiteFunctions/setupGit.html', - {'domainName': self.domain, 'deploymentKey': deploymentKey, 'installed': 0}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def setupGitRepo(self, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('installStatus', 0) - - mailUtilities.checkHome() - - extraArgs = {} - extraArgs['admin'] = admin - extraArgs['domainName'] = data['domain'] - extraArgs['username'] = data['username'] - extraArgs['reponame'] = data['reponame'] - extraArgs['branch'] = data['branch'] - extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) - extraArgs['defaultProvider'] = data['defaultProvider'] - - background = ApplicationInstaller('git', extraArgs) - background.start() - - time.sleep(2) - - data_ret = {'installStatus': 1, 'error_message': 'None', - 'tempStatusPath': extraArgs['tempStatusPath']} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - except BaseException as msg: - data_ret = {'installStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def gitNotify(self, userID=None, data=None): - try: - - extraArgs = {} - extraArgs['domain'] = self.domain - - background = ApplicationInstaller('pull', extraArgs) - background.start() - - data_ret = {'pulled': 1, 'error_message': 'None'} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'pulled': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def detachRepo(self, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson() - - mailUtilities.checkHome() - - extraArgs = {} - extraArgs['domainName'] = data['domain'] - extraArgs['admin'] = admin - - background = ApplicationInstaller('detach', extraArgs) - background.start() - - time.sleep(2) - - data_ret = {'status': 1, 'error_message': 'None'} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - except BaseException as msg: - data_ret = {'status': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def changeBranch(self, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson() - - mailUtilities.checkHome() - - extraArgs = {} - extraArgs['domainName'] = data['domain'] - extraArgs['githubBranch'] = data['githubBranch'] - extraArgs['admin'] = admin - - background = ApplicationInstaller('changeBranch', extraArgs) - background.start() - - time.sleep(2) - - data_ret = {'status': 1, 'error_message': 'None'} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - except BaseException as msg: - data_ret = {'status': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def installPrestaShop(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() - - return render(request, 'websiteFunctions/installPrestaShop.html', {'domainName': self.domain}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def prestaShopInstall(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('installStatus', 0) - - mailUtilities.checkHome() - - extraArgs = {} - extraArgs['admin'] = admin - extraArgs['domainName'] = data['domain'] - extraArgs['home'] = data['home'] - extraArgs['shopName'] = data['shopName'] - extraArgs['firstName'] = data['firstName'] - extraArgs['lastName'] = data['lastName'] - extraArgs['databasePrefix'] = data['databasePrefix'] - extraArgs['email'] = data['email'] - extraArgs['password'] = data['passwordByPass'] - extraArgs['tempStatusPath'] = "/home/cyberpanel/" + str(randint(1000, 9999)) - - if data['home'] == '0': - extraArgs['path'] = data['path'] - - background = ApplicationInstaller('prestashop', extraArgs) - background.start() - - time.sleep(2) - - data_ret = {'status': 1, 'installStatus': 1, 'error_message': 'None', - 'tempStatusPath': extraArgs['tempStatusPath']} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - ## Installation ends - - except BaseException as msg: - data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def createWebsiteAPI(self, data=None): - try: - - adminUser = data['adminUser'] - adminPass = data['adminPass'] - adminEmail = data['ownerEmail'] - websiteOwner = data['websiteOwner'] - ownerPassword = data['ownerPassword'] - data['ssl'] = 0 - data['dkimCheck'] = 0 - data['openBasedir'] = 1 - data['adminEmail'] = data['ownerEmail'] - data['phpSelection'] = "PHP 7.0" - data['package'] = data['packageName'] - - admin = Administrator.objects.get(userName=adminUser) - - if hashPassword.check_password(admin.password, adminPass): - - if adminEmail is None: - data['adminEmail'] = "usman@cyberpersons.com" - - try: - acl = ACL.objects.get(name='user') - websiteOwn = Administrator(userName=websiteOwner, - password=hashPassword.hash_password(ownerPassword), - email=adminEmail, type=3, owner=admin.pk, - initWebsitesLimit=1, acl=acl, api=1) - websiteOwn.save() - except BaseException: - pass - - else: - data_ret = {"existsStatus": 0, 'createWebSiteStatus': 0, - 'error_message': "Could not authorize access to API"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - return self.submitWebsiteCreation(admin.pk, data) - - except BaseException as msg: - data_ret = {'createWebSiteStatus': 0, 'error_message': str(msg), "existsStatus": 0} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def searchWebsitesJson(self, currentlACL, userID, searchTerm): - - websites = ACLManager.searchWebsiteObjects(currentlACL, userID, searchTerm) - - json_data = "[" - checker = 0 - - try: - ipFile = "/etc/cyberpanel/machineIP" - f = open(ipFile) - ipData = f.read() - ipAddress = ipData.split('\n', 1)[0] - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile("Failed to read machine IP, error:" + str(msg)) - ipAddress = "192.168.100.1" - - for items in websites: - if items.state == 0: - state = "Suspended" - else: - state = "Active" - dic = {'domain': items.domain, 'adminEmail': items.adminEmail, 'ipAddress': ipAddress, - 'admin': items.admin.userName, 'package': items.package.packageName, 'state': state} - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' - - return json_data - - def findWebsitesJson(self, currentACL, userID, pageNumber): - finalPageNumber = ((pageNumber * 10)) - 10 - endPageNumber = finalPageNumber + 10 - websites = ACLManager.findWebsiteObjects(currentACL, userID)[finalPageNumber:endPageNumber] - - json_data = "[" - checker = 0 - - try: - ipFile = "/etc/cyberpanel/machineIP" - f = open(ipFile) - ipData = f.read() - ipAddress = ipData.split('\n', 1)[0] - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile("Failed to read machine IP, error:" + str(msg)) - ipAddress = "192.168.100.1" - - for items in websites: - if items.state == 0: - state = "Suspended" - else: - state = "Active" - dic = {'domain': items.domain, 'adminEmail': items.adminEmail, 'ipAddress': ipAddress, - 'admin': items.admin.userName, 'package': items.package.packageName, 'state': state} - - if checker == 0: - json_data = json_data + json.dumps(dic) - checker = 1 - else: - json_data = json_data + ',' + json.dumps(dic) - - json_data = json_data + ']' - - return json_data - - def websitePagination(self, currentACL, userID): - websites = ACLManager.findAllSites(currentACL, userID) - - pages = float(len(websites)) / float(10) - pagination = [] - - if pages <= 1.0: - pages = 1 - pagination.append('
  • ') - else: - pages = ceil(pages) - finalPages = int(pages) + 1 - - for i in range(1, finalPages): - pagination.append('
  • ' + str(i) + '
  • ') - - return pagination - - def getSwitchStatus(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - try: - globalData = data['global'] - - data = {} - data['status'] = 1 - - if os.path.exists('/etc/httpd'): - data['server'] = 1 - else: - data['server'] = 0 - - json_data = json.dumps(data) - return HttpResponse(json_data) - except: - pass - - self.domain = data['domainName'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('status', 0) - - if ProcessUtilities.decideServer() == ProcessUtilities.OLS: - finalConfPath = ApacheVhost.configBasePath + self.domain + '.conf' - - if os.path.exists(finalConfPath): - - phpPath = ApacheVhost.whichPHPExists(self.domain) - command = 'sudo cat ' + phpPath - phpConf = ProcessUtilities.outputExecutioner(command).splitlines() - pmMaxChildren = phpConf[8].split(' ')[2] - pmStartServers = phpConf[9].split(' ')[2] - pmMinSpareServers = phpConf[10].split(' ')[2] - pmMaxSpareServers = phpConf[11].split(' ')[2] - - data = {} - data['status'] = 1 - - data['server'] = WebsiteManager.apache - data['pmMaxChildren'] = pmMaxChildren - data['pmStartServers'] = pmStartServers - data['pmMinSpareServers'] = pmMinSpareServers - data['pmMaxSpareServers'] = pmMaxSpareServers - data['phpPath'] = phpPath - else: - data = {} - data['status'] = 1 - data['server'] = WebsiteManager.ols - - else: - data = {} - data['status'] = 1 - data['server'] = WebsiteManager.lsws - - json_data = json.dumps(data) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'status': 0, 'saveStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def switchServer(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - domainName = data['domainName'] - phpVersion = data['phpSelection'] - server = data['server'] - - if ACLManager.checkOwnership(domainName, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson() - - tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) - - execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/virtualHostUtilities.py" - execPath = execPath + " switchServer --phpVersion '" + phpVersion + "' --server " + str( - server) + " --virtualHostName " + domainName + " --tempStatusPath " + tempStatusPath - ProcessUtilities.popenExecutioner(execPath) - - time.sleep(3) - - data_ret = {'status': 1, 'tempStatusPath': tempStatusPath} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def tuneSettings(self, userID=None, data=None): - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - domainName = data['domainName'] - pmMaxChildren = data['pmMaxChildren'] - pmStartServers = data['pmStartServers'] - pmMinSpareServers = data['pmMinSpareServers'] - pmMaxSpareServers = data['pmMaxSpareServers'] - phpPath = data['phpPath'] - - if ACLManager.checkOwnership(domainName, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson() - - if int(pmStartServers) < int(pmMinSpareServers) or int(pmStartServers) > int(pmMinSpareServers): - data_ret = {'status': 0, - 'error_message': 'pm.start_servers must not be less than pm.min_spare_servers and not greater than pm.max_spare_servers.'} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - if int(pmMinSpareServers) > int(pmMaxSpareServers): - data_ret = {'status': 0, - 'error_message': 'pm.max_spare_servers must not be less than pm.min_spare_servers'} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - try: - website = Websites.objects.get(domain=domainName) - externalApp = website.externalApp - except: - website = ChildDomains.objects.get(domain=domainName) - externalApp = website.master.externalApp - - tempStatusPath = "/home/cyberpanel/" + str(randint(1000, 9999)) - - phpFPMConf = vhostConfs.phpFpmPoolReplace - phpFPMConf = phpFPMConf.replace('{externalApp}', externalApp) - phpFPMConf = phpFPMConf.replace('{pmMaxChildren}', pmMaxChildren) - phpFPMConf = phpFPMConf.replace('{pmStartServers}', pmStartServers) - phpFPMConf = phpFPMConf.replace('{pmMinSpareServers}', pmMinSpareServers) - phpFPMConf = phpFPMConf.replace('{pmMaxSpareServers}', pmMaxSpareServers) - phpFPMConf = phpFPMConf.replace('{www}', "".join(re.findall("[a-zA-Z]+", domainName))[:7]) - phpFPMConf = phpFPMConf.replace('{Sock}', domainName) - - writeToFile = open(tempStatusPath, 'w') - writeToFile.writelines(phpFPMConf) - writeToFile.close() - - command = 'sudo mv %s %s' % (tempStatusPath, phpPath) - ProcessUtilities.executioner(command) - - phpPath = phpPath.split('/') - - if phpPath[1] == 'etc': - phpVersion = phpPath[4][3] + phpPath[4][4] - else: - phpVersion = phpPath[3][3] + phpPath[3][4] - - command = "systemctl stop php%s-php-fpm" % (phpVersion) - ProcessUtilities.executioner(command) - - command = "systemctl restart php%s-php-fpm" % (phpVersion) - ProcessUtilities.executioner(command) - - data_ret = {'status': 1} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - def sshAccess(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() - - website = Websites.objects.get(domain=self.domain) - externalApp = website.externalApp - - return render(request, 'websiteFunctions/sshAccess.html', - {'domainName': self.domain, 'externalApp': externalApp}) - except BaseException as msg: - return HttpResponse(str(msg)) - - def saveSSHAccessChanges(self, userID=None, data=None): - try: - - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - - self.domain = data['domain'] - - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson('status', 0) - - website = Websites.objects.get(domain=self.domain) - - if website.externalApp != data['externalApp']: - data_ret = {'status': 0, 'error_message': 'External app mis-match.'} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - - command = 'echo "%s" | passwd --stdin %s' % (data['password'], data['externalApp']) - ProcessUtilities.executioner(command) - - data_ret = {'status': 1, 'error_message': 'None'} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) - - except BaseException as msg: - data_ret = {'status': 0, 'installStatus': 0, 'error_message': str(msg)} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) diff --git a/websiteFunctions/views.py b/websiteFunctions/views.py index b9d74dcff..a03884740 100755 --- a/websiteFunctions/views.py +++ b/websiteFunctions/views.py @@ -1,22 +1,23 @@ # -*- coding: utf-8 -*- -from django.shortcuts import render,redirect +from django.shortcuts import redirect from django.http import HttpResponse from loginSystem.models import Administrator from loginSystem.views import loadLoginPage import json + +from plogical.httpProc import httpProc from websiteFunctions.website import WebsiteManager from websiteFunctions.pluginManager import pluginManager from django.views.decorators.csrf import csrf_exempt def loadWebsitesHome(request): - try: - val = request.session['userID'] - admin = Administrator.objects.get(pk=val) - return render(request,'websiteFunctions/index.html',{"type":admin.type}) - except KeyError: - return redirect(loadLoginPage) + val = request.session['userID'] + admin = Administrator.objects.get(pk=val) + proc = httpProc(request, 'websiteFunctions/index.html', + {"type": admin.type}) + return proc.render() def createWebsite(request): try: diff --git a/websiteFunctions/website.py b/websiteFunctions/website.py index 13e27403d..ce6c4c860 100755 --- a/websiteFunctions/website.py +++ b/websiteFunctions/website.py @@ -4,6 +4,8 @@ import os.path import sys import django +from plogical.httpProc import httpProc + sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() @@ -53,15 +55,14 @@ class WebsiteManager: def createWebsite(self, request=None, userID=None, data=None): try: currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createWebsite') == 0: - return ACLManager.loadError() - adminNames = ACLManager.loadAllUsers(userID) packagesName = ACLManager.loadPackages(userID, currentACL) phps = PHPManager.findPHPVersions() Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps} - return render(request, 'websiteFunctions/createWebsite.html', Data) + proc = httpProc(request, 'websiteFunctions/createWebsite.html', + Data, 'createWebsite') + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -71,25 +72,22 @@ class WebsiteManager: currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'modifyWebsite') == 0: - return ACLManager.loadError() - websitesName = ACLManager.findAllSites(currentACL, userID) phps = PHPManager.findPHPVersions() - - return render(request, 'websiteFunctions/modifyWebsite.html', {'websiteList': websitesName, 'phps': phps}) + proc = httpProc(request, 'websiteFunctions/modifyWebsite.html', + {'websiteList': websitesName, 'phps': phps}, 'modifyWebsite') + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) def deleteWebsite(self, request=None, userID=None, data=None): try: currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'deleteWebsite') == 0: - return ACLManager.loadError() websitesName = ACLManager.findAllSites(currentACL, userID) - - return render(request, 'websiteFunctions/deleteWebsite.html', {'websiteList': websitesName}) + proc = httpProc(request, 'websiteFunctions/deleteWebsite.html', + {'websiteList': websitesName}, 'deleteWebsite') + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -97,12 +95,12 @@ class WebsiteManager: try: currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'suspendWebsite') == 0: - return ACLManager.loadError() - websitesName = ACLManager.findAllSites(currentACL, userID) - return render(request, 'websiteFunctions/suspendWebsite.html', {'websiteList': websitesName}) + proc = httpProc(request, 'websiteFunctions/suspendWebsite.html', + {'websiteList': websitesName}, 'suspendWebsite') + return proc.render() + except BaseException as msg: return HttpResponse(str(msg)) @@ -110,8 +108,9 @@ class WebsiteManager: try: currentACL = ACLManager.loadedACL(userID) pagination = self.websitePagination(currentACL, userID) - - return render(request, 'websiteFunctions/listWebsites.html', {"pagination": pagination}) + proc = httpProc(request, 'websiteFunctions/listWebsites.html', + {"pagination": pagination}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -124,8 +123,9 @@ class WebsiteManager: phps = PHPManager.findPHPVersions() Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps} - - return render(request, 'websiteFunctions/listChildDomains.html', Data) + proc = httpProc(request, 'websiteFunctions/listChildDomains.html', + Data) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -140,7 +140,9 @@ class WebsiteManager: else: return ACLManager.loadError() - return render(request, 'websiteFunctions/listCron.html', {'domain': request.GET.get('domain')}) + proc = httpProc(request, 'websiteFunctions/listCron.html', + {'domain': request.GET.get('domain')}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -159,12 +161,13 @@ class WebsiteManager: path = "/home/" + self.domain + "/public_html" - return render(request, 'websiteFunctions/domainAlias.html', { + proc = httpProc(request, 'websiteFunctions/domainAlias.html', { 'masterDomain': self.domain, 'aliases': finalAlisList, 'path': path, 'noAlias': noAlias }) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -891,11 +894,12 @@ class WebsiteManager: else: Data['ftp'] = 0 - return render(request, 'websiteFunctions/website.html', Data) - + proc = httpProc(request, 'websiteFunctions/website.html', Data) + return proc.render() else: - return render(request, 'websiteFunctions/website.html', + proc = httpProc(request, 'websiteFunctions/website.html', {"error": 1, "domain": "This domain does not exists."}) + return proc.render() def launchChild(self, request=None, userID=None, data=None): @@ -976,11 +980,12 @@ class WebsiteManager: logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return render(request, 'websiteFunctions/launchChild.html', Data) + proc = httpProc(request, 'websiteFunctions/launchChild.html', Data) + return proc.render() else: - return render(request, 'websiteFunctions/launchChild.html', + proc = httpProc(request, 'websiteFunctions/launchChild.html', {"error": 1, "domain": "This child domain does not exists"}) - + return proc.render() def getDataFromLogFile(self, userID=None, data=None): currentACL = ACLManager.loadedACL(userID) @@ -1774,8 +1779,8 @@ class WebsiteManager: else: return ACLManager.loadError() - return render(request, 'websiteFunctions/installWordPress.html', {'domainName': self.domain}) - + proc = httpProc(request, 'websiteFunctions/installWordPress.html', {'domainName': self.domain}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -1879,7 +1884,8 @@ class WebsiteManager: else: return ACLManager.loadError() - return render(request, 'websiteFunctions/installJoomla.html', {'domainName': self.domain}) + proc = httpProc(request, 'websiteFunctions/installJoomla.html', {'domainName': self.domain}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -1951,8 +1957,9 @@ class WebsiteManager: webhookURL = 'https://' + ipAddress + ':%s/websites/' % (port) + self.domain + '/gitNotify' - return render(request, 'websiteFunctions/setupGit.html', + proc = httpProc(request, 'websiteFunctions/setupGit.html', {'domainName': self.domain, 'installed': 1, 'webhookURL': webhookURL}) + return proc.render() else: command = "ssh-keygen -f /home/%s/.ssh/%s -t rsa -N ''" % (self.domain, website.externalApp) @@ -1979,8 +1986,9 @@ StrictHostKeyChecking no command = 'cat /home/%s/.ssh/%s.pub' % (self.domain, website.externalApp) deploymentKey = ProcessUtilities.outputExecutioner(command, website.externalApp) - return render(request, 'websiteFunctions/setupGit.html', + proc = httpProc(request, 'websiteFunctions/setupGit.html', {'domainName': self.domain, 'deploymentKey': deploymentKey, 'installed': 0}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -2118,7 +2126,8 @@ StrictHostKeyChecking no else: return ACLManager.loadError() - return render(request, 'websiteFunctions/installPrestaShop.html', {'domainName': self.domain}) + proc = httpProc(request, 'websiteFunctions/installPrestaShop.html', {'domainName': self.domain}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -2132,7 +2141,8 @@ StrictHostKeyChecking no else: return ACLManager.loadError() - return render(request, 'websiteFunctions/installMagento.html', {'domainName': self.domain}) + proc = httpProc(request, 'websiteFunctions/installMagento.html', {'domainName': self.domain}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -2193,7 +2203,8 @@ StrictHostKeyChecking no else: return ACLManager.loadError() - return render(request, 'websiteFunctions/installMautic.html', {'domainName': self.domain}) + proc = httpProc(request, 'websiteFunctions/installMautic.html', {'domainName': self.domain}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -2616,8 +2627,9 @@ StrictHostKeyChecking no website = Websites.objects.get(domain=self.domain) externalApp = website.externalApp - return render(request, 'websiteFunctions/sshAccess.html', + proc = httpProc(request, 'websiteFunctions/sshAccess.html', {'domainName': self.domain, 'externalApp': externalApp}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -2673,8 +2685,9 @@ StrictHostKeyChecking no website = Websites.objects.get(domain=self.domain) externalApp = website.externalApp - return render(request, 'websiteFunctions/setupStaging.html', + proc = httpProc(request, 'websiteFunctions/setupStaging.html', {'domainName': self.domain, 'externalApp': externalApp}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -2741,8 +2754,9 @@ StrictHostKeyChecking no website = Websites.objects.get(domain=self.domain) externalApp = website.externalApp - return render(request, 'websiteFunctions/syncMaster.html', + proc = httpProc(request, 'websiteFunctions/syncMaster.html', {'domainName': self.domain, 'externalApp': externalApp, 'childDomain': childDomain}) + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) @@ -2855,9 +2869,9 @@ StrictHostKeyChecking no basePath = '/var/lib/mysql/' folders.append('%s%s' % (basePath, database.dbName)) - return render(request, 'websiteFunctions/manageGIT.html', + proc = httpProc(request, 'websiteFunctions/manageGIT.html', {'domainName': self.domain, 'folders': folders}) - + return proc.render() except BaseException as msg: return HttpResponse(str(msg)) From b9e0a29a37ec30b8a7302dfe5e0f2e90fa3bbcc9 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 20:53:04 +0500 Subject: [PATCH 084/107] further refactor backupManager --- backup/backupManager.py | 168 ++++++++++++---------------------------- 1 file changed, 48 insertions(+), 120 deletions(-) diff --git a/backup/backupManager.py b/backup/backupManager.py index 438c41729..ba5dcd9e8 100755 --- a/backup/backupManager.py +++ b/backup/backupManager.py @@ -47,40 +47,22 @@ class BackupManager: return HttpResponse(str(msg)) def backupSite(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'createBackup') == 0: - return ACLManager.loadError() - - websitesName = ACLManager.findAllSites(currentACL, userID) - proc = httpProc(request, 'backup/backup.html', {'websiteList': websitesName}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID) + proc = httpProc(request, 'backup/backup.html', {'websiteList': websitesName}, 'createBackup') + return proc.render() def gDrive(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - - admin = Administrator.objects.get(pk=userID) - - if ACLManager.currentContextPermission(currentACL, 'createBackup') == 0: - return ACLManager.loadError() - - gDriveAcctsList = [] - - gDriveAccts = admin.gdrive_set.all() - - for items in gDriveAccts: - gDriveAcctsList.append(items.name) - - websitesName = ACLManager.findAllSites(currentACL, userID) - - proc = httpProc(request, 'backup/googleDrive.html', {'accounts': gDriveAcctsList, 'websites': websitesName}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + gDriveAcctsList = [] + gDriveAccts = admin.gdrive_set.all() + for items in gDriveAccts: + gDriveAcctsList.append(items.name) + websitesName = ACLManager.findAllSites(currentACL, userID) + proc = httpProc(request, 'backup/googleDrive.html', {'accounts': gDriveAcctsList, 'websites': websitesName}, + 'createBackup') + return proc.render() def gDriveSetup(self, userID=None, request=None): try: @@ -361,34 +343,23 @@ class BackupManager: return HttpResponse(json_data) def restoreSite(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) + path = os.path.join("/home", "backup") + if not os.path.exists(path): + proc = httpProc(request, 'backup/restore.html', 'restoreBackup') + return proc.render() + else: + all_files = [] + ext = ".tar.gz" - if ACLManager.currentContextPermission(currentACL, 'restoreBackup') == 0: - return ACLManager.loadError() + command = 'sudo chown -R cyberpanel:cyberpanel ' + path + ACLManager.executeCall(command) - path = os.path.join("/home", "backup") - - if not os.path.exists(path): - proc = httpProc(request, 'backup/restore.html') - return proc.render() - else: - all_files = [] - ext = ".tar.gz" - - command = 'sudo chown -R cyberpanel:cyberpanel ' + path - ACLManager.executeCall(command) - - files = os.listdir(path) - for filename in files: - if filename.endswith(ext): - all_files.append(filename) - - proc = httpProc(request, 'backup/restore.html', {'backups': all_files}) - return proc.render() - - except BaseException as msg: - return HttpResponse(str(msg)) + files = os.listdir(path) + for filename in files: + if filename.endswith(ext): + all_files.append(filename) + proc = httpProc(request, 'backup/restore.html', {'backups': all_files}, 'restoreBackup') + return proc.render() def getCurrentBackups(self, userID=None, data=None): try: @@ -702,17 +673,8 @@ class BackupManager: return HttpResponse(final_json) def backupDestinations(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'addDeleteDestinations') == 0: - return ACLManager.loadError() - - proc = httpProc(request, 'backup/backupDestinations.html', {}) - return proc.render() - - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'backup/backupDestinations.html', {}, 'addDeleteDestinations') + return proc.render() def submitDestinationCreation(self, userID=None, data=None): try: @@ -876,26 +838,15 @@ class BackupManager: return HttpResponse(final_json) def scheduleBackup(self, request, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'scheDuleBackups') == 0: - return ACLManager.loadError() - - destinations = NormalBackupDests.objects.all() - - dests = [] - - for dest in destinations: - dests.append(dest.name) - - websitesName = ACLManager.findAllSites(currentACL, userID) - - proc = httpProc(request, 'backup/backupSchedule.html', {'destinations': dests, 'websites': websitesName}) - return proc.render() - - except BaseException as msg: - return HttpResponse(str(msg)) + currentACL = ACLManager.loadedACL(userID) + destinations = NormalBackupDests.objects.all() + dests = [] + for dest in destinations: + dests.append(dest.name) + websitesName = ACLManager.findAllSites(currentACL, userID) + proc = httpProc(request, 'backup/backupSchedule.html', {'destinations': dests, 'websites': websitesName}, + 'scheDuleBackups') + return proc.render() def getCurrentBackupSchedules(self, userID=None, data=None): try: @@ -1018,17 +969,8 @@ class BackupManager: return HttpResponse(final_json) def remoteBackups(self, request, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'remoteBackups') == 0: - return ACLManager.loadError() - - proc = httpProc(request, 'backup/remoteBackups.html') - return proc.render() - - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'backup/remoteBackups.html', 'remoteBackups') + return proc.render() def submitRemoteBackups(self, userID=None, data=None): try: @@ -1381,26 +1323,12 @@ class BackupManager: return HttpResponse(json_data) def backupLogs(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - all_files = [] - - logFiles = BackupJob.objects.all().order_by('-id') - - for logFile in logFiles: - all_files.append(logFile.logFile) - - proc = httpProc(request, 'backup/backupLogs.html', {'backups': all_files}) - return proc.render() - - except BaseException as msg: - return HttpResponse(str(msg)) + all_files = [] + logFiles = BackupJob.objects.all().order_by('-id') + for logFile in logFiles: + all_files.append(logFile.logFile) + proc = httpProc(request, 'backup/backupLogs.html', {'backups': all_files}, 'admin') + return proc.render() def fetchLogs(self, userID=None, data=None): try: From 8dde79dead9d2f09cbbddbaa12d0f08489e053b0 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Wed, 3 Mar 2021 21:15:23 +0500 Subject: [PATCH 085/107] further refoctor default render --- baseTemplate/views.py | 6 ------ containerization/containerManager.py | 1 - dns/dnsManager.py | 3 +++ dockerManager/container.py | 5 ----- dockerManager/views.py | 1 - 5 files changed, 3 insertions(+), 13 deletions(-) diff --git a/baseTemplate/views.py b/baseTemplate/views.py index 74d18de28..4395a7009 100755 --- a/baseTemplate/views.py +++ b/baseTemplate/views.py @@ -66,7 +66,6 @@ def getAdminStatus(request): def getSystemStatus(request): try: - HTTPData = SystemInformation.getSystemInformation() json_data = json.dumps(HTTPData) return HttpResponse(json_data) @@ -79,11 +78,8 @@ def getLoadAverage(request): one = loadAverage[0] two = loadAverage[1] three = loadAverage[2] - loadAvg = {"one": one, "two": two,"three": three} - json_data = json.dumps(loadAvg) - return HttpResponse(json_data) @ensure_csrf_cookie @@ -91,9 +87,7 @@ def versionManagment(request): ## Get latest version getVersion = requests.get('https://cyberpanel.net/version.txt') - latest = getVersion.json() - latestVersion = latest['version'] latestBuild = latest['build'] diff --git a/containerization/containerManager.py b/containerization/containerManager.py index 8922516a5..f86c1f636 100755 --- a/containerization/containerManager.py +++ b/containerization/containerManager.py @@ -1,4 +1,3 @@ -from django.shortcuts import render from plogical.processUtilities import ProcessUtilities import threading as multi from plogical.acl import ACLManager diff --git a/dns/dnsManager.py b/dns/dnsManager.py index 05009251c..bbb507607 100755 --- a/dns/dnsManager.py +++ b/dns/dnsManager.py @@ -113,10 +113,12 @@ class DNSManager: return HttpResponse(final_json) def createDNSZone(self, request = None, userID = None): + if os.path.exists('/home/cyberpanel/powerdns'): finalData = {'status': 1} else: finalData = {'status': 0} + template = 'dns/createDNSZone.html' proc = httpProc(request, template, finalData, 'createDNSZone') return proc.render() @@ -158,6 +160,7 @@ class DNSManager: def addDeleteDNSRecords(self, request = None, userID = None): currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/powerdns'): finalData = {"status": 0} else: diff --git a/dockerManager/container.py b/dockerManager/container.py index 8cc1ceb73..71d251e44 100755 --- a/dockerManager/container.py +++ b/dockerManager/container.py @@ -1,13 +1,8 @@ #!/usr/local/CyberCP/bin/python -import os import os.path import sys import django -import mimetypes - -from plogical.httpProc import httpProc - sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() diff --git a/dockerManager/views.py b/dockerManager/views.py index ed871a900..2e58b9f33 100755 --- a/dockerManager/views.py +++ b/dockerManager/views.py @@ -29,7 +29,6 @@ def loadDockerHome(request): userID = request.session['userID'] admin = Administrator.objects.get(pk=userID) template = 'dockerManager/index.html' - proc = httpProc(request, template, {"type": admin.type}, 'admin') return proc.render() From f0f3b9c34697d954d8d3d497ae2d3aa6de9165a0 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 5 Mar 2021 10:15:01 +0500 Subject: [PATCH 086/107] fix: Data too long for column type at row 1 --- plogical/upgrade.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plogical/upgrade.py b/plogical/upgrade.py index c53464ee9..427aa03c6 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -1402,6 +1402,11 @@ imap_folder_list_limit = 0 except: pass + try: + cursor.execute('ALTER TABLE `manageServices_pdnsstatus` CHANGE `type` `type` VARCHAR(6) NULL;') + except: + pass + query = '''CREATE TABLE `databases_dbmeta` ( `id` int(11) NOT NULL AUTO_INCREMENT, `key` varchar(200) NOT NULL, From 5b698c1a24b855b5460703e0f887b3b3632d9f5d Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 5 Mar 2021 14:27:41 +0500 Subject: [PATCH 087/107] further refoctor default render dockercontainer --- dockerManager/container.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/dockerManager/container.py b/dockerManager/container.py index 71d251e44..13a600571 100755 --- a/dockerManager/container.py +++ b/dockerManager/container.py @@ -36,16 +36,7 @@ class ContainerManager(multi.Thread): self.data = data def renderDM(self): - - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - proc = httpProc(self.request, self.templateName, self.data) + proc = httpProc(self.request, self.templateName, self.data, 'admin') return proc.render() def run(self): From 5d41b304384717b86d4339cdb55552b953c79d5e Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 5 Mar 2021 14:37:00 +0500 Subject: [PATCH 088/107] further refoctor default render emailMarketingManager --- emailMarketing/emailMarketingManager.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/emailMarketing/emailMarketingManager.py b/emailMarketing/emailMarketingManager.py index cfb19b343..beb4bef6c 100755 --- a/emailMarketing/emailMarketingManager.py +++ b/emailMarketing/emailMarketingManager.py @@ -4,7 +4,6 @@ from loginSystem.views import loadLoginPage import json from random import randint import time - from plogical.httpProc import httpProc from .models import EmailMarketing, EmailLists, EmailsInList, EmailJobs from websiteFunctions.models import Websites @@ -14,7 +13,6 @@ import smtplib from .models import SMTPHosts, EmailTemplate from loginSystem.models import Administrator from .emACL import emACL -from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging class EmailMarketingManager: @@ -115,7 +113,7 @@ class EmailMarketingManager: if emACL.checkIfEMEnabled(admin.userName) == 0: return ACLManager.loadError() - proc = httpProc(self.request, 'emailMarketing/createEmailList.html', {'domain': self.domain}, 'admin') + proc = httpProc(self.request, 'emailMarketing/createEmailList.html', {'domain': self.domain}) return proc.render() except KeyError as msg: return redirect(loadLoginPage) @@ -161,6 +159,7 @@ class EmailMarketingManager: userID = self.request.session['userID'] currentACL = ACLManager.loadedACL(userID) admin = Administrator.objects.get(pk=userID) + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: pass else: @@ -171,7 +170,7 @@ class EmailMarketingManager: listNames = emACL.getEmailsLists(self.domain) - proc = httpProc(self.request, 'emailMarketing/manageLists.html', {'listNames': listNames, 'domain': self.domain}, 'admin') + proc = httpProc(self.request, 'emailMarketing/manageLists.html', {'listNames': listNames, 'domain': self.domain}) return proc.render() except KeyError as msg: @@ -179,6 +178,7 @@ class EmailMarketingManager: def configureVerify(self): try: + userID = self.request.session['userID'] currentACL = ACLManager.loadedACL(userID) admin = Administrator.objects.get(pk=userID) @@ -192,7 +192,7 @@ class EmailMarketingManager: return ACLManager.loadError() proc = httpProc(self.request, 'emailMarketing/configureVerify.html', - {'domain': self.domain}, 'admin') + {'domain': self.domain}) return proc.render() except KeyError as msg: @@ -490,7 +490,7 @@ class EmailMarketingManager: listNames.append(items.listName) proc = httpProc(self.request, 'emailMarketing/manageSMTPHosts.html', - {'listNames': listNames, 'domain': self.domain}, 'admin') + {'listNames': listNames, 'domain': self.domain}) return proc.render() except KeyError as msg: return redirect(loadLoginPage) @@ -659,7 +659,7 @@ class EmailMarketingManager: return ACLManager.loadErrorJson() proc = httpProc(self.request, 'emailMarketing/composeMessages.html', - None, 'admin') + None) return proc.render() except KeyError as msg: return redirect(loadLoginPage) @@ -714,7 +714,7 @@ class EmailMarketingManager: Data['listNames'] = listNames proc = httpProc(self.request, 'emailMarketing/sendEmails.html', - Data, 'admin') + Data) return proc.render() except KeyError as msg: From c0bbf5fc2e24814a1aa81252d7b78f9339d30006 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Fri, 5 Mar 2021 14:45:23 +0500 Subject: [PATCH 089/107] further refoctor default render emailPremium --- emailPremium/views.py | 296 ++++++++++++++---------------------------- 1 file changed, 101 insertions(+), 195 deletions(-) diff --git a/emailPremium/views.py b/emailPremium/views.py index ac230318e..47299efe9 100755 --- a/emailPremium/views.py +++ b/emailPremium/views.py @@ -1,10 +1,8 @@ # -*- coding: utf-8 -*- - -from django.shortcuts import render,redirect +from django.shortcuts import redirect from django.http import HttpResponse from mailServer.models import Domains, EUsers -# Create your views here. from websiteFunctions.models import Websites from loginSystem.views import loadLoginPage import plogical.CyberCPLogFileWriter as logging @@ -12,33 +10,19 @@ import json from .models import DomainLimits, EmailLimits from math import ceil from postfixSenderPolicy.client import cacheClient -import _thread from plogical.mailUtilities import mailUtilities from plogical.virtualHostUtilities import virtualHostUtilities from random import randint from plogical.acl import ACLManager from plogical.processUtilities import ProcessUtilities from plogical.httpProc import httpProc -# Create your views here. ## Email Policy Server def emailPolicyServer(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - proc = httpProc(request, 'emailPremium/policyServer.html', - None, 'admin') - return proc.render() - - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'emailPremium/policyServer.html', + None, 'admin') + return proc.render() def fetchPolicyServerStatus(request): try: @@ -130,59 +114,43 @@ def savePolicyServerStatus(request): ## Email Policy Server configs def listDomains(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + websites = DomainLimits.objects.all() - try: - websites = DomainLimits.objects.all() + ## Check if Policy Server is installed. - ## Check if Policy Server is installed. + command = 'sudo cat /etc/postfix/main.cf' + output = ProcessUtilities.outputExecutioner(command).split('\n') - command = 'sudo cat /etc/postfix/main.cf' - output = ProcessUtilities.outputExecutioner(command).split('\n') + installCheck = 0 - installCheck = 0 + for items in output: + if items.find('check_policy_service unix:/var/log/policyServerSocket') > -1: + installCheck = 1 + break - for items in output: - if items.find('check_policy_service unix:/var/log/policyServerSocket') > -1: - installCheck = 1 - break + if installCheck == 0: + proc = httpProc(request, 'emailPremium/listDomains.html', {"installCheck": installCheck}, 'admin') + return proc.render() - if installCheck == 0: - proc = httpProc(request, 'emailPremium/listDomains.html', {"installCheck": installCheck}) - return proc.render() + ### - ### + pages = float(len(websites)) / float(10) + pagination = [] - pages = float(len(websites)) / float(10) - pagination = [] + if pages <= 1.0: + pages = 1 + pagination.append('
  • ') + else: + pages = ceil(pages) + finalPages = int(pages) + 1 - if pages <= 1.0: - pages = 1 - pagination.append('
  • ') - else: - pages = ceil(pages) - finalPages = int(pages) + 1 + for i in range(1, finalPages): + pagination.append('
  • ' + str(i) + '
  • ') - for i in range(1, finalPages): - pagination.append('
  • ' + str(i) + '
  • ') - - proc = httpProc(request, 'emailPremium/listDomains.html', - {"pagination":pagination, "installCheck": installCheck}, 'admin') - return proc.render() - - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse("See CyberCP main log file.") - - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'emailPremium/listDomains.html', + {"pagination": pagination, "installCheck": installCheck}, 'admin') + return proc.render() def getFurtherDomains(request): try: @@ -307,60 +275,47 @@ def enableDisableEmailLimits(request): return HttpResponse(json_data) def emailLimits(request,domain): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + if Websites.objects.filter(domain=domain).exists(): + website = Websites.objects.get(domain=domain) + domainEmail = Domains.objects.get(domainOwner=website) + domainLimits = DomainLimits.objects.get(domain=domainEmail) - if currentACL['admin'] == 1: - pass + Data = {} + Data['domain'] = domain + Data['monthlyLimit'] = domainLimits.monthlyLimit + Data['monthlyUsed'] = domainLimits.monthlyUsed + Data['emailAccounts'] = domainEmail.eusers_set.count() + + if domainLimits.limitStatus == 1: + Data['limitsOn'] = 1 + Data['limitsOff'] = 0 else: - return ACLManager.loadError() + Data['limitsOn'] = 0 + Data['limitsOff'] = 1 + ## Pagination for emails - if Websites.objects.filter(domain=domain).exists(): - website = Websites.objects.get(domain=domain) - domainEmail = Domains.objects.get(domainOwner=website) - domainLimits = DomainLimits.objects.get(domain=domainEmail) - - Data = {} - Data['domain'] = domain - Data['monthlyLimit'] = domainLimits.monthlyLimit - Data['monthlyUsed'] = domainLimits.monthlyUsed - Data['emailAccounts'] = domainEmail.eusers_set.count() - - if domainLimits.limitStatus == 1: - Data['limitsOn'] = 1 - Data['limitsOff'] = 0 - else: - Data['limitsOn'] = 0 - Data['limitsOff'] = 1 - - ## Pagination for emails - - - pages = float(Data['emailAccounts']) / float(10) - pagination = [] - - if pages <= 1.0: - pages = 1 - pagination.append('
  • ') - else: - pages = ceil(pages) - finalPages = int(pages) + 1 - - for i in range(1, finalPages): - pagination.append('
  • ' + str(i) + '
  • ') - - Data['pagination'] = pagination - - proc = httpProc(request, 'emailPremium/emailLimits.html', Data, 'admin') - return proc.render() + pages = float(Data['emailAccounts']) / float(10) + pagination = [] + if pages <= 1.0: + pages = 1 + pagination.append('
  • ') else: - proc = httpProc(request, 'emailPremium/emailLimits.html', {"error":1,"domain": "This domain does not exists"}, 'admin') - return proc.render() - except KeyError: - return redirect(loadLoginPage) + pages = ceil(pages) + finalPages = int(pages) + 1 + + for i in range(1, finalPages): + pagination.append('
  • ' + str(i) + '
  • ') + + Data['pagination'] = pagination + + proc = httpProc(request, 'emailPremium/emailLimits.html', Data, 'admin') + return proc.render() + else: + proc = httpProc(request, 'emailPremium/emailLimits.html', {"error": 1, "domain": "This domain does not exists"}, + 'admin') + return proc.render() def changeDomainLimit(request): try: @@ -501,41 +456,29 @@ def enableDisableIndividualEmailLimits(request): return HttpResponse(json_data) def emailPage(request, emailAddress): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + Data = {} + Data['emailAddress'] = emailAddress - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + email = EUsers.objects.get(email=emailAddress) + logEntries = email.emaillogs_set.all().count() - Data = {} - Data['emailAddress'] = emailAddress + pages = float(logEntries) / float(10) + pagination = [] - email = EUsers.objects.get(email=emailAddress) - logEntries = email.emaillogs_set.all().count() + if pages <= 1.0: + pages = 1 + pagination.append('
  • ') + else: + pages = ceil(pages) + finalPages = int(pages) + 1 - pages = float(logEntries) / float(10) - pagination = [] + for i in range(1, finalPages): + pagination.append('
  • ' + str(i) + '
  • ') - if pages <= 1.0: - pages = 1 - pagination.append('
  • ') - else: - pages = ceil(pages) - finalPages = int(pages) + 1 + Data['pagination'] = pagination - for i in range(1, finalPages): - pagination.append('
  • ' + str(i) + '
  • ') - - Data['pagination'] = pagination - - proc = httpProc(request, 'emailPremium/emailPage.html', Data, 'admin') - return proc.render() - - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'emailPremium/emailPage.html', Data, 'admin') + return proc.render() def getEmailStats(request): try: @@ -779,24 +722,14 @@ def flushEmailLogs(request): ### SpamAssassin def spamAssassinHome(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + checkIfSpamAssassinInstalled = 0 - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + if mailUtilities.checkIfSpamAssassinInstalled() == 1: + checkIfSpamAssassinInstalled = 1 - checkIfSpamAssassinInstalled = 0 - - if mailUtilities.checkIfSpamAssassinInstalled() == 1: - checkIfSpamAssassinInstalled = 1 - - proc = httpProc(request, 'emailPremium/SpamAssassin.html', {'checkIfSpamAssassinInstalled': checkIfSpamAssassinInstalled}, 'admin') - return proc.render() - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'emailPremium/SpamAssassin.html', + {'checkIfSpamAssassinInstalled': checkIfSpamAssassinInstalled}, 'admin') + return proc.render() def installSpamAssassin(request): try: @@ -959,10 +892,6 @@ def fetchSpamAssassinSettings(request): final_dic = {'fetchStatus': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) return HttpResponse(final_json) - - - proc = httpProc(request,'managePHP/editPHPConfig.html') - return proc.render() except KeyError: return redirect(loadLoginPage) @@ -1037,20 +966,9 @@ def saveSpamAssassinConfigurations(request): return HttpResponse(json_data) def mailQueue(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - proc = httpProc(request, 'emailPremium/mailQueue.html', - None, 'admin') - return proc.render() - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'emailPremium/mailQueue.html', + None, 'admin') + return proc.render() def fetchMailQueue(request): try: @@ -1186,31 +1104,19 @@ def delete(request): ## MailScanner def MailScanner(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + checkIfMailScannerInstalled = 0 - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddress = ipData.split('\n', 1)[0] - checkIfMailScannerInstalled = 0 + if mailUtilities.checkIfMailScannerInstalled() == 1: + checkIfMailScannerInstalled = 1 - ipFile = "/etc/cyberpanel/machineIP" - f = open(ipFile) - ipData = f.read() - ipAddress = ipData.split('\n', 1)[0] - - if mailUtilities.checkIfMailScannerInstalled() == 1: - checkIfMailScannerInstalled = 1 - - proc = httpProc(request, 'emailPremium/MailScanner.html', - {'checkIfMailScannerInstalled': checkIfMailScannerInstalled, 'ipAddress': ipAddress}, 'admin') - return proc.render() - - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'emailPremium/MailScanner.html', + {'checkIfMailScannerInstalled': checkIfMailScannerInstalled, 'ipAddress': ipAddress}, 'admin') + return proc.render() def installMailScanner(request): try: From 3aeab72d9122b46b1bee5b719922598bbd534315 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 6 Mar 2021 11:05:19 +0500 Subject: [PATCH 090/107] further refoctor default render firewall --- firewall/firewallManager.py | 267 +++++++++++++----------------------- 1 file changed, 96 insertions(+), 171 deletions(-) diff --git a/firewall/firewallManager.py b/firewall/firewallManager.py index b269e6d1d..355a8e435 100755 --- a/firewall/firewallManager.py +++ b/firewall/firewallManager.py @@ -466,37 +466,26 @@ class FirewallManager: return HttpResponse(final_json) def loadModSecurityHome(self, request = None, userID = None): - try: - currentACL = ACLManager.loadedACL(userID) + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + OLS = 1 + confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf") - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + command = "sudo cat " + confPath + httpdConfig = ProcessUtilities.outputExecutioner(command).splitlines() - if ProcessUtilities.decideServer() == ProcessUtilities.OLS: - OLS = 1 - confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf") + modSecInstalled = 0 - command = "sudo cat " + confPath - httpdConfig = ProcessUtilities.outputExecutioner(command).splitlines() + for items in httpdConfig: + if items.find('module mod_security') > -1: + modSecInstalled = 1 + break + else: + OLS = 0 + modSecInstalled = 1 - modSecInstalled = 0 - - for items in httpdConfig: - if items.find('module mod_security') > -1: - modSecInstalled = 1 - break - else: - OLS = 0 - modSecInstalled = 1 - - proc = httpProc(request, 'firewall/modSecurity.html', - {'modSecInstalled': modSecInstalled, 'OLS': OLS}, 'admin') - return proc.render() - - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'firewall/modSecurity.html', + {'modSecInstalled': modSecInstalled, 'OLS': OLS}, 'admin') + return proc.render() def installModSec(self, userID = None, data = None): try: @@ -852,35 +841,24 @@ class FirewallManager: return HttpResponse(json_data) def modSecRules(self, request = None, userID = None): - try: + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf") - currentACL = ACLManager.loadedACL(userID) + command = "sudo cat " + confPath + httpdConfig = ProcessUtilities.outputExecutioner(command).split('\n') - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + modSecInstalled = 0 - if ProcessUtilities.decideServer() == ProcessUtilities.OLS: - confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf") + for items in httpdConfig: + if items.find('module mod_security') > -1: + modSecInstalled = 1 + break + else: + modSecInstalled = 1 - command = "sudo cat " + confPath - httpdConfig = ProcessUtilities.outputExecutioner(command).split('\n') - - modSecInstalled = 0 - - for items in httpdConfig: - if items.find('module mod_security') > -1: - modSecInstalled = 1 - break - else: - modSecInstalled = 1 - - proc = httpProc(request, 'firewall/modSecurityRules.html', - {'modSecInstalled': modSecInstalled}, 'admin') - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'firewall/modSecurityRules.html', + {'modSecInstalled': modSecInstalled}, 'admin') + return proc.render() def fetchModSecRules(self, userID = None, data = None): try: @@ -977,37 +955,25 @@ class FirewallManager: return HttpResponse(json_data) def modSecRulesPacks(self, request = None, userID = None): - try: + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: - currentACL = ACLManager.loadedACL(userID) + confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf") - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + command = "sudo cat " + confPath + httpdConfig = ProcessUtilities.outputExecutioner(command).split('\n') - if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + modSecInstalled = 0 - confPath = os.path.join(virtualHostUtilities.Server_root, "conf/httpd_config.conf") + for items in httpdConfig: + if items.find('module mod_security') > -1: + modSecInstalled = 1 + break + else: + modSecInstalled = 1 - command = "sudo cat " + confPath - httpdConfig = ProcessUtilities.outputExecutioner(command).split('\n') - - modSecInstalled = 0 - - for items in httpdConfig: - if items.find('module mod_security') > -1: - modSecInstalled = 1 - break - else: - modSecInstalled = 1 - - proc = httpProc(request, 'firewall/modSecurityRulesPacks.html', - {'modSecInstalled': modSecInstalled}, 'admin') - return proc.render() - - except BaseException as msg: - return HttpResponse(msg) + proc = httpProc(request, 'firewall/modSecurityRulesPacks.html', + {'modSecInstalled': modSecInstalled}, 'admin') + return proc.render() def getOWASPAndComodoStatus(self, userID = None, data = None): try: @@ -1284,30 +1250,18 @@ class FirewallManager: return HttpResponse(json_data) def csf(self): + csfInstalled = 1 try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() - - csfInstalled = 1 - try: - command = 'csf -h' - output = ProcessUtilities.outputExecutioner(command) - if output.find("command not found") > -1: - csfInstalled = 0 - except subprocess.CalledProcessError: + command = 'csf -h' + output = ProcessUtilities.outputExecutioner(command) + if output.find("command not found") > -1: csfInstalled = 0 + except subprocess.CalledProcessError: + csfInstalled = 0 - proc = httpProc(self.request, 'firewall/csf.html', - {'csfInstalled' : csfInstalled}, 'admin') - return proc.render() - - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(self.request, 'firewall/csf.html', + {'csfInstalled': csfInstalled}, 'admin') + return proc.render() def installCSF(self): try: @@ -1537,48 +1491,35 @@ class FirewallManager: return HttpResponse(final_json) def imunify(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddress = ipData.split('\n', 1)[0] - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + fullAddress = '%s:%s' % (ipAddress, ProcessUtilities.fetchCurrentPort()) - ipFile = "/etc/cyberpanel/machineIP" - f = open(ipFile) - ipData = f.read() - ipAddress = ipData.split('\n', 1)[0] + data = {} + data['ipAddress'] = fullAddress - fullAddress = '%s:%s' % (ipAddress, ProcessUtilities.fetchCurrentPort()) + data['CL'] = 1 - data = {} - data['ipAddress'] = fullAddress + if os.path.exists(FirewallManager.imunifyPath): + data['imunify'] = 1 + else: + data['imunify'] = 0 - data['CL'] = 1 - - if os.path.exists(FirewallManager.imunifyPath): - data['imunify'] = 1 - else: - data['imunify'] = 0 - - if data['CL'] == 0: - proc = httpProc(self.request, 'firewall/notAvailable.html', - data, 'admin') - return proc.render() - elif data['imunify'] == 0: - proc = httpProc(self.request, 'firewall/notAvailable.html', - data, 'admin') - return proc.render() - else: - proc = httpProc(self.request, 'firewall/imunify.html', - data, 'admin') - return proc.render() - - - except BaseException as msg: - return HttpResponse(str(msg)) + if data['CL'] == 0: + proc = httpProc(self.request, 'firewall/notAvailable.html', + data, 'admin') + return proc.render() + elif data['imunify'] == 0: + proc = httpProc(self.request, 'firewall/notAvailable.html', + data, 'admin') + return proc.render() + else: + proc = httpProc(self.request, 'firewall/imunify.html', + data, 'admin') + return proc.render() def submitinstallImunify(self): try: @@ -1607,45 +1548,29 @@ class FirewallManager: logging.CyberCPLogFileWriter.statusWriter(ServerStatusUtil.lswsInstallStatusPath, str(msg) + ' [404].', 1) def imunifyAV(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddress = ipData.split('\n', 1)[0] - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + fullAddress = '%s:%s' % (ipAddress, ProcessUtilities.fetchCurrentPort()) - ipFile = "/etc/cyberpanel/machineIP" - f = open(ipFile) - ipData = f.read() - ipAddress = ipData.split('\n', 1)[0] + data = {} + data['ipAddress'] = fullAddress - fullAddress = '%s:%s' % (ipAddress, ProcessUtilities.fetchCurrentPort()) + if os.path.exists(FirewallManager.imunifyAVPath): + data['imunify'] = 1 + else: + data['imunify'] = 0 - data = {} - data['ipAddress'] = fullAddress - - - - if os.path.exists(FirewallManager.imunifyAVPath): - data['imunify'] = 1 - else: - data['imunify'] = 0 - - if data['imunify'] == 0: - proc = httpProc(self.request, 'firewall/notAvailableAV.html', - data, 'admin') - return proc.render() - else: - proc = httpProc(self.request, 'firewall/imunifyAV.html', - data, 'admin') - return proc.render() - - - - except BaseException as msg: - return HttpResponse(str(msg)) + if data['imunify'] == 0: + proc = httpProc(self.request, 'firewall/notAvailableAV.html', + data, 'admin') + return proc.render() + else: + proc = httpProc(self.request, 'firewall/imunifyAV.html', + data, 'admin') + return proc.render() def submitinstallImunifyAV(self): try: From 16216dbf0ac205e425db4e7d38419afb9c514733 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 6 Mar 2021 11:12:14 +0500 Subject: [PATCH 091/107] further refoctor default render ftpaccounts --- ftp/ftpManager.py | 92 +++++++++++++++++------------------------------ 1 file changed, 33 insertions(+), 59 deletions(-) diff --git a/ftp/ftpManager.py b/ftp/ftpManager.py index 86e583906..8c1e0e3a4 100755 --- a/ftp/ftpManager.py +++ b/ftp/ftpManager.py @@ -9,7 +9,7 @@ sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() import json -from django.shortcuts import render,redirect +from django.shortcuts import redirect from django.http import HttpResponse try: from .models import Users @@ -35,36 +35,26 @@ class FTPManager: self.extraArgs = extraArgs def loadFTPHome(self): - try: - proc = httpProc(self.request, 'ftp/index.html', - None, 'createFTPAccount') - return proc.render() - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(self.request, 'ftp/index.html', + None, 'createFTPAccount') + return proc.render() def createFTPAccount(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'createFTPAccount') == 0: - return ACLManager.loadError() - - admin = Administrator.objects.get(pk=userID) - - if not os.path.exists('/home/cyberpanel/pureftpd'): - proc = httpProc(self.request, 'ftp/createFTPAccount.html', - { "status": 0}, 'createFTPAccount') - return proc.render() - - websitesName = ACLManager.findAllSites(currentACL, userID) + admin = Administrator.objects.get(pk=userID) + if not os.path.exists('/home/cyberpanel/pureftpd'): proc = httpProc(self.request, 'ftp/createFTPAccount.html', - {'websiteList': websitesName, 'admin': admin.userName, "status": 1}, 'createFTPAccount') + {"status": 0}, 'createFTPAccount') return proc.render() - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse(str(msg)) + + websitesName = ACLManager.findAllSites(currentACL, userID) + + proc = httpProc(self.request, 'ftp/createFTPAccount.html', + {'websiteList': websitesName, 'admin': admin.userName, "status": 1}, 'createFTPAccount') + return proc.render() def submitFTPCreation(self): try: @@ -121,28 +111,19 @@ class FTPManager: return HttpResponse(json_data) def deleteFTPAccount(self): - try: - - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'deleteFTPAccount') == 0: - return ACLManager.loadError() - - if not os.path.exists('/home/cyberpanel/pureftpd'): - proc = httpProc(self.request, 'ftp/deleteFTPAccount.html', - { "status": 0}, 'deleteFTPAccount') - return proc.render() - - websitesName = ACLManager.findAllSites(currentACL, userID) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/pureftpd'): proc = httpProc(self.request, 'ftp/deleteFTPAccount.html', - {'websiteList': websitesName, "status": 1}, 'deleteFTPAccount') + {"status": 0}, 'deleteFTPAccount') return proc.render() - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse(str(msg)) + websitesName = ACLManager.findAllSites(currentACL, userID) + + proc = httpProc(self.request, 'ftp/deleteFTPAccount.html', + {'websiteList': websitesName, "status": 1}, 'deleteFTPAccount') + return proc.render() def fetchFTPAccounts(self): try: @@ -216,25 +197,18 @@ class FTPManager: return HttpResponse(json_data) def listFTPAccounts(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'listFTPAccounts') == 0: - return ACLManager.loadError() - - if not os.path.exists('/home/cyberpanel/pureftpd'): - proc = httpProc(self.request, 'ftp/listFTPAccounts.html', - {"status": 0}, 'listFTPAccounts') - return proc.render() - - websitesName = ACLManager.findAllSites(currentACL, userID) + if not os.path.exists('/home/cyberpanel/pureftpd'): proc = httpProc(self.request, 'ftp/listFTPAccounts.html', - {'websiteList': websitesName, "status": 1}, 'listFTPAccounts') + {"status": 0}, 'listFTPAccounts') return proc.render() - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse(str(msg)) + + websitesName = ACLManager.findAllSites(currentACL, userID) + proc = httpProc(self.request, 'ftp/listFTPAccounts.html', + {'websiteList': websitesName, "status": 1}, 'listFTPAccounts') + return proc.render() def getAllFTPAccounts(self): try: From bb5e6ffc97731629dcfa3943015c59ee7401c6c6 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 6 Mar 2021 11:25:47 +0500 Subject: [PATCH 092/107] further refoctor default render mailserver --- IncBackups/views.py | 2 - mailServer/mailserverManager.py | 159 +++++++++++++------------------- 2 files changed, 63 insertions(+), 98 deletions(-) diff --git a/IncBackups/views.py b/IncBackups/views.py index ee1d45f53..399cd0bfd 100644 --- a/IncBackups/views.py +++ b/IncBackups/views.py @@ -6,8 +6,6 @@ from pathlib import Path from random import randint from django.shortcuts import HttpResponse, redirect -from django.shortcuts import render - from loginSystem.models import Administrator from loginSystem.views import loadLoginPage from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging diff --git a/mailServer/mailserverManager.py b/mailServer/mailserverManager.py index 4245c7342..d16fbd6b9 100755 --- a/mailServer/mailserverManager.py +++ b/mailServer/mailserverManager.py @@ -58,53 +58,42 @@ class MailServerManager(multi.Thread): logging.CyberCPLogFileWriter.writeToFile(str(msg) + ' [MailServerManager.run]') def loadEmailHome(self): - try: - proc = httpProc(self.request, 'mailServer/index.html', - None, 'createEmail') - return proc.render() - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(self.request, 'mailServer/index.html', + None, 'createEmail') + return proc.render() def createEmailAccount(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if not os.path.exists('/home/cyberpanel/postfix'): - proc = httpProc(self.request, 'mailServer/createEmailAccount.html', - { "status": 0}, 'createEmail') - return proc.render() - - websitesName = ACLManager.findAllSites(currentACL, userID) - websitesName = websitesName + ACLManager.findChildDomains(websitesName) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/postfix'): proc = httpProc(self.request, 'mailServer/createEmailAccount.html', - {'websiteList': websitesName, "status": 1}, 'createEmail') + {"status": 0}, 'createEmail') return proc.render() - except BaseException as msg: - return redirect(loadLoginPage) + websitesName = ACLManager.findAllSites(currentACL, userID) + websitesName = websitesName + ACLManager.findChildDomains(websitesName) + + proc = httpProc(self.request, 'mailServer/createEmailAccount.html', + {'websiteList': websitesName, "status": 1}, 'createEmail') + return proc.render() def listEmails(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if not os.path.exists('/home/cyberpanel/postfix'): - proc = httpProc(self.request, 'mailServer/listEmails.html', - { "status": 0}, 'listEmails') - return proc.render() - - websitesName = ACLManager.findAllSites(currentACL, userID) - websitesName = websitesName + ACLManager.findChildDomains(websitesName) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/postfix'): proc = httpProc(self.request, 'mailServer/listEmails.html', - {'websiteList': websitesName, "status": 1}, 'listEmails') + {"status": 0}, 'listEmails') return proc.render() - except BaseException as msg: - return redirect(loadLoginPage) + websitesName = ACLManager.findAllSites(currentACL, userID) + websitesName = websitesName + ACLManager.findChildDomains(websitesName) + + proc = httpProc(self.request, 'mailServer/listEmails.html', + {'websiteList': websitesName, "status": 1}, 'listEmails') + return proc.render() def submitEmailCreation(self): try: @@ -148,26 +137,20 @@ class MailServerManager(multi.Thread): return HttpResponse(json_data) def deleteEmailAccount(self): - try: - - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - - if not os.path.exists('/home/cyberpanel/postfix'): - proc = httpProc(self.request, 'mailServer/deleteEmailAccount.html', - { "status": 0}, 'deleteEmail') - return proc.render() - - websitesName = ACLManager.findAllSites(currentACL, userID) - websitesName = websitesName + ACLManager.findChildDomains(websitesName) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/postfix'): proc = httpProc(self.request, 'mailServer/deleteEmailAccount.html', - {'websiteList': websitesName, "status": 1}, 'deleteEmail') + {"status": 0}, 'deleteEmail') return proc.render() - except BaseException as msg: - return redirect(loadLoginPage) + websitesName = ACLManager.findAllSites(currentACL, userID) + websitesName = websitesName + ACLManager.findChildDomains(websitesName) + + proc = httpProc(self.request, 'mailServer/deleteEmailAccount.html', + {'websiteList': websitesName, "status": 1}, 'deleteEmail') + return proc.render() def getEmailsForDomain(self): try: @@ -292,23 +275,20 @@ class MailServerManager(multi.Thread): return HttpResponse(json_data) def emailForwarding(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if not os.path.exists('/home/cyberpanel/postfix'): - proc = httpProc(self.request, 'mailServer/emailForwarding.html', - { "status": 0}, 'emailForwarding') - return proc.render() - - websitesName = ACLManager.findAllSites(currentACL, userID) - websitesName = websitesName + ACLManager.findChildDomains(websitesName) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/postfix'): proc = httpProc(self.request, 'mailServer/emailForwarding.html', - {'websiteList': websitesName, "status": 1}, 'emailForwarding') + {"status": 0}, 'emailForwarding') return proc.render() - except BaseException as msg: - return redirect(loadLoginPage) + + websitesName = ACLManager.findAllSites(currentACL, userID) + websitesName = websitesName + ACLManager.findChildDomains(websitesName) + + proc = httpProc(self.request, 'mailServer/emailForwarding.html', + {'websiteList': websitesName, "status": 1}, 'emailForwarding') + return proc.render() def fetchCurrentForwardings(self): try: @@ -582,26 +562,20 @@ class MailServerManager(multi.Thread): ####### def changeEmailAccountPassword(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if ACLManager.currentContextPermission(currentACL, 'changeEmailPassword') == 0: - return ACLManager.loadError() - - if not os.path.exists('/home/cyberpanel/postfix'): - proc = httpProc(self.request, 'mailServer/changeEmailPassword.html', - {"status": 0}, 'changeEmailPassword') - return proc.render() - - websitesName = ACLManager.findAllSites(currentACL, userID) - websitesName = websitesName + ACLManager.findChildDomains(websitesName) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + if not os.path.exists('/home/cyberpanel/postfix'): proc = httpProc(self.request, 'mailServer/changeEmailPassword.html', - {'websiteList': websitesName, "status": 1}, 'changeEmailPassword') + {"status": 0}, 'changeEmailPassword') return proc.render() - except BaseException as msg: - return redirect(loadLoginPage) + + websitesName = ACLManager.findAllSites(currentACL, userID) + websitesName = websitesName + ACLManager.findChildDomains(websitesName) + + proc = httpProc(self.request, 'mailServer/changeEmailPassword.html', + {'websiteList': websitesName, "status": 1}, 'changeEmailPassword') + return proc.render() def submitPasswordChange(self): try: @@ -653,24 +627,17 @@ class MailServerManager(multi.Thread): ####### def dkimManager(self): - try: - userID = self.request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + userID = self.request.session['userID'] + currentACL = ACLManager.loadedACL(userID) - if ACLManager.currentContextPermission(currentACL, 'dkimManager') == 0: - return ACLManager.loadError() + openDKIMInstalled = 1 - openDKIMInstalled = 1 + websitesName = ACLManager.findAllSites(currentACL, userID) + websitesName = websitesName + ACLManager.findChildDomains(websitesName) - websitesName = ACLManager.findAllSites(currentACL, userID) - websitesName = websitesName + ACLManager.findChildDomains(websitesName) - - proc = httpProc(self.request, 'mailServer/dkimManager.html', - {'websiteList': websitesName, 'openDKIMInstalled': openDKIMInstalled}, 'dkimManager') - return proc.render() - - except BaseException as msg: - return redirect(loadLoginPage) + proc = httpProc(self.request, 'mailServer/dkimManager.html', + {'websiteList': websitesName, 'openDKIMInstalled': openDKIMInstalled}, 'dkimManager') + return proc.render() def fetchDKIMKeys(self): try: From b97bd2e0e49b9afc7f2c77553c26654ba8705325 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 6 Mar 2021 11:31:13 +0500 Subject: [PATCH 093/107] further refoctor default render manageservice --- manageServices/views.py | 103 +++++++++++++++------------------------- 1 file changed, 39 insertions(+), 64 deletions(-) diff --git a/manageServices/views.py b/manageServices/views.py index 7df91bb98..ddca457b6 100755 --- a/manageServices/views.py +++ b/manageServices/views.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- -from django.shortcuts import render from django.shortcuts import HttpResponse, redirect import plogical.CyberCPLogFileWriter as logging from loginSystem.views import loadLoginPage @@ -16,44 +15,31 @@ from plogical.processUtilities import ProcessUtilities # Create your views here. def managePowerDNS(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + data = {} + data['status'] = 1 - try: + pdnsStatus = PDNSStatus.objects.get(pk=1) - data = {} - data['status'] = 1 + if pdnsStatus.type == 'MASTER': + counter = 1 - pdnsStatus = PDNSStatus.objects.get(pk=1) + for items in SlaveServers.objects.all(): - if pdnsStatus.type == 'MASTER': - counter = 1 - - for items in SlaveServers.objects.all(): - - if counter == 1: - data['slaveServer'] = items.slaveServer - data['slaveServerIP'] = items.slaveServerIP - else: - data['slaveServer%s' % (str(counter))] = items.slaveServer - data['slaveServerIP%s' % (str(counter))] = items.slaveServerIP - - counter = counter + 1 + if counter == 1: + data['slaveServer'] = items.slaveServer + data['slaveServerIP'] = items.slaveServerIP else: - data['slaveServerNS'] = pdnsStatus.masterServer - data['masterServerIP'] = pdnsStatus.masterIP + data['slaveServer%s' % (str(counter))] = items.slaveServer + data['slaveServerIP%s' % (str(counter))] = items.slaveServerIP - proc = httpProc(request, 'manageServices/managePowerDNS.html', - data, 'admin') - return proc.render() + counter = counter + 1 + else: + data['slaveServerNS'] = pdnsStatus.masterServer + data['masterServerIP'] = pdnsStatus.masterIP - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse("See CyberCP main log file.") - - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'manageServices/managePowerDNS.html', + data, 'admin') + return proc.render() def managePostfix(request): proc = httpProc(request, 'manageServices/managePostfix.html', @@ -273,44 +259,33 @@ def saveStatus(request): return HttpResponse(json_data) def manageApplications(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + services = [] - if currentACL['admin'] == 1: - pass - else: - return ACLManager.loadError() + ## ElasticSearch - services = [] + esPath = '/home/cyberpanel/elasticsearch' + rPath = '/home/cyberpanel/redis' - ## ElasticSearch + if os.path.exists(esPath): + installed = 'Installed' + else: + installed = 'Not-Installed' - esPath = '/home/cyberpanel/elasticsearch' - rPath = '/home/cyberpanel/redis' + if os.path.exists(rPath): + rInstalled = 'Installed' + else: + rInstalled = 'Not-Installed' - if os.path.exists(esPath): - installed = 'Installed' - else: - installed = 'Not-Installed' + elasticSearch = {'image': '/static/manageServices/images/elastic-search.png', 'name': 'Elastic Search', + 'installed': installed} + redis = {'image': '/static/manageServices/images/redis.png', 'name': 'Redis', + 'installed': rInstalled} + services.append(elasticSearch) + services.append(redis) - if os.path.exists(rPath): - rInstalled = 'Installed' - else: - rInstalled = 'Not-Installed' - - elasticSearch = {'image': '/static/manageServices/images/elastic-search.png', 'name': 'Elastic Search', 'installed': installed} - redis = {'image': '/static/manageServices/images/redis.png', 'name': 'Redis', - 'installed': rInstalled} - services.append(elasticSearch) - services.append(redis) - - proc = httpProc(request, 'manageServices/applications.html', - {'services': services}, 'admin') - return proc.render() - - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'manageServices/applications.html', + {'services': services}, 'admin') + return proc.render() def removeInstall(request): try: From 484b6adcc5f3774150177f605cf3a56c10b0a801 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 6 Mar 2021 11:33:12 +0500 Subject: [PATCH 094/107] further refoctor default render managessl --- manageSSL/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/manageSSL/views.py b/manageSSL/views.py index 9688278d6..9d455158e 100755 --- a/manageSSL/views.py +++ b/manageSSL/views.py @@ -100,7 +100,6 @@ def sslForHostName(request): userID = request.session['userID'] currentACL = ACLManager.loadedACL(userID) websitesName = ACLManager.findAllSites(currentACL, userID, 1) - proc = httpProc(request, 'manageSSL/sslForHostName.html', {'websiteList': websitesName}, 'hostnameSSL') return proc.render() From ae7822f896e931a9a9344ab64ab4c466170bdf90 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 6 Mar 2021 11:37:17 +0500 Subject: [PATCH 095/107] further refoctor default render packagelist --- packages/packagesManager.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/packages/packagesManager.py b/packages/packagesManager.py index 249557650..610e961c3 100755 --- a/packages/packagesManager.py +++ b/packages/packagesManager.py @@ -2,14 +2,11 @@ import os.path import sys import django - -from plogical import hashPassword from plogical.httpProc import httpProc - sys.path.append('/usr/local/CyberCP') os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CyberCP.settings") django.setup() -from django.shortcuts import render,redirect +from django.shortcuts import redirect from django.http import HttpResponse from loginSystem.views import loadLoginPage from loginSystem.models import Administrator @@ -124,7 +121,7 @@ class PackagesManager: currentACL = ACLManager.loadedACL(userID) packageList = ACLManager.loadPackages(userID, currentACL) proc = httpProc(self.request, 'packages/modifyPackage.html', - {"packageList": packageList}, 'modifyPackage') + {"packList": packageList}, 'modifyPackage') return proc.render() def submitModify(self): @@ -209,7 +206,7 @@ class PackagesManager: currentACL = ACLManager.loadedACL(userID) packageList = ACLManager.loadPackages(userID, currentACL) proc = httpProc(self.request, 'packages/listPackages.html', - {"packageList": packageList}, 'listPackages') + {"packList": packageList}, 'listPackages') return proc.render() def listPackagesAPI(self,data=None): From 325e592b635ef45822e3d272961616f0640d1732 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 6 Mar 2021 11:43:11 +0500 Subject: [PATCH 096/107] further refoctor default render serverstatus --- serverStatus/views.py | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/serverStatus/views.py b/serverStatus/views.py index d86a50f12..4f4f3e32c 100755 --- a/serverStatus/views.py +++ b/serverStatus/views.py @@ -155,27 +155,21 @@ def getFurtherDataFromLogFile(request): def services(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + data = {} - data = {} + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + data['serverName'] = 'OpenLiteSpeed' + else: + data['serverName'] = 'LiteSpeed Ent' - if ProcessUtilities.decideServer() == ProcessUtilities.OLS: - data['serverName'] = 'OpenLiteSpeed' - else: - data['serverName'] = 'LiteSpeed Ent' + dockerInstallPath = '/usr/bin/docker' + if not os.path.exists(dockerInstallPath): + data['isDocker'] = False + else: + data['isDocker'] = True - dockerInstallPath = '/usr/bin/docker' - if not os.path.exists(dockerInstallPath): - data['isDocker'] = False - else: - data['isDocker'] = True - - proc = httpProc(request, 'serverStatus/services.html', data, 'admin') - return proc.render() - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'serverStatus/services.html', data, 'admin') + return proc.render() def servicesStatus(request): try: From 5472c88710574f384cb476fa38fb6791f258200a Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 6 Mar 2021 11:45:17 +0500 Subject: [PATCH 097/107] further refoctor default render tuning --- tuning/tuning.py | 30 ++++++++++++------------------ tuning/views.py | 1 - 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/tuning/tuning.py b/tuning/tuning.py index 76956181b..8afff2e2d 100755 --- a/tuning/tuning.py +++ b/tuning/tuning.py @@ -31,24 +31,18 @@ class tuningManager: return proc.render() def phpTuning(self, request, userID): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if ProcessUtilities.decideServer() == ProcessUtilities.OLS: - websitesName = ACLManager.findAllSites(currentACL, userID) - OLS = 1 - proc = httpProc(request, 'tuning/phpTuning.html', - {'websiteList': websitesName, 'OLS': OLS}, 'admin') - return proc.render() - else: - OLS = 0 - proc = httpProc(request, 'tuning/phpTuning.html', - {'OLS': OLS}, 'admin') - return proc.render() - - except KeyError: - return redirect(loadLoginPage) + currentACL = ACLManager.loadedACL(userID) + if ProcessUtilities.decideServer() == ProcessUtilities.OLS: + websitesName = ACLManager.findAllSites(currentACL, userID) + OLS = 1 + proc = httpProc(request, 'tuning/phpTuning.html', + {'websiteList': websitesName, 'OLS': OLS}, 'admin') + return proc.render() + else: + OLS = 0 + proc = httpProc(request, 'tuning/phpTuning.html', + {'OLS': OLS}, 'admin') + return proc.render() def tuneLitespeed(self, userID, data): try: diff --git a/tuning/views.py b/tuning/views.py index 0e86d44ff..61d97ba27 100755 --- a/tuning/views.py +++ b/tuning/views.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- - from django.shortcuts import redirect import json from loginSystem.views import loadLoginPage From 0d5692ea1d732843360294859931e7498bb5e7bf Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sat, 6 Mar 2021 11:45:53 +0500 Subject: [PATCH 098/107] further refoctor default render terminal --- WebTerminal/views.py | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/WebTerminal/views.py b/WebTerminal/views.py index 33c69b821..17d8ff718 100644 --- a/WebTerminal/views.py +++ b/WebTerminal/views.py @@ -18,38 +18,32 @@ import plogical.randomPassword # Create your views here. def terminal(request): - try: + password = plogical.randomPassword.generate_pass() - password = plogical.randomPassword.generate_pass() + verifyPath = "/home/cyberpanel/" + str(randint(100000, 999999)) + writeToFile = open(verifyPath, 'w') + writeToFile.write(password) + writeToFile.close() - verifyPath = "/home/cyberpanel/" + str(randint(100000, 999999)) - writeToFile = open(verifyPath, 'w') - writeToFile.write(password) - writeToFile.close() + ## setting up ssh server + path = '/etc/systemd/system/cpssh.service' + curPath = '/usr/local/CyberCP/WebTerminal/cpssh.service' - ## setting up ssh server - path = '/etc/systemd/system/cpssh.service' - curPath = '/usr/local/CyberCP/WebTerminal/cpssh.service' + if not os.path.exists(path): + command = 'mv %s %s' % (curPath, path) + ProcessUtilities.executioner(command) - if not os.path.exists(path): - command = 'mv %s %s' % (curPath, path) - ProcessUtilities.executioner(command) + command = 'systemctl start cpssh' + ProcessUtilities.executioner(command) - command = 'systemctl start cpssh' - ProcessUtilities.executioner(command) + FirewallUtilities.addRule('tcp', '5678', '0.0.0.0/0') - FirewallUtilities.addRule('tcp', '5678', '0.0.0.0/0') + newFWRule = FirewallRules(name='terminal', proto='tcp', port='5678', ipAddress='0.0.0.0/0') + newFWRule.save() - newFWRule = FirewallRules(name='terminal', proto='tcp', port='5678', ipAddress='0.0.0.0/0') - newFWRule.save() - - proc = httpProc(request, 'WebTerminal/WebTerminal.html', - {'verifyPath': verifyPath, 'password': password}) - return proc.render() - - except BaseException as msg: - logging.writeToFile(str(msg)) - return redirect(loadLoginPage) + proc = httpProc(request, 'WebTerminal/WebTerminal.html', + {'verifyPath': verifyPath, 'password': password}) + return proc.render() def restart(request): try: From 76744100c997ffc8e9c391ad710b42a341db92b0 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 7 Mar 2021 11:12:38 +0500 Subject: [PATCH 099/107] further refoctor default render websiteFunctions --- websiteFunctions/website.py | 459 ++++++++++++++++-------------------- 1 file changed, 197 insertions(+), 262 deletions(-) diff --git a/websiteFunctions/website.py b/websiteFunctions/website.py index ce6c4c860..527c6e2b7 100755 --- a/websiteFunctions/website.py +++ b/websiteFunctions/website.py @@ -28,9 +28,6 @@ from plogical.childDomain import ChildDomainManager from math import ceil from plogical.alias import AliasManager from plogical.applicationInstaller import ApplicationInstaller -from databases.models import Databases -import hashlib -from plogical.mysqlUtilities import mysqlUtilities from plogical import hashPassword from emailMarketing.emACL import emACL from plogical.processUtilities import ProcessUtilities @@ -38,7 +35,6 @@ from managePHP.phpManager import PHPManager from ApachController.ApacheVhosts import ApacheVhost from plogical.vhostConfs import vhostConfs from plogical.cronUtil import CronUtil -from plogical import randomPassword from .StagingSetup import StagingSetup import validators @@ -53,123 +49,93 @@ class WebsiteManager: self.childDomain = childDomain def createWebsite(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - adminNames = ACLManager.loadAllUsers(userID) - packagesName = ACLManager.loadPackages(userID, currentACL) - phps = PHPManager.findPHPVersions() + currentACL = ACLManager.loadedACL(userID) + adminNames = ACLManager.loadAllUsers(userID) + packagesName = ACLManager.loadPackages(userID, currentACL) + phps = PHPManager.findPHPVersions() - Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps} - proc = httpProc(request, 'websiteFunctions/createWebsite.html', - Data, 'createWebsite') - return proc.render() - - except BaseException as msg: - return HttpResponse(str(msg)) + Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps} + proc = httpProc(request, 'websiteFunctions/createWebsite.html', + Data, 'createWebsite') + return proc.render() def modifyWebsite(self, request=None, userID=None, data=None): - try: + currentACL = ACLManager.loadedACL(userID) - currentACL = ACLManager.loadedACL(userID) - - websitesName = ACLManager.findAllSites(currentACL, userID) - phps = PHPManager.findPHPVersions() - proc = httpProc(request, 'websiteFunctions/modifyWebsite.html', - {'websiteList': websitesName, 'phps': phps}, 'modifyWebsite') - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + websitesName = ACLManager.findAllSites(currentACL, userID) + phps = PHPManager.findPHPVersions() + proc = httpProc(request, 'websiteFunctions/modifyWebsite.html', + {'websiteList': websitesName, 'phps': phps}, 'modifyWebsite') + return proc.render() def deleteWebsite(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - - websitesName = ACLManager.findAllSites(currentACL, userID) - proc = httpProc(request, 'websiteFunctions/deleteWebsite.html', - {'websiteList': websitesName}, 'deleteWebsite') - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + currentACL = ACLManager.loadedACL(userID) + websitesName = ACLManager.findAllSites(currentACL, userID) + proc = httpProc(request, 'websiteFunctions/deleteWebsite.html', + {'websiteList': websitesName}, 'deleteWebsite') + return proc.render() def siteState(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) + currentACL = ACLManager.loadedACL(userID) - websitesName = ACLManager.findAllSites(currentACL, userID) + websitesName = ACLManager.findAllSites(currentACL, userID) - proc = httpProc(request, 'websiteFunctions/suspendWebsite.html', - {'websiteList': websitesName}, 'suspendWebsite') - return proc.render() - - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/suspendWebsite.html', + {'websiteList': websitesName}, 'suspendWebsite') + return proc.render() def listWebsites(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - pagination = self.websitePagination(currentACL, userID) - proc = httpProc(request, 'websiteFunctions/listWebsites.html', - {"pagination": pagination}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + currentACL = ACLManager.loadedACL(userID) + pagination = self.websitePagination(currentACL, userID) + proc = httpProc(request, 'websiteFunctions/listWebsites.html', + {"pagination": pagination}) + return proc.render() def listChildDomains(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - pagination = self.websitePagination(currentACL, userID) - adminNames = ACLManager.loadAllUsers(userID) - packagesName = ACLManager.loadPackages(userID, currentACL) - phps = PHPManager.findPHPVersions() + currentACL = ACLManager.loadedACL(userID) + adminNames = ACLManager.loadAllUsers(userID) + packagesName = ACLManager.loadPackages(userID, currentACL) + phps = PHPManager.findPHPVersions() - Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps} - proc = httpProc(request, 'websiteFunctions/listChildDomains.html', - Data) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + Data = {'packageList': packagesName, "owernList": adminNames, 'phps': phps} + proc = httpProc(request, 'websiteFunctions/listChildDomains.html', + Data) + return proc.render() def listCron(self, request=None, userID=None, data=None): - try: + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + if ACLManager.checkOwnership(request.GET.get('domain'), admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - if ACLManager.checkOwnership(request.GET.get('domain'), admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() - - proc = httpProc(request, 'websiteFunctions/listCron.html', - {'domain': request.GET.get('domain')}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/listCron.html', + {'domain': request.GET.get('domain')}) + return proc.render() def domainAlias(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - aliasManager = AliasManager(self.domain) - noAlias, finalAlisList = aliasManager.fetchAlisForDomains() + aliasManager = AliasManager(self.domain) + noAlias, finalAlisList = aliasManager.fetchAlisForDomains() - path = "/home/" + self.domain + "/public_html" + path = "/home/" + self.domain + "/public_html" - proc = httpProc(request, 'websiteFunctions/domainAlias.html', { - 'masterDomain': self.domain, - 'aliases': finalAlisList, - 'path': path, - 'noAlias': noAlias - }) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/domainAlias.html', { + 'masterDomain': self.domain, + 'aliases': finalAlisList, + 'path': path, + 'noAlias': noAlias + }) + return proc.render() def submitWebsiteCreation(self, userID=None, data=None): try: @@ -986,6 +952,7 @@ class WebsiteManager: proc = httpProc(request, 'websiteFunctions/launchChild.html', {"error": 1, "domain": "This child domain does not exists"}) return proc.render() + def getDataFromLogFile(self, userID=None, data=None): currentACL = ACLManager.loadedACL(userID) @@ -1770,19 +1737,16 @@ class WebsiteManager: return HttpResponse(json_data) def wordpressInstall(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - proc = httpProc(request, 'websiteFunctions/installWordPress.html', {'domainName': self.domain}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/installWordPress.html', {'domainName': self.domain}) + return proc.render() def installWordpress(self, userID=None, data=None): try: @@ -1875,19 +1839,16 @@ class WebsiteManager: return HttpResponse(json_data) def joomlaInstall(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - proc = httpProc(request, 'websiteFunctions/installJoomla.html', {'domainName': self.domain}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/installJoomla.html', {'domainName': self.domain}) + return proc.render() def installJoomla(self, userID=None, data=None): try: @@ -1934,63 +1895,59 @@ class WebsiteManager: return HttpResponse(json_data) def setupGit(self, request=None, userID=None, data=None): - try: + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + website = Websites.objects.get(domain=self.domain) - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) - website = Websites.objects.get(domain=self.domain) + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadErrorJson() + path = '/home/cyberpanel/' + self.domain + '.git' - path = '/home/cyberpanel/' + self.domain + '.git' + if os.path.exists(path): + ipFile = "/etc/cyberpanel/machineIP" + f = open(ipFile) + ipData = f.read() + ipAddress = ipData.split('\n', 1)[0] - if os.path.exists(path): - ipFile = "/etc/cyberpanel/machineIP" - f = open(ipFile) - ipData = f.read() - ipAddress = ipData.split('\n', 1)[0] + port = ProcessUtilities.fetchCurrentPort() - port = ProcessUtilities.fetchCurrentPort() + webhookURL = 'https://' + ipAddress + ':%s/websites/' % (port) + self.domain + '/gitNotify' - webhookURL = 'https://' + ipAddress + ':%s/websites/' % (port) + self.domain + '/gitNotify' + proc = httpProc(request, 'websiteFunctions/setupGit.html', + {'domainName': self.domain, 'installed': 1, 'webhookURL': webhookURL}) + return proc.render() + else: - proc = httpProc(request, 'websiteFunctions/setupGit.html', - {'domainName': self.domain, 'installed': 1, 'webhookURL': webhookURL}) - return proc.render() - else: + command = "ssh-keygen -f /home/%s/.ssh/%s -t rsa -N ''" % (self.domain, website.externalApp) + ProcessUtilities.executioner(command, website.externalApp) - command = "ssh-keygen -f /home/%s/.ssh/%s -t rsa -N ''" % (self.domain, website.externalApp) - ProcessUtilities.executioner(command, website.externalApp) + ### - ### - - configContent = """Host github.com + configContent = """Host github.com IdentityFile /home/%s/.ssh/%s StrictHostKeyChecking no """ % (self.domain, website.externalApp) - path = "/home/cyberpanel/config" - writeToFile = open(path, 'w') - writeToFile.writelines(configContent) - writeToFile.close() + path = "/home/cyberpanel/config" + writeToFile = open(path, 'w') + writeToFile.writelines(configContent) + writeToFile.close() - command = 'mv %s /home/%s/.ssh/config' % (path, self.domain) - ProcessUtilities.executioner(command) + command = 'mv %s /home/%s/.ssh/config' % (path, self.domain) + ProcessUtilities.executioner(command) - command = 'chown %s:%s /home/%s/.ssh/config' % (website.externalApp, website.externalApp, self.domain) - ProcessUtilities.executioner(command) + command = 'chown %s:%s /home/%s/.ssh/config' % (website.externalApp, website.externalApp, self.domain) + ProcessUtilities.executioner(command) - command = 'cat /home/%s/.ssh/%s.pub' % (self.domain, website.externalApp) - deploymentKey = ProcessUtilities.outputExecutioner(command, website.externalApp) + command = 'cat /home/%s/.ssh/%s.pub' % (self.domain, website.externalApp) + deploymentKey = ProcessUtilities.outputExecutioner(command, website.externalApp) - proc = httpProc(request, 'websiteFunctions/setupGit.html', - {'domainName': self.domain, 'deploymentKey': deploymentKey, 'installed': 0}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/setupGit.html', + {'domainName': self.domain, 'deploymentKey': deploymentKey, 'installed': 0}) + return proc.render() def setupGitRepo(self, userID=None, data=None): try: @@ -2117,34 +2074,28 @@ StrictHostKeyChecking no return HttpResponse(json_data) def installPrestaShop(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - proc = httpProc(request, 'websiteFunctions/installPrestaShop.html', {'domainName': self.domain}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/installPrestaShop.html', {'domainName': self.domain}) + return proc.render() def installMagento(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - proc = httpProc(request, 'websiteFunctions/installMagento.html', {'domainName': self.domain}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/installMagento.html', {'domainName': self.domain}) + return proc.render() def magentoInstall(self, userID=None, data=None): try: @@ -2194,19 +2145,16 @@ StrictHostKeyChecking no return HttpResponse(json_data) def installMautic(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - proc = httpProc(request, 'websiteFunctions/installMautic.html', {'domainName': self.domain}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/installMautic.html', {'domainName': self.domain}) + return proc.render() def mauticInstall(self, userID=None, data=None): try: @@ -2615,23 +2563,20 @@ StrictHostKeyChecking no return HttpResponse(json_data) def sshAccess(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - website = Websites.objects.get(domain=self.domain) - externalApp = website.externalApp + website = Websites.objects.get(domain=self.domain) + externalApp = website.externalApp - proc = httpProc(request, 'websiteFunctions/sshAccess.html', - {'domainName': self.domain, 'externalApp': externalApp}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/sshAccess.html', + {'domainName': self.domain, 'externalApp': externalApp}) + return proc.render() def saveSSHAccessChanges(self, userID=None, data=None): try: @@ -2673,23 +2618,20 @@ StrictHostKeyChecking no def setupStaging(self, request=None, userID=None, data=None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - website = Websites.objects.get(domain=self.domain) - externalApp = website.externalApp + website = Websites.objects.get(domain=self.domain) + externalApp = website.externalApp - proc = httpProc(request, 'websiteFunctions/setupStaging.html', - {'domainName': self.domain, 'externalApp': externalApp}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/setupStaging.html', + {'domainName': self.domain, 'externalApp': externalApp}) + return proc.render() def startCloning(self, userID=None, data=None): try: @@ -2742,23 +2684,20 @@ StrictHostKeyChecking no return HttpResponse(json_data) def syncToMaster(self, request=None, userID=None, data=None, childDomain = None): - try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() - website = Websites.objects.get(domain=self.domain) - externalApp = website.externalApp + website = Websites.objects.get(domain=self.domain) + externalApp = website.externalApp - proc = httpProc(request, 'websiteFunctions/syncMaster.html', - {'domainName': self.domain, 'externalApp': externalApp, 'childDomain': childDomain}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/syncMaster.html', + {'domainName': self.domain, 'externalApp': externalApp, 'childDomain': childDomain}) + return proc.render() def startSync(self, userID=None, data=None): try: @@ -2837,43 +2776,39 @@ StrictHostKeyChecking no return HttpResponse(json_data) def manageGIT(self, request=None, userID=None, data=None): + currentACL = ACLManager.loadedACL(userID) + admin = Administrator.objects.get(pk=userID) + + if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadError() + try: - currentACL = ACLManager.loadedACL(userID) - admin = Administrator.objects.get(pk=userID) + website = Websites.objects.get(domain=self.domain) + folders = ['/home/%s/public_html' % (self.domain), '/home/%s' % (self.domain), + '/home/vmail/%s' % (self.domain)] - if ACLManager.checkOwnership(self.domain, admin, currentACL) == 1: - pass - else: - return ACLManager.loadError() + databases = website.databases_set.all() - try: - website = Websites.objects.get(domain=self.domain) - folders = ['/home/%s/public_html' % (self.domain), '/home/%s' % (self.domain), '/home/vmail/%s' % (self.domain)] + for database in databases: + basePath = '/var/lib/mysql/' + folders.append('%s%s' % (basePath, database.dbName)) + except: - databases = website.databases_set.all() + self.childWebsite = ChildDomains.objects.get(domain=self.domain) - for database in databases: - basePath = '/var/lib/mysql/' - folders.append('%s%s' % (basePath, database.dbName)) + folders = [self.childWebsite.path] + databases = self.childWebsite.master.databases_set.all() - except: + for database in databases: + basePath = '/var/lib/mysql/' + folders.append('%s%s' % (basePath, database.dbName)) - self.childWebsite = ChildDomains.objects.get(domain=self.domain) - - folders = [self.childWebsite.path] - - databases = self.childWebsite.master.databases_set.all() - - for database in databases: - basePath = '/var/lib/mysql/' - folders.append('%s%s' % (basePath, database.dbName)) - - proc = httpProc(request, 'websiteFunctions/manageGIT.html', - {'domainName': self.domain, 'folders': folders}) - return proc.render() - except BaseException as msg: - return HttpResponse(str(msg)) + proc = httpProc(request, 'websiteFunctions/manageGIT.html', + {'domainName': self.domain, 'folders': folders}) + return proc.render() def folderCheck(self): From 845e7e8e9c65b95c077a14ddd389223abe532bba Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 7 Mar 2021 11:34:08 +0500 Subject: [PATCH 100/107] further refoctor default render userManagement --- userManagment/views.py | 309 +++++++++++++++++------------------------ 1 file changed, 129 insertions(+), 180 deletions(-) diff --git a/userManagment/views.py b/userManagment/views.py index ad06d3843..c59d9277b 100755 --- a/userManagment/views.py +++ b/userManagment/views.py @@ -7,7 +7,6 @@ from loginSystem.views import loadLoginPage from loginSystem.models import Administrator, ACL import json from plogical import hashPassword -from plogical import CyberCPLogFileWriter as logging from plogical.acl import ACLManager from plogical.httpProc import httpProc from plogical.virtualHostUtilities import virtualHostUtilities @@ -17,91 +16,67 @@ from CyberCP.SecurityLevel import SecurityLevel # Create your views here. def loadUserHome(request): - try: - val = request.session['userID'] - try: - admin = Administrator.objects.get(pk=val) - currentACL = ACLManager.loadedACL(val) - if currentACL['admin'] == 1: - listUsers = 1 - else: - listUsers = currentACL['listUsers'] - proc = httpProc(request, 'userManagment/index.html', - {"type": admin.type, 'listUsers': listUsers}, 'admin') - return proc.render() - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return HttpResponse(str(msg)) + val = request.session['userID'] + admin = Administrator.objects.get(pk=val) + currentACL = ACLManager.loadedACL(val) - except KeyError: - return redirect(loadLoginPage) + if currentACL['admin'] == 1: + listUsers = 1 + else: + listUsers = currentACL['listUsers'] + + proc = httpProc(request, 'userManagment/index.html', + {"type": admin.type, 'listUsers': listUsers}, 'listUsers') + return proc.render() def viewProfile(request): - try: - userID = request.session['userID'] + userID = request.session['userID'] + admin = Administrator.objects.get(pk=userID) - admin = Administrator.objects.get(pk=userID) + AdminData = {} - AdminData = {} + AdminData['userName'] = admin.userName + AdminData['firstName'] = admin.firstName + AdminData['lastName'] = admin.lastName + AdminData['websitesLimit'] = admin.initWebsitesLimit + AdminData['email'] = admin.email + AdminData['accountACL'] = admin.acl.name - AdminData['userName'] = admin.userName - AdminData['firstName'] = admin.firstName - AdminData['lastName'] = admin.lastName - AdminData['websitesLimit'] = admin.initWebsitesLimit - AdminData['email'] = admin.email - AdminData['accountACL'] = admin.acl.name - - proc = httpProc(request, 'userManagment/userProfile.html', - AdminData) - return proc.render() - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'userManagment/userProfile.html', + AdminData) + return proc.render() def createUser(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - aclNames = ACLManager.unFileteredACLs() - proc = httpProc(request, 'userManagment/createUser.html', - {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) - return proc.render() - elif currentACL['changeUserACL'] == 1: - aclNames = ACLManager.unFileteredACLs() - proc = httpProc(request, 'userManagment/createUser.html', - {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) - return proc.render() - elif currentACL['createNewUser'] == 1: - aclNames = ['user'] - proc = httpProc(request, 'userManagment/createUser.html', - {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) - return proc.render() - else: - return ACLManager.loadError() - - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return redirect(loadLoginPage) + if currentACL['admin'] == 1: + aclNames = ACLManager.unFileteredACLs() + proc = httpProc(request, 'userManagment/createUser.html', + {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) + return proc.render() + elif currentACL['changeUserACL'] == 1: + aclNames = ACLManager.unFileteredACLs() + proc = httpProc(request, 'userManagment/createUser.html', + {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) + return proc.render() + elif currentACL['createNewUser'] == 1: + aclNames = ['user'] + proc = httpProc(request, 'userManagment/createUser.html', + {'aclNames': aclNames, 'securityLevels': SecurityLevel.list()}) + return proc.render() + else: + return ACLManager.loadError() def apiAccess(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - adminNames = ACLManager.loadDeletionUsers(userID, currentACL) - adminNames.append("admin") - proc = httpProc(request, 'userManagment/apiAccess.html', - {'acctNames': adminNames}) - return proc.render() - else: - return ACLManager.loadError() - - except BaseException as msg: - logging.CyberCPLogFileWriter.writeToFile(str(msg)) - return redirect(loadLoginPage) + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) + adminNames = ACLManager.loadDeletionUsers(userID, currentACL) + adminNames.append("admin") + proc = httpProc(request, 'userManagment/apiAccess.html', + {'acctNames': adminNames}, 'admin') + return proc.render() def saveChangesAPIAccess(request): try: @@ -261,14 +236,11 @@ def submitUserCreation(request): def modifyUsers(request): - try: - userID = request.session['userID'] - userNames = ACLManager.loadAllUsers(userID) - proc = httpProc(request, 'userManagment/modifyUser.html', - {"acctNames": userNames, 'securityLevels': SecurityLevel.list()}) - return proc.render() - except KeyError: - return redirect(loadLoginPage) + userID = request.session['userID'] + userNames = ACLManager.loadAllUsers(userID) + proc = httpProc(request, 'userManagment/modifyUser.html', + {"acctNames": userNames, 'securityLevels': SecurityLevel.list()}) + return proc.render() def fetchUserDetails(request): try: @@ -417,26 +389,21 @@ def saveModifications(request): return HttpResponse(json_data) def deleteUser(request): - try: - userID = request.session['userID'] + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) - currentACL = ACLManager.loadedACL(userID) - - if currentACL['admin'] == 1: - adminNames = ACLManager.loadDeletionUsers(userID, currentACL) - proc = httpProc(request, 'userManagment/deleteUser.html', - {"acctNames": adminNames}) - return proc.render() - elif currentACL['deleteUser'] == 1: - adminNames = ACLManager.loadDeletionUsers(userID, currentACL) - proc = httpProc(request, 'userManagment/deleteUser.html', - {"acctNames": adminNames}) - return proc.render() - else: - return ACLManager.loadError() - - except KeyError: - return redirect(loadLoginPage) + if currentACL['admin'] == 1: + adminNames = ACLManager.loadDeletionUsers(userID, currentACL) + proc = httpProc(request, 'userManagment/deleteUser.html', + {"acctNames": adminNames}) + return proc.render() + elif currentACL['deleteUser'] == 1: + adminNames = ACLManager.loadDeletionUsers(userID, currentACL) + proc = httpProc(request, 'userManagment/deleteUser.html', + {"acctNames": adminNames}) + return proc.render() + else: + return ACLManager.loadError() def submitUserDeletion(request): @@ -508,12 +475,9 @@ def submitUserDeletion(request): return HttpResponse(json_data) def createNewACL(request): - try: - proc = httpProc(request, 'userManagment/createACL.html', - None, 'admin') - return proc.render() - except KeyError: - return redirect(loadLoginPage) + proc = httpProc(request, 'userManagment/createACL.html', + None, 'admin') + return proc.render() def createACLFunc(request): try: @@ -647,28 +611,23 @@ def submitACLModifications(request): return HttpResponse(json_data) def changeUserACL(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - aclNames = ACLManager.unFileteredACLs() - userNames = ACLManager.findAllUsers() - proc = httpProc(request, 'userManagment/changeUserACL.html', - {'aclNames': aclNames, 'usersList': userNames}, 'admin') - return proc.render() - elif currentACL['changeUserACL'] == 1: - aclNames = ACLManager.unFileteredACLs() - userNames = ACLManager.findAllUsers() - proc = httpProc(request, 'userManagment/changeUserACL.html', - {'aclNames': aclNames, 'usersList': userNames}) - return proc.render() - else: - return ACLManager.loadError() - - - except KeyError: - return redirect(loadLoginPage) + if currentACL['admin'] == 1: + aclNames = ACLManager.unFileteredACLs() + userNames = ACLManager.findAllUsers() + proc = httpProc(request, 'userManagment/changeUserACL.html', + {'aclNames': aclNames, 'usersList': userNames}, 'admin') + return proc.render() + elif currentACL['changeUserACL'] == 1: + aclNames = ACLManager.unFileteredACLs() + userNames = ACLManager.findAllUsers() + proc = httpProc(request, 'userManagment/changeUserACL.html', + {'aclNames': aclNames, 'usersList': userNames}) + return proc.render() + else: + return ACLManager.loadError() def changeACLFunc(request): try: @@ -711,28 +670,23 @@ def changeACLFunc(request): return HttpResponse(json_data) def resellerCenter(request): - try: - userID = request.session['userID'] - currentACL = ACLManager.loadedACL(userID) + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) - if currentACL['admin'] == 1: - userNames = ACLManager.loadDeletionUsers(userID, currentACL) - resellerPrivUsers = ACLManager.userWithResellerPriv(userID) - proc = httpProc(request, 'userManagment/resellerCenter.html', - {'userToBeModified': userNames, 'resellerPrivUsers': resellerPrivUsers}) - return proc.render() - elif currentACL['resellerCenter'] == 1: - userNames = ACLManager.loadDeletionUsers(userID, currentACL) - resellerPrivUsers = ACLManager.userWithResellerPriv(userID) - proc = httpProc(request, 'userManagment/resellerCenter.html', - {'userToBeModified': userNames, 'resellerPrivUsers': resellerPrivUsers}) - return proc.render() - else: - return ACLManager.loadError() - - - except KeyError: - return redirect(loadLoginPage) + if currentACL['admin'] == 1: + userNames = ACLManager.loadDeletionUsers(userID, currentACL) + resellerPrivUsers = ACLManager.userWithResellerPriv(userID) + proc = httpProc(request, 'userManagment/resellerCenter.html', + {'userToBeModified': userNames, 'resellerPrivUsers': resellerPrivUsers}) + return proc.render() + elif currentACL['resellerCenter'] == 1: + userNames = ACLManager.loadDeletionUsers(userID, currentACL) + resellerPrivUsers = ACLManager.userWithResellerPriv(userID) + proc = httpProc(request, 'userManagment/resellerCenter.html', + {'userToBeModified': userNames, 'resellerPrivUsers': resellerPrivUsers}) + return proc.render() + else: + return ACLManager.loadError() def saveResellerChanges(request): try: @@ -791,40 +745,35 @@ def saveResellerChanges(request): return HttpResponse(json_data) def listUsers(request): - try: - userID = request.session['userID'] + userID = request.session['userID'] + currentACL = ACLManager.loadedACL(userID) - currentACL = ACLManager.loadedACL(userID) + if currentACL['admin'] == 1: + aclNames = ACLManager.unFileteredACLs() + elif currentACL['changeUserACL'] == 1: + aclNames = ACLManager.unFileteredACLs() + elif currentACL['createNewUser'] == 1: + aclNames = ['user'] + else: + aclNames = [] - if currentACL['admin'] == 1: - aclNames = ACLManager.unFileteredACLs() - elif currentACL['changeUserACL'] == 1: - aclNames = ACLManager.unFileteredACLs() - elif currentACL['createNewUser'] == 1: - aclNames = ['user'] - else: - aclNames = [] + if currentACL['admin'] == 1: + resellerPrivUsers = ACLManager.userWithResellerPriv(userID) + elif currentACL['resellerCenter'] == 1: + resellerPrivUsers = ACLManager.userWithResellerPriv(userID) + else: + resellerPrivUsers = [] - if currentACL['admin'] == 1: - resellerPrivUsers = ACLManager.userWithResellerPriv(userID) - elif currentACL['resellerCenter'] == 1: - resellerPrivUsers = ACLManager.userWithResellerPriv(userID) - else: - resellerPrivUsers = [] - - if currentACL['admin'] == 1: - proc = httpProc(request, 'userManagment/listUsers.html', - {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers}) - return proc.render() - elif currentACL['listUsers'] == 1: - proc = httpProc(request, 'userManagment/listUsers.html', - {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers}) - return proc.render() - else: - return ACLManager.loadError() - - except KeyError: - return redirect(loadLoginPage) + if currentACL['admin'] == 1: + proc = httpProc(request, 'userManagment/listUsers.html', + {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers}) + return proc.render() + elif currentACL['listUsers'] == 1: + proc = httpProc(request, 'userManagment/listUsers.html', + {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers}) + return proc.render() + else: + return ACLManager.loadError() def fetchTableUsers(request): try: From ab0b22702dcd64d200f0ce8ea300dabd65f8a7dc Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 7 Mar 2021 11:38:26 +0500 Subject: [PATCH 101/107] further refoctor default render secmiddleware --- CyberCP/secMiddleware.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CyberCP/secMiddleware.py b/CyberCP/secMiddleware.py index 8f0271330..7aaf4ca5d 100755 --- a/CyberCP/secMiddleware.py +++ b/CyberCP/secMiddleware.py @@ -1,7 +1,7 @@ # coding=utf-8 from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging import json -from django.shortcuts import HttpResponse +from django.shortcuts import HttpResponse, render import re from loginSystem.models import Administrator @@ -96,12 +96,15 @@ class secMiddleware: logging.writeToFile(str(msg)) response = self.get_response(request) return response - + else: + try: + uID = request.session['userID'] + except: + return render(request, 'loginSystem/login.html', {}) response = self.get_response(request) response['X-XSS-Protection'] = "1; mode=block" - #response['Strict-Transport-Security'] = "max-age=31536000; includeSubDomains; preload" response['X-Frame-Options'] = "sameorigin" response['Content-Security-Policy'] = "script-src 'self' https://www.jsdelivr.com" response['Content-Security-Policy'] = "connect-src *;" From 7e41d50fe601fd73b829beecc45b5d5befc88b7b Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 7 Mar 2021 11:47:54 +0500 Subject: [PATCH 102/107] further refoctor default render secmiddleware --- CyberCP/secMiddleware.py | 1 + 1 file changed, 1 insertion(+) diff --git a/CyberCP/secMiddleware.py b/CyberCP/secMiddleware.py index 7aaf4ca5d..90ddefd2a 100755 --- a/CyberCP/secMiddleware.py +++ b/CyberCP/secMiddleware.py @@ -110,6 +110,7 @@ class secMiddleware: response['Content-Security-Policy'] = "connect-src *;" response['Content-Security-Policy'] = "font-src 'self' 'unsafe-inline' https://www.jsdelivr.com https://fonts.googleapis.com" response['Content-Security-Policy'] = "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://www.jsdelivr.com https://cdnjs.cloudflare.com https://maxcdn.bootstrapcdn.com https://cdn.jsdelivr.net" + response['Content-Security-Policy'] = "default-src 'self' cyberpanel.cloud *.cyberpanel.cloud" response['X-Content-Type-Options'] = "nosniff" response['Referrer-Policy'] = "same-origin" From 3e9bdffdd0c72d5e30dfb5d94d441f291cae60f9 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 7 Mar 2021 11:59:36 +0500 Subject: [PATCH 103/107] further refoctor default render secmiddleware --- CyberCP/secMiddleware.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/CyberCP/secMiddleware.py b/CyberCP/secMiddleware.py index 90ddefd2a..064b6e905 100755 --- a/CyberCP/secMiddleware.py +++ b/CyberCP/secMiddleware.py @@ -96,11 +96,14 @@ class secMiddleware: logging.writeToFile(str(msg)) response = self.get_response(request) return response - else: - try: - uID = request.session['userID'] - except: - return render(request, 'loginSystem/login.html', {}) + # else: + # try: + # if request.path.find('cloudAPI/') > -1 or request.path.find('api/') > -1: + # pass + # else: + # uID = request.session['userID'] + # except: + # return render(request, 'loginSystem/login.html', {}) response = self.get_response(request) @@ -110,7 +113,7 @@ class secMiddleware: response['Content-Security-Policy'] = "connect-src *;" response['Content-Security-Policy'] = "font-src 'self' 'unsafe-inline' https://www.jsdelivr.com https://fonts.googleapis.com" response['Content-Security-Policy'] = "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://www.jsdelivr.com https://cdnjs.cloudflare.com https://maxcdn.bootstrapcdn.com https://cdn.jsdelivr.net" - response['Content-Security-Policy'] = "default-src 'self' cyberpanel.cloud *.cyberpanel.cloud" + #response['Content-Security-Policy'] = "default-src 'self' cyberpanel.cloud *.cyberpanel.cloud" response['X-Content-Type-Options'] = "nosniff" response['Referrer-Policy'] = "same-origin" From 826e26016927fdf555955d5bdecc0feadc574d56 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Sun, 7 Mar 2021 12:14:54 +0500 Subject: [PATCH 104/107] further refoctor default render secmiddleware --- baseTemplate/templates/baseTemplate/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/baseTemplate/templates/baseTemplate/index.html b/baseTemplate/templates/baseTemplate/index.html index 4a5250080..787063fd6 100755 --- a/baseTemplate/templates/baseTemplate/index.html +++ b/baseTemplate/templates/baseTemplate/index.html @@ -352,7 +352,7 @@ aria-describedby="tooltip896208"> {% trans "Version Management" %} - From ae32836325f1b7a8a8fd90c443a8ce26da706cc7 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 8 Mar 2021 11:08:13 +0500 Subject: [PATCH 105/107] fixed some bugs found in testing --- databases/databaseManager.py | 4 ++-- databases/templates/databases/listDataBases.html | 2 +- ftp/ftpManager.py | 2 +- ftp/templates/ftp/createFTPAccount.html | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/databases/databaseManager.py b/databases/databaseManager.py index 55c11bfb7..b5fbf48cf 100755 --- a/databases/databaseManager.py +++ b/databases/databaseManager.py @@ -158,9 +158,9 @@ class DatabaseManager: def listDBs(self, request = None, userID = None): currentACL = ACLManager.loadedACL(userID) - websitesName = ACLManager.findAllSites(currentACL, userID) + AllWebsites = ACLManager.findAllSites(currentACL, userID) template = 'databases/listDataBases.html' - proc = httpProc(request, template, {'websitesList': websitesName}, 'listDatabases') + proc = httpProc(request, template, {'AllWebsites': AllWebsites}, 'listDatabases') return proc.render() def changePassword(self, userID = None, data = None): diff --git a/databases/templates/databases/listDataBases.html b/databases/templates/databases/listDataBases.html index 2f8589839..9423ec949 100755 --- a/databases/templates/databases/listDataBases.html +++ b/databases/templates/databases/listDataBases.html @@ -26,7 +26,7 @@
    diff --git a/ftp/ftpManager.py b/ftp/ftpManager.py index 8c1e0e3a4..2eda896ed 100755 --- a/ftp/ftpManager.py +++ b/ftp/ftpManager.py @@ -53,7 +53,7 @@ class FTPManager: websitesName = ACLManager.findAllSites(currentACL, userID) proc = httpProc(self.request, 'ftp/createFTPAccount.html', - {'websiteList': websitesName, 'admin': admin.userName, "status": 1}, 'createFTPAccount') + {'websiteList': websitesName, 'OwnerFTP': admin.userName, "status": 1}, 'createFTPAccount') return proc.render() def submitFTPCreation(self): diff --git a/ftp/templates/ftp/createFTPAccount.html b/ftp/templates/ftp/createFTPAccount.html index eb32ccad3..9c068cf8c 100755 --- a/ftp/templates/ftp/createFTPAccount.html +++ b/ftp/templates/ftp/createFTPAccount.html @@ -59,7 +59,7 @@
    -
    {{ admin }}_{$ ftpUserName $}
    +
    {{ OwnerFTP }}_{$ ftpUserName $}
    From ced6a2b8e82e3b3b3b4a02423585d9e936799bea Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 8 Mar 2021 11:10:48 +0500 Subject: [PATCH 106/107] update build numbers --- CLScript/CLMain.py | 4 ++-- baseTemplate/views.py | 4 ++-- install/install.py | 4 ++-- loginSystem/views.py | 4 ++-- plogical/adminPass.py | 4 ++-- plogical/backupUtilities.py | 4 ++-- plogical/upgrade.py | 4 ++-- serverStatus/views.py | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/CLScript/CLMain.py b/CLScript/CLMain.py index c6f730ba4..0d09cec9b 100644 --- a/CLScript/CLMain.py +++ b/CLScript/CLMain.py @@ -4,8 +4,8 @@ class CLMain(): def __init__(self): self.path = '/usr/local/CyberCP/version.txt' #versionInfo = json.loads(open(self.path, 'r').read()) - self.version = '2.0' - self.build = '3' + self.version = '2.1' + self.build = '1' ipFile = "/etc/cyberpanel/machineIP" f = open(ipFile) diff --git a/baseTemplate/views.py b/baseTemplate/views.py index 4395a7009..ce4631b23 100755 --- a/baseTemplate/views.py +++ b/baseTemplate/views.py @@ -17,8 +17,8 @@ from plogical.processUtilities import ProcessUtilities from plogical.httpProc import httpProc # Create your views here. -VERSION = '2.0' -BUILD = 3 +VERSION = '2.1' +BUILD = 1 @ensure_csrf_cookie def renderBase(request): diff --git a/install/install.py b/install/install.py index f973a5dd8..84899beb4 100755 --- a/install/install.py +++ b/install/install.py @@ -14,8 +14,8 @@ from os.path import * from stat import * import stat -VERSION = '2.0' -BUILD = 3 +VERSION = '2.1' +BUILD = 1 char_set = {'small': 'abcdefghijklmnopqrstuvwxyz', 'nums': '0123456789', diff --git a/loginSystem/views.py b/loginSystem/views.py index da4af680e..4d600cb94 100644 --- a/loginSystem/views.py +++ b/loginSystem/views.py @@ -18,8 +18,8 @@ from django.http import HttpResponse from django.utils import translation # Create your views here. -VERSION = '2.0' -BUILD = 3 +VERSION = '2.1' +BUILD = 1 def verifyLogin(request): try: diff --git a/plogical/adminPass.py b/plogical/adminPass.py index 446e6329f..1cd46ebc4 100755 --- a/plogical/adminPass.py +++ b/plogical/adminPass.py @@ -12,8 +12,8 @@ from plogical.acl import ACLManager from packages.models import Package from baseTemplate.models import version -VERSION = '2.0' -BUILD = 3 +VERSION = '2.1' +BUILD = 1 if not os.geteuid() == 0: sys.exit("\nOnly root can run this script\n") diff --git a/plogical/backupUtilities.py b/plogical/backupUtilities.py index 1160e6631..6df1ee58b 100755 --- a/plogical/backupUtilities.py +++ b/plogical/backupUtilities.py @@ -48,8 +48,8 @@ try: except: pass -VERSION = '2.0' -BUILD = 3 +VERSION = '2.1' +BUILD = 1 ## I am not the monster that you think I am.. diff --git a/plogical/upgrade.py b/plogical/upgrade.py index 427aa03c6..a30ad69dc 100755 --- a/plogical/upgrade.py +++ b/plogical/upgrade.py @@ -14,8 +14,8 @@ from CyberCP import settings import random import string -VERSION = '2.0' -BUILD = 3 +VERSION = '2.1' +BUILD = 1 CENTOS7 = 0 CENTOS8 = 1 diff --git a/serverStatus/views.py b/serverStatus/views.py index 4f4f3e32c..62d1d3f7e 100755 --- a/serverStatus/views.py +++ b/serverStatus/views.py @@ -25,8 +25,8 @@ EXPIRE = 3 ### Version -VERSION = '2.0' -BUILD = 3 +VERSION = '2.1' +BUILD = 1 def serverStatusHome(request): proc = httpProc(request, 'serverStatus/index.html', From a4bb0bdede81696786eb691c6455156b61c0e231 Mon Sep 17 00:00:00 2001 From: Usman Nasir Date: Mon, 8 Mar 2021 11:50:02 +0500 Subject: [PATCH 107/107] further refoctor default render secmiddleware --- baseTemplate/templates/baseTemplate/index.html | 2 +- loginSystem/templates/loginSystem/login.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/baseTemplate/templates/baseTemplate/index.html b/baseTemplate/templates/baseTemplate/index.html index 787063fd6..0ff264bfb 100755 --- a/baseTemplate/templates/baseTemplate/index.html +++ b/baseTemplate/templates/baseTemplate/index.html @@ -76,7 +76,7 @@ - {% with version="2.0.4" %} + {% with version="2.1.1" %} diff --git a/loginSystem/templates/loginSystem/login.html b/loginSystem/templates/loginSystem/login.html index 239414e0c..d4b285da3 100755 --- a/loginSystem/templates/loginSystem/login.html +++ b/loginSystem/templates/loginSystem/login.html @@ -281,7 +281,7 @@

    CyberPanel - v 2.0 + v 2.1

    Web Hosting Control Panel