diff --git a/CyberCP/secMiddleware.py b/CyberCP/secMiddleware.py index 783080e2b..7cb0562b7 100755 --- a/CyberCP/secMiddleware.py +++ b/CyberCP/secMiddleware.py @@ -73,7 +73,7 @@ class secMiddleware: or key == 'imageByPass' or key == 'passwordByPass' or key == 'cronCommand' \ or key == 'emailMessage' or key == 'configData' or key == 'rewriteRules' \ or key == 'modSecRules' or key == 'recordContentTXT' or key == 'SecAuditLogRelevantStatus' \ - or key == 'fileContent' or key == 'commands' or key == 'gitHost': + or key == 'fileContent' or key == 'commands' or key == 'gitHost' or key == 'ipv6': continue if value.find(';') > -1 or value.find('&&') > -1 or value.find('|') > -1 or value.find('...') > -1 \ or value.find("`") > -1 or value.find("$") > -1 or value.find("(") > -1 or value.find(")") > -1 \ diff --git a/emailMarketing/emailMarketing.py b/emailMarketing/emailMarketing.py index 473297b8c..67a59bb19 100755 --- a/emailMarketing/emailMarketing.py +++ b/emailMarketing/emailMarketing.py @@ -81,6 +81,49 @@ class emailMarketing(multi.Thread): logging.CyberCPLogFileWriter.statusWriter(self.extraArgs['tempStatusPath'], str(msg) +'. [404]') return 0 + def findNextIP(self): + try: + if self.delayData['rotation'] == 'Disable': + return None + elif self.delayData['rotation'] == 'IPv4': + if self.delayData['ipv4'].find(',') == -1: + return self.delayData['ipv4'] + else: + ipv4s = self.delayData['ipv4'].split(',') + + if self.currentIP == '': + return ipv4s[0] + else: + returnCheck = 0 + + for items in ipv4s: + if returnCheck == 1: + return items + if items == self.currentIP: + returnCheck = 1 + + return ipv4s[0] + else: + if self.delayData['ipv6'].find(',') == -1: + return self.delayData['ipv6'] + else: + ipv6 = self.delayData['ipv6'].split(',') + + if self.currentIP == '': + return ipv6[0] + else: + returnCheck = 0 + + for items in ipv6: + if returnCheck == 1: + return items + if items == self.currentIP: + returnCheck = 1 + return ipv6[0] + except BaseException as msg: + logging.CyberCPLogFileWriter.writeToFile(str(msg)) + return None + def verificationJob(self): try: @@ -97,6 +140,16 @@ class emailMarketing(multi.Thread): counter = 1 allEmailsInList = verificationList.emailsinlist_set.all() + configureVerifyPath = '/home/cyberpanel/configureVerify' + finalPath = '%s/%s' % (configureVerifyPath, domain) + + counterGlobal = 0 + + import json + if os.path.exists(finalPath): + self.delayData = json.loads(open(finalPath, 'r').read()) + + self.currentIP = '' for items in allEmailsInList: if items.verificationStatus != 'Verified': @@ -109,7 +162,53 @@ class emailMarketing(multi.Thread): # Get local server hostname host = socket.gethostname() - server = smtplib.SMTP() + if os.path.exists(finalPath): + try: + logging.CyberCPLogFileWriter.writeToFile('Checking if delay is enabled for verification..') + delay = self.delayData['delay'] + if delay == 'Enable': + logging.CyberCPLogFileWriter.writeToFile( + 'It seems delay is enabled...') + if counterGlobal == int(self.delayData['delayAfter']): + logging.CyberCPLogFileWriter.writeToFile( + 'Sleeping for %s seconds...' % (self.delayData['delayTime'])) + time.sleep(int(self.delayData['delayTime'])) + counterGlobal = 0 + self.currentIP = self.findNextIP() + + logging.CyberCPLogFileWriter.writeToFile( + 'IP in use: %s.' % (str(self.currentIP))) + + if self.currentIP == None: + server = smtplib.SMTP() + else: + server = smtplib.SMTP(self.currentIP) + else: + + if self.currentIP == '': + self.currentIP = self.findNextIP() + + logging.CyberCPLogFileWriter.writeToFile( + 'IP in use: %s.' % (str(self.currentIP))) + + if self.currentIP == None: + server = smtplib.SMTP() + else: + server = smtplib.SMTP(self.currentIP) + else: + logging.CyberCPLogFileWriter.writeToFile( + 'Delay not configured..') + server = smtplib.SMTP() + except BaseException as msg: + logging.CyberCPLogFileWriter.writeToFile( + 'Delay not configured.. Error: %s' % (str(msg))) + server = smtplib.SMTP() + else: + logging.CyberCPLogFileWriter.writeToFile( + 'Delay not configured..') + server = smtplib.SMTP() + + server.set_debuglevel(0) # SMTP Conversation @@ -126,7 +225,7 @@ class emailMarketing(multi.Thread): break else: items.verificationStatus = 'Verification Failed' - logging.CyberCPLogFileWriter.writeToFile(email + " verification failed with error: " + message) + logging.CyberCPLogFileWriter.writeToFile(email + " verification failed with error: " + message.decode()) items.save() logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, str(counter) + ' emails verified so far..') @@ -137,6 +236,9 @@ class emailMarketing(multi.Thread): counter = counter + 1 logging.CyberCPLogFileWriter.writeToFile(str(msg)) + + counterGlobal = counterGlobal + 1 + logging.CyberCPLogFileWriter.statusWriter(tempStatusPath, str(counter) + ' emails successfully verified. [200]') except BaseException as msg: verificationList = EmailLists.objects.get(listName=self.extraArgs['listName']) diff --git a/emailMarketing/emailMarketingManager.py b/emailMarketing/emailMarketingManager.py index 6309f0ad0..389f0dfc8 100755 --- a/emailMarketing/emailMarketingManager.py +++ b/emailMarketing/emailMarketingManager.py @@ -181,6 +181,58 @@ class EmailMarketingManager: except KeyError as msg: return redirect(loadLoginPage) + def configureVerify(self): + try: + 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: + return ACLManager.loadError() + + if emACL.checkIfEMEnabled(admin.userName) == 0: + return ACLManager.loadError() + + return render(self.request, 'emailMarketing/configureVerify.html', {'domain': self.domain}) + except KeyError as msg: + return redirect(loadLoginPage) + + def saveConfigureVerify(self): + try: + + userID = self.request.session['userID'] + admin = Administrator.objects.get(pk=userID) + + if emACL.checkIfEMEnabled(admin.userName) == 0: + return ACLManager.loadErrorJson() + + data = json.loads(self.request.body) + + domain = data['domain'] + + configureVerifyPath = '/home/cyberpanel/configureVerify' + + import os + + if not os.path.exists(configureVerifyPath): + os.mkdir(configureVerifyPath) + + finalPath = '%s/%s' % (configureVerifyPath, domain) + + writeToFile = open(finalPath, 'w') + writeToFile.write(self.request.body.decode()) + writeToFile.close() + + data_ret = {"status": 1} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + except BaseException as msg: + final_dic = {'status': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + def fetchEmails(self): try: diff --git a/emailMarketing/static/emailMarketing/emailMarketing.js b/emailMarketing/static/emailMarketing/emailMarketing.js index 28c75e3a5..726addba8 100755 --- a/emailMarketing/static/emailMarketing/emailMarketing.js +++ b/emailMarketing/static/emailMarketing/emailMarketing.js @@ -1330,4 +1330,87 @@ app.controller('sendEmailsCTRL', function ($scope, $http, $timeout) { }; }); +app.controller('configureVerify', function ($scope, $http) { + + $scope.cyberPanelLoading = true; + $scope.ipv4Hidden = true; + $scope.ipv6Hidden = true; + $scope.delayHidden = true; + + $scope.delayInitial = function () { + if ($scope.delay === 'Disable') { + $scope.delayHidden = true; + } else { + $scope.delayHidden = false; + } + }; + $scope.rotateInitial = function () { + if ($scope.rotation === 'Disable') { + $scope.rotationHidden = true; + } else if ($scope.rotation === 'IPv4') { + $scope.ipv4Hidden = false; + $scope.ipv6Hidden = true; + } else { + $scope.ipv4Hidden = true; + $scope.ipv6Hidden = false; + } + }; + + $scope.saveChanges = function () { + + $scope.cyberPanelLoading = false; + + url = "/emailMarketing/saveConfigureVerify"; + + var data = { + domain: $("#domainName").text(), + rotation: $scope.rotation, + delay: $scope.delay, + delayAfter: $scope.delayAfter, + delayTime: $scope.delayTime, + ipv4: $scope.ipv4, + ipv6: $scope.ipv6 + }; + + 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: 'Successfully saved verification settings.', + type: 'success' + }); + } else { + new PNotify({ + title: 'Operation Failed!', + text: response.data.error_message, + type: 'error' + }); + } + } + + function cantLoadInitialDatas(response) { + $scope.cyberPanelLoading = false; + new PNotify({ + title: 'Operation Failed!', + text: 'Could not connect to server, please refresh this page', + type: 'error' + }); + + } + + }; +}); + diff --git a/emailMarketing/templates/emailMarketing/configureVerify.html b/emailMarketing/templates/emailMarketing/configureVerify.html new file mode 100755 index 000000000..1423293ac --- /dev/null +++ b/emailMarketing/templates/emailMarketing/configureVerify.html @@ -0,0 +1,99 @@ +{% extends "baseTemplate/index.html" %} +{% load i18n %} +{% block title %}{% trans "Configure Email Verification - CyberPanel" %}{% endblock %} +{% block content %} + + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + + + +
+
+

