From 241e2c497945a93117ce42ebc2a555e3871ca716 Mon Sep 17 00:00:00 2001 From: Pierre LALET <pierre.lalet@cea.fr> Date: Wed, 27 Apr 2016 16:41:43 +0200 Subject: [PATCH] Code cleanup / optimization --- scapy/ansmachine.py | 4 ++-- scapy/arch/windows/__init__.py | 6 +++--- scapy/asn1/mib.py | 8 ++++---- scapy/asn1fields.py | 6 +++--- scapy/automaton.py | 2 +- scapy/config.py | 5 ++--- scapy/contrib/openflow3.py | 2 +- scapy/contrib/ppi_geotag.py | 8 +++----- scapy/crypto/cert.py | 12 ++++++------ scapy/dadict.py | 5 +++-- scapy/layers/dns.py | 31 +++++++++++++++---------------- scapy/layers/inet.py | 32 +++++++++++++++----------------- scapy/layers/inet6.py | 12 ++++++------ scapy/main.py | 6 +++--- scapy/modules/nmap.py | 20 ++++++++++---------- scapy/packet.py | 24 ++++++++++++------------ scapy/plist.py | 11 ++++++----- scapy/sendrecv.py | 7 ++++--- scapy/volatile.py | 6 ++---- test/regression.uts | 5 +++-- 20 files changed, 104 insertions(+), 108 deletions(-) diff --git a/scapy/ansmachine.py b/scapy/ansmachine.py index 2a90adcc..d73bd421 100644 --- a/scapy/ansmachine.py +++ b/scapy/ansmachine.py @@ -68,13 +68,13 @@ class AnsweringMachine(object): def parse_all_options(self, mode, kargs): sniffopt = {} sendopt = {} - for k in kargs.keys(): + for k in kargs.keys(): # use .keys(): kargs is modified in the loop if k in self.sniff_options_list: sniffopt[k] = kargs[k] if k in self.send_options_list: sendopt[k] = kargs[k] if k in self.sniff_options_list+self.send_options_list: - del(kargs[k]) + del kargs[k] if mode != 2 or kargs: if mode == 1: self.optam0 = kargs diff --git a/scapy/arch/windows/__init__.py b/scapy/arch/windows/__init__.py index c4860da4..44f3569b 100755 --- a/scapy/arch/windows/__init__.py +++ b/scapy/arch/windows/__init__.py @@ -308,7 +308,7 @@ class NetworkInterfaceDict(UserDict): def show(self, resolve_mac=True): """Print list of available network interfaces in human readable form""" print "%s %s %s %s" % ("INDEX".ljust(5), "IFACE".ljust(35), "IP".ljust(15), "MAC") - for iface_name in sorted(self.data.keys()): + for iface_name in sorted(self.data): dev = self.data[iface_name] mac = dev.mac if resolve_mac: @@ -568,9 +568,9 @@ def sndrcv(pks, pkt, timeout = 2, inter = 0, verbose=None, chainCC=0, retry=0, m finally: pass - remain = list(itertools.chain(*[ i for i in hsent.values() ])) + remain = list(itertools.chain(*hsent.itervalues())) if multi: - remain = [ p for p in remain if not hasattr(p, '_answered')] + remain = [p for p in remain if not hasattr(p, '_answered')] if autostop and len(remain) > 0 and len(remain) != len(tobesent): retry = autostop diff --git a/scapy/asn1/mib.py b/scapy/asn1/mib.py index c8065f00..c3aa59c1 100644 --- a/scapy/asn1/mib.py +++ b/scapy/asn1/mib.py @@ -32,7 +32,7 @@ class MIBDict(DADict): x += "." max=0 root="." - for k in self.keys(): + for k in self.iterkeys(): if x.startswith(self[k]+"."): if max < len(self[k]): max = len(self[k]) @@ -51,8 +51,8 @@ class MIBDict(DADict): xl[p] = self[xl[p]] return ".".join(xl[p:]) def _make_graph(self, other_keys=[], **kargs): - nodes = [(k,self[k]) for k in self.keys()] - oids = [self[k] for k in self.keys()] + nodes = [(k, self[k]) for k in self.iterkeys()] + oids = [self[k] for k in self.iterkeys()] for k in other_keys: if k not in oids: nodes.append(self.oidname(k),k) @@ -114,7 +114,7 @@ def mib_register(ident, value, the_mib, unresolved): def load_mib(filenames): the_mib = {'iso': ['1']} unresolved = {} - for k in conf.mib.keys(): + for k in conf.mib.iterkeys(): mib_register(k, conf.mib[k].split("."), the_mib, unresolved) if type(filenames) is str: diff --git a/scapy/asn1fields.py b/scapy/asn1fields.py index 0994e4a9..568022af 100644 --- a/scapy/asn1fields.py +++ b/scapy/asn1fields.py @@ -169,8 +169,8 @@ class ASN1F_enum_INTEGER(ASN1F_INTEGER): keys = xrange(len(enum)) else: keys = enum.keys() - if filter(lambda x: type(x) is str, keys): - i2s,s2i = s2i,i2s + if any(isinstance(x, basestring) for x in keys): + i2s, s2i = s2i, i2s for k in keys: i2s[k] = enum[k] s2i[enum[k]] = k @@ -470,7 +470,7 @@ class ASN1F_CHOICE(ASN1F_field): explicit_tag=exp) return BER_tagging_enc(s, explicit_tag=self.explicit_tag) def randval(self): - return RandChoice(*map(lambda x:fuzz(x()), self.choice.values())) + return RandChoice(*(fuzz(x()) for x in self.choices.itervalues())) class ASN1F_PACKET(ASN1F_field): holds_packets = 1 diff --git a/scapy/automaton.py b/scapy/automaton.py index 69651c50..1dde1dac 100644 --- a/scapy/automaton.py +++ b/scapy/automaton.py @@ -291,7 +291,7 @@ class Automaton_metaclass(type): se += '\t"%s" [ style=filled, fillcolor=red, shape=octagon ];\n' % st.atmt_state s += se - for st in self.states.values(): + for st in self.states.itervalues(): for n in st.atmt_origfunc.func_code.co_names+st.atmt_origfunc.func_code.co_consts: if n in self.states: s += '\t"%s" -> "%s" [ color=green ];\n' % (st.atmt_state,n) diff --git a/scapy/config.py b/scapy/config.py index 95fb43d2..7f99e3d8 100755 --- a/scapy/config.py +++ b/scapy/config.py @@ -23,11 +23,10 @@ class ConfClass(object): def __repr__(self): return str(self) def __str__(self): - s="" + s = "" keys = self.__class__.__dict__.copy() keys.update(self.__dict__) - keys = keys.keys() - keys.sort() + keys = sorted(keys) for i in keys: if i[0] != "_": r = repr(getattr(self, i)) diff --git a/scapy/contrib/openflow3.py b/scapy/contrib/openflow3.py index 0dc31306..5df721ad 100755 --- a/scapy/contrib/openflow3.py +++ b/scapy/contrib/openflow3.py @@ -553,7 +553,7 @@ class OXMPacketListField(PacketListField): for oxm in fix_val: f = 2*oxm.field fix_index = list(self.index) - while f in need_prereq.keys(): + while f in need_prereq: # this loop enables a small recursion # e.g. ipv6_nd<--icmpv6<--ip_proto<--eth_type prereq = need_prereq[f] diff --git a/scapy/contrib/ppi_geotag.py b/scapy/contrib/ppi_geotag.py index add1a675..bb7f321d 100644 --- a/scapy/contrib/ppi_geotag.py +++ b/scapy/contrib/ppi_geotag.py @@ -260,11 +260,9 @@ class HCSIAppField(StrFixedLenField): return StrFixedLenField.__init__(self, name, default, length=60) def _FlagsList(myfields): - flags = [] - for i in xrange(32): - flags.append("Reserved%02d" % i) - for i in myfields.keys(): - flags[i] = myfields[i] + flags = ["Reserved%02d" % i for i in xrange(32)] + for i, value in myfields.iteritems(): + flags[i] = value return flags # Define all geolocation-tag flags lists diff --git a/scapy/crypto/cert.py b/scapy/crypto/cert.py index 1d383650..c89656a5 100644 --- a/scapy/crypto/cert.py +++ b/scapy/crypto/cert.py @@ -159,7 +159,7 @@ def pkcs_mgf1(mgfSeed, maskLen, h): """ # steps are those of Appendix B.2.1 - if not _hashFuncParams.has_key(h): + if h not in _hashFuncParams: warning("pkcs_mgf1: invalid hash (%s) provided") return None hLen = _hashFuncParams[h][0] @@ -520,7 +520,7 @@ class _EncryptAndVerify: mLen = len(M) if h is None: h = "sha1" - if not _hashFuncParams.has_key(h): + if h not in _hashFuncParams: warning("Key._rsaes_oaep_encrypt(): unknown hash function %s.", h) return None hLen = _hashFuncParams[h][0] @@ -641,7 +641,7 @@ class _EncryptAndVerify: # Set default parameters if not provided if h is None: # By default, sha1 h = "sha1" - if not _hashFuncParams.has_key(h): + if h not in _hashFuncParams: warning("Key._rsassa_pss_verify(): unknown hash function " "provided (%s)" % h) return False @@ -889,7 +889,7 @@ class _DecryptAndSignMethods(OSSLHelper): # 1.a) is not done if h is None: h = "sha1" - if not _hashFuncParams.has_key(h): + if h not in _hashFuncParams: warning("Key._rsaes_oaep_decrypt(): unknown hash function %s.", h) return None hLen = _hashFuncParams[h][0] @@ -1042,7 +1042,7 @@ class _DecryptAndSignMethods(OSSLHelper): # Set default parameters if not provided if h is None: # By default, sha1 h = "sha1" - if not _hashFuncParams.has_key(h): + if h not in _hashFuncParams: warning("Key._rsassa_pss_sign(): unknown hash function " "provided (%s)" % h) return None @@ -1940,7 +1940,7 @@ class Cert(OSSLHelper, _EncryptAndVerify): unenc = unenc[pos+1:] found = None - for k in _hashFuncParams.keys(): + for k in _hashFuncParams: if self.sigAlg.startswith(k): found = k break diff --git a/scapy/dadict.py b/scapy/dadict.py index dcfd2a77..f50ccfb1 100644 --- a/scapy/dadict.py +++ b/scapy/dadict.py @@ -83,5 +83,6 @@ class DADict: r += p return r def keys(self): - return filter(lambda x:x and x[0]!="_", self.__dict__.keys()) - + return list(self.iterkeys()) + def iterkeys(self): + return (x for x in self.__dict__ if x and x[0] != "_") diff --git a/scapy/layers/dns.py b/scapy/layers/dns.py index ed85cf18..9abbf566 100644 --- a/scapy/layers/dns.py +++ b/scapy/layers/dns.py @@ -125,8 +125,8 @@ class DNSRRField(StrField): if type in [2, 3, 4, 5]: rr.rdata = DNSgetstr(s,p)[0] del(rr.rdlen) - elif type in dnsRRdispatcher.keys(): - rr = dnsRRdispatcher[type]("\x00"+ret+s[p:p+rdlen]) + elif type in DNSRR_DISPATCHER: + rr = DNSRR_DISPATCHER[type]("\x00"+ret+s[p:p+rdlen]) else: del(rr.rdlen) @@ -591,22 +591,21 @@ class DNSRRNSEC3PARAM(_DNSRRdummy): ] -dnssecclasses = [ DNSRROPT, DNSRRRSIG, DNSRRDLV, DNSRRDNSKEY, DNSRRNSEC, DNSRRDS, DNSRRNSEC3, DNSRRNSEC3PARAM ] +DNSRR_DISPATCHER = { + 41: DNSRROPT, # RFC 1671 + 43: DNSRRDS, # RFC 4034 + 46: DNSRRRSIG, # RFC 4034 + 47: DNSRRNSEC, # RFC 4034 + 48: DNSRRDNSKEY, # RFC 4034 + 50: DNSRRNSEC3, # RFC 5155 + 51: DNSRRNSEC3PARAM, # RFC 5155 + 32769: DNSRRDLV, # RFC 4431 +} + +DNSSEC_CLASSES = tuple(DNSRR_DISPATCHER.itervalues()) def isdnssecRR(obj): - list = [ isinstance (obj, cls) for cls in dnssecclasses ] - return reduce(lambda x,y: x or y, list) - -dnsRRdispatcher = { #6: DNSRRSOA, - 41: DNSRROPT, # RFC 1671 - 43: DNSRRDS, # RFC 4034 - 46: DNSRRRSIG, # RFC 4034 - 47: DNSRRNSEC, # RFC 4034 - 48: DNSRRDNSKEY, # RFC 4034 - 50: DNSRRNSEC3, # RFC 5155 - 51: DNSRRNSEC3PARAM, # RFC 5155 - 32769: DNSRRDLV # RFC 4431 - } + return isinstance(obj, DNSSEC_CLASSES) class DNSRR(Packet): name = "DNS Resource Record" diff --git a/scapy/layers/inet.py b/scapy/layers/inet.py index 1807d19d..4aec65a0 100644 --- a/scapy/layers/inet.py +++ b/scapy/layers/inet.py @@ -1004,14 +1004,14 @@ class TracerouteResult(SndRcvList): if d not in trace: trace[d] = {} trace[d][s[IP].ttl] = r[IP].src, ICMP not in r - for k in trace.values(): - m = filter(lambda x:k[x][1], k.keys()) - if not m: + for k in trace.itervalues(): + try: + m = min(x for x, y in k.itervalues() if y[1]) + except ValueError: continue - m = min(m) - for l in k.keys(): + for l in k.keys(): # use .keys(): k is modified in the loop if l > m: - del(k[l]) + del k[l] return trace def trace3D(self): @@ -1049,8 +1049,7 @@ class TracerouteResult(SndRcvList): for i in trace: tr = trace[i] tr3d[i] = [] - ttl = tr.keys() - for t in xrange(1,max(ttl)+1): + for t in xrange(1, max(tr) + 1): if t not in rings: rings[t] = [] if t in tr: @@ -1074,12 +1073,12 @@ class TracerouteResult(SndRcvList): s = IPsphere(pos=((l-1)*visual.cos(2*i*visual.pi/l),(l-1)*visual.sin(2*i*visual.pi/l),2*t), ip = r[i][0], color = col) - for trlst in tr3d.values(): + for trlst in tr3d.itervalues(): if t <= len(trlst): if trlst[t-1] == i: trlst[t-1] = s forecol = colgen(0.625, 0.4375, 0.25, 0.125) - for trlst in tr3d.values(): + for trlst in tr3d.itervalues(): col = forecol.next() start = (0,0,0) for ip in trlst: @@ -1174,7 +1173,7 @@ class TracerouteResult(SndRcvList): for trace_id in rt: trace = rt[trace_id] loctrace = [] - for i in xrange(max(trace.keys())): + for i in xrange(max(trace)): ip = trace.get(i,None) if ip is None: continue @@ -1259,8 +1258,7 @@ class TracerouteResult(SndRcvList): bhip = {} for rtk in rt: trace = rt[rtk] - k = trace.keys() - for n in xrange(min(k), max(k)): + for n in xrange(min(trace), max(trace)): if not trace.has_key(n): trace[n] = unknown_label.next() if not ports_done.has_key(rtk): @@ -1279,7 +1277,7 @@ class TracerouteResult(SndRcvList): blackholes.append(bh) # Find AS numbers - ASN_query_list = dict.fromkeys(map(lambda x:x.rsplit(" ",1)[0],ips)).keys() + ASN_query_list = set(x.rsplit(" ",1)[0] for x in ips) if ASres is None: ASNlist = [] else: @@ -1352,10 +1350,10 @@ class TracerouteResult(SndRcvList): s += "#---[%s\n" % `rtk` s += '\t\tedge [color="#%s%s%s"];\n' % forecolorlist.next() trace = rt[rtk] - k = trace.keys() - for n in xrange(min(k), max(k)): + maxtrace = max(trace) + for n in xrange(min(trace), maxtrace): s += '\t%s ->\n' % trace[n] - s += '\t%s;\n' % trace[max(k)] + s += '\t%s;\n' % trace[maxtrace] s += "}\n"; self.graphdef = s diff --git a/scapy/layers/inet6.py b/scapy/layers/inet6.py index 763b9167..a0ce6b32 100644 --- a/scapy/layers/inet6.py +++ b/scapy/layers/inet6.py @@ -2919,14 +2919,14 @@ class TracerouteResult6(TracerouteResult): trace[d][s[IPv6].hlim] = r[IPv6].src, t - for k in trace.values(): - m = filter(lambda x: k[x][1], k.keys()) - if not m: + for k in trace.itervalues(): + try: + m = min(x for x, y in k.itervalues() if y[1]) + except ValueError: continue - m = min(m) - for l in k.keys(): + for l in k.keys(): # use .keys(): k is modified in the loop if l > m: - del(k[l]) + del k[l] return trace diff --git a/scapy/main.py b/scapy/main.py index 149ac6e4..63c615c1 100644 --- a/scapy/main.py +++ b/scapy/main.py @@ -204,13 +204,13 @@ def interact(mydict=None,argv=None,mybanner=None,loglevel=20): def global_matches(self, text): matches = [] n = len(text) - for lst in [dir(__builtin__), session.keys()]: + for lst in [dir(__builtin__), session]: for word in lst: if word[:n] == text and word != "__builtins__": matches.append(word) return matches - - + + def attr_matches(self, text): m = re.match(r"(\w+(\.\w+)*)\.(\w*)", text) if not m: diff --git a/scapy/modules/nmap.py b/scapy/modules/nmap.py index 50abec1d..4ff1a56a 100644 --- a/scapy/modules/nmap.py +++ b/scapy/modules/nmap.py @@ -111,16 +111,16 @@ def nmap_udppacket_sig(S,T): def nmap_match_one_sig(seen, ref): c = 0 - for k in seen.keys(): - if ref.has_key(k): - if seen[k] in ref[k].split("|"): + for k, v in seen.iteritems(): + if k in ref: + if v in ref[k].split("|"): c += 1 if c == 0 and seen.get("Resp") == "N": return 0.7 else: - return 1.0*c/len(seen.keys()) - - + return float(c) / len(seen) + + def nmap_sig(target, oport=80, cport=81, ucport=1): res = {} @@ -167,10 +167,10 @@ def nmap_search(sigs): guess = 0,[] for os,fp in nmap_kdb.get_base(): c = 0.0 - for t in sigs.keys(): + for t, v in sigs.itervalues(): if t in fp: - c += nmap_match_one_sig(sigs[t], fp[t]) - c /= len(sigs.keys()) + c += nmap_match_one_sig(v, fp[t]) + c /= len(sigs) if c > guess[0]: guess = c,[ os ] elif c == guess[0]: @@ -194,7 +194,7 @@ def nmap_sig2txt(sig): "Resp", "DF", "W", "ACK", "Flags", "Ops", "TOS", "IPLEN", "RIPTL", "RID", "RIPCK", "UCK", "ULEN", "DAT" ] txt=[] - for i in sig.keys(): + for i in sig: if i not in torder: torder.append(i) for t in torder: diff --git a/scapy/packet.py b/scapy/packet.py index a87fc42b..afe5e4da 100644 --- a/scapy/packet.py +++ b/scapy/packet.py @@ -94,8 +94,8 @@ class Packet(BasePacket): self.dissect(_pkt) if not _internal: self.dissection_done(self) - for f in fields.keys(): - self.fields[f] = self.get_field(f).any2i(self,fields[f]) + for f, v in fields.iteritems(): + self.fields[f] = self.get_field(f).any2i(self, v) if type(post_transform) is list: self.post_transforms = post_transform elif post_transform is None: @@ -629,8 +629,8 @@ Creates an EPS file describing a packet. If filename is not provided a temporary for t in self.aliastypes: for fval, cls in t.payload_guess: ok = 1 - for k in fval.keys(): - if not hasattr(self, k) or fval[k] != self.getfieldval(k): + for k, v in fval.iteritems(): + if not hasattr(self, k) or v != self.getfieldval(k): ok = 0 break if ok: @@ -643,12 +643,12 @@ Creates an EPS file describing a packet. If filename is not provided a temporary def hide_defaults(self): """Removes fields' values that are the same as default values.""" - for k in self.fields.keys(): - if self.default_fields.has_key(k): - if self.default_fields[k] == self.fields[k]: - del(self.fields[k]) + for k, v in self.fields.items(): # use .items(): self.fields is modified in the loop + if k in self.default_fields: + if self.default_fields[k] == v: + del self.fields[k] self.payload.hide_defaults() - + def clone_with(self, payload=None, **kargs): pkt = self.__class__() pkt.explicit = 1 @@ -696,9 +696,9 @@ Creates an EPS file describing a packet. If filename is not provided a temporary todo = [] done = self.fields else: - todo = [ k for (k,v) in itertools.chain(self.default_fields.iteritems(), - self.overloaded_fields.iteritems()) - if isinstance(v, VolatileValue) ] + self.fields.keys() + todo = [k for (k,v) in itertools.chain(self.default_fields.iteritems(), + self.overloaded_fields.iteritems()) + if isinstance(v, VolatileValue)] + self.fields.keys() done = {} return loop(todo, done) diff --git a/scapy/plist.py b/scapy/plist.py index 987d39db..5e3fdea5 100644 --- a/scapy/plist.py +++ b/scapy/plist.py @@ -363,16 +363,17 @@ lfilter: truth function to apply to each packet to decide whether it will be dis return 2+math.log(n)/4.0 def minmax(x): - m,M = min(x),max(x) + m, M = reduce(lambda a, b: (min(a[0], b[0]), max(a[1], b[1])), + ((a, a) for a in x)) if m == M: m = 0 if M == 0: M = 1 - return m,M + return m, M - mins,maxs = minmax(map(lambda (x,y): x, sl.values())) - mine,maxe = minmax(map(lambda (x,y): x, el.values())) - mind,maxd = minmax(dl.values()) + mins, maxs = minmax(x for x, _ in sl.itervalues()) + mine, maxe = minmax(x for x, _ in el.itervalues()) + mind, maxd = minmax(dl.itervalues()) gr = 'digraph "afterglow" {\n\tedge [len=2.5];\n' diff --git a/scapy/sendrecv.py b/scapy/sendrecv.py index ba921d2a..04dabcb8 100644 --- a/scapy/sendrecv.py +++ b/scapy/sendrecv.py @@ -8,6 +8,7 @@ Functions to send and receive packets. """ import cPickle,os,sys,time,subprocess +import itertools from select import select from data import * import arch @@ -180,10 +181,10 @@ def sndrcv(pks, pkt, timeout = None, inter = 0, verbose=None, chainCC=0, retry=0 if pid == 0: os._exit(0) - remain = reduce(list.__add__, hsent.values(), []) + remain = list(itertools.chain(*hsent.itervalues())) if multi: - remain = filter(lambda p: not hasattr(p, '_answered'), remain); - + remain = [p for p in remain if not hasattr(p, '_answered')] + if autostop and len(remain) > 0 and len(remain) != len(tobesent): retry = autostop diff --git a/scapy/volatile.py b/scapy/volatile.py index 1a1f0002..a870b23c 100644 --- a/scapy/volatile.py +++ b/scapy/volatile.py @@ -192,10 +192,8 @@ class RandEnumSLong(RandEnum): class RandEnumKeys(RandEnum): """Picks a random value from dict keys list. """ def __init__(self, enum): - self.enum = [] - for key in list(enum.keys()): - self.enum.append(key) - self.seq = RandomEnumeration(0, len(list(enum.keys())) - 1) + self.enum = list(enum) + self.seq = RandomEnumeration(0, len(self.enum) - 1) def _fix(self): return self.enum[self.seq.next()] diff --git a/test/regression.uts b/test/regression.uts index d86a5fb5..289235ed 100644 --- a/test/regression.uts +++ b/test/regression.uts @@ -4379,8 +4379,9 @@ builder = LargeTlvBuilder() builder.parse(plist) data = builder.get_data() assert len(data) == 1 -assert data.keys()[0].endswith(' [Detailed Icon Image]') -assert data.values()[0] == 'abcdefg' +key, value = data.popitem() +assert key.endswith(' [Detailed Icon Image]') +assert value == 'abcdefg' ############ -- GitLab