This commit is contained in:
Usman Nasir
2019-08-13 16:27:56 +05:00
parent 4d4b0c7e03
commit d495ce4160
49 changed files with 26567 additions and 15706 deletions

View File

@@ -675,6 +675,9 @@ class BackupManager:
command = "mv " + tempCronPath + " " + path command = "mv " + tempCronPath + " " + path
ProcessUtilities.executioner(command) ProcessUtilities.executioner(command)
command = 'chown root:root %s' % (path)
ProcessUtilities.executioner(command)
command = "systemctl restart crond" command = "systemctl restart crond"
ProcessUtilities.executioner(command) ProcessUtilities.executioner(command)
@@ -707,6 +710,9 @@ class BackupManager:
command = "sudo mv " + tempCronPath + " " + path command = "sudo mv " + tempCronPath + " " + path
ProcessUtilities.executioner(command) ProcessUtilities.executioner(command)
command = 'chown root:root %s' % (path)
ProcessUtilities.executioner(command)
command = "sudo systemctl restart crond" command = "sudo systemctl restart crond"
ProcessUtilities.executioner(command) ProcessUtilities.executioner(command)
@@ -762,8 +768,10 @@ class BackupManager:
command = "sudo mv " + tempCronPath + " " + path command = "sudo mv " + tempCronPath + " " + path
ProcessUtilities.executioner(command) ProcessUtilities.executioner(command)
command = "sudo systemctl restart crond" command = 'chown root:root %s' % (path)
ProcessUtilities.executioner(command)
command = "sudo systemctl restart crond"
ProcessUtilities.executioner(command) ProcessUtilities.executioner(command)
destination = dest.objects.get(destLoc=backupDest) destination = dest.objects.get(destLoc=backupDest)

View File

