25f87607aa
This is mainly just useful for authenticating without using TLS. If an access token is not provided, an attempt will be made to retrieve one from Google.
61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
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
|
|
|
|
|
|
register_mechanism('PLAIN', 5, PLAIN, use_hashes=False)
|