@nictool/dns-resource-record 1.2.1 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codeclimate.yml +25 -0
- package/.github/FUNDING.yml +3 -0
- package/.github/workflows/ci.yml +43 -0
- package/.github/workflows/codeql.yml +14 -0
- package/.github/workflows/publish.yml +16 -0
- package/.gitmodules +3 -0
- package/.prettierrc.yml +3 -0
- package/CHANGELOG.md +9 -0
- package/DEVELOP.md +9 -0
- package/README.md +3 -1
- package/eslint.config.mjs +41 -0
- package/package.json +12 -3
- package/rr/caa.js +5 -3
- package/rr/hinfo.js +5 -3
- package/rr/openpgpkey.js +3 -3
- package/rr/tlsa.js +5 -3
- package/rr/txt.js +3 -3
- package/test/a.js +75 -0
- package/test/aaaa.js +86 -0
- package/test/base.js +148 -0
- package/test/caa.js +111 -0
- package/test/cert.js +48 -0
- package/test/cname.js +40 -0
- package/test/dname.js +57 -0
- package/test/dnskey.js +45 -0
- package/test/ds.js +45 -0
- package/test/fake.js +34 -0
- package/test/hinfo.js +80 -0
- package/test/https.js +56 -0
- package/test/ipseckey.js +141 -0
- package/test/key.js +36 -0
- package/test/loc.js +75 -0
- package/test/mx.js +78 -0
- package/test/naptr.js +47 -0
- package/test/ns.js +56 -0
- package/test/nsec.js +37 -0
- package/test/nsec3.js +47 -0
- package/test/nsec3param.js +23 -0
- package/test/nxt.js +37 -0
- package/test/openpgpkey.js +85 -0
- package/test/ptr.js +56 -0
- package/test/rr.js +212 -0
- package/test/smimea.js +51 -0
- package/test/soa.js +99 -0
- package/test/spf.js +51 -0
- package/test/srv.js +101 -0
- package/test/sshfp.js +69 -0
- package/test/svcb.js +56 -0
- package/test/tinydns.js +163 -0
- package/test/tlsa.js +63 -0
- package/test/txt.js +82 -0
- package/test/uri.js +65 -0
package/test/tinydns.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
|
|
3
|
+
import * as TINYDNS from '../lib/tinydns.js'
|
|
4
|
+
|
|
5
|
+
describe('TINYDNS', function () {
|
|
6
|
+
const b64cases = {
|
|
7
|
+
'0sAQPeOwAGDPLrDebL1q5Lg8XW9B/d9MnxqlzIYKXhvZPWEHNYGP7AwART/tmkeDNn7HPMtgM6GIwQ4p0KGLfSRoUKbjtPlRVeWYLbsnNXeFU5bchyYef0efYiKlxZdo':
|
|
8
|
+
'\\322\\300\\020\\075\\343\\260\\000\\140\\317.\\260\\336l\\275j\\344\\270\\074\\135oA\\375\\337L\\237\\032\\245\\314\\206\\012\\136\\033\\331\\075a\\0075\\201\\217\\354\\014\\000E\\077\\355\\232G\\2036\\176\\307\\074\\313\\1403\\241\\210\\301\\016\\051\\320\\241\\213\\175\\044hP\\246\\343\\264\\371QU\\345\\230-\\273\\0475w\\205S\\226\\334\\207\\046\\036\\177G\\237b\\042\\245\\305\\227h',
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
describe('base64toOctal', function () {
|
|
12
|
+
for (const c in b64cases) {
|
|
13
|
+
it('octal escapes a base64 encoded string', async function () {
|
|
14
|
+
assert.strictEqual(TINYDNS.base64toOctal(c), b64cases[c])
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
describe('octalToBase64', function () {
|
|
20
|
+
for (const c in b64cases) {
|
|
21
|
+
it('converts octal escaped to base64 encoded string', async function () {
|
|
22
|
+
assert.deepStrictEqual(TINYDNS.octalToBase64(b64cases[c]), c)
|
|
23
|
+
})
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
describe('escapeOctal', function () {
|
|
28
|
+
const rdataRe = new RegExp(/[\r\n\t:\\/]/, 'g')
|
|
29
|
+
it('escapes tinydns rdata special chars', async function () {
|
|
30
|
+
const e = TINYDNS.escapeOctal(
|
|
31
|
+
rdataRe,
|
|
32
|
+
'v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB',
|
|
33
|
+
)
|
|
34
|
+
assert.strictEqual(
|
|
35
|
+
e,
|
|
36
|
+
'v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN\\057nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64\\057cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn\\057LAf+3kzW58AjsERpsNCSTD2RquxbnyoR\\0571wdGKb8cUlD\\057EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB',
|
|
37
|
+
)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const specialChars = {
|
|
41
|
+
'/': '\\057',
|
|
42
|
+
'\\': '\\134',
|
|
43
|
+
':': '\\072',
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
for (const c of Object.keys(specialChars)) {
|
|
47
|
+
it(`escapes tinydns rdata special char ${c}`, function () {
|
|
48
|
+
assert.strictEqual(TINYDNS.escapeOctal(rdataRe, c), specialChars[c])
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
describe('octaltoChar', function () {
|
|
54
|
+
it('converts a string of octal escapes to characters', async () => {})
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
describe('octalToHex', function () {
|
|
58
|
+
it('unescapes octal to hex digits', function () {
|
|
59
|
+
assert.strictEqual(
|
|
60
|
+
TINYDNS.octalToHex(
|
|
61
|
+
'\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\001',
|
|
62
|
+
),
|
|
63
|
+
'00000000000000000000000000000001',
|
|
64
|
+
)
|
|
65
|
+
})
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
describe('UInt16toOctal', function () {
|
|
69
|
+
it('converts a 16-bit number to escaped octal', function () {
|
|
70
|
+
assert.strictEqual(TINYDNS.UInt16toOctal(65535), '\\377\\377')
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it('converts a 16-bit number to escaped octal', function () {
|
|
74
|
+
assert.strictEqual(TINYDNS.UInt16toOctal(1), '\\000\\001')
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
describe('octalToUInt16', function () {
|
|
79
|
+
it('converts a 16-bit number to escaped octal', function () {
|
|
80
|
+
assert.strictEqual(TINYDNS.octalToUInt16('\\377\\377'), 65535)
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('converts a 16-bit number to escaped octal', function () {
|
|
84
|
+
assert.strictEqual(TINYDNS.octalToUInt16('\\000\\001'), 1)
|
|
85
|
+
})
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
describe('UInt32toOctal', function () {
|
|
89
|
+
it('converts a 32-bit number to escaped octal', function (done) {
|
|
90
|
+
assert.strictEqual(
|
|
91
|
+
TINYDNS.UInt32toOctal(2319310648),
|
|
92
|
+
'\\212\\075\\337\\070',
|
|
93
|
+
)
|
|
94
|
+
done()
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('converts a 32-bit number to escaped octal', function (done) {
|
|
98
|
+
assert.strictEqual(
|
|
99
|
+
TINYDNS.UInt32toOctal(1706988648),
|
|
100
|
+
'\\145\\276\\224\\150',
|
|
101
|
+
)
|
|
102
|
+
done()
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
describe('octalToUInt32', function () {
|
|
107
|
+
it('converts escaped octal to 32-bit integer', function () {
|
|
108
|
+
assert.strictEqual(
|
|
109
|
+
TINYDNS.octalToUInt32('\\145\\276\\224\\150'),
|
|
110
|
+
1706988648,
|
|
111
|
+
)
|
|
112
|
+
})
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
describe('unpackDomainName', function () {
|
|
116
|
+
it(`extracts domain name from wire format`, async () => {
|
|
117
|
+
const r = TINYDNS.unpackDomainName(
|
|
118
|
+
'\\006sipdir\\006online\\004lync\\003com\\000',
|
|
119
|
+
)
|
|
120
|
+
assert.strictEqual(r[0], 'sipdir.online.lync.com.')
|
|
121
|
+
assert.strictEqual(r[1], 40)
|
|
122
|
+
})
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
const cases = {
|
|
126
|
+
'0.0.0.0': '\\000\\000\\000\\000',
|
|
127
|
+
'192.0.2.127': '\\300\\000\\002\\177',
|
|
128
|
+
'255.255.255.255': '\\377\\377\\377\\377',
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
describe('ipv4toOctal', function () {
|
|
132
|
+
for (const c in cases) {
|
|
133
|
+
it(`converts dotted quad IPv4 to octal escaped integer ${c}`, async () => {
|
|
134
|
+
assert.strictEqual(TINYDNS.ipv4toOctal(c), cases[c])
|
|
135
|
+
})
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
describe('octalToIPv4', function () {
|
|
140
|
+
for (const c in cases) {
|
|
141
|
+
it(`converts octal escaped integer to dotted quad IPv4 ${cases[c]}`, async () => {
|
|
142
|
+
assert.strictEqual(TINYDNS.octalToIPv4(cases[c]), c)
|
|
143
|
+
})
|
|
144
|
+
}
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
describe('packString', function () {
|
|
148
|
+
it(`packs a string to wire format`, async () => {
|
|
149
|
+
assert.strictEqual(
|
|
150
|
+
TINYDNS.packString('matt wuz here'),
|
|
151
|
+
'\\015matt wuz here',
|
|
152
|
+
)
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
describe('uppackString', function () {
|
|
157
|
+
it(`uppacks a string from wire format`, async () => {
|
|
158
|
+
assert.deepStrictEqual(TINYDNS.unpackString('\\015matt wuz here'), [
|
|
159
|
+
'matt wuz here',
|
|
160
|
+
])
|
|
161
|
+
})
|
|
162
|
+
})
|
|
163
|
+
})
|
package/test/tlsa.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as base from './base.js'
|
|
2
|
+
|
|
3
|
+
import TLSA from '../rr/tlsa.js'
|
|
4
|
+
|
|
5
|
+
const defaults = { class: 'IN', ttl: 3600, type: 'TLSA' }
|
|
6
|
+
|
|
7
|
+
const validRecords = [
|
|
8
|
+
{
|
|
9
|
+
...defaults,
|
|
10
|
+
owner: '_443._tcp.www.example.com.',
|
|
11
|
+
'certificate usage': 0,
|
|
12
|
+
selector: 0,
|
|
13
|
+
'matching type': 1,
|
|
14
|
+
'certificate association data':
|
|
15
|
+
'd2abde240d7cd3ee6b4b28c54df034b9 7983a1d16e8a410e4561cb106618e971',
|
|
16
|
+
testB:
|
|
17
|
+
'_443._tcp.www.example.com.\t3600\tIN\tTLSA\t0\t0\t1\td2abde240d7cd3ee6b4b28c54df034b9 7983a1d16e8a410e4561cb106618e971\n',
|
|
18
|
+
testT:
|
|
19
|
+
':_443._tcp.www.example.com:52:\\000\\000\\001d2abde240d7cd3ee6b4b28c54df034b9 7983a1d16e8a410e4561cb106618e971:3600::\n',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
...defaults,
|
|
23
|
+
owner: '_443._tcp.www.example.com.',
|
|
24
|
+
'certificate usage': 1,
|
|
25
|
+
selector: 1,
|
|
26
|
+
'matching type': 2,
|
|
27
|
+
'certificate association data':
|
|
28
|
+
'92003ba34942dc74152e2f2c408d29ec a5a520e7f2e06bb944f4dca346baf63c 1b177615d466f6c4b71c216a50292bd5 8c9ebdd2f74e38fe51ffd48c43326cbc',
|
|
29
|
+
testB: `_443._tcp.www.example.com.\t3600\tIN\tTLSA\t1\t1\t2\t92003ba34942dc74152e2f2c408d29ec a5a520e7f2e06bb944f4dca346baf63c 1b177615d466f6c4b71c216a50292bd5 8c9ebdd2f74e38fe51ffd48c43326cbc\n`,
|
|
30
|
+
testT:
|
|
31
|
+
':_443._tcp.www.example.com:52:\\001\\001\\00292003ba34942dc74152e2f2c408d29ec a5a520e7f2e06bb944f4dca346baf63c 1b177615d466f6c4b71c216a50292bd5 8c9ebdd2f74e38fe51ffd48c43326cbc:3600::\n',
|
|
32
|
+
},
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
const invalidRecords = [
|
|
36
|
+
{
|
|
37
|
+
...defaults,
|
|
38
|
+
owner: 'test.example.com.',
|
|
39
|
+
selector: 6, // invalid
|
|
40
|
+
msg: /RFC/,
|
|
41
|
+
},
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
describe('TLSA record', function () {
|
|
45
|
+
base.valid(TLSA, validRecords)
|
|
46
|
+
base.invalid(TLSA, invalidRecords)
|
|
47
|
+
|
|
48
|
+
base.getDescription(TLSA)
|
|
49
|
+
base.getRFCs(TLSA, validRecords[0])
|
|
50
|
+
base.getFields(TLSA, [
|
|
51
|
+
'certificate usage',
|
|
52
|
+
'selector',
|
|
53
|
+
'matching type',
|
|
54
|
+
'certificate association data',
|
|
55
|
+
])
|
|
56
|
+
base.getTypeId(TLSA, 52)
|
|
57
|
+
|
|
58
|
+
base.toBind(TLSA, validRecords)
|
|
59
|
+
base.toTinydns(TLSA, validRecords)
|
|
60
|
+
|
|
61
|
+
base.fromBind(TLSA, validRecords)
|
|
62
|
+
base.fromTinydns(TLSA, validRecords)
|
|
63
|
+
})
|
package/test/txt.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
|
|
3
|
+
import * as base from './base.js'
|
|
4
|
+
|
|
5
|
+
import TXT from '../rr/txt.js'
|
|
6
|
+
|
|
7
|
+
const validRecords = [
|
|
8
|
+
{
|
|
9
|
+
owner: 'oct2021._domainkey.example.com.',
|
|
10
|
+
ttl: 86400,
|
|
11
|
+
type: 'TXT',
|
|
12
|
+
data: 'v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB',
|
|
13
|
+
testB:
|
|
14
|
+
'oct2021._domainkey.example.com.\t86400\tIN\tTXT\t"v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob" "4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB"\n',
|
|
15
|
+
testT:
|
|
16
|
+
"'oct2021._domainkey.example.com:v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN\\057nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64\\057cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn\\057LAf+3kzW58AjsERpsNCSTD2RquxbnyoR\\0571wdGKb8cUlD\\057EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB:86400::\n",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
owner: 'oct2021._domainkey.example.com.',
|
|
20
|
+
ttl: 86400,
|
|
21
|
+
type: 'TXT',
|
|
22
|
+
data: [
|
|
23
|
+
'v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob',
|
|
24
|
+
'4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB',
|
|
25
|
+
],
|
|
26
|
+
testB:
|
|
27
|
+
'oct2021._domainkey.example.com.\t86400\tIN\tTXT\t"v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob" "4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB"\n',
|
|
28
|
+
testT:
|
|
29
|
+
"'oct2021._domainkey.example.com:v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN\\057nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64\\057cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn\\057LAf+3kzW58AjsERpsNCSTD2RquxbnyoR\\0571wdGKb8cUlD\\057EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB:86400::\n",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
owner: 'example.com.',
|
|
33
|
+
ttl: 86400,
|
|
34
|
+
type: 'TXT',
|
|
35
|
+
data: 'v=spf1 mx a include:mx.example.com -all',
|
|
36
|
+
testB:
|
|
37
|
+
'example.com.\t86400\tIN\tTXT\t"v=spf1 mx a include:mx.example.com -all"\n',
|
|
38
|
+
testT: "'example.com:v=spf1 mx a include\\072mx.example.com -all:86400::\n",
|
|
39
|
+
},
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
const invalidRecords = []
|
|
43
|
+
|
|
44
|
+
describe('TXT record', function () {
|
|
45
|
+
base.valid(TXT, validRecords)
|
|
46
|
+
base.invalid(TXT, invalidRecords)
|
|
47
|
+
|
|
48
|
+
base.getDescription(TXT)
|
|
49
|
+
base.getRFCs(TXT, validRecords[0])
|
|
50
|
+
base.getFields(TXT, ['data'])
|
|
51
|
+
base.getTypeId(TXT, 16)
|
|
52
|
+
|
|
53
|
+
base.toBind(TXT, validRecords)
|
|
54
|
+
base.toTinydns(TXT, validRecords)
|
|
55
|
+
|
|
56
|
+
base.fromTinydns(TXT, validRecords)
|
|
57
|
+
base.fromBind(TXT, validRecords)
|
|
58
|
+
|
|
59
|
+
it(`imports tinydns TXT (generic) record`, async function () {
|
|
60
|
+
const val = {
|
|
61
|
+
owner: 'nov2021._domainkey.example.com.',
|
|
62
|
+
type: 'TXT',
|
|
63
|
+
data: 'v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB',
|
|
64
|
+
ttl: 86400,
|
|
65
|
+
testB:
|
|
66
|
+
'nov2021._domainkey.example.com.\t86400\tIN\tTXT\t"v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN/nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64/cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob" "4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn/LAf+3kzW58AjsERpsNCSTD2RquxbnyoR/1wdGKb8cUlD/EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB"\n',
|
|
67
|
+
testT:
|
|
68
|
+
':nov2021._domainkey.example.com:16:\\622v=DKIM1;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoyUzGOTSOmakY8BcxXgi0mN\\057nFegLBPs7aaGQUtjHfa8yUrt9T2j6GSXgdjLuG3R43WjePQv3RHzc+bwwOkdw0XDOXiztn5mhrlaflbVr5PMSTrv64\\057cpFQKLtgQx8Vgqp7Dh3jw13rLomRTqJFgMrMHdhIibZEa69gtuAfDqoeXo6QDSGk5JuBAeRHEH27FriHulg5ob4F4lmh7fMFVsDGkQEF6jaIVYqvRjDyyQed3R3aTJX3fpb3QrtRqvfn\\057LAf+3kzW58AjsERpsNCSTD2RquxbnyoR\\0571wdGKb8cUlD\\057EXvqtvpVnOzHeSeMEqex3kQI8HOGsEehWZlKd+GqwIDAQAB:86400\n',
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const r = new TXT({ tinyline: val.testT })
|
|
72
|
+
if (process.env.DEBUG) console.dir(r)
|
|
73
|
+
for (const f of r.getFields()) {
|
|
74
|
+
if (f === 'class') continue
|
|
75
|
+
assert.deepStrictEqual(
|
|
76
|
+
r.get(f),
|
|
77
|
+
val[f],
|
|
78
|
+
`${f}: ${r.get(f)} !== ${val[f]}`,
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
})
|
package/test/uri.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import assert from 'assert'
|
|
2
|
+
|
|
3
|
+
import * as base from './base.js'
|
|
4
|
+
|
|
5
|
+
import URI from '../rr/uri.js'
|
|
6
|
+
|
|
7
|
+
const validRecords = [
|
|
8
|
+
{
|
|
9
|
+
class: 'IN',
|
|
10
|
+
owner: 'www.example.com.',
|
|
11
|
+
type: 'URI',
|
|
12
|
+
target: 'www2.example.com.',
|
|
13
|
+
priority: 1,
|
|
14
|
+
weight: 0,
|
|
15
|
+
ttl: 3600,
|
|
16
|
+
testB: 'www.example.com.\t3600\tIN\tURI\t1\t0\t"www2.example.com."\n',
|
|
17
|
+
testT:
|
|
18
|
+
':www.example.com:256:\\000\\001\\000\\000www2.example.com.:3600::\n',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
class: 'IN',
|
|
22
|
+
owner: '_http.github.dog.',
|
|
23
|
+
type: 'URI',
|
|
24
|
+
target: 'http://github.com/dog',
|
|
25
|
+
priority: 2,
|
|
26
|
+
weight: 100,
|
|
27
|
+
ttl: 3600,
|
|
28
|
+
testB:
|
|
29
|
+
'_http.github.dog.\t3600\tIN\tURI\t2\t100\t"http://github.com/dog"\n',
|
|
30
|
+
testT:
|
|
31
|
+
':_http.github.dog:256:\\000\\002\\000\\144http\\072\\057\\057github.com\\057dog:3600::\n',
|
|
32
|
+
},
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
const invalidRecords = []
|
|
36
|
+
|
|
37
|
+
describe('URI record', function () {
|
|
38
|
+
base.valid(URI, validRecords)
|
|
39
|
+
base.invalid(URI, invalidRecords)
|
|
40
|
+
|
|
41
|
+
base.getDescription(URI)
|
|
42
|
+
base.getRFCs(URI, validRecords[0])
|
|
43
|
+
base.getFields(URI, ['priority', 'weight', 'target'])
|
|
44
|
+
base.getTypeId(URI, 256)
|
|
45
|
+
|
|
46
|
+
base.toBind(URI, validRecords)
|
|
47
|
+
base.toTinydns(URI, validRecords)
|
|
48
|
+
|
|
49
|
+
base.fromBind(URI, validRecords)
|
|
50
|
+
base.fromTinydns(URI, validRecords)
|
|
51
|
+
|
|
52
|
+
for (const val of validRecords) {
|
|
53
|
+
it.skip(`imports tinydns (generic) record`, async function () {
|
|
54
|
+
const r = new URI({ tinyline: val.testT })
|
|
55
|
+
if (process.env.DEBUG) console.dir(r)
|
|
56
|
+
for (const f of ['owner', 'priority', 'weight', 'target', 'ttl']) {
|
|
57
|
+
assert.deepStrictEqual(
|
|
58
|
+
r.get(f),
|
|
59
|
+
val[f],
|
|
60
|
+
`${f}: ${r.get(f)} !== ${val[f]}`,
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
}
|
|
65
|
+
})
|