diff --git a/scapy/base_classes.py b/scapy/base_classes.py index 221ada6b1abbcbc11a3de3ceb9271896aac40a89..42670e0b9d3121e638d050251fcf23e3a42a0a52 100644 --- a/scapy/base_classes.py +++ b/scapy/base_classes.py @@ -161,31 +161,25 @@ class Packet_metaclass(type): raise AttributeError(attr) class NewDefaultValues(Packet_metaclass): - """NewDefaultValues metaclass. Example usage: - class MyPacket(Packet): - fields_desc = [ StrField("my_field", "my default value"), ] - - class MyPacket_variant(MyPacket): + """NewDefaultValues is deprecated (not needed anymore) + + remove this: __metaclass__ = NewDefaultValues - my_field = "my new default value" + and it should still work. """ def __new__(cls, name, bases, dct): - fields = None - for b in bases: - if hasattr(b,"fields_desc"): - fields = b.fields_desc - break - if fields is None: - raise error.Scapy_Exception("No fields_desc in superclasses") - - new_fields = [] - for f in fields: - if f.name in dct: - f = f.copy() - f.default = dct[f.name] - del(dct[f.name]) - new_fields.append(f) - dct["fields_desc"] = new_fields + from error import log_loading + import traceback + try: + for tb in traceback.extract_stack()+[("??",-1,None,"")]: + f,l,_,line = tb + if line.startswith("class"): + break + except: + f,l="??",-1 + raise + log_loading.warning("Deprecated use of NewDefaultValues (%s l. %i)." % (f,l)) + return super(NewDefaultValues, cls).__new__(cls, name, bases, dct) class BasePacket(Gen): diff --git a/scapy/layers/dhcp6.py b/scapy/layers/dhcp6.py index db61c38f9db99755bba07214a9e79c6c216ba153..07eee8afb38e309352e7014d6795ca233b8f3b17 100644 --- a/scapy/layers/dhcp6.py +++ b/scapy/layers/dhcp6.py @@ -282,7 +282,6 @@ class DHCP6OptClientId(_DHCP6OptGuessPayload): # RFC sect 22.2 class DHCP6OptServerId(DHCP6OptClientId): # RFC sect 22.3 name = "DHCP6 Server Identifier Option" - __metaclass__ = NewDefaultValues optcode = 2 # Should be encapsulated in the option field of IA_NA or IA_TA options @@ -941,7 +940,6 @@ class DHCP6(_DHCP6OptGuessPayload): class DHCP6_Solicit(DHCP6): name = "DHCPv6 Solicit Message" - __metaclass__ = NewDefaultValues msgtype = 1 overload_fields = { UDP: {"sport": 546, "dport": 547} } @@ -955,7 +953,6 @@ class DHCP6_Solicit(DHCP6): class DHCP6_Advertise(DHCP6): name = "DHCPv6 Advertise Message" - __metaclass__ = NewDefaultValues msgtype = 2 overload_fields = { UDP: {"sport": 547, "dport": 546} } @@ -983,7 +980,6 @@ class DHCP6_Advertise(DHCP6): class DHCP6_Request(DHCP6): name = "DHCPv6 Request Message" - __metaclass__ = NewDefaultValues msgtype = 3 ##################################################################### @@ -996,7 +992,6 @@ class DHCP6_Request(DHCP6): class DHCP6_Confirm(DHCP6): name = "DHCPv6 Confirm Message" - __metaclass__ = NewDefaultValues msgtype = 4 ##################################################################### @@ -1018,7 +1013,6 @@ class DHCP6_Confirm(DHCP6): class DHCP6_Renew(DHCP6): name = "DHCPv6 Renew Message" - __metaclass__ = NewDefaultValues msgtype = 5 ##################################################################### @@ -1029,7 +1023,6 @@ class DHCP6_Renew(DHCP6): class DHCP6_Rebind(DHCP6): name = "DHCPv6 Rebind Message" - __metaclass__ = NewDefaultValues msgtype = 6 ##################################################################### @@ -1057,7 +1050,6 @@ class DHCP6_Rebind(DHCP6): class DHCP6_Reply(DHCP6): name = "DHCPv6 Reply Message" - __metaclass__ = NewDefaultValues msgtype = 7 def answers(self, other): @@ -1072,7 +1064,6 @@ class DHCP6_Reply(DHCP6): class DHCP6_Release(DHCP6): name = "DHCPv6 Release Message" - __metaclass__ = NewDefaultValues msgtype = 8 ##################################################################### @@ -1087,7 +1078,6 @@ class DHCP6_Release(DHCP6): class DHCP6_Decline(DHCP6): name = "DHCPv6 Decline Message" - __metaclass__ = NewDefaultValues msgtype = 9 ##################################################################### @@ -1105,7 +1095,6 @@ class DHCP6_Decline(DHCP6): class DHCP6_Reconf(DHCP6): name = "DHCPv6 Reconfigure Message" - __metaclass__ = NewDefaultValues msgtype = 10 overload_fields = { UDP: { "sport": 547, "dport": 546 } } @@ -1124,7 +1113,6 @@ class DHCP6_Reconf(DHCP6): class DHCP6_InfoRequest(DHCP6): name = "DHCPv6 Information Request Message" - __metaclass__ = NewDefaultValues msgtype = 11 def hashret(self): @@ -1172,7 +1160,6 @@ class DHCP6_RelayForward(_DHCP6GuessPayload,Packet): class DHCP6_RelayReply(DHCP6_RelayForward): name = "DHCPv6 Relay Reply Message (Relay Agent/Server Message)" - __metaclass__= NewDefaultValues msgtype = 13 def hashret(self): # We filter on peer address field. return inet_pton(socket.AF_INET6, self.peeraddr) diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py index 87e4f36a7c2c8fdd49b7f38d6d1b0d8f1eba035d..5466e985721c3bae2c465fd2c57beaf0338057f2 100644 --- a/scapy/layers/inet6.py +++ b/scapy/layers/inet6.py @@ -1227,7 +1227,6 @@ class ICMPv6EchoRequest(_ICMPv6): class ICMPv6EchoReply(ICMPv6EchoRequest): name = "ICMPv6 Echo Reply" - __metaclass__ = NewDefaultValues type = 129 def answers(self, other): # We could match data content between request and reply. @@ -1262,7 +1261,6 @@ class _ICMPv6ML(_ICMPv6): # Option in a Destination Option Header. class ICMPv6MLQuery(_ICMPv6ML): # RFC 2710 name = "MLD - Multicast Listener Query" - __metaclass__ = NewDefaultValues type = 130 mrd = 10000 mladdr = "::" # 10s for mrd @@ -1278,7 +1276,6 @@ class ICMPv6MLQuery(_ICMPv6ML): # RFC 2710 # Option in a Destination Option Header. class ICMPv6MLReport(_ICMPv6ML): # RFC 2710 name = "MLD - Multicast Listener Report" - __metaclass__ = NewDefaultValues type = 131 overload_fields = {IPv6: {"hlim": 1}} # implementer le hashret et le answers @@ -1291,7 +1288,6 @@ class ICMPv6MLReport(_ICMPv6ML): # RFC 2710 # Option in a Destination Option Header. class ICMPv6MLDone(_ICMPv6ML): # RFC 2710 name = "MLD - Multicast Listener Done" - __metaclass__ = NewDefaultValues type = 132 overload_fields = {IPv6: { "dst": "ff02::2", "hlim": 1}} @@ -1430,7 +1426,6 @@ class ICMPv6NDOptSrcLLAddr(_ICMPv6NDGuessPayload, Packet): class ICMPv6NDOptDstLLAddr(ICMPv6NDOptSrcLLAddr): name = "ICMPv6 Neighbor Discovery Option - Destination Link-Layer Address" - __metaclass__ = NewDefaultValues type = 2 class ICMPv6NDOptPrefixInfo(_ICMPv6NDGuessPayload, Packet): @@ -1695,7 +1690,6 @@ class ICMPv6ND_NS(_ICMPv6NDGuessPayload, _ICMPv6, Packet): class ICMPv6ND_NA(ICMPv6ND_NS): name = "ICMPv6 Neighbor Discovery - Neighbor Advertisement" - __metaclass__ = NewDefaultValues type = 136 R = 1 O = 1 @@ -1729,7 +1723,6 @@ class ICMPv6NDOptSrcAddrList(_ICMPv6NDGuessPayload, Packet): class ICMPv6NDOptTgtAddrList(ICMPv6NDOptSrcAddrList): name = "ICMPv6 Inverse Neighbor Discovery Option - Target Address List" - __metaclass__ = NewDefaultValues type = 10 @@ -2009,19 +2002,16 @@ class ICMPv6NIQueryNOOP(_ICMPv6NIHashret, _ICMPv6): class ICMPv6NIQueryName(ICMPv6NIQueryNOOP): name = "ICMPv6 Node Information Query - IPv6 Name Query" - __metaclass__ = NewDefaultValues qtype = 2 # We ask for the IPv6 address of the peer class ICMPv6NIQueryIPv6(ICMPv6NIQueryNOOP): name = "ICMPv6 Node Information Query - IPv6 Address Query" - __metaclass__ = NewDefaultValues qtype = 3 flags = 0x3E class ICMPv6NIQueryIPv4(ICMPv6NIQueryNOOP): name = "ICMPv6 Node Information Query - IPv4 Address Query" - __metaclass__ = NewDefaultValues qtype = 4 _nireply_code = { 0: "Successful Reply", @@ -2176,27 +2166,22 @@ class ICMPv6NIReplyNOOP(_ICMPv6NIAnswers, _ICMPv6NIHashret, _ICMPv6): class ICMPv6NIReplyName(ICMPv6NIReplyNOOP): name = "ICMPv6 Node Information Reply - Node Names" - __metaclass__ = NewDefaultValues qtype = 2 class ICMPv6NIReplyIPv6(ICMPv6NIReplyNOOP): name = "ICMPv6 Node Information Reply - IPv6 addresses" - __metaclass__ = NewDefaultValues qtype = 3 class ICMPv6NIReplyIPv4(ICMPv6NIReplyNOOP): name = "ICMPv6 Node Information Reply - IPv4 addresses" - __metaclass__ = NewDefaultValues qtype = 4 class ICMPv6NIReplyRefuse(ICMPv6NIReplyNOOP): name = "ICMPv6 Node Information Reply - Responder refuses to supply answer" - __metaclass__ = NewDefaultValues code = 1 class ICMPv6NIReplyUnknown(ICMPv6NIReplyNOOP): name = "ICMPv6 Node Information Reply - Qtype unknown to the responder" - __metaclass__ = NewDefaultValues code = 2 @@ -2674,7 +2659,6 @@ class MIP6MH_HoTI(_MobilityHeader): class MIP6MH_CoTI(MIP6MH_HoTI): name = "IPv6 Mobility Header - Care-of Test Init" - __metaclass__ = NewDefaultValues mhtype = 2 def hashret(self): return self.cookie @@ -2703,7 +2687,6 @@ class MIP6MH_HoT(_MobilityHeader): class MIP6MH_CoT(MIP6MH_HoT): name = "IPv6 Mobility Header - Care-of Test" - __metaclass__ = NewDefaultValues mhtype = 4 def hashret(self): return self.cookie diff --git a/scapy/layers/llmnr.py b/scapy/layers/llmnr.py index 62be5226e7a30a2ef384169daeac9284a3932060..561729c876fa4547d6e91f0102edf4928d976be7 100644 --- a/scapy/layers/llmnr.py +++ b/scapy/layers/llmnr.py @@ -36,7 +36,6 @@ class LLMNRQuery(Packet): class LLMNRResponse(LLMNRQuery): name = "Link Local Multicast Node Resolution - Response" - __metaclass__ = NewDefaultValues qr = 1 fields_desc = [] diff --git a/test/regression.uts b/test/regression.uts index 49149c9919df5dd03beaedea909254610e462876..333d8a2e348dbfb13707df06fab24ca9357bd848 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -188,11 +188,10 @@ assert( _ == "FOO\x01\x02\x03\x04" ) ############ ############ -+ Tests on NewDefaultValues metaclass ++ Tests on default value changes mechanism = Creation of an IPv3 class from IP class with different default values class IPv3(IP): - __metaclass__ = NewDefaultValues version = 3 ttl = 32