diff --git a/lib/zonefile.js b/lib/zonefile.js index cfd56f8..23020b3 100644 --- a/lib/zonefile.js +++ b/lib/zonefile.js @@ -39,6 +39,9 @@ \n\ ; SRV Records\n\ {srv}\n\ +\n\ +; SPF Records\n\ +{spf}\n\ '; //var fs = require('fs'); @@ -57,6 +60,7 @@ template = processPTR(options['ptr'], template); template = processTXT(options['txt'], template); template = processSRV(options['srv'], template); + template = processSPF(options['spf'], template); template = processValues(options, template); return template.replace(/\n{2,}/gim, '\n\n'); }; @@ -171,6 +175,16 @@ return template.replace('{srv}', ret); }; + var processSPF = function (data, template) { + var ret = ''; + for (var i in data) { + ret += (data[i].name || '@') + '\t'; + if (data[i].ttl) ret += data[i].ttl + '\t'; + ret += 'IN\tSPF\t' + data[i].data + '\n'; + } + return template.replace('{spf}', ret); + }; + var processValues = function (options, template) { template = template.replace('{zone}', options['$origin'] || options['soa']['name'] || ''); template = template.replace('{datetime}', (new Date()).toISOString()); @@ -246,6 +260,9 @@ } else if (/\s+SRV\s+/.test(uRR)) { ret.srv = ret.srv || []; ret.srv.push(parseSRV(rr)); + } else if (/\s+SPF\s+/.test(uRR)) { + ret.spf = ret.spf || []; + ret.spf.push(parseSPF(rr)); } } return ret; @@ -384,6 +401,22 @@ return result; }; + var parseSPF = function (rr) { + var rrTokens = rr.trim().split(/\s+/g); + var result = { + name: rrTokens[0], + data: '' + }; + + var l = rrTokens.length; + while (l-- > 4) { + result.data = rrTokens[l] + ' ' + result.data.trim(); + } + + if (!isNaN(rrTokens[1])) result.ttl = parseInt(rrTokens[1], 10); + return result; + }; + if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { exports.generate = generate; exports.parse = parse;