]>
Commit | Line | Data |
---|---|---|
ff73f02b RG |
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 | ||
a41603bf | 25 | def to_wire(self, file=None): |
718033e2 | 26 | """Create EDNS packet as defined in draft-ietf-dnsop-cookies-09.""" |
ff73f02b | 27 | |
ff73f02b | 28 | if self.server and len(self.server) > 0: |
a41603bf RG |
29 | data = self.client + self.server |
30 | else: | |
31 | data = self.client | |
32 | ||
33 | if file: | |
34 | file.write(data) | |
35 | else: | |
36 | return data | |
ff73f02b RG |
37 | |
38 | def from_wire(cls, otype, wire, current, olen): | |
39 | """Read EDNS packet as defined in draft-ietf-dnsop-cookies-09. | |
40 | ||
41 | Returns: | |
42 | An instance of CookiesOption based on the EDNS packet | |
43 | """ | |
44 | ||
45 | data = wire[current:current + olen] | |
46 | if len(data) != 8 and (len(data) < 16 or len(data) > 40): | |
47 | raise Exception('Invalid EDNS Cookies option') | |
48 | ||
49 | client = data[:8] | |
50 | if len(data) > 8: | |
51 | server = data[8:] | |
52 | else: | |
53 | server = None | |
54 | ||
55 | return cls(client, server) | |
56 | ||
57 | from_wire = classmethod(from_wire) | |
58 | ||
a41603bf RG |
59 | # needed in 2.0.0 |
60 | @classmethod | |
61 | def from_wire_parser(cls, otype, parser): | |
62 | data = parser.get_remaining() | |
63 | ||
64 | if len(data) != 8 and (len(data) < 16 or len(data) > 40): | |
65 | raise Exception('Invalid EDNS Cookies option') | |
66 | ||
67 | client = data[:8] | |
68 | if len(data) > 8: | |
69 | server = data[8:] | |
70 | else: | |
71 | server = None | |
72 | ||
73 | return cls(client, server) | |
74 | ||
ff73f02b RG |
75 | def __repr__(self): |
76 | return '%s(%s, %s)' % ( | |
77 | self.__class__.__name__, | |
78 | self.client, | |
79 | self.server | |
80 | ) | |
81 | ||
5610fe2d RG |
82 | def to_text(self): |
83 | return self.__repr__() | |
84 | ||
ff73f02b RG |
85 | def __eq__(self, other): |
86 | if not isinstance(other, CookiesOption): | |
87 | return False | |
88 | if self.client != other.client: | |
89 | return False | |
90 | if self.server != other.server: | |
91 | return False | |
92 | return True | |
93 | ||
94 | def __ne__(self, other): | |
95 | return not self.__eq__(other) | |
96 | ||
97 | ||
98 | dns.edns._type_to_class[0x000A] = CookiesOption | |
37063755 PL |
99 | |
100 | dns.rcode.BADCOOKIE = 23 |