Package dpkt :: Module rpc
[hide private]
[frames] | no frames]

Source Code for Module dpkt.rpc

  1  # $Id: rpc.py 271 2006-01-11 16:03:33Z dugsong $ 
  2   
  3  """Remote Procedure Call.""" 
  4   
  5  import struct 
  6  import dpkt 
  7   
  8  # RPC.dir 
  9  CALL = 0 
 10  REPLY = 1 
 11   
 12  # RPC.Auth.flavor 
 13  AUTH_NONE = AUTH_NULL = 0 
 14  AUTH_UNIX = 1 
 15  AUTH_SHORT = 2 
 16  AUTH_DES = 3 
 17   
 18  # RPC.Reply.stat 
 19  MSG_ACCEPTED = 0 
 20  MSG_DENIED = 1 
 21   
 22  # RPC.Reply.Accept.stat 
 23  SUCCESS = 0 
 24  PROG_UNAVAIL = 1 
 25  PROG_MISMATCH = 2 
 26  PROC_UNAVAIL = 3 
 27  GARBAGE_ARGS = 4 
 28  SYSTEM_ERR = 5 
 29   
 30  # RPC.Reply.Reject.stat 
 31  RPC_MISMATCH = 0 
 32  AUTH_ERROR = 1 
 33   
34 -class RPC(dpkt.Packet):
35 __hdr__ = ( 36 ('xid', 'I', 0), 37 ('dir', 'I', CALL) 38 )
39 - class Auth(dpkt.Packet):
40 __hdr__ = (('flavor', 'I', AUTH_NONE), )
41 - def unpack(self, buf):
42 dpkt.Packet.unpack(self, buf) 43 n = struct.unpack('>I', self.data[:4])[0] 44 self.data = self.data[4:4+n]
45 - def __len__(self):
46 return 8 + len(self.data)
47 - def __str__(self):
48 return self.pack_hdr() + struct.pack('>I', len(self.data)) + \ 49 str(self.data)
50
51 - class Call(dpkt.Packet):
52 __hdr__ = ( 53 ('rpcvers', 'I', 2), 54 ('prog', 'I', 0), 55 ('vers', 'I', 0), 56 ('proc', 'I', 0) 57 )
58 - def unpack(self, buf):
59 dpkt.Packet.unpack(self, buf) 60 self.cred = RPC.Auth(self.data) 61 self.verf = RPC.Auth(self.data[len(self.cred):]) 62 self.data = self.data[len(self.cred) + len(self.verf):]
63 - def __len__(self):
64 return len(str(self)) # XXX
65 - def __str__(self):
66 return dpkt.Packet.__str__(self) + \ 67 str(getattr(self, 'cred', RPC.Auth())) + \ 68 str(getattr(self, 'verf', RPC.Auth())) + \ 69 str(self.data)
70
71 - class Reply(dpkt.Packet):
72 __hdr__ = (('stat', 'I', MSG_ACCEPTED), ) 73
74 - class Accept(dpkt.Packet):
75 __hdr__ = (('stat', 'I', SUCCESS), )
76 - def unpack(self, buf):
77 self.verf = RPC.Auth(buf) 78 buf = buf[len(self.verf):] 79 self.stat = struct.unpack('>I', buf[:4])[0] 80 if self.stat == SUCCESS: 81 self.data = buf[4:] 82 elif self.stat == PROG_MISMATCH: 83 self.low, self.high = struct.unpack('>II', buf[4:12]) 84 self.data = buf[12:]
85 - def __len__(self):
86 if self.stat == PROG_MISMATCH: n = 8 87 else: n = 0 88 return len(self.verf) + 4 + n + len(self.data)
89 - def __str__(self):
90 if self.stat == PROG_MISMATCH: 91 return str(self.verf) + struct.pack('>III', self.stat, 92 self.low, self.high) + self.data 93 return str(self.verf) + dpkt.Packet.__str__(self)
94
95 - class Reject(dpkt.Packet):
96 __hdr__ = (('stat', 'I', AUTH_ERROR), )
97 - def unpack(self, buf):
98 dpkt.Packet.unpack(self, buf) 99 if self.stat == RPC_MISMATCH: 100 self.low, self.high = struct.unpack('>II', self.data[:8]) 101 self.data = self.data[8:] 102 elif self.stat == AUTH_ERROR: 103 self.why = struct.unpack('>I', self.data[:4])[0] 104 self.data = self.data[4:]
105 - def __len__(self):
106 if self.stat == RPC_MISMATCH: n = 8 107 elif self.stat == AUTH_ERROR: n =4 108 else: n = 0 109 return 4 + n + len(self.data)
110 - def __str__(self):
111 if self.stat == RPC_MISMATCH: 112 return struct.pack('>III', self.stat, self.low, 113 self.high) + self.data 114 elif self.stat == AUTH_ERROR: 115 return struct.pack('>II', self.stat, self.why) + self.data 116 return dpkt.Packet.__str__(self)
117
118 - def unpack(self, buf):
119 dpkt.Packet.unpack(self, buf) 120 if self.stat == MSG_ACCEPTED: 121 self.data = self.accept = self.Accept(self.data) 122 elif self.status == MSG_DENIED: 123 self.data = self.reject = self.Reject(self.data)
124
125 - def unpack(self, buf):
126 dpkt.Packet.unpack(self, buf) 127 if self.dir == CALL: 128 self.data = self.call = self.Call(self.data) 129 elif self.dir == REPLY: 130 self.data = self.reply = self.Reply(self.data)
131
132 -def unpack_xdrlist(cls, buf):
133 l = [] 134 while buf: 135 if buf.startswith('\x00\x00\x00\x01'): 136 p = cls(buf[4:]) 137 l.append(p) 138 buf = p.data 139 elif buf.startswith('\x00\x00\x00\x00'): 140 break 141 else: 142 raise dpkt.UnpackError, 'invalid XDR list' 143 return l
144
145 -def pack_xdrlist(*args):
146 return '\x00\x00\x00\x01'.join(map(str, args)) + '\x00\x00\x00\x00'
147