{% trans "Configure Email Verification" %}

+

{% trans "On this page you can configure parameters regarding how email verification is performed for " %}{{ domain }}

+
+
+
+

+ {% trans "Compose Email Message" %} +

+
+ + +
+ + + +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ + + +
+ +
+ +
+
+ + + +
+ + +
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/emailMarketing/templates/emailMarketing/manageLists.html b/emailMarketing/templates/emailMarketing/manageLists.html index 378649f87..ef03aa58b 100755 --- a/emailMarketing/templates/emailMarketing/manageLists.html +++ b/emailMarketing/templates/emailMarketing/manageLists.html @@ -3,188 +3,207 @@ {% block title %}{% trans "Manage Email Lists - CyberPanel" %}{% endblock %} {% block content %} -{% load static %} -{% get_current_language as LANGUAGE_CODE %} - + {% load static %} + {% get_current_language as LANGUAGE_CODE %} + -
-
-

{% trans "Manage Email Lists" %} - {{ domain }}

-

{% trans "On this page you can manage your email lists (Delete, Verify, Add More Emails)." %}

-
-
-
-

- {% trans "Manage Email Lists" %} -

-
+
+
+

{% trans "Manage Email Lists" %} - {{ domain }}

+

{% trans "On this page you can manage your email lists (Delete, Verify, Add More Emails)." %}

