Skip to content

Commit

Permalink
Split txt and spf data.
Browse files Browse the repository at this point in the history
  • Loading branch information
elgs committed Apr 11, 2021
1 parent e622b44 commit 16249b5
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 19 deletions.
35 changes: 27 additions & 8 deletions lib/zonefile-es.js
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,7 @@ let parseMX = function (rrData, recordsSoFar) {

let parseTXT = function (rrData, recordsSoFar) {
let rrTokens = rrData.tokens;
const txtArray = rrTokens.slice(rrData.typeIndex + 1);
if (!rrData.hasName) {
if (recordsSoFar.length) {
rrTokens.unshift(recordsSoFar[recordsSoFar.length - 1].name);
Expand All @@ -447,10 +448,14 @@ let parseTXT = function (rrData, recordsSoFar) {
}
}

let l = rrTokens.length;
const splitTxtArray = [];
txtArray.forEach(txt => {
splitTxtArray.push(...splitStringBySize(txt, 255));
});

let result = {
name: rrTokens[0],
txt: rrTokens[l - 1]
txt: splitTxtArray.join(' ')
};

if (rrData.hasTtl) result.ttl = parseInt(rrTokens[1], 10);
Expand Down Expand Up @@ -499,6 +504,7 @@ let parseSRV = function (rrData, recordsSoFar) {

let parseSPF = function (rrData, recordsSoFar) {
let rrTokens = rrData.tokens;
const txtArray = rrTokens.slice(rrData.typeIndex + 1);
if (!rrData.hasName) {
if (recordsSoFar.length) {
rrTokens.unshift(recordsSoFar[recordsSoFar.length - 1].name);
Expand All @@ -507,16 +513,16 @@ let parseSPF = function (rrData, recordsSoFar) {
}
}

const splitTxtArray = [];
txtArray.forEach(txt => {
splitTxtArray.push(...splitStringBySize(txt, 255));
});

let result = {
name: rrTokens[0],
data: ''
txt: splitTxtArray.join(' ')
};

let l = rrTokens.length;
while (l-- > (rrData.hasTtl ? 4 : 3)) {
result.data = rrTokens[l] + ' ' + result.data.trim();
}

if (rrData.hasTtl) result.ttl = parseInt(rrTokens[1], 10);
return result;
};
Expand All @@ -543,6 +549,19 @@ let parseCAA = function (rrData, recordsSoFar) {
return result;
};

const splitStringBySize = function (input, chunkSize) {
const output = [];
const numOfChunks = Math.ceil(input.length / chunkSize);
for (let i = 0; i < numOfChunks; ++i) {
let chunkData = input.slice(i * chunkSize, (i + 1) * chunkSize);
if (!input.startsWith('"') || !input.endsWith('"')) {
chunkData = '"' + chunkData + '"';
}
output.push(chunkData)
}
return output;
}

let splitArgs = function (input, sep, keepQuotes) {
let separator = sep || /\s/g;
let singleQuoteOpen = false;
Expand Down
35 changes: 27 additions & 8 deletions lib/zonefile.js
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,7 @@ let parseMX = function (rrData, recordsSoFar) {

let parseTXT = function (rrData, recordsSoFar) {
let rrTokens = rrData.tokens;
const txtArray = rrTokens.slice(rrData.typeIndex + 1);
if (!rrData.hasName) {
if (recordsSoFar.length) {
rrTokens.unshift(recordsSoFar[recordsSoFar.length - 1].name);
Expand All @@ -447,10 +448,14 @@ let parseTXT = function (rrData, recordsSoFar) {
}
}

let l = rrTokens.length;
const splitTxtArray = [];
txtArray.forEach(txt => {
splitTxtArray.push(...splitStringBySize(txt, 255));
});

let result = {
name: rrTokens[0],
txt: rrTokens[l - 1]
txt: splitTxtArray.join(' ')
};

if (rrData.hasTtl) result.ttl = parseInt(rrTokens[1], 10);
Expand Down Expand Up @@ -499,6 +504,7 @@ let parseSRV = function (rrData, recordsSoFar) {

let parseSPF = function (rrData, recordsSoFar) {
let rrTokens = rrData.tokens;
const txtArray = rrTokens.slice(rrData.typeIndex + 1);
if (!rrData.hasName) {
if (recordsSoFar.length) {
rrTokens.unshift(recordsSoFar[recordsSoFar.length - 1].name);
Expand All @@ -507,16 +513,16 @@ let parseSPF = function (rrData, recordsSoFar) {
}
}

const splitTxtArray = [];
txtArray.forEach(txt => {
splitTxtArray.push(...splitStringBySize(txt, 255));
});

let result = {
name: rrTokens[0],
data: ''
txt: splitTxtArray.join(' ')
};

let l = rrTokens.length;
while (l-- > (rrData.hasTtl ? 4 : 3)) {
result.data = rrTokens[l] + ' ' + result.data.trim();
}

if (rrData.hasTtl) result.ttl = parseInt(rrTokens[1], 10);
return result;
};
Expand All @@ -543,6 +549,19 @@ let parseCAA = function (rrData, recordsSoFar) {
return result;
};

const splitStringBySize = function (input, chunkSize) {
const output = [];
const numOfChunks = Math.ceil(input.length / chunkSize);
for (let i = 0; i < numOfChunks; ++i) {
let chunkData = input.slice(i * chunkSize, (i + 1) * chunkSize);
if (!input.startsWith('"') || !input.endsWith('"')) {
chunkData = '"' + chunkData + '"';
}
output.push(chunkData)
}
return output;
}

let splitArgs = function (input, sep, keepQuotes) {
let separator = sep || /\s/g;
let singleQuoteOpen = false;
Expand Down
2 changes: 1 addition & 1 deletion test/zonefile_forward.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
"txt": [
{
"name": "treefrog.ca.",
"txt": "\"v=spf1 a mx a:mail.treefrog.ca a:webmail.treefrog.ca ip4:76.75.250.33 ?all\""
"txt": "\"v=spf1 a mx a:mail.treefrog.ca a:webmail.treefrog.ca ip4:76.75.250.33 ?all\" \"sdfsadfdasf\""
},
{
"name": "treemonkey.ca.",
Expand Down
5 changes: 3 additions & 2 deletions test/zonefile_forward.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,10 @@ mail2 CNAME mail

test IN SPF "v=spf1" "mx:gcloud-node.com." "-all"
test1 SPF "v=spf2" "mx:gcloud-node.com." "-all"
IN SPF "v=spf3" "mx:gcloud-node.com." "-all "
IN SPF "v=spf3" "mx:gcloud-node.com." "-all " "aasdfsadfdsafdasf"
SPF "v=spf4" "mx:gcloud-node.com." "-all"

treefrog.ca. IN TXT "v=spf1 a mx a:mail.treefrog.ca a:webmail.treefrog.ca ip4:76.75.250.33 ?all"
treefrog.ca. IN TXT "v=spf1 a mx a:mail.treefrog.ca a:webmail.treefrog.ca ip4:76.75.250.33 ?all" "asdfsdaf" "sdfsadfdasf"
IN TXT "v=spf1 a mx a:mail.treefrog.ca a:webmail.treefrog.ca ip4:76.75.250.33 ?all" "asdfsdaf" sdfsadfdasf
treemonkey.ca. IN TXT "v=DKIM1\; k=rsa\; p=MIGf..."
treemonkey1.ca. IN TXT "v=DKIM1\; k=rsa\; p=MIGf..."

0 comments on commit 16249b5

Please sign in to comment.