diff --git a/dns/dnsManager.py b/dns/dnsManager.py index e8868cc58..c33a1e30e 100755 --- a/dns/dnsManager.py +++ b/dns/dnsManager.py @@ -255,8 +255,6 @@ class DNSManager: if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0: return ACLManager.loadErrorJson('add_status', 0) - - zoneDomain = data['selectedZone'] recordType = data['recordType'] recordName = data['recordName'] @@ -770,7 +768,7 @@ class DNSManager: for zone in sorted(zones, key=lambda v: v['name']): zone_id = zone['id'] - dns_record = cf.zones.dns_records.delete(zone_id, int(id)) + cf.zones.dns_records.delete(zone_id, int(id)) final_dic = {'status': 1, 'delete_status': 1, 'error_message': "None"} final_json = json.dumps(final_dic) @@ -779,4 +777,192 @@ class DNSManager: except BaseException as msg: final_dic = {'status': 0, 'delete_status': 0, 'error_message': str(msg)} final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + + def addDNSRecordCloudFlare(self, userID = None, data = None): + try: + + currentACL = ACLManager.loadedACL(userID) + + if ACLManager.currentContextPermission(currentACL, 'addDeleteRecords') == 0: + return ACLManager.loadErrorJson('add_status', 0) + + zoneDomain = data['selectedZone'] + recordType = data['recordType'] + recordName = data['recordName'] + ttl = int(data['ttl']) + + admin = Administrator.objects.get(pk=userID) + self.admin = admin + if ACLManager.checkOwnershipZone(zoneDomain, admin, currentACL) == 1: + pass + else: + return ACLManager.loadErrorJson() + + ## Get zone + + self.loadCFKeys() + + params = {'name': zoneDomain, 'per_page': 50} + cf = CloudFlare.CloudFlare(email=self.email, token=self.key) + + try: + zones = cf.zones.get(params=params) + except CloudFlare.CloudFlareAPIError as e: + final_json = json.dumps({'status': 0, 'delete_status': 0, 'error_message': str(e), "data": '[]'}) + return HttpResponse(final_json) + + for zone in sorted(zones, key=lambda v: v['name']): + zone = zone['id'] + + value = "" + + if recordType == "A": + + recordContentA = data['recordContentA'] ## IP or ponting value + + if recordName == "@": + value = zoneDomain + ## re.match + elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName, + M | I): + value = recordName + else: + value = recordName + "." + zoneDomain + + DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentA, 0, ttl) + + elif recordType == "MX": + + if recordName == "@": + value = zoneDomain + ## re.match + elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName, + M | I): + value = recordName + else: + value = recordName + "." + zoneDomain + + recordContentMX = data['recordContentMX'] + priority = data['priority'] + + DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentMX, priority, ttl) + + elif recordType == "AAAA": + + if recordName == "@": + value = zoneDomain + ## re.match + elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName, + M | I): + value = recordName + else: + value = recordName + "." + zoneDomain + + recordContentAAAA = data['recordContentAAAA'] ## IP or ponting value + + DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentAAAA, 0, ttl) + + elif recordType == "CNAME": + + if recordName == "@": + value = zoneDomain + ## re.match + elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName, + M | I): + value = recordName + else: + value = recordName + "." + zoneDomain + + recordContentCNAME = data['recordContentCNAME'] ## IP or ponting value + + DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentCNAME, 0, ttl) + + elif recordType == "SPF": + + if recordName == "@": + value = zoneDomain + ## re.match + elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName, + M | I): + value = recordName + else: + value = recordName + "." + zoneDomain + + recordContentSPF = data['recordContentSPF'] ## IP or ponting value + + DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentSPF, 0, ttl) + + elif recordType == "TXT": + + if recordName == "@": + value = zoneDomain + ## re.match + elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName, + M | I): + value = recordName + else: + value = recordName + "." + zoneDomain + + recordContentTXT = data['recordContentTXT'] ## IP or ponting value + + DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentTXT, 0, ttl) + + elif recordType == "SOA": + + recordContentSOA = data['recordContentSOA'] + + DNS.createDNSRecordCloudFlare(cf, zone, recordName, recordType, recordContentSOA, 0, ttl) + + elif recordType == "NS": + + recordContentNS = data['recordContentNS'] + + if recordContentNS == "@": + recordContentNS = "ns1." + zoneDomain + ## re.match + elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', + recordContentNS, M | I): + recordContentNS = recordContentNS + else: + recordContentNS = recordContentNS + "." + zoneDomain + + DNS.createDNSRecordCloudFlare(cf, zone, recordName, recordType, recordContentNS, 0, ttl) + + elif recordType == "SRV": + + if recordName == "@": + value = zoneDomain + ## re.match + elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName, + M | I): + value = recordName + else: + value = recordName + "." + zoneDomain + + recordContentSRV = data['recordContentSRV'] + priority = data['priority'] + + DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentSRV, priority, ttl) + + elif recordType == "CAA": + if recordName == "@": + value = zoneDomain + ## re.match + elif match(r'([\da-z\.-]+\.[a-z\.]{2,12}|[\d\.]+)([\/:?=&#]{1}[\da-z\.-]+)*[\/\?]?', recordName, + M | I): + value = recordName + else: + value = recordName + "." + zoneDomain + recordContentCAA = data['recordContentCAA'] ## IP or ponting value + DNS.createDNSRecordCloudFlare(cf, zone, value, recordType, recordContentCAA, 0, ttl) + + final_dic = {'status': 1, 'add_status': 1, 'error_message': "None"} + final_json = json.dumps(final_dic) + return HttpResponse(final_json) + + except BaseException as msg: + final_dic = {'status': 0, 'add_status': 0, 'error_message': str(msg)} + final_json = json.dumps(final_dic) return HttpResponse(final_json) \ No newline at end of file diff --git a/dns/static/dns/dns.js b/dns/static/dns/dns.js index 73d1609b0..5e3b33732 100755 --- a/dns/static/dns/dns.js +++ b/dns/static/dns/dns.js @@ -763,7 +763,7 @@ app.controller('addModifyDNSRecordsCloudFlare', function ($scope, $http) { $scope.recordsLoading = false; - url = "/dns/addDNSRecord"; + url = "/dns/addDNSRecordCloudFlare"; // Record specific values diff --git a/dns/urls.py b/dns/urls.py index c3d852463..cdbba940b 100755 --- a/dns/urls.py +++ b/dns/urls.py @@ -13,7 +13,7 @@ urlpatterns = [ url(r'^NSCreation',views.NSCreation,name="NSCreation"), url(r'^zoneCreation', views.zoneCreation, name='zoneCreation'), url(r'^getCurrentRecordsForDomain$',views.getCurrentRecordsForDomain,name='getCurrentRecordsForDomain'), - url(r'^addDNSRecord',views.addDNSRecord,name='addDNSRecord'), + url(r'^addDNSRecord$',views.addDNSRecord,name='addDNSRecord'), url(r'^deleteDNSRecord$',views.deleteDNSRecord,name='deleteDNSRecord'), url(r'^deleteDNSZone',views.deleteDNSZone,name='deleteDNSZone'), url(r'^submitZoneDeletion',views.submitZoneDeletion,name='submitZoneDeletion'), @@ -21,6 +21,6 @@ urlpatterns = [ url(r'^saveCFConfigs$', views.saveCFConfigs, name='saveCFConfigs'), url(r'^getCurrentRecordsForDomainCloudFlare$', views.getCurrentRecordsForDomainCloudFlare, name='getCurrentRecordsForDomainCloudFlare'), - url(r'^deleteDNSRecordCloudFlare$', views.deleteDNSRecordCloudFlare, - name='deleteDNSRecordCloudFlare'), + url(r'^deleteDNSRecordCloudFlare$', views.deleteDNSRecordCloudFlare, name='deleteDNSRecordCloudFlare'), + url(r'^addDNSRecordCloudFlare$', views.addDNSRecordCloudFlare,name='addDNSRecordCloudFlare') ] \ No newline at end of file diff --git a/dns/views.py b/dns/views.py index 602cb8fe4..0192cc07b 100755 --- a/dns/views.py +++ b/dns/views.py @@ -208,3 +208,15 @@ def deleteDNSRecordCloudFlare(request): return coreResult except KeyError: return redirect(loadLoginPage) + +def addDNSRecordCloudFlare(request): + try: + userID = request.session['userID'] + + dm = DNSManager() + coreResult = dm.addDNSRecordCloudFlare(userID, json.loads(request.body)) + + return coreResult + + except KeyError: + return redirect(loadLoginPage) diff --git a/plogical/dnsUtilities.py b/plogical/dnsUtilities.py index 4963f953e..a0c3ab820 100755 --- a/plogical/dnsUtilities.py +++ b/plogical/dnsUtilities.py @@ -419,6 +419,12 @@ class DNS: except: return 0 + @staticmethod + def createDNSRecordCloudFlare(cf, zone, name, type, value, priority, ttl): + dns_record = {'name': name, 'type': type, 'content': value, 'ttl': ttl, 'priority': priority} + r = cf.zones.dns_records.post(zone, data=dns_record) + + @staticmethod def createDNSRecord(zone, name, type, value, priority, ttl): try: