2011-08-04 00:00:51 +00:00
|
|
|
import sys
|
|
|
|
|
|
|
|
from sleekxmpp.thirdparty.suelta.util import bytes
|
|
|
|
from sleekxmpp.thirdparty.suelta.sasl import Mechanism, register_mechanism
|
|
|
|
from sleekxmpp.thirdparty.suelta.exceptions import SASLError, SASLCancelled
|
|
|
|
|
|
|
|
|
|
|
|
class PLAIN(Mechanism):
|
|
|
|
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, sasl, name):
|
|
|
|
"""
|
|
|
|
"""
|
|
|
|
super(PLAIN, self).__init__(sasl, name)
|
|
|
|
|
|
|
|
if not self.sasl.tls_active():
|
|
|
|
if not self.sasl.sec_query(self, '-ENCRYPTION, PLAIN'):
|
|
|
|
raise SASLCancelled(self.sasl, self)
|
|
|
|
else:
|
|
|
|
if not self.sasl.sec_query(self, '+ENCRYPTION, PLAIN'):
|
|
|
|
raise SASLCancelled(self.sasl, self)
|
|
|
|
|
|
|
|
self.check_values(['username', 'password'])
|
|
|
|
|
|
|
|
def prep(self):
|
|
|
|
"""
|
|
|
|
Prepare for processing by deleting the password if
|
|
|
|
the user has not approved storing it in the clear.
|
|
|
|
"""
|
|
|
|
if 'savepass' not in self.values:
|
|
|
|
if self.sasl.sec_query(self, 'CLEAR-PASSWORD'):
|
|
|
|
self.values['savepass'] = True
|
|
|
|
|
|
|
|
if 'savepass' not in self.values:
|
|
|
|
del self.values['password']
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
def process(self, challenge=None):
|
|
|
|
"""
|
|
|
|
Process a challenge request and return the response.
|
|
|
|
|
|
|
|
:param challenge: A challenge issued by the server that
|
|
|
|
must be answered for authentication.
|
|
|
|
"""
|
|
|
|
user = bytes(self.values['username'])
|
|
|
|
password = bytes(self.values['password'])
|
|
|
|
return b'\x00' + user + b'\x00' + password
|
|
|
|
|
|
|
|
def okay(self):
|
|
|
|
"""
|
|
|
|
Mutual authentication is not supported by PLAIN.
|
|
|
|
|
|
|
|
:returns: ``True``
|
|
|
|
"""
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
2012-01-21 08:44:03 +00:00
|
|
|
register_mechanism('PLAIN', 5, PLAIN, use_hashes=False)
|