+
+
+
+

+ {% trans "Manage Email Lists" %} +

+
-
+ -
- -
- -
-
+
+ +
+ +
+
-
- -
- - - {% endblock %} \ No newline at end of file diff --git a/emailMarketing/urls.py b/emailMarketing/urls.py index 4d22a9206..6f02cd300 100755 --- a/emailMarketing/urls.py +++ b/emailMarketing/urls.py @@ -4,10 +4,12 @@ urlpatterns = [ url(r'^$', views.emailMarketing, name='emailMarketing'), url(r'^fetchUsers$', views.fetchUsers, name='fetchUsers'), url(r'^enableDisableMarketing$', views.enableDisableMarketing, name='enableDisableMarketing'), + url(r'^saveConfigureVerify$', views.saveConfigureVerify, name='saveConfigureVerify'), url(r'^(?P(.*))/emailLists$', views.createEmailList, name='createEmailList'), url(r'^submitEmailList$', views.submitEmailList, name='submitEmailList'), url(r'^(?P(.*))/manageLists$', views.manageLists, name='manageLists'), url(r'^(?P(.*))/manageSMTP$', views.manageSMTP, name='manageSMTP'), + url(r'^(?P(.*))/configureVerify$', views.configureVerify, name='configureVerify'), url(r'^fetchEmails$', views.fetchEmails, name='fetchEmails'), url(r'^deleteList$', views.deleteList, name='deleteList'), url(r'^emailVerificationJob$', views.emailVerificationJob, name='emailVerificationJob'), diff --git a/emailMarketing/views.py b/emailMarketing/views.py index 3aff6a5ff..704fa9e37 100755 --- a/emailMarketing/views.py +++ b/emailMarketing/views.py @@ -54,6 +54,22 @@ def manageLists(request, domain): except KeyError: return redirect(loadLoginPage) +def configureVerify(request, domain): + try: + userID = request.session['userID'] + emm = EmailMarketingManager(request, domain) + return emm.configureVerify() + except KeyError: + return redirect(loadLoginPage) + +def saveConfigureVerify(request): + try: + userID = request.session['userID'] + emm = EmailMarketingManager(request) + return emm.saveConfigureVerify() + except KeyError: + return redirect(loadLoginPage) + def fetchEmails(request): try: userID = request.session['userID']