Package pyxmpp :: Package sasl :: Module gssapi
[hide private]

Source Code for Module pyxmpp.sasl.gssapi

 1  # 
 2  # (C) Copyright 2008 Jelmer Vernooij <jelmer@samba.org> 
 3  # 
 4  # This program is free software; you can redistribute it and/or modify 
 5  # it under the terms of the GNU Lesser General Public License Version 
 6  # 2.1 as published by the Free Software Foundation. 
 7  # 
 8  # This program is distributed in the hope that it will be useful, 
 9  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
10  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
11  # GNU Lesser General Public License for more details. 
12  # 
13  # You should have received a copy of the GNU Lesser General Public 
14  # License along with this program; if not, write to the Free Software 
15  # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
16  # 
17  """GSSAPI authentication mechanism for PyXMPP SASL implementation. 
18   
19  Normative reference: 
20    - `RFC 4752 <http://www.ietf.org/rfc/rfc4752.txt>`__ 
21  """ 
22   
23  __revision__="$Id$" 
24  __docformat__="restructuredtext en" 
25   
26  import base64 
27  import kerberos 
28   
29  import logging 
30   
31  from pyxmpp.sasl.core import (ClientAuthenticator,Failure,Response,Challenge,Success) 
32   
33 -class GSSAPIClientAuthenticator(ClientAuthenticator):
34 """Provides client-side GSSAPI SASL (Kerberos 5) authentication.""" 35
36 - def __init__(self,password_manager):
37 ClientAuthenticator.__init__(self, password_manager) 38 self.password_manager = password_manager 39 self.__logger = logging.getLogger("pyxmpp.sasl.gssapi.GSSAPIClientAuthenticator")
40
41 - def start(self, username, authzid):
42 self.username = username 43 self.authzid = authzid 44 rc, self._gss = kerberos.authGSSClientInit(authzid or "%s@%s" % ("xmpp", self.password_manager.get_serv_host())) 45 self.step = 0 46 return self.challenge("")
47
48 - def challenge(self, challenge):
49 if self.step == 0: 50 rc = kerberos.authGSSClientStep(self._gss, base64.b64encode(challenge)) 51 if rc != kerberos.AUTH_GSS_CONTINUE: 52 self.step = 1 53 elif self.step == 1: 54 rc = kerberos.authGSSClientUnwrap(self._gss, base64.b64encode(challenge)) 55 response = kerberos.authGSSClientResponse(self._gss) 56 rc = kerberos.authGSSClientWrap(self._gss, response, self.username) 57 response = kerberos.authGSSClientResponse(self._gss) 58 if response is None: 59 return Response("") 60 else: 61 return Response(base64.b64decode(response))
62
63 - def finish(self, data):
64 self.username = kerberos.authGSSClientUserName(self._gss) 65 self.__logger.debug("Authenticated as %s" % kerberos.authGSSClientUserName(self._gss)) 66 return Success(self.username,None,self.authzid)
67 68 69 # vi: sts=4 et sw=4 70