Changeset 466
- Timestamp:
- 03/03/03 01:03:50 (6 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBMessaging/RBMessaging/Client/Handlers/Authentication.py
r465 r466 25 25 26 26 from RBTelepathy.Handlers import * 27 from RBMessaging.Packet import AuthenticationMethods 27 28 28 29 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 44 45 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 46 46 class method(Elements.PacketElement):47 __slots__ = []48 ElementFactories = PacketFactorySet({49 'response': Elements.Factory(Elements.PacketElement),50 'challenge': Elements.Factory(Elements.PacketElement),51 })52 53 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~54 #~ Properties55 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~56 57 def _get_challenge(self):58 challenge = self['challenge',]59 if len(challenge) > 1:60 raise ErrorTypes.AuthenticationError, '"%s" expected a single "challenge" element' % (self.node,)61 elif len(challenge) == 1:62 challenge = ''.join(map(str, challenge[0].iterdata()))63 else: challenge = 'password'64 return challenge65 def _set_challenge(self, challenge):66 self.delnodes('challenge')67 self.addnode('challenge').adddata(challenge)68 def _del_challenge(self, challenge):69 self.delnodes('challenge')70 challenge = property(_get_challenge, _set_challenge, _del_challenge)71 72 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~73 74 def _get_response(self):75 response = self['response',]76 if len(response) != 1:77 raise ErrorTypes.AuthenticationError, '"%s" expected a single "response" child element' % (self.node,)78 else: response = ''.join(map(str, response[0].iterdata()))79 return response80 def _set_response(self, response):81 self.delnodes('response')82 self.addnode('response').adddata(response)83 def _del_response(self, response):84 self.delnodes('response')85 response = property(_get_response, _set_response, _del_response)86 87 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~88 89 47 class authentication(Elements.RootElementBase): 90 48 __slots__ = [] 91 49 ElementFactories = PacketFactorySet({ 92 50 'as': Elements.Factory(Elements.URIAddressElement), 93 'method': Elements.Factory(method),51 'method': AuthenticationMethods.MethodFactory(), 94 52 }) 95 53 … … 133 91 def AuthorizeAs(self, loginaddr, bShort=True): 134 92 self.loginaddr = URIAddress.URIAddress(loginaddr) 135 if bShort: self._reply_response(None) 136 else: self._reply_query(None) 93 if bShort: 94 self._reply_response(None) 95 else: 96 self._reply_query(None) 137 97 138 98 def SendPacket(self, packet, *args, **kw): … … 160 120 161 121 def _reply_select(self, packet, *args, **kw): 122 raise NotImplementedError 162 123 packet = authentication() 163 124 packet.attrs['type'] = 'select' 164 125 packet += 'as', 165 126 packet[-1].attrs['addr'] = str(self.loginaddr) 166 packet += method()127 packet += AuthenticationMethods.AuthenticationBaseMethod() 167 128 packet[-1].attrs['type'] = 'plaintext' 168 129 self.SendPacket(packet) … … 176 137 packet += 'as', 177 138 packet[-1].attrs['addr'] = str(self.loginaddr) 178 packet += method()179 139 180 140 if sendkey: 181 141 # Use PublicKey 182 packet[-1].attrs['type'] = 'publickey' 183 packet[-1] += 'challenge', 184 signdata = 'password' 185 packet[-1][-1] += signdata 186 packet[-1] += 'response', 187 packet[-1][-1] += str(sendkey.sign(signdata, '')[0]) 188 #print packet[-1].toxml(True) 142 packet += AuthenticationMethods.RSAPublicKey() 143 packet[-1].Sign(sendkey, 'password') 189 144 else: 190 packet[-1].attrs['type'] = 'sha-hash' 191 packet[-1] += 'challenge', 192 packet[-1][-1] += 'password' 193 packet[-1] += 'response', 194 import sha 195 packet[-1][-1] += sha.new('secret'+'password').hexdigest() 145 packet += AuthenticationMethods.SHAHash() 146 packet[-1].Sign('secret', 'password') 147 196 148 self.SendPacket(packet) 197 149 … … 202 154 self.connection.OnAuthenticated(False, self.loginaddr) 203 155 156 def _reply_answer(self, packet, *args, **kw): 157 packet = authentication() 158 packet.attrs['type'] = 'answer' 159 packet += 'as', 160 packet[-1].attrs['addr'] = str(self.loginaddr) 161 162 if sendkey: 163 # Use PublicKey 164 packet += AuthenticationMethods.RSAPublicKey() 165 packet[-1].Sign(sendkey, 'password') 166 else: 167 packet += AuthenticationMethods.SHAHash() 168 packet[-1].Sign('secret', 'password') 169 170 self.SendPacket(packet) 171 trunk/RBMessaging/RBMessaging/Host/Handlers/Authentication.py
r465 r466 86 86 87 87 def _reply_options(self, packet, *args, **kw): 88 raise NotImplementedError 88 89 packet.attrs['type'] = 'options' 89 90 for authmethod in ('passkey', 'plaintext', 'md5-hash', 'sha-hash', 'publickey', 'radius'): 90 packet += AuthenticationMethod .AuthenticationBaseMethod()91 packet += AuthenticationMethods.AuthenticationBaseMethod() 91 92 packet[-1].attrs['type'] = authmethod 92 93 self.SendPacket(packet) … … 99 100 self.SendPacket(packet) 100 101 101 def _type_ response(self, packet, *args, **kw):102 def _type_answer(self, packet, *args, **kw): 102 103 try: as_ = packet['as',][0] 103 104 except (LookupError), e: … … 110 111 if method.Verify(self, as_.addr): 111 112 self.connection.OnAuthenticated(True, as_.addr) 112 self._reply_success(packet, *args, **kw)113 return True 113 114 else: 114 115 self.connection.OnAuthenticated(False, as_.addr) 116 raise ErrorTypes.AuthenticationError('Invalid authentication') 117 except ErrorTypes.AuthenticationError, err: 118 self.connection.OnAuthenticated(False, as_.addr) 119 raise 120 121 def _type_response(self, packet, *args, **kw): 122 """Like the "answer" packet type, only with a "success" or "failure" response.""" 123 try: 124 result = self._type_answer(packet, *args, **kw) 125 if result: 126 self._reply_success(packet, *args, **kw) 127 return result 128 else: 115 129 self._reply_failure(packet, *args, **kw) 116 130 raise ErrorTypes.AuthenticationError('Invalid authentication') 117 131 except ErrorTypes.AuthenticationError, err: 118 self.connection.OnAuthenticated(False, as_.addr)119 132 self._reply_failure(packet, *args, **kw) 120 133 raise
