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 "On this page you can configure parameters regarding how email verification is performed for " %}{{ domain }}
+
+ {% trans "On this page you can manage your email lists (Delete, Verify, Add More Emails)." %}
-
- {% trans "On this page you can manage your email lists (Delete, Verify, Add More Emails)." %}
+
+