70 lines
3.1 KiB
JavaScript
70 lines
3.1 KiB
JavaScript
(function (exports) {
|
|
'use strict';
|
|
|
|
// TODO. Not yet implemented. Do we need to include the name server and email address record properties???
|
|
|
|
// Value Meaning/Use
|
|
// Primary NS Variable length. The name of the Primary Master for the domain. May be a label, pointer, or any combination
|
|
// Admin MB Variable length. The administrator's mailbox. May be a label, pointer, or any combination
|
|
// Serial Number Unsigned 32-bit integer
|
|
// Refresh Interval Unsigned 32-bit integer
|
|
// Retry Interval Unsigned 32-bit integer
|
|
// Expiration Limit Unsigned 32-bit integer
|
|
// Minimum TTL Unsigned 32-bit integer
|
|
|
|
var unpackLabels = exports.DNS_UNPACK_LABELS || require('../dns.unpack-labels.js').DNS_UNPACK_LABELS;
|
|
|
|
exports.DNS_PARSER_TYPE_SOA = function (ab, packet, record) {
|
|
|
|
var rdataAb = ab.slice(record.rdstart, record.rdstart + record.rdlength);
|
|
var dv = new DataView(rdataAb);
|
|
|
|
// we need this information for this parser
|
|
var cpcount = unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).cpcount;
|
|
var offset = unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).byteLength;
|
|
var labels = unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).labels;
|
|
|
|
// Primary NS
|
|
record.name_server = unpackLabels(new Uint8Array(ab), record.rdstart, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
|
|
|
|
// if there exists compression pointers in the rdata
|
|
if (cpcount > 0){
|
|
// do something awesome with compression pointers to get the email address
|
|
// I need the length of all the data before the email address starts.
|
|
// if there are compression pointers then there will be a byte to indicate the length of each label, the label,
|
|
// then there will be a compression pointer to grab the longest label.
|
|
|
|
var start = 2; // start or email_addr. take into account compression pointer and address length
|
|
for(var i = 0; i < labels.length; i++){
|
|
|
|
// increase start by the label length. the +1 is to take into account the next label size byte
|
|
start = start + labels[i].length + 1;
|
|
// check for cpcount. 2 counts behind
|
|
if(parseInt(dv.getUint8(start - 2), 10) === 192){
|
|
record.email_addr = unpackLabels(new Uint8Array(ab), record.rdstart + start ,{ byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
|
|
}
|
|
}
|
|
} // if there are no compression pointers, we can get the email address directly from the offset
|
|
else {
|
|
|
|
record.email_addr = unpackLabels(new Uint8Array(ab), record.rdstart + offset, { byteLength: 0, cpcount: 0, labels: [], name: '' }).name;
|
|
}
|
|
|
|
// Serial Number
|
|
record.sn = dv.getUint32(dv.byteLength - 20, false);
|
|
// Refresh Interval
|
|
record.ref = dv.getUint32(dv.byteLength - 16, false);
|
|
// Retry Interval
|
|
record.ret = dv.getUint32(dv.byteLength - 12, false);
|
|
// Expiration Limit
|
|
record.ex = dv.getUint32(dv.byteLength - 8, false);
|
|
// Minimum TTL
|
|
record.nx = dv.getUint32(dv.byteLength - 4, false);
|
|
|
|
|
|
return record;
|
|
|
|
};
|
|
|
|
}('undefined' !== typeof window ? window : exports));
|