@@ -126,6 +126,9 @@ app.controller('adminController', function($scope,$http,$timeout) {
if(!Boolean(response.data.createNewUser)){ if(!Boolean(response.data.createNewUser)){
$('.createNewUser').hide(); $('.createNewUser').hide();
} }
if(!Boolean(response.data.listUsers)){
$('.listUsers').hide();
}
if(!Boolean(response.data.resellerCenter)){ if(!Boolean(response.data.resellerCenter)){
$('.resellerCenter').hide(); $('.resellerCenter').hide();
} }
@@ -158,6 +161,10 @@ app.controller('adminController', function($scope,$http,$timeout) {
$('.createPackage').hide(); $('.createPackage').hide();
} }
if(!Boolean(response.data.listPackages)){
$('.listPackages').hide();
}
if(!Boolean(response.data.deletePackage)){ if(!Boolean(response.data.deletePackage)){
$('.deletePackage').hide(); $('.deletePackage').hide();
} }
@@ -208,6 +215,10 @@ app.controller('adminController', function($scope,$http,$timeout) {
$('.emailAsWhole').hide(); $('.emailAsWhole').hide();
} }
if(!Boolean(response.data.listEmails)){
$('.listEmails').hide();
}
if(!Boolean(response.data.createEmail)){ if(!Boolean(response.data.createEmail)){
$('.createEmail').hide(); $('.createEmail').hide();
} }

View File

@@ -319,7 +319,7 @@
</div> </div>
</div> </div>
<a class="header-btn" id="logout-btn" href="{% url 'logout' %}" title="{% trans 'Logout' %}"> <a class="header-btn" id="logout-btn" href="{% url 'logout' %}" title="{% trans 'Logout' %}">
<i class="glyph-icon icon-linecons-lock"></i> <i class="glyph-icon icon-power-off"></i>
</a> </a>
@@ -373,6 +373,9 @@
<li class="createNewUser"><a href="{% url 'createUser' %}" <li class="createNewUser"><a href="{% url 'createUser' %}"
title="{% trans 'Create New User' %}"><span>{% trans "Create New User" %}</span></a> title="{% trans 'Create New User' %}"><span>{% trans "Create New User" %}</span></a>
</li> </li>
<li class="listUsers"><a href="{% url 'listUsers' %}"
title="{% trans 'List Users' %}"><span>{% trans "List Users" %}</span></a>
</li>
<li><a href="{% url 'modifyUsers' %}" <li><a href="{% url 'modifyUsers' %}"
title="{% trans 'Modify User' %}"><span>{% trans "Modify User" %}</span></a></li> title="{% trans 'Modify User' %}"><span>{% trans "Modify User" %}</span></a></li>
<li class="deleteUser"><a href="{% url 'deleteUser' %}" <li class="deleteUser"><a href="{% url 'deleteUser' %}"
@@ -439,6 +442,9 @@
<li class="createPackage"><a href="{% url 'createPackage' %}" <li class="createPackage"><a href="{% url 'createPackage' %}"
title="{% trans 'Create Package' %}"><span>{% trans "Create Package" %}</span></a> title="{% trans 'Create Package' %}"><span>{% trans "Create Package" %}</span></a>
</li> </li>
<li class="listPackages"><a href="{% url 'listPackages' %}"
title="{% trans 'List Packages' %}"><span>{% trans "List Packages" %}</span></a>
</li>
<li class="deletePackage"><a href="{% url 'deletePackage' %}" <li class="deletePackage"><a href="{% url 'deletePackage' %}"
title="{% trans 'Delete Package' %}"><span>{% trans "Delete Package" %}</span></a> title="{% trans 'Delete Package' %}"><span>{% trans "Delete Package" %}</span></a>
</li> </li>
@@ -511,6 +517,9 @@
<li class="createEmail"><a href="{% url 'createEmailAccount' %}" <li class="createEmail"><a href="{% url 'createEmailAccount' %}"
title="{% trans 'Create Email Account' %}"><span>{% trans "Create Email" %}</span></a> title="{% trans 'Create Email Account' %}"><span>{% trans "Create Email" %}</span></a>
</li> </li>
<li class="listEmails"><a href="{% url 'listEmails' %}"
title="{% trans 'List Emails' %}"><span>{% trans "List Emails" %}</span></a>
</li>
<li class="deleteEmail"><a href="{% url 'deleteEmailAccount' %}" <li class="deleteEmail"><a href="{% url 'deleteEmailAccount' %}"
title="{% trans 'Delete Email Account' %}"><span>{% trans "Delete Email" %}</span></a> title="{% trans 'Delete Email Account' %}"><span>{% trans "Delete Email" %}</span></a>
</li> </li>

View File

@@ -519,13 +519,11 @@ class DNSManager:
delRecord = Records.objects.get(id=id) delRecord = Records.objects.get(id=id)
admin = Administrator.objects.get(pk=userID) admin = Administrator.objects.get(pk=userID)
if currentACL['admin'] == 1:
pass if ACLManager.checkOwnership(delRecord.domainOwner.name, admin, currentACL) == 1:
elif delRecord.domainOwner.admin == admin:
pass pass
else: else:
return ACLManager.loadErrorJson() return ACLManager.loadError()
delRecord.delete() delRecord.delete()

View File

@@ -952,7 +952,7 @@ class preFlightsChecks:
os.chdir(self.path) os.chdir(self.path)
command = "wget http://cyberpanel.sh/CyberPanel.1.8.8.tar.gz" command = "wget http://cyberpanel.sh/CyberPanel.1.8.9.tar.gz"
#command = "wget http://cyberpanel.sh/CyberPanelTemp.tar.gz" #command = "wget http://cyberpanel.sh/CyberPanelTemp.tar.gz"
preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]', preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]',
'CyberPanel Download', 'CyberPanel Download',
@@ -961,7 +961,7 @@ class preFlightsChecks:
## ##
count = 0 count = 0
command = "tar zxf CyberPanel.1.8.8.tar.gz" command = "tar zxf CyberPanel.1.8.9.tar.gz"
#command = "tar zxf CyberPanelTemp.tar.gz" #command = "tar zxf CyberPanelTemp.tar.gz"
preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]', preFlightsChecks.call(command, self.distro, '[download_install_CyberPanel]',
'Extract CyberPanel',1, 1, os.EX_OSERR) 'Extract CyberPanel',1, 1, os.EX_OSERR)
@@ -1054,7 +1054,7 @@ class preFlightsChecks:
path = "/usr/local/CyberCP/version.txt" path = "/usr/local/CyberCP/version.txt"
writeToFile = open(path, 'w') writeToFile = open(path, 'w')
writeToFile.writelines('1.8\n') writeToFile.writelines('1.8\n')
writeToFile.writelines('2') writeToFile.writelines('9')
writeToFile.close() writeToFile.close()
except: except:
pass pass
@@ -1362,6 +1362,40 @@ enabled=1"""
preFlightsChecks.stdOut("Dovecot and Dovecot-MySQL successfully installed!") preFlightsChecks.stdOut("Dovecot and Dovecot-MySQL successfully installed!")
break break
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 OSError, msg: except OSError, msg:
logging.InstallLog.writeToFile(str(msg) + " [install_postfix_davecot]") logging.InstallLog.writeToFile(str(msg) + " [install_postfix_davecot]")
return 0 return 0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -14,6 +14,7 @@ class ACL(models.Model):
## User Management ## User Management
createNewUser = models.IntegerField(default=0) createNewUser = models.IntegerField(default=0)
listUsers = models.IntegerField(default=0)
deleteUser = models.IntegerField(default=0) deleteUser = models.IntegerField(default=0)
resellerCenter = models.IntegerField(default=0) resellerCenter = models.IntegerField(default=0)
changeUserACL = models.IntegerField(default=0) changeUserACL = models.IntegerField(default=0)
@@ -28,6 +29,7 @@ class ACL(models.Model):
## Package Management ## Package Management
createPackage = models.IntegerField(default=0) createPackage = models.IntegerField(default=0)
listPackages = models.IntegerField(default=0)
deletePackage = models.IntegerField(default=0) deletePackage = models.IntegerField(default=0)
modifyPackage = models.IntegerField(default=0) modifyPackage = models.IntegerField(default=0)
@@ -47,6 +49,7 @@ class ACL(models.Model):
## Email Management ## Email Management
createEmail = models.IntegerField(default=1) createEmail = models.IntegerField(default=1)
listEmails = models.IntegerField(default=1)
deleteEmail = models.IntegerField(default=1) deleteEmail = models.IntegerField(default=1)
emailForwarding = models.IntegerField(default=1) emailForwarding = models.IntegerField(default=1)
changeEmailPassword = models.IntegerField(default=1) changeEmailPassword = models.IntegerField(default=1)

View File

@@ -91,6 +91,17 @@ application.controller('loginSystem', function($scope,$http,$window) {
}; };
$scope.initiateLogin = function($event){
var keyCode = $event.which || $event.keyCode;
if (keyCode === 13) {
$scope.verifyLoginCredentials();
}
};
}); });

View File

@@ -113,7 +113,7 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="input-group"> <div class="input-group">
<input ng-model="password" type="password" class="form-control" id="password" placeholder="Password" required> <input ng-keypress="initiateLogin($event)" ng-model="password" type="password" class="form-control" id="password" placeholder="Password" required>
<span class="input-group-addon bg-blue"> <span class="input-group-addon bg-blue">
<i class="glyph-icon icon-unlock-alt"></i> <i class="glyph-icon icon-unlock-alt"></i>
</span> </span>

View File

@@ -218,7 +218,7 @@ def loadLoginPage(request):
firstName="Cyber",lastName="Panel", acl=acl, token=token) firstName="Cyber",lastName="Panel", acl=acl, token=token)
admin.save() admin.save()
vers = version(currentVersion="1.8", build=8) vers = version(currentVersion="1.8", build=9)
vers.save() vers.save()
package = Package(admin=admin, packageName="Default", diskSpace=1000, package = Package(admin=admin, packageName="Default", diskSpace=1000,

View File

@@ -58,6 +58,26 @@ class MailServerManager:
logging.CyberCPLogFileWriter.writeToFile(str(msg)) logging.CyberCPLogFileWriter.writeToFile(str(msg))
return HttpResponse(str(msg)) return HttpResponse(str(msg))
def listEmails(self):
try:
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})
websitesName = ACLManager.findAllSites(currentACL, userID)
websitesName = websitesName + ACLManager.findChildDomains(websitesName)
return render(self.request, 'mailServer/listEmails.html',
{'websiteList': websitesName, "status": 1})
except BaseException, msg:
return redirect(loadLoginPage)
def submitEmailCreation(self): def submitEmailCreation(self):
try: try:
@@ -347,6 +367,53 @@ class MailServerManager:
json_data = json.dumps(data_ret) json_data = json.dumps(data_ret)
return HttpResponse(json_data) return HttpResponse(json_data)
def fetchEmails(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'listEmails') == 0:
return ACLManager.loadErrorJson('status', 0)
data = json.loads(self.request.body)
selectedDomain = data['selectedDomain']
admin = Administrator.objects.get(pk=userID)
if ACLManager.checkOwnership(selectedDomain, admin, currentACL) == 1:
pass
else:
return ACLManager.loadErrorJson()
try:
emailDomain = Domains.objects.get(domain=selectedDomain)
except:
raise BaseException('No emails exist for this domain.')
records = emailDomain.eusers_set.all()
json_data = "["
checker = 0
for items in records:
dic = {'email': items.email,
}
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, msg:
final_dic = {'status': 0, 'fetchStatus': 0, 'error_message': str(msg)}
final_json = json.dumps(final_dic)
return HttpResponse(final_json)
####### #######
def changeEmailAccountPassword(self): def changeEmailAccountPassword(self):

View File

@@ -1108,3 +1108,179 @@ app.controller('emailForwarding', function ($scope, $http) {
}); });
/* Java script for email forwarding */ /* Java script for email forwarding */
/* Java script code for List Emails */
app.controller('listEmails', function ($scope, $http) {
$scope.cyberpanelLoading = true;
$scope.emailsAccounts = true;
$scope.populateCurrentRecords = function () {
$scope.cyberpanelLoading = false;
$scope.emailsAccounts = true;
url = "/email/fetchEmails";
var data = {
selectedDomain: $scope.selectedDomain,
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.status === 1) {
$scope.emailsAccounts = false;
$scope.records = JSON.parse(response.data.data);
new PNotify({
title: 'Success!',
text: 'Emails Successfully Fetched.',
type: 'success'
});
} else {
$scope.emailsAccounts = true;
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
$scope.errorMessage = response.data.error_message;
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.emailsAccounts = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
$scope.deleteEmailAccountFinal = function (email) {
$scope.cyberpanelLoading = false;
var url = "/email/submitEmailDeletion";
var data = {
email: email,
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.deleteEmailStatus === 1) {
$scope.populateCurrentRecords();
new PNotify({
title: 'Success!',
text: 'Email Successfully deleted.',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
$scope.changePasswordInitial = function (email) {
$scope.email = email;
};
$scope.changePassword = function () {
$scope.cyberpanelLoading = false;
var url = "/email/submitPasswordChange";
var data = {
domain: $scope.selectedDomain,
email: $scope.email,
passwordByPass: $scope.password,
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.status === 1) {
new PNotify({
title: 'Success!',
text: 'Password Successfully changed.',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
});
/* Java script code for List Emails Ends here */

View File

@@ -0,0 +1,164 @@
{% extends "baseTemplate/index.html" %}
{% load i18n %}
{% block title %}{% trans "List Email Accounts - CyberPanel" %}{% endblock %}
{% block content %}
{% load static %}
{% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} -->
<div class="container">
<div id="page-title">
<h2>{% trans "List Email Accounts" %}</h2>
<p>{% trans "List Emails Accounts. Change their passwords or delete them." %}</p>
</div>
<div ng-controller="listEmails" class="panel">
<div class="panel-body">
<h3 class="title-hero">
{% trans "List Email Accounts" %} <img ng-hide="cyberpanelLoading"
src="{% static 'images/loading.gif' %}">
</h3>
<div class="example-box-wrapper">
{% if not status %}
<div class="col-md-12 text-center" style="margin-bottom: 2%;">
<h3>{% trans "Postfix is disabled." %}
<a href="{% url 'managePostfix' %}">
<button class="btn btn-alt btn-hover btn-blue-alt">
<span>{% trans "Enable Now" %}</span>
<i class="glyph-icon icon-arrow-right"></i>
</button>
</a></h3>
</div>
{% else %}
<form action="/" class="form-horizontal bordered-row">
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Select Domain" %}</label>
<div class="col-sm-6">
<select ng-change="populateCurrentRecords()" ng-model="selectedDomain"
class="form-control">
{% for items in websiteList %}
<option>{{ items }}</option>
{% endfor %}
</select>
</div>
</div>
<!------ List of records --------------->
<div ng-hide="emailsAccounts" class="form-group">
<div class="col-sm-12">
<table class="table">
<thead>
<tr>
<th>{% trans "Emails" %}</th>
<th>{% trans "Actions" %}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="record in records track by $index">
<td ng-bind="record.email"></td>
<td>
<a data-toggle="modal" data-target="#settings"
ng-click="changePasswordInitial(record.email)"
class="btn btn-border btn-alt border-purple btn-link font-purple"
href="#"
title=""><span>{% trans 'Change Password' %}</span></a>
<a ng-click="deleteEmailAccountFinal(record.email)" class="btn btn-border btn-alt border-red btn-link font-red" href="#"
title=""><span>{% trans 'Delete' %}</span></a>
<!--- Modal --->
<div id="settings" class="modal fade" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close"
data-dismiss="modal">&times;
</button>
<h4 class="modal-title">Change Password
<img ng-hide="cyberpanelLoading"
src="{% static 'images/loading.gif' %}">
</h4>
</div>
<div class="modal-body">
<form name="containerSettingsForm" action="/"
class="form-horizontal">
<div ng-hide="installationDetailsForm"
class="form-group">
<label class="col-sm-3 control-label">{% trans "Email" %}</label>
<div class="col-sm-6">
<input name="name" type="text"
class="form-control"
ng-model="email" readonly>
</div>
</div>
<hr>
<div ng-hide="installationDetailsForm"
class="form-group">
<label class="col-sm-3 control-label">{% trans "Password" %}</label>
<div class="col-sm-6">
<input type="password"
class="form-control"
ng-model="$parent.password">
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" ng-disabled="savingSettings"
class="btn btn-primary"
ng-click="changePassword()"
data-dismiss="modal">
Save
</button>
<button type="button" ng-disabled="savingSettings"
class="btn btn-default" data-dismiss="modal">
Close
</button>
</div>
</div>
</div>
</div>
<!--- Modal End--->
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!------ List of records --------------->
</form>
{% endif %}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -4,7 +4,9 @@ import views
urlpatterns = [ urlpatterns = [
url(r'^$', views.loadEmailHome, name='loadEmailHome'), url(r'^$', views.loadEmailHome, name='loadEmailHome'),
url(r'^createEmailAccount', views.createEmailAccount, name='createEmailAccount'), url(r'^createEmailAccount', views.createEmailAccount, name='createEmailAccount'),
url(r'^listEmails$', views.listEmails, name='listEmails'),
url(r'^submitEmailCreation', views.submitEmailCreation, name='submitEmailCreation'), url(r'^submitEmailCreation', views.submitEmailCreation, name='submitEmailCreation'),
url(r'^fetchEmails$', views.fetchEmails, name='fetchEmails'),
## Mail Forwardings ## Mail Forwardings

View File

@@ -22,6 +22,21 @@ def createEmailAccount(request):
except KeyError: except KeyError:
return redirect(loadLoginPage) return redirect(loadLoginPage)
def listEmails(request):
try:
msM = MailServerManager(request)
return msM.listEmails()
except KeyError:
return redirect(loadLoginPage)
def fetchEmails(request):
try:
msM = MailServerManager(request)
return msM.fetchEmails()
except KeyError:
return redirect(loadLoginPage)
def submitEmailCreation(request): def submitEmailCreation(request):
try: try:

View File

@@ -218,3 +218,59 @@ class PackagesManager:
data_ret = {'status': 0, 'saveStatus': 0, 'error_message': str(msg)} data_ret = {'status': 0, 'saveStatus': 0, 'error_message': str(msg)}
json_data = json.dumps(data_ret) json_data = json.dumps(data_ret)
return HttpResponse(json_data) return HttpResponse(json_data)
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, msg:
return redirect(loadLoginPage)
def fetchPackagesTable(self):
try:
userID = self.request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if ACLManager.currentContextPermission(currentACL, 'listPackages') == 0:
return ACLManager.loadErrorJson()
packages = ACLManager.loadPackageObjects(userID, currentACL)
json_data = "["
checker = 0
for items in packages:
dic = {'package': items.packageName,
'diskSpace': items.diskSpace,
'bandwidth': items.bandwidth,
'emailAccounts': items.emailAccounts,
'dataBases': items.dataBases,
'ftpAccounts': items.ftpAccounts,
'allowedDomains': items.allowedDomains,
'allowFullDomain': items.allowFullDomain
}
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 KeyError:
return redirect(loadLoginPage)

View File

@@ -49,7 +49,7 @@ app.controller('createPackage', function ($scope, $http) {
var dataBases = $scope.dataBases; var dataBases = $scope.dataBases;
var emails = $scope.emails; var emails = $scope.emails;
if($scope.allowFullDomain === undefined){ if ($scope.allowFullDomain === undefined) {
$scope.allowFullDomain = 0; $scope.allowFullDomain = 0;
} }
@@ -240,7 +240,7 @@ app.controller('modifyPackages', function ($scope, $http) {
$scope.allowFullDomain = false; $scope.allowFullDomain = false;
} }
$scope.modifyButton = "Save Details" $scope.modifyButton = "Save Details";
$("#packageDetailsToBeModified").fadeIn(); $("#packageDetailsToBeModified").fadeIn();
@@ -333,3 +333,199 @@ app.controller('modifyPackages', function ($scope, $http) {
/* Java script code to Modify Pacakge ends here */ /* Java script code to Modify Pacakge ends here */
app.controller('listPackageTables', function ($scope, $http) {
$scope.cyberpanelLoading = true;
$scope.populateCurrentRecords = function () {
$scope.cyberpanelLoading = false;
url = "/packages/fetchPackagesTable";
var data = {};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.status === 1) {
$scope.records = JSON.parse(response.data.data);
new PNotify({
title: 'Success!',
text: 'Packages successfully fetched!',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
$scope.populateCurrentRecords();
$scope.deletePackageFinal = function (packageToBeDeleted) {
$scope.cyberpanelLoading = false;
url = "/packages/submitDelete";
var data = {
packageName: packageToBeDeleted,
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.status === 1) {
$scope.populateCurrentRecords();
new PNotify({
title: 'Success!',
text: 'Package successfully deleted!',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
$scope.editInitial = function (package, diskSpace, bandwidth,
emailAccounts, dataBases, ftpAccounts, allowedDomains, allowFullDomain) {
$scope.name = package;
$scope.diskSpace = diskSpace;
$scope.bandwidth = bandwidth;
$scope.emails = emailAccounts;
$scope.dataBases = dataBases;
$scope.ftpAccounts = ftpAccounts;
$scope.allowedDomains = allowedDomains;
$scope.allowFullDomain = allowFullDomain;
if (allowFullDomain === 1) {
$scope.allowFullDomain = true;
} else {
$scope.allowFullDomain = false;
}
};
$scope.saveChanges = function () {
var packageName = $scope.name;
var diskSpace = $scope.diskSpace;
var bandwidth = $scope.bandwidth;
var ftpAccounts = $scope.ftpAccounts;
var dataBases = $scope.dataBases;
var emails = $scope.emails;
url = "/packages/saveChanges";
var data = {
packageName: packageName,
diskSpace: diskSpace,
bandwidth: bandwidth,
ftpAccounts: ftpAccounts,
dataBases: dataBases,
emails: emails,
allowedDomains: $scope.allowedDomains,
allowFullDomain: $scope.allowFullDomain
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.saveStatus === 1) {
$scope.populateCurrentRecords();
new PNotify({
title: 'Success!',
text: 'Package successfully updated!',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
});

View File

@@ -0,0 +1,204 @@
{% extends "baseTemplate/index.html" %}
{% load i18n %}
{% block title %}{% trans "List Packages - CyberPanel" %}{% endblock %}
{% block content %}
{% load static %}
{% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} -->
<div class="container">
<div id="page-title">
<h2>{% trans "List Packages" %}</h2>
<p>{% trans "List Packages and delete or edit them." %}</p>
</div>
<div ng-controller="listPackageTables" class="panel">
<div class="panel-body">
<h3 class="content-box-header">
{% trans "List Packages" %} <img ng-hide="cyberpanelLoading"
src="{% static 'images/loading.gif' %}">
</h3>
<div class="example-box-wrapper">
<!------ List of records --------------->
<div class="form-group">
<div class="col-sm-12">
<table class="table">
<thead>
<tr>
<th>{% trans "Package" %}</th>
<th>{% trans "Diskspace" %}</th>
<th>{% trans "Bandwidth" %}</th>
<th>{% trans "Email Accounts" %}</th>
<th>{% trans "Databases" %}</th>
<th>{% trans "FTPs" %}</th>
<th>{% trans "Child Domains" %}</th>
<th>{% trans "Allow FQDN as Childs" %}</th>
<th>{% trans "Actions" %}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="record in records track by $index">
<td ng-bind="record.package"></td>
<td ng-bind="record.diskSpace"></td>
<td ng-bind="record.bandwidth"></td>
<td ng-bind="record.emailAccounts"></td>
<td ng-bind="record.dataBases"></td>
<td ng-bind="record.ftpAccounts"></td>
<td ng-bind="record.allowedDomains"></td>
<td><span ng-hide="record.allowFullDomain==0">Enabled</span><span
ng-hide="record.allowFullDomain">Disabled</span></td>
<td>
<a data-toggle="modal" data-target="#settings"
ng-click="editInitial(record.package, record.diskSpace, record.bandwidth,
record.emailAccounts, record.dataBases, record.ftpAccounts, record.allowedDomains, record.allowFullDomain)"
class="btn btn-border btn-alt border-purple btn-link font-purple" href="#"
title=""><span>{% trans 'Edit' %}</span></a>
<a ng-click="deletePackageFinal(record.package)"
class="btn btn-border btn-alt border-red btn-link font-red" href="#"
title=""><span>{% trans 'Delete' %}</span></a>
<!--- Modal --->
<div id="settings" class="modal fade" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;
</button>
<h4 class="modal-title">Edit Package
<img ng-hide="cyberpanelLoading"
src="{% static 'images/loading.gif' %}">
</h4>
</div>
<div class="modal-body">
<form name="containerSettingsForm" action="/"
class="form-horizontal">
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Name" %}</label>
<div class="col-sm-6">
<input name="name" type="text" class="form-control"
ng-model="name" readonly>
</div>
</div>
<hr>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Domains" %}</label>
<div class="col-sm-6">
<input type="number" class="form-control"
ng-model="$parent.allowedDomains" required>
</div>
<div class="current-pack"> {% trans "(0 = Unlimited)" %} </div>
</div>
<hr>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Disk Space" %}</label>
<div class="col-sm-6">
<input type="number" class="form-control"
ng-model="$parent.diskSpace" required>
</div>
<div class="current-pack"> {% trans "MB (0 = Unlimited)" %} </div>
</div>
<hr>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Bandwidth" %}</label>
<div class="col-sm-6">
<input type="number" class="form-control"
ng-model="$parent.bandwidth" required>
</div>
<div class="current-pack"> {% trans "MB (0 = Unlimited)" %} </div>
</div>
<hr>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "FTP Accounts" %}</label>
<div class="col-sm-6">
<input type="number" class="form-control"
ng-model="$parent.ftpAccounts" required>
</div>
</div>
<hr>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Databases" %}</label>
<div class="col-sm-6">
<input type="number" class="form-control"
ng-model="$parent.dataBases" required>
</div>
</div>
<hr>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Emails" %}</label>
<div class="col-sm-6">
<input type="number" class="form-control"
ng-model="$parent.emails" required>
</div>
</div>
<hr>
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Additional" %}</label>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="$parent.allowFullDomain"
type="checkbox" value="">
Allow Creation of Fully Qualified Domain as
Child-Domains
</label>
</div>
</div>
</div>
<hr>
</form>
</div>
<div class="modal-footer">
<button type="button" ng-disabled="savingSettings"
class="btn btn-primary"
ng-click="saveChanges()"
data-dismiss="modal">
Save
</button>
<button type="button" ng-disabled="savingSettings"
class="btn btn-default" data-dismiss="modal">
Close
</button>
</div>
</div>
</div>
</div>
<!--- Modal End--->
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!------ List of records --------------->
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -6,7 +6,8 @@ urlpatterns = [
url(r'^createPackage$', views.createPacakge, name='createPackage'), url(r'^createPackage$', views.createPacakge, name='createPackage'),
url(r'^deletePacakge$', views.deletePacakge, name='deletePackage'), url(r'^deletePacakge$', views.deletePacakge, name='deletePackage'),
url(r'^modifyPackage$', views.modifyPackage, name='modifyPackage'), url(r'^modifyPackage$', views.modifyPackage, name='modifyPackage'),
url(r'^listPackages$', views.listPackages, name='listPackages'),
url(r'^fetchPackagesTable$', views.fetchPackagesTable, name='fetchPackagesTable'),
# Pacakge Modification URLs # Pacakge Modification URLs

View File

@@ -108,3 +108,23 @@ def saveChanges(request):
return coreResult return coreResult
except KeyError: except KeyError:
return redirect(loadLoginPage) return redirect(loadLoginPage)
def listPackages(request):
try:
pm = PackagesManager(request)
return pm.listPackages()
except KeyError:
return redirect(loadLoginPage)
def fetchPackagesTable(request):
try:
pm = PackagesManager(request)
coreResult = pm.fetchPackagesTable()
return coreResult
except KeyError:
return redirect(loadLoginPage)

View File

@@ -34,7 +34,7 @@ class ACLManager:
serverIPAddress = "192.168.100.1" serverIPAddress = "192.168.100.1"
finalResponse['serverIPAddress'] = serverIPAddress finalResponse['serverIPAddress'] = serverIPAddress
finalResponse['adminName'] = admin.firstName + " " + admin.lastName[:3] finalResponse['adminName'] = admin.firstName
if admin.acl.adminStatus == 1: if admin.acl.adminStatus == 1:
finalResponse['admin'] = 1 finalResponse['admin'] = 1
@@ -47,6 +47,7 @@ class ACLManager:
## User Management ## User Management
finalResponse['createNewUser'] = acl.createNewUser finalResponse['createNewUser'] = acl.createNewUser
finalResponse['listUsers'] = acl.listUsers
finalResponse['deleteUser'] = acl.deleteUser finalResponse['deleteUser'] = acl.deleteUser
finalResponse['changeUserACL'] = acl.changeUserACL finalResponse['changeUserACL'] = acl.changeUserACL
finalResponse['resellerCenter'] = acl.resellerCenter finalResponse['resellerCenter'] = acl.resellerCenter
@@ -62,6 +63,7 @@ class ACLManager:
finalResponse['createPackage'] = acl.createPackage finalResponse['createPackage'] = acl.createPackage
finalResponse['listPackages'] = acl.listPackages
finalResponse['deletePackage'] = acl.deletePackage finalResponse['deletePackage'] = acl.deletePackage
finalResponse['modifyPackage'] = acl.modifyPackage finalResponse['modifyPackage'] = acl.modifyPackage
@@ -81,6 +83,7 @@ class ACLManager:
## Email Management ## Email Management
finalResponse['createEmail'] = acl.createEmail finalResponse['createEmail'] = acl.createEmail
finalResponse['listEmails'] = acl.listEmails
finalResponse['deleteEmail'] = acl.deleteEmail finalResponse['deleteEmail'] = acl.deleteEmail
finalResponse['emailForwarding'] = acl.emailForwarding finalResponse['emailForwarding'] = acl.emailForwarding
finalResponse['changeEmailPassword'] = acl.changeEmailPassword finalResponse['changeEmailPassword'] = acl.changeEmailPassword
@@ -119,7 +122,6 @@ class ACLManager:
else: else:
return 0 return 0
@staticmethod @staticmethod
def currentContextPermission(currentACL, context): def currentContextPermission(currentACL, context):
try: try:
@@ -261,6 +263,22 @@ class ACLManager:
return adminObjects return adminObjects
@staticmethod
def fetchTableUserObjects(userID):
admin = Administrator.objects.get(pk=userID)
adminObjects = []
finalResponse = ACLManager.loadedACL(userID)
if finalResponse['admin'] == 1:
return Administrator.objects.all().exclude(pk=userID)
else:
admins = Administrator.objects.filter(owner=admin.pk)
for items in admins:
adminObjects.append(items)
return adminObjects
@staticmethod @staticmethod
def loadDeletionUsers(userID, finalResponse): def loadDeletionUsers(userID, finalResponse):
admin = Administrator.objects.get(pk=userID) admin = Administrator.objects.get(pk=userID)
@@ -426,22 +444,22 @@ class ACLManager:
domainsList = [] domainsList = []
if currentACL['admin'] == 1: if currentACL['admin'] == 1:
domains = Domains.objects.all() domains = Websites.objects.all()
for items in domains: for items in domains:
domainsList.append(items.name) domainsList.append(items.domain)
else: else:
admin = Administrator.objects.get(pk=userID) admin = Administrator.objects.get(pk=userID)
domains = admin.domains_set.all() domains = admin.websites_set.all()
for items in domains: for items in domains:
domainsList.append(items.name) domainsList.append(items.domain)
admins = Administrator.objects.filter(owner=admin.pk) admins = Administrator.objects.filter(owner=admin.pk)
for items in admins: for items in admins:
doms = items.domains_set.all() doms = items.websites_set.all()
for dom in doms: for dom in doms:
domainsList.append(dom.name) domainsList.append(dom.domain)
return domainsList return domainsList

View File

@@ -31,7 +31,7 @@ def main():
firstName="Cyber", lastName="Panel", acl=acl, token=token) firstName="Cyber", lastName="Panel", acl=acl, token=token)
admin.save() admin.save()
vers = version(currentVersion="1.8", build=8) vers = version(currentVersion="1.8", build=9)
vers.save() vers.save()
package = Package(admin=admin, packageName="Default", diskSpace=1000, package = Package(admin=admin, packageName="Default", diskSpace=1000,

View File

@@ -724,6 +724,8 @@ class cPanelImporter:
message = 'Detecting email format from %s.' % (self.backupFile) message = 'Detecting email format from %s.' % (self.backupFile)
logging.statusWriter(self.logFile, message, 1) logging.statusWriter(self.logFile, message, 1)
try:
Format = open(FormatPath, 'r').read() Format = open(FormatPath, 'r').read()
if Format.find('mdbox') > -1: if Format.find('mdbox') > -1:
@@ -734,6 +736,8 @@ class cPanelImporter:
self.mailFormat = cPanelImporter.MailDir self.mailFormat = cPanelImporter.MailDir
message = 'Maildir format detected from %s.' % (self.backupFile) message = 'Maildir format detected from %s.' % (self.backupFile)
logging.statusWriter(self.logFile, message, 1) logging.statusWriter(self.logFile, message, 1)
except:
self.mailFormat = cPanelImporter.MailDir
#### ####

View File

@@ -597,6 +597,22 @@ class Upgrade:
except: except:
pass pass
try:
cursor.execute("ALTER TABLE loginSystem_acl ADD COLUMN listUsers INT DEFAULT 0;")
except:
pass
try:
cursor.execute("ALTER TABLE loginSystem_acl ADD COLUMN listEmails INT DEFAULT 1;")
except:
pass
try:
cursor.execute("ALTER TABLE loginSystem_acl ADD COLUMN listPackages INT DEFAULT 0;")
except:
pass
try: try:
connection.close() connection.close()
except: except:
@@ -1083,6 +1099,12 @@ class Upgrade:
except: except:
pass pass
query = "ALTER TABLE packages_package ADD COLUMN allowFullDomain INT DEFAULT 1;"
try:
cursor.execute(query)
except:
pass
try: try:
connection.close() connection.close()
except: except:

View File

@@ -126,6 +126,9 @@ app.controller('adminController', function($scope,$http,$timeout) {
if(!Boolean(response.data.createNewUser)){ if(!Boolean(response.data.createNewUser)){
$('.createNewUser').hide(); $('.createNewUser').hide();
} }
if(!Boolean(response.data.listUsers)){
$('.listUsers').hide();
}
if(!Boolean(response.data.resellerCenter)){ if(!Boolean(response.data.resellerCenter)){
$('.resellerCenter').hide(); $('.resellerCenter').hide();
} }
@@ -158,6 +161,10 @@ app.controller('adminController', function($scope,$http,$timeout) {
$('.createPackage').hide(); $('.createPackage').hide();
} }
if(!Boolean(response.data.listPackages)){
$('.listPackages').hide();
}
if(!Boolean(response.data.deletePackage)){ if(!Boolean(response.data.deletePackage)){
$('.deletePackage').hide(); $('.deletePackage').hide();
} }
@@ -208,6 +215,10 @@ app.controller('adminController', function($scope,$http,$timeout) {
$('.emailAsWhole').hide(); $('.emailAsWhole').hide();
} }
if(!Boolean(response.data.listEmails)){
$('.listEmails').hide();
}
if(!Boolean(response.data.createEmail)){ if(!Boolean(response.data.createEmail)){
$('.createEmail').hide(); $('.createEmail').hide();
} }

11
static/loginSystem/login-systen.js Executable file → Normal file
View File

@@ -91,6 +91,17 @@ application.controller('loginSystem', function($scope,$http,$window) {
}; };
$scope.initiateLogin = function($event){
var keyCode = $event.which || $event.keyCode;
if (keyCode === 13) {
$scope.verifyLoginCredentials();
}
};
}); });

View File

@@ -1108,3 +1108,179 @@ app.controller('emailForwarding', function ($scope, $http) {
}); });
/* Java script for email forwarding */ /* Java script for email forwarding */
/* Java script code for List Emails */
app.controller('listEmails', function ($scope, $http) {
$scope.cyberpanelLoading = true;
$scope.emailsAccounts = true;
$scope.populateCurrentRecords = function () {
$scope.cyberpanelLoading = false;
$scope.emailsAccounts = true;
url = "/email/fetchEmails";
var data = {
selectedDomain: $scope.selectedDomain,
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.status === 1) {
$scope.emailsAccounts = false;
$scope.records = JSON.parse(response.data.data);
new PNotify({
title: 'Success!',
text: 'Emails Successfully Fetched.',
type: 'success'
});
} else {
$scope.emailsAccounts = true;
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
$scope.errorMessage = response.data.error_message;
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
$scope.emailsAccounts = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
$scope.deleteEmailAccountFinal = function (email) {
$scope.cyberpanelLoading = false;
var url = "/email/submitEmailDeletion";
var data = {
email: email,
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
if (response.data.deleteEmailStatus === 1) {
$scope.populateCurrentRecords();
new PNotify({
title: 'Success!',
text: 'Email Successfully deleted.',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
$scope.changePasswordInitial = function (email) {
$scope.email = email;
};
$scope.changePassword = function () {
$scope.cyberpanelLoading = false;
var url = "/email/submitPasswordChange";
var data = {
domain: $scope.selectedDomain,
email: $scope.email,
passwordByPass: $scope.password,
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.status === 1) {
new PNotify({
title: 'Success!',
text: 'Password Successfully changed.',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
});
/* Java script code for List Emails Ends here */

301
static/packages/packages.js Executable file → Normal file
View File

@@ -3,13 +3,11 @@
*/ */
/** /**
* Created by usman on 7/25/17. * Created by usman on 7/25/17.
*/ */
/* Utilities */ /* Utilities */
function getCookie(name) { function getCookie(name) {
@@ -31,20 +29,18 @@ function getCookie(name) {
/* Utilities ends here */ /* Utilities ends here */
/* Java script code to create Pacakge */ /* Java script code to create Pacakge */
$("#packageCreationFailed").hide(); $("#packageCreationFailed").hide();
$("#packageCreated").hide(); $("#packageCreated").hide();
app.controller('createPackage', function ($scope, $http) {
app.controller('createPackage', function($scope,$http) {
//$scope.pname = /([A-Z]){3,10}/gi; //$scope.pname = /([A-Z]){3,10}/gi;
$scope.insertPackInDB = function(){ $scope.insertPackInDB = function () {
var packageName = $scope.packageName; var packageName = $scope.packageName;
var diskSpace = $scope.diskSpace; var diskSpace = $scope.diskSpace;
@@ -53,6 +49,10 @@ app.controller('createPackage', function($scope,$http) {
var dataBases = $scope.dataBases; var dataBases = $scope.dataBases;
var emails = $scope.emails; var emails = $scope.emails;
if ($scope.allowFullDomain === undefined) {
$scope.allowFullDomain = 0;
}
url = "/packages/submitPackage"; url = "/packages/submitPackage";
@@ -62,30 +62,29 @@ app.controller('createPackage', function($scope,$http) {
bandwidth: bandwidth, bandwidth: bandwidth,
ftpAccounts: ftpAccounts, ftpAccounts: ftpAccounts,
dataBases: dataBases, dataBases: dataBases,
emails:emails, emails: emails,
allowedDomains:$scope.allowedDomains allowedDomains: $scope.allowedDomains,
allowFullDomain: $scope.allowFullDomain
}; };
var config = { var config = {
headers : { headers: {
'X-CSRFToken': getCookie('csrftoken') 'X-CSRFToken': getCookie('csrftoken')
} }
}; };
$http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) { function ListInitialDatas(response) {
console.log(response.data) console.log(response.data)
if (response.data.saveStatus == 0) if (response.data.saveStatus == 0) {
{
$scope.errorMessage = response.data.error_message; $scope.errorMessage = response.data.error_message;
$("#packageCreationFailed").fadeIn(); $("#packageCreationFailed").fadeIn();
$("#packageCreated").hide(); $("#packageCreated").hide();
} } else {
else{
$("#packageCreationFailed").hide(); $("#packageCreationFailed").hide();
$("#packageCreated").fadeIn(); $("#packageCreated").fadeIn();
$scope.createdPackage = $scope.packageName; $scope.createdPackage = $scope.packageName;
@@ -94,6 +93,7 @@ app.controller('createPackage', function($scope,$http) {
} }
function cantLoadInitialDatas(response) { function cantLoadInitialDatas(response) {
console.log("not good"); console.log("not good");
} }
@@ -107,7 +107,6 @@ app.controller('createPackage', function($scope,$http) {
/* Java script code to to create Pacakge ends here */ /* Java script code to to create Pacakge ends here */
/* Java script code to delete Pacakge */ /* Java script code to delete Pacakge */
@@ -117,23 +116,22 @@ $("#deleteSuccess").hide();
$("#deletePackageButton").hide(); $("#deletePackageButton").hide();
app.controller('deletePackage', function($scope,$http) { app.controller('deletePackage', function ($scope, $http) {
$scope.deletePackage = function(){ $scope.deletePackage = function () {
$("#deletePackageButton").fadeIn(); $("#deletePackageButton").fadeIn();
}; };
$scope.deletePackageFinal = function(){ $scope.deletePackageFinal = function () {
var packageName = $scope.packageToBeDeleted; var packageName = $scope.packageToBeDeleted;
url = "/packages/submitDelete"; url = "/packages/submitDelete";
var data = { var data = {
@@ -141,26 +139,24 @@ app.controller('deletePackage', function($scope,$http) {
}; };
var config = { var config = {
headers : { headers: {
'X-CSRFToken': getCookie('csrftoken') 'X-CSRFToken': getCookie('csrftoken')
} }
}; };
$http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) { function ListInitialDatas(response) {
console.log(response.data) console.log(response.data)
if (response.data.deleteStatus == 0) if (response.data.deleteStatus == 0) {
{
$scope.errorMessage = response.data.error_message; $scope.errorMessage = response.data.error_message;
$("#deleteFailure").fadeIn(); $("#deleteFailure").fadeIn();
$("#deleteSuccess").hide(); $("#deleteSuccess").hide();
$("#deletePackageButton").hide(); $("#deletePackageButton").hide();
} } else {
else{
$("#deleteFailure").hide(); $("#deleteFailure").hide();
$("#deleteSuccess").fadeIn(); $("#deleteSuccess").fadeIn();
$("#deletePackageButton").hide(); $("#deletePackageButton").hide();
@@ -170,6 +166,7 @@ app.controller('deletePackage', function($scope,$http) {
} }
function cantLoadInitialDatas(response) { function cantLoadInitialDatas(response) {
console.log("not good"); console.log("not good");
} }
@@ -180,11 +177,9 @@ app.controller('deletePackage', function($scope,$http) {
}); });
/* Java script code to delete package ends here */ /* Java script code to delete package ends here */
/* Java script code modify package */ /* Java script code modify package */
$("#packageDetailsToBeModified").hide(); $("#packageDetailsToBeModified").hide();
@@ -194,9 +189,9 @@ $("#modifyButton").hide();
$("#packageLoading").hide(); $("#packageLoading").hide();
$("#successfullyModified").hide(); $("#successfullyModified").hide();
app.controller('modifyPackages', function($scope,$http) { app.controller('modifyPackages', function ($scope, $http) {
$scope.fetchDetails = function(){ $scope.fetchDetails = function () {
$("#packageLoading").show(); $("#packageLoading").show();
$("#successfullyModified").hide(); $("#successfullyModified").hide();
@@ -212,18 +207,17 @@ app.controller('modifyPackages', function($scope,$http) {
}; };
var config = { var config = {
headers : { headers: {
'X-CSRFToken': getCookie('csrftoken') 'X-CSRFToken': getCookie('csrftoken')
} }
}; };
$http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) { function ListInitialDatas(response) {
if (response.data.modifyStatus == 0) if (response.data.modifyStatus === 0) {
{
$scope.errorMessage = response.data.error_message; $scope.errorMessage = response.data.error_message;
$("#modifyFailure").fadeIn(); $("#modifyFailure").fadeIn();
$("#modifySuccess").hide(); $("#modifySuccess").hide();
@@ -231,8 +225,7 @@ app.controller('modifyPackages', function($scope,$http) {
$("#packageLoading").hide(); $("#packageLoading").hide();
} } else {
else{
$("#modifyButton").show(); $("#modifyButton").show();
$scope.diskSpace = response.data.diskSpace; $scope.diskSpace = response.data.diskSpace;
$scope.bandwidth = response.data.bandwidth; $scope.bandwidth = response.data.bandwidth;
@@ -241,7 +234,13 @@ app.controller('modifyPackages', function($scope,$http) {
$scope.emails = response.data.emails; $scope.emails = response.data.emails;
$scope.allowedDomains = response.data.allowedDomains; $scope.allowedDomains = response.data.allowedDomains;
$scope.modifyButton = "Save Details" if (response.data.allowFullDomain === 1) {
$scope.allowFullDomain = true;
} else {
$scope.allowFullDomain = false;
}
$scope.modifyButton = "Save Details";
$("#packageDetailsToBeModified").fadeIn(); $("#packageDetailsToBeModified").fadeIn();
@@ -250,12 +249,11 @@ app.controller('modifyPackages', function($scope,$http) {
$("#packageLoading").hide(); $("#packageLoading").hide();
} }
} }
function cantLoadInitialDatas(response) { function cantLoadInitialDatas(response) {
console.log("not good"); console.log("not good");
} }
@@ -263,7 +261,6 @@ app.controller('modifyPackages', function($scope,$http) {
}; };
$scope.modifyPackageFunc = function () { $scope.modifyPackageFunc = function () {
var packageName = $scope.packageToBeModified; var packageName = $scope.packageToBeModified;
@@ -283,27 +280,27 @@ app.controller('modifyPackages', function($scope,$http) {
var data = { var data = {
packageName: packageName, packageName: packageName,
diskSpace:diskSpace, diskSpace: diskSpace,
bandwidth:bandwidth, bandwidth: bandwidth,
ftpAccounts:ftpAccounts, ftpAccounts: ftpAccounts,
dataBases:dataBases, dataBases: dataBases,
emails:emails, emails: emails,
allowedDomains:$scope.allowedDomains, allowedDomains: $scope.allowedDomains,
allowFullDomain: $scope.allowFullDomain
}; };
var config = { var config = {
headers : { headers: {
'X-CSRFToken': getCookie('csrftoken') 'X-CSRFToken': getCookie('csrftoken')
} }
}; };
$http.post(url, data,config).then(ListInitialDatas, cantLoadInitialDatas); $http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) { function ListInitialDatas(response) {
if (response.data.saveStatus == 0) if (response.data.saveStatus === 0) {
{
$scope.errorMessage = response.data.error_message; $scope.errorMessage = response.data.error_message;
$("#modifyFailure").fadeIn(); $("#modifyFailure").fadeIn();
$("#modifySuccess").hide(); $("#modifySuccess").hide();
@@ -311,8 +308,7 @@ app.controller('modifyPackages', function($scope,$http) {
$("#packageLoading").hide(); $("#packageLoading").hide();
} } else {
else{
$("#modifyButton").hide(); $("#modifyButton").hide();
$("#successfullyModified").fadeIn(); $("#successfullyModified").fadeIn();
@@ -321,22 +317,215 @@ app.controller('modifyPackages', function($scope,$http) {
$scope.packageModified = packageName; $scope.packageModified = packageName;
} }
} }
function cantLoadInitialDatas(response) { function cantLoadInitialDatas(response) {
console.log("not good"); console.log("not good");
} }
}; };
}); });
/* Java script code to Modify Pacakge ends here */ /* Java script code to Modify Pacakge ends here */
app.controller('listPackageTables', function ($scope, $http) {
$scope.cyberpanelLoading = true;
$scope.populateCurrentRecords = function () {
$scope.cyberpanelLoading = false;
url = "/packages/fetchPackagesTable";
var data = {};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.status === 1) {
$scope.records = JSON.parse(response.data.data);
new PNotify({
title: 'Success!',
text: 'Packages successfully fetched!',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
$scope.populateCurrentRecords();
$scope.deletePackageFinal = function (packageToBeDeleted) {
$scope.cyberpanelLoading = false;
url = "/packages/submitDelete";
var data = {
packageName: packageToBeDeleted,
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.status === 1) {
$scope.populateCurrentRecords();
new PNotify({
title: 'Success!',
text: 'Package successfully deleted!',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
$scope.editInitial = function (package, diskSpace, bandwidth,
emailAccounts, dataBases, ftpAccounts, allowedDomains, allowFullDomain) {
$scope.name = package;
$scope.diskSpace = diskSpace;
$scope.bandwidth = bandwidth;
$scope.emails = emailAccounts;
$scope.dataBases = dataBases;
$scope.ftpAccounts = ftpAccounts;
$scope.allowedDomains = allowedDomains;
$scope.allowFullDomain = allowFullDomain;
if (allowFullDomain === 1) {
$scope.allowFullDomain = true;
} else {
$scope.allowFullDomain = false;
}
};
$scope.saveChanges = function () {
var packageName = $scope.name;
var diskSpace = $scope.diskSpace;
var bandwidth = $scope.bandwidth;
var ftpAccounts = $scope.ftpAccounts;
var dataBases = $scope.dataBases;
var emails = $scope.emails;
url = "/packages/saveChanges";
var data = {
packageName: packageName,
diskSpace: diskSpace,
bandwidth: bandwidth,
ftpAccounts: ftpAccounts,
dataBases: dataBases,
emails: emails,
allowedDomains: $scope.allowedDomains,
allowFullDomain: $scope.allowFullDomain
};
var config = {
headers: {
'X-CSRFToken': getCookie('csrftoken')
}
};
$http.post(url, data, config).then(ListInitialDatas, cantLoadInitialDatas);
function ListInitialDatas(response) {
$scope.cyberpanelLoading = true;
if (response.data.saveStatus === 1) {
$scope.populateCurrentRecords();
new PNotify({
title: 'Success!',
text: 'Package successfully updated!',
type: 'success'
});
} else {
new PNotify({
title: 'Error!',
text: response.data.error_message,
type: 'error'
});
}
}
function cantLoadInitialDatas(response) {
$scope.cyberpanelLoading = true;
new PNotify({
title: 'Error!',
text: 'Could not connect to server, please refresh this page.',
type: 'error'
});
}
};
});

File diff suppressed because it is too large Load Diff

View File

@@ -286,7 +286,6 @@ app.controller('listWebsites', function ($scope, $http) {
} else { } else {
$("#listFail").fadeIn(); $("#listFail").fadeIn();
$scope.errorMessage = response.data.error_message; $scope.errorMessage = response.data.error_message;
console.log(response.data);
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -66,6 +66,15 @@
</div> </div>
</div> </div>
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="listUsers" type="checkbox" value="">
{% trans "List Users" %}
</label>
</div>
</div>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9"> <div class="col-sm-9">
<div class="checkbox"> <div class="checkbox">
<label> <label>
@@ -145,6 +154,15 @@
</div> </div>
</div> </div>
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="listPackages" type="checkbox" value="">
{% trans "List Packages" %}
</label>
</div>
</div>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9"> <div class="col-sm-9">
<div class="checkbox"> <div class="checkbox">
<label> <label>
@@ -246,6 +264,15 @@
</div> </div>
</div> </div>
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="listEmails" type="checkbox" value="">
{% trans "List Emails" %}
</label>
</div>
</div>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9"> <div class="col-sm-9">
<div class="checkbox"> <div class="checkbox">
<label> <label>

View File

@@ -0,0 +1,136 @@
{% extends "baseTemplate/index.html" %}
{% load i18n %}
{% block title %}{% trans "List Users - CyberPanel" %}{% endblock %}
{% block content %}
{% load static %}
{% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} -->
<div class="container">
<div id="page-title">
<h2>{% trans "List Users" %}</h2>
<p>{% trans "List Users that you own." %}</p>
</div>
<div ng-controller="listTableUsers" class="panel">
<div class="panel-body">
<h3 class="content-box-header">
{% trans "List Users" %} <img ng-hide="cyberpanelLoading" src="{% static 'images/loading.gif' %}">
</h3>
<div class="example-box-wrapper">
<!------ List of records --------------->
<div class="form-group">
<div class="col-sm-12">
<table class="table">
<thead>
<tr>
<th>{% trans "Username" %}</th>
<th>{% trans "Websites Limit" %}</th>
<th>{% trans "Disk Usage" %}</th>
<th>{% trans "ACL" %}</th>
<th>{% trans "Owner" %}</th>
<th>{% trans "Actions" %}</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="record in records track by $index">
<td ng-bind="record.name"></td>
<td ng-bind="record.websites"></td>
<td ng-bind="record.diskUsage"></td>
<td ng-bind="record.acl"></td>
<td ng-bind="record.owner"></td>
<td>
<a data-toggle="modal" data-target="#settings"
ng-click="editInitial(record.name)"
class="btn btn-border btn-alt border-purple btn-link font-purple" href="#"
title=""><span>{% trans 'Edit' %}</span></a>
<a ng-click="deleteUserFinal(record.name)"
class="btn btn-border btn-alt border-red btn-link font-red" href="#"
title=""><span>{% trans 'Delete' %}</span></a>
<!--- Modal --->
<div id="settings" class="modal fade" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">&times;
</button>
<h4 class="modal-title">Edit User
<img ng-hide="cyberpanelLoading"
src="{% static 'images/loading.gif' %}">
</h4>
</div>
<div class="modal-body">
<form name="containerSettingsForm" action="/"
class="form-horizontal">
<div ng-hide="installationDetailsForm" class="form-group">
<label class="col-sm-3 control-label">{% trans "Name" %}</label>
<div class="col-sm-6">
<input name="name" type="text" class="form-control"
ng-model="name" readonly>
</div>
</div>
<hr>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "New Owner" %} </label>
<div class="col-sm-6">
<select ng-change="saveResellerChanges()"
ng-model="$parent.newOwner"
class="form-control">
{% for items in resellerPrivUsers %}
<option>{{ items }}</option>
{% endfor %}
</select>
</div>
</div>
<hr>
<div class="form-group">
<label class="col-sm-3 control-label">{% trans "Select ACL" %} </label>
<div class="col-sm-6">
<select ng-change="changeACLFunc()"
ng-model="$parent.selectedACL"
class="form-control">
{% for items in aclNames %}
<option>{{ items }}</option>
{% endfor %}
</select>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<!--- Modal End--->
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!------ List of records --------------->
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -3,17 +3,17 @@
{% block title %}{% trans "Modify an ACL - CyberPanel" %}{% endblock %} {% block title %}{% trans "Modify an ACL - CyberPanel" %}{% endblock %}
{% block content %} {% block content %}
{% load static %} {% load static %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
<!-- Current language: {{ LANGUAGE_CODE }} --> <!-- Current language: {{ LANGUAGE_CODE }} -->
<div class="container"> <div class="container">
<div id="page-title"> <div id="page-title">
<h2>{% trans "Modify an ACL" %}</h2> <h2>{% trans "Modify an ACL" %}</h2>
<p>{% trans "On this page you can modify an existing ACL." %}</p> <p>{% trans "On this page you can modify an existing ACL." %}</p>
</div> </div>
<div class="panel"> <div class="panel">
<div ng-controller="modifyACLCtrl" class="panel-body"> <div ng-controller="modifyACLCtrl" class="panel-body">
<h3 class="content-box-header"> <h3 class="content-box-header">
{% trans "ACL Details" %} - <img ng-hide="aclLoading" src="{% static 'images/loading.gif' %}"> {% trans "ACL Details" %} - <img ng-hide="aclLoading" src="{% static 'images/loading.gif' %}">
@@ -69,7 +69,15 @@
</label> </label>
</div> </div>
</div> </div>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="listUsers" type="checkbox" value="">
{% trans "List Users" %}
</label>
</div>
</div>
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-9"> <div class="col-sm-9">
<div class="checkbox"> <div class="checkbox">
@@ -79,7 +87,6 @@
</label> </label>
</div> </div>
</div> </div>
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-9"> <div class="col-sm-9">
<div class="checkbox"> <div class="checkbox">
@@ -151,6 +158,15 @@
</div> </div>
</div> </div>
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="listPackages" type="checkbox" value="">
{% trans "List Packages" %}
</label>
</div>
</div>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9"> <div class="col-sm-9">
<div class="checkbox"> <div class="checkbox">
<label> <label>
@@ -252,6 +268,15 @@
</div> </div>
</div> </div>
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-9">
<div class="checkbox">
<label>
<input ng-model="listEmails" type="checkbox" value="">
{% trans "List Emails" %}
</label>
</div>
</div>
<label class="col-sm-3 control-label"></label>
<div class="col-sm-9"> <div class="col-sm-9">
<div class="checkbox"> <div class="checkbox">
<label> <label>
@@ -357,7 +382,7 @@
<div class="checkbox"> <div class="checkbox">
<label> <label>
<input ng-model="scheDuleBackups" type="checkbox" value=""> <input ng-model="scheDuleBackups" type="checkbox" value="">
{% trans "Achedule Back up" %} {% trans "Schedule Back up" %}
</label> </label>
</div> </div>
</div> </div>
@@ -407,22 +432,21 @@
<div ng-hide="aclDetails" class="form-group"> <div ng-hide="aclDetails" class="form-group">
<label class="col-sm-3 control-label"></label> <label class="col-sm-3 control-label"></label>
<div class="col-sm-4"> <div class="col-sm-4">
<button type="button" ng-click="saveChanges()" class="btn btn-primary btn-lg">{% trans "Save Changes" %} <img ng-hide="aclLoading" src="{% static 'images/loading.gif' %}"></button> <button type="button" ng-click="saveChanges()"
class="btn btn-primary btn-lg">{% trans "Save Changes" %} <img
ng-hide="aclLoading" src="{% static 'images/loading.gif' %}"></button>
</div> </div>
</div> </div>
</form> </form>
</div>
</div>
</div>
</div> </div>
</div>
</div>
</div>
{% endblock %} {% endblock %}

View File

@@ -30,4 +30,6 @@ urlpatterns = [
url(r'^saveResellerChanges$',views.saveResellerChanges,name="saveResellerChanges"), url(r'^saveResellerChanges$',views.saveResellerChanges,name="saveResellerChanges"),
url(r'^apiAccess$', views.apiAccess, name="apiAccess"), url(r'^apiAccess$', views.apiAccess, name="apiAccess"),
url(r'^saveChangesAPIAccess$', views.saveChangesAPIAccess, name="saveChangesAPIAccess"), url(r'^saveChangesAPIAccess$', views.saveChangesAPIAccess, name="saveChangesAPIAccess"),
url(r'^listUsers$', views.listUsers, name="listUsers"),
url(r'^fetchTableUsers$', views.fetchTableUsers, name="fetchTableUsers"),
] ]

View File

@@ -9,7 +9,7 @@ import json
from plogical import hashPassword from plogical import hashPassword
from plogical import CyberCPLogFileWriter as logging from plogical import CyberCPLogFileWriter as logging
from plogical.acl import ACLManager from plogical.acl import ACLManager
from plogical.virtualHostUtilities import virtualHostUtilities
# Create your views here. # Create your views here.
@@ -68,6 +68,7 @@ def createUser(request):
logging.CyberCPLogFileWriter.writeToFile(str(msg)) logging.CyberCPLogFileWriter.writeToFile(str(msg))
return redirect(loadLoginPage) return redirect(loadLoginPage)
def apiAccess(request): def apiAccess(request):
try: try:
userID = request.session['userID'] userID = request.session['userID']
@@ -144,7 +145,6 @@ def submitUserCreation(request):
password = hashPassword.hash_password(password) password = hashPassword.hash_password(password)
currentAdmin = Administrator.objects.get(pk=userID) currentAdmin = Administrator.objects.get(pk=userID)
if ACLManager.websitesLimitCheck(currentAdmin, websitesLimit) == 0: if ACLManager.websitesLimitCheck(currentAdmin, websitesLimit) == 0:
data_ret = {'status': 0, 'createStatus': 0, data_ret = {'status': 0, 'createStatus': 0,
'error_message': "You've reached maximum websites limit as a reseller."} 'error_message': "You've reached maximum websites limit as a reseller."}
@@ -370,6 +370,12 @@ def submitUserDeletion(request):
if ACLManager.checkUserOwnerShip(currentACL, currentUser, userInQuestion): if ACLManager.checkUserOwnerShip(currentACL, currentUser, userInQuestion):
user = Administrator.objects.get(userName=accountUsername) user = Administrator.objects.get(userName=accountUsername)
childUsers = Administrator.objects.filter(owner=user.pk)
for items in childUsers:
items.delete()
user.delete() user.delete()
data_ret = {'status': 1, 'deleteStatus': 1, 'error_message': 'None'} data_ret = {'status': 1, 'deleteStatus': 1, 'error_message': 'None'}
@@ -422,6 +428,7 @@ def createACLFunc(request):
## User Management ## User Management
createNewUser=int(data['createNewUser']), createNewUser=int(data['createNewUser']),
listUsers=int(data['listUsers']),
resellerCenter=int(data['resellerCenter']), resellerCenter=int(data['resellerCenter']),
deleteUser=int(data['deleteUser']), deleteUser=int(data['deleteUser']),
changeUserACL=int(data['changeUserACL']), changeUserACL=int(data['changeUserACL']),
@@ -436,6 +443,7 @@ def createACLFunc(request):
## Package Management ## Package Management
createPackage=int(data['createPackage']), createPackage=int(data['createPackage']),
listPackages=int(data['listPackages']),
deletePackage=int(data['deletePackage']), deletePackage=int(data['deletePackage']),
modifyPackage=int(data['modifyPackage']), modifyPackage=int(data['modifyPackage']),
@@ -455,6 +463,7 @@ def createACLFunc(request):
## Email Management ## Email Management
createEmail=int(data['createEmail']), createEmail=int(data['createEmail']),
listEmails=int(data['listEmails']),
deleteEmail=int(data['deleteEmail']), deleteEmail=int(data['deleteEmail']),
emailForwarding=int(data['emailForwarding']), emailForwarding=int(data['emailForwarding']),
changeEmailPassword=int(data['changeEmailPassword']), changeEmailPassword=int(data['changeEmailPassword']),
@@ -507,6 +516,7 @@ def deleteACL(request):
except KeyError: except KeyError:
return redirect(loadLoginPage) return redirect(loadLoginPage)
def deleteACLFunc(request): def deleteACLFunc(request):
try: try:
val = request.session['userID'] val = request.session['userID']
@@ -521,7 +531,8 @@ def deleteACLFunc(request):
acl.delete() acl.delete()
finalResponse = {'status': 1} finalResponse = {'status': 1}
else: else:
finalResponse = {'status': 0, 'errorMesssage': 'This ACL is currently in used by existing users.', 'error_message': 'This ACL is currently in used by existing users.'} finalResponse = {'status': 0, 'errorMesssage': 'This ACL is currently in used by existing users.',
'error_message': 'This ACL is currently in used by existing users.'}
else: else:
return ACLManager.loadErrorJson() return ACLManager.loadErrorJson()
@@ -566,6 +577,7 @@ def fetchACLDetails(request):
## User Management ## User Management
finalResponse['createNewUser'] = acl.createNewUser finalResponse['createNewUser'] = acl.createNewUser
finalResponse['listUsers'] = acl.listUsers
finalResponse['resellerCenter'] = acl.resellerCenter finalResponse['resellerCenter'] = acl.resellerCenter
finalResponse['deleteUser'] = acl.deleteUser finalResponse['deleteUser'] = acl.deleteUser
finalResponse['changeUserACL'] = acl.changeUserACL finalResponse['changeUserACL'] = acl.changeUserACL
@@ -579,8 +591,8 @@ def fetchACLDetails(request):
## Package Management ## Package Management
finalResponse['createPackage'] = acl.createPackage finalResponse['createPackage'] = acl.createPackage
finalResponse['listPackages'] = acl.listPackages
finalResponse['deletePackage'] = acl.deletePackage finalResponse['deletePackage'] = acl.deletePackage
finalResponse['modifyPackage'] = acl.modifyPackage finalResponse['modifyPackage'] = acl.modifyPackage
@@ -600,6 +612,7 @@ def fetchACLDetails(request):
## Email Management ## Email Management
finalResponse['createEmail'] = acl.createEmail finalResponse['createEmail'] = acl.createEmail
finalResponse['listEmails'] = acl.listEmails
finalResponse['deleteEmail'] = acl.deleteEmail finalResponse['deleteEmail'] = acl.deleteEmail
finalResponse['emailForwarding'] = acl.emailForwarding finalResponse['emailForwarding'] = acl.emailForwarding
finalResponse['changeEmailPassword'] = acl.changeEmailPassword finalResponse['changeEmailPassword'] = acl.changeEmailPassword
@@ -655,6 +668,7 @@ def submitACLModifications(request):
## User Management ## User Management
acl.createNewUser = int(data['createNewUser']) acl.createNewUser = int(data['createNewUser'])
acl.listUsers = int(data['listUsers'])
acl.resellerCenter = int(data['resellerCenter']) acl.resellerCenter = int(data['resellerCenter'])
acl.deleteUser = int(data['deleteUser']) acl.deleteUser = int(data['deleteUser'])
acl.changeUserACL = int(data['changeUserACL']) acl.changeUserACL = int(data['changeUserACL'])
@@ -669,6 +683,7 @@ def submitACLModifications(request):
## Package Management ## Package Management
acl.createPackage = int(data['createPackage']) acl.createPackage = int(data['createPackage'])
acl.listPackages = int(data['listPackages'])
acl.deletePackage = int(data['deletePackage']) acl.deletePackage = int(data['deletePackage'])
acl.modifyPackage = int(data['modifyPackage']) acl.modifyPackage = int(data['modifyPackage'])
@@ -688,6 +703,7 @@ def submitACLModifications(request):
## Email Management ## Email Management
acl.createEmail = int(data['createEmail']) acl.createEmail = int(data['createEmail'])
acl.listEmails = int(data['listEmails'])
acl.deleteEmail = int(data['deleteEmail']) acl.deleteEmail = int(data['deleteEmail'])
acl.emailForwarding = int(data['emailForwarding']) acl.emailForwarding = int(data['emailForwarding'])
acl.changeEmailPassword = int(data['changeEmailPassword']) acl.changeEmailPassword = int(data['changeEmailPassword'])
@@ -850,16 +866,21 @@ def saveResellerChanges(request):
userToBeModified = Administrator.objects.get(userName=data['userToBeModified']) userToBeModified = Administrator.objects.get(userName=data['userToBeModified'])
newOwner = Administrator.objects.get(userName=data['newOwner']) newOwner = Administrator.objects.get(userName=data['newOwner'])
try:
if ACLManager.websitesLimitCheck(newOwner, data['websitesLimit'], userToBeModified) == 0: if ACLManager.websitesLimitCheck(newOwner, data['websitesLimit'], userToBeModified) == 0:
finalResponse = {'status': 0, finalResponse = {'status': 0,
'errorMessage': "You've reached maximum websites limit as a reseller.", 'errorMessage': "You've reached maximum websites limit as a reseller.",
'error_message': "You've reached maximum websites limit as a reseller."} 'error_message': "You've reached maximum websites limit as a reseller."}
json_data = json.dumps(finalResponse) json_data = json.dumps(finalResponse)
return HttpResponse(json_data) return HttpResponse(json_data)
except:
pass
userToBeModified.owner = newOwner.pk userToBeModified.owner = newOwner.pk
try:
userToBeModified.initWebsitesLimit = data['websitesLimit'] userToBeModified.initWebsitesLimit = data['websitesLimit']
except:
pass
userToBeModified.save() userToBeModified.save()
finalResponse = {'status': 1} finalResponse = {'status': 1}
@@ -869,3 +890,84 @@ def saveResellerChanges(request):
finalResponse = {'status': 0, 'errorMessage': str(msg), 'error_message': str(msg)} finalResponse = {'status': 0, 'errorMessage': str(msg), 'error_message': str(msg)}
json_data = json.dumps(finalResponse) json_data = json.dumps(finalResponse)
return HttpResponse(json_data) return HttpResponse(json_data)
def listUsers(request):
try:
userID = request.session['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:
resellerPrivUsers = ACLManager.userWithResellerPriv(userID)
elif currentACL['resellerCenter'] == 1:
resellerPrivUsers = ACLManager.userWithResellerPriv(userID)
else:
resellerPrivUsers = []
if currentACL['admin'] == 1:
return render(request, 'userManagment/listUsers.html', {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers})
elif currentACL['listUsers'] == 1:
return render(request, 'userManagment/listUsers.html', {'aclNames': aclNames, 'resellerPrivUsers': resellerPrivUsers})
else:
return ACLManager.loadError()
except KeyError:
return redirect(loadLoginPage)
def fetchTableUsers(request):
try:
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] == 1:
users = ACLManager.fetchTableUserObjects(userID)
elif currentACL['listUsers'] == 1:
users = ACLManager.fetchTableUserObjects(userID)
else:
return ACLManager.loadErrorJson()
json_data = "["
checker = 0
for items in users:
diskUsage = 0
for webs in items.websites_set.all():
diskUsage = virtualHostUtilities.getDiskUsage("/home/" + webs.domain, webs.package.diskSpace)[0] + diskUsage
owner = Administrator.objects.get(pk=items.owner)
dic = {'id': items.pk,
'name': items.userName,
'owner': owner.userName,
'acl': items.acl.name,
'diskUsage': '%sMB' % str(diskUsage),
'websites': items.initWebsitesLimit
}
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 KeyError:
return redirect(loadLoginPage)