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

Source Code for Module dpkt.rpc

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