]> git.ipfire.org Git - thirdparty/pdns.git/blob - regression-tests.dnsdist/cookiesoption.py
Merge pull request #8713 from rgacogne/auth-strict-caches-size
[thirdparty/pdns.git] / regression-tests.dnsdist / cookiesoption.py
1 #!/usr/bin/env python2
2
3 import dns
4 import dns.edns
5 import dns.flags
6 import dns.message
7 import dns.query
8
9 class CookiesOption(dns.edns.Option):
10 """Implementation of draft-ietf-dnsop-cookies-09.
11 """
12
13 def __init__(self, client, server):
14 super(CookiesOption, self).__init__(10)
15
16 if len(client) != 8:
17 raise Exception('invalid client cookie length')
18
19 if server is not None and len(server) != 0 and (len(server) < 8 or len(server) > 32):
20 raise Exception('invalid server cookie length')
21
22 self.client = client
23 self.server = server
24
25 def to_wire(self, file):
26 """Create EDNS packet as defined in draft-ietf-dnsop-cookies-09."""
27
28 file.write(self.client)
29 if self.server and len(self.server) > 0:
30 file.write(self.server)
31
32 def from_wire(cls, otype, wire, current, olen):
33 """Read EDNS packet as defined in draft-ietf-dnsop-cookies-09.
34
35 Returns:
36 An instance of CookiesOption based on the EDNS packet
37 """
38
39 data = wire[current:current + olen]
40 if len(data) != 8 and (len(data) < 16 or len(data) > 40):
41 raise Exception('Invalid EDNS Cookies option')
42
43 client = data[:8]
44 if len(data) > 8:
45 server = data[8:]
46 else:
47 server = None
48
49 return cls(client, server)
50
51 from_wire = classmethod(from_wire)
52
53 def __repr__(self):
54 return '%s(%s, %s)' % (
55 self.__class__.__name__,
56 self.client,
57 self.server
58 )
59
60 def to_text(self):
61 return self.__repr__()
62
63 def __eq__(self, other):
64 if not isinstance(other, CookiesOption):
65 return False
66 if self.client != other.client:
67 return False
68 if self.server != other.server:
69 return False
70 return True
71
72 def __ne__(self, other):
73 return not self.__eq__(other)
74
75
76 dns.edns._type_to_class[0x000A] = CookiesOption
77