if isinstance(secret, str):
secret = base64.decodebytes(secret.encode())
self.secret = secret
+ if isinstance(algorithm, str):
+ algorithm = dns.name.from_text(algorithm)
self.algorithm = algorithm
def __eq__(self, other):
def from_text(textring):
"""Convert a dictionary containing (textual DNS name, base64 secret)
- or (textual DNS name, (algorithm, base64 secret)) where algorithm
- can be a dns.name.Name or string into a binary keyring which has
- (dns.name.Name, dns.tsig.Key) pairs.
+ pairs into a binary keyring which has (dns.name.Name, bytes) pairs, or
+ a dictionary containing (textual DNS name, (algorithm, base64 secret))
+ pairs into a binary keyring which has (dns.name.Name, dns.tsig.Key) pairs.
@rtype: dict"""
keyring = {}
for (name, value) in textring.items():
name = dns.name.from_text(name)
if isinstance(value, str):
- algorithm = dns.tsig.default_algorithm
- secret = value
+ keyring[name] = dns.tsig.Key(name, value).secret
else:
(algorithm, secret) = value
- if isinstance(algorithm, str):
- algorithm = dns.name.from_text(algorithm)
- keyring[name] = dns.tsig.Key(name, secret, algorithm)
+ keyring[name] = dns.tsig.Key(name, secret, algorithm)
return keyring
def to_text(keyring):
"""Convert a dictionary containing (dns.name.Name, dns.tsig.Key) pairs
into a text keyring which has (textual DNS name, (textual algorithm,
- base64 secret)) pairs.
+ base64 secret)) pairs, or a dictionary containing (dns.name.Name, bytes)
+ pairs into a text keyring which has (textual DNS name, base64 secret) pairs.
@rtype: dict"""
textring = {}
+ b64encode = lambda secret: base64.encodebytes(secret).decode().rstrip()
for (name, key) in keyring.items():
name = name.to_text()
if isinstance(key, bytes):
- algorithm = dns.tsig.default_algorithm
- secret = key
+ textring[name] = b64encode(key)
else:
algorithm = key.algorithm
secret = key.secret
- textring[name] = (algorithm.to_text(),
- base64.encodebytes(secret).decode().rstrip())
+ textring[name] = (key.algorithm.to_text(), b64encode(key.secret))
return textring
self.resolver.keyring = dns.tsigkeyring.from_text({
'keyname.' : 'NjHwPsMKjdN++dOfE5iAiQ=='
})
- key = next(iter(self.resolver.keyring.values()))
+ (keyname, secret) = next(iter(self.resolver.keyring.items()))
self.resolver.keyname = dns.name.from_text('keyname.')
(request, answer) = self.resn.next_request()
self.assertFalse(request is None)
- self.assertEqual(request.keyring, key)
+ self.assertEqual(request.keyring.name, keyname)
+ self.assertEqual(request.keyring.secret, secret)
def test_next_request_flags(self):
self.resolver.flags = dns.flags.RD | dns.flags.CD
'keyname.' : ('hmac-sha256.', 'NjHwPsMKjdN++dOfE5iAiQ==')
}
-old_text_keyring = {
- 'keyname.' : 'NjHwPsMKjdN++dOfE5iAiQ=='
-}
-
alt_text_keyring = {
'keyname.' : (dns.tsig.HMAC_SHA256, 'NjHwPsMKjdN++dOfE5iAiQ==')
}
+old_text_keyring = {
+ 'keyname.' : 'NjHwPsMKjdN++dOfE5iAiQ=='
+}
+
key = dns.tsig.Key('keyname.', 'NjHwPsMKjdN++dOfE5iAiQ==')
rich_keyring = { key.name : key }
rkeyring = dns.tsigkeyring.from_text(text_keyring)
self.assertEqual(rkeyring, rich_keyring)
- def test_from_old_text(self):
- """old format text keyring -> rich keyring"""
- rkeyring = dns.tsigkeyring.from_text(old_text_keyring)
- self.assertEqual(rkeyring, rich_keyring)
-
def test_from_alt_text(self):
"""alternate format text keyring -> rich keyring"""
rkeyring = dns.tsigkeyring.from_text(alt_text_keyring)
self.assertEqual(rkeyring, rich_keyring)
+ def test_from_old_text(self):
+ """old format text keyring -> rich keyring"""
+ rkeyring = dns.tsigkeyring.from_text(old_text_keyring)
+ self.assertEqual(rkeyring, old_rich_keyring)
+
def test_to_text(self):
"""text keyring -> rich keyring -> text keyring"""
tkeyring = dns.tsigkeyring.to_text(rich_keyring)
def test_old_to_text(self):
"""text keyring -> rich keyring -> text keyring"""
tkeyring = dns.tsigkeyring.to_text(old_rich_keyring)
- self.assertEqual(tkeyring, text_keyring)
+ self.assertEqual(tkeyring, old_text_keyring)
def test_from_and_to_text(self):
"""text keyring -> rich keyring -> text keyring"""
rkeyring = dns.tsigkeyring.from_text(text_keyring)
tkeyring = dns.tsigkeyring.to_text(rkeyring)
self.assertEqual(tkeyring, text_keyring)
+
+ def test_old_from_and_to_text(self):
+ """text keyring -> rich keyring -> text keyring"""
+ rkeyring = dns.tsigkeyring.from_text(old_text_keyring)
+ tkeyring = dns.tsigkeyring.to_text(rkeyring)
+ self.assertEqual(tkeyring, old_text_keyring)