- some getattr/setattr/delattr enhancements

This commit is contained in:
pbi 2003-04-22 11:55:01 +00:00
parent daaff0057b
commit 9d402af84a
1 changed files with 47 additions and 42 deletions

View File

@ -22,6 +22,9 @@
# #
# $Log: scapy.py,v $ # $Log: scapy.py,v $
# Revision 0.9.10.7 2003/04/22 13:55:01 pbi
# - some getattr/setattr/delattr enhancements
#
# Revision 0.9.10.6 2003/04/22 13:52:00 pbi # Revision 0.9.10.6 2003/04/22 13:52:00 pbi
# - added experimental support for QueSO OS fingerprinting. Has someone a *recent* database ? # - added experimental support for QueSO OS fingerprinting. Has someone a *recent* database ?
# #
@ -169,7 +172,7 @@
from __future__ import generators from __future__ import generators
RCSID="$Id: scapy.py,v 0.9.10.6 2003/04/22 13:52:00 pbi Exp $" RCSID="$Id: scapy.py,v 0.9.10.7 2003/04/22 13:55:01 pbi Exp $"
VERSION = RCSID.split()[2]+"beta" VERSION = RCSID.split()[2]+"beta"
@ -948,11 +951,11 @@ class SourceIPField(IPField):
self.dstname = dstname self.dstname = dstname
def i2m(self, pkt, x): def i2m(self, pkt, x):
if x is None: if x is None:
iff,x,gw = choose_route(pkt.__getattr__(self.dstname)) iff,x,gw = choose_route(getattr(pkt,self.dstname))
return IPField.i2m(self, pkt, x) return IPField.i2m(self, pkt, x)
def i2h(self, pkt, x): def i2h(self, pkt, x):
if x is None: if x is None:
dst=pkt.__getattr__(self.dstname) dst=getattr(pkt,self.dstname)
if isinstance(dst,Gen): if isinstance(dst,Gen):
r = map(choose_route, dst) r = map(choose_route, dst)
r.sort() r.sort()
@ -1414,7 +1417,7 @@ class Packet(Gen):
underlayer = None underlayer = None
payload_guess = [] payload_guess = []
initialized = 0
def __init__(self, pkt="", **fields): def __init__(self, pkt="", **fields):
self.time = time.time() self.time = time.time()
@ -1427,6 +1430,7 @@ class Packet(Gen):
for f in self.fields_desc: for f in self.fields_desc:
self.default_fields[f] = f.default self.default_fields[f] = f.default
self.fieldtype[f] = f self.fieldtype[f] = f
self.initialized = 1
if pkt: if pkt:
self.dissect(pkt) self.dissect(pkt)
for f in fields.keys(): for f in fields.keys():
@ -1470,49 +1474,50 @@ class Packet(Gen):
clone.payload.add_underlayer(clone) clone.payload.add_underlayer(clone)
return clone return clone
def __getattr__(self, attr): def __getattr__(self, attr):
if self.__dict__.has_key("fieldtype") and self.fieldtype.has_key(attr): if self.initialized:
i2h = self.fieldtype[attr].i2h fld = self.fieldtype.get(attr)
else: if fld is None:
i2h = lambda x,y: y i2h = lambda x,y: y
if self.__dict__.has_key("fields") and self.fields.has_key(attr):
return i2h(self, self.fields[attr])
elif self.__dict__.has_key("overloaded_fields") and self.overloaded_fields.has_key(attr):
return i2h(self, self.overloaded_fields[attr])
elif self.__dict__.has_key("default_fields") and self.default_fields.has_key(attr):
return i2h(self, self.default_fields[attr])
elif self.__dict__.has_key(attr):
return self.__dict__[attr]
else: else:
i2h = fld.i2h
for f in ["fields", "overloaded_fields", "default_fields"]:
fields = self.__dict__[f]
if fields.has_key(attr):
return i2h(self, fields[attr] )
return getattr(self.payload, attr) return getattr(self.payload, attr)
# raise AttributeError, attr raise AttributeError(attr)
def __setattr__(self, attr, val): def __setattr__(self, attr, val):
if self.__dict__.has_key("fieldtype") and self.fieldtype.has_key(attr): if self.initialized:
any2i = self.fieldtype[attr].any2i if self.default_fields.has_key(attr):
else: fld = self.fieldtype.get(attr)
if fld is None:
any2i = lambda x,y: y any2i = lambda x,y: y
if ( self.__dict__.has_key("fields") and else:
( ( self.fields.has_key(attr) or any2i = fld.any2i
( self.__dict__.has_key("default_fields") and
self.default_fields.has_key(attr) ) ) ) ):
self.fields[attr] = any2i(self, val) self.fields[attr] = any2i(self, val)
elif attr == "payload": elif attr == "payload":
self.remove_payload() self.remove_payload()
self.add_payload(val) self.add_payload(val)
else: else:
self.__dict__[attr] = val self.__dict__[attr] = val
else:
self.__dict__[attr] = val
def __delattr__(self, attr): def __delattr__(self, attr):
if self.__dict__.has_key("fields") and self.fields.has_key(attr): if self.initialized:
if self.fields.has_key(attr):
del(self.fields[attr]) del(self.fields[attr])
elif self.__dict__.has_key("overloaded_fields") and self.overloaded_fields.has_key(attr): return
pass elif self.default_fields.has_key(attr):
elif self.__dict__.has_key("default_fields") and self.default_fields.has_key(attr): return
pass
elif attr == "payload": elif attr == "payload":
self.remove_payload() self.remove_payload()
elif self.__dict__.has_key(attr): return
if self.__dict__.has_key(attr):
del(self.__dict__[attr]) del(self.__dict__[attr])
else: else:
raise AttributeError, attr raise AttributeError(attr)
def __repr__(self): def __repr__(self):
s = "" s = ""
for fname in self.fields.keys(): for fname in self.fields.keys():
@ -1591,7 +1596,7 @@ class Packet(Gen):
for fval, cls in t.payload_guess: for fval, cls in t.payload_guess:
ok = 1 ok = 1
for k in fval.keys(): for k in fval.keys():
if fval[k] != self.__getattr__(k): if fval[k] != getattr(self,k):
ok = 0 ok = 0
break break
if ok: if ok: