]> git.ipfire.org Git - thirdparty/pdns.git/blame - regression-tests.dnsdist/cookiesoption.py
Merge pull request #14078 from rgacogne/ddist-harvest-quic
[thirdparty/pdns.git] / regression-tests.dnsdist / cookiesoption.py
CommitLineData
ff73f02b
RG
1#!/usr/bin/env python2
2
3import dns
4import dns.edns
5import dns.flags
6import dns.message
7import dns.query
8
9class 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
98dns.edns._type_to_class[0x000A] = CookiesOption
37063755
PL
99
100dns.rcode.BADCOOKIE = 23