diff options
author | Lance Stout <lancestout@gmail.com> | 2011-08-04 11:52:17 -0700 |
---|---|---|
committer | Lance Stout <lancestout@gmail.com> | 2011-08-04 11:52:17 -0700 |
commit | 89cffd43f48cfc835b70e137776eb8c2e73a0b67 (patch) | |
tree | 088035aeb688edc6a0f5675de31eedf169f87fd3 /sleekxmpp/thirdparty/suelta/mechanisms/cram_md5.py | |
parent | ad978700fc891602c826dea03615c396f39364a0 (diff) | |
parent | b9764cc120c48576be1fe6cadb11813d12f91f4c (diff) | |
download | slixmpp-89cffd43f48cfc835b70e137776eb8c2e73a0b67.tar.gz slixmpp-89cffd43f48cfc835b70e137776eb8c2e73a0b67.tar.bz2 slixmpp-89cffd43f48cfc835b70e137776eb8c2e73a0b67.tar.xz slixmpp-89cffd43f48cfc835b70e137776eb8c2e73a0b67.zip |
Merge branch 'develop' into roster
Conflicts:
setup.py
Diffstat (limited to 'sleekxmpp/thirdparty/suelta/mechanisms/cram_md5.py')
-rw-r--r-- | sleekxmpp/thirdparty/suelta/mechanisms/cram_md5.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/sleekxmpp/thirdparty/suelta/mechanisms/cram_md5.py b/sleekxmpp/thirdparty/suelta/mechanisms/cram_md5.py new file mode 100644 index 00000000..ba44befe --- /dev/null +++ b/sleekxmpp/thirdparty/suelta/mechanisms/cram_md5.py @@ -0,0 +1,63 @@ +import sys +import hmac + +from sleekxmpp.thirdparty.suelta.util import hash, bytes +from sleekxmpp.thirdparty.suelta.sasl import Mechanism, register_mechanism +from sleekxmpp.thirdparty.suelta.exceptions import SASLError, SASLCancelled + + +class CRAM_MD5(Mechanism): + + """ + """ + + def __init__(self, sasl, name): + """ + """ + super(CRAM_MD5, self).__init__(sasl, name, 2) + + self.hash = hash(name[5:]) + if self.hash is None: + raise SASLCancelled(self.sasl, self) + if not self.sasl.tls_active(): + if not self.sasl.sec_query(self, 'CRAM-MD5'): + raise SASLCancelled(self.sasl, self) + + def prep(self): + """ + """ + 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'] + + def process(self, challenge): + """ + """ + if challenge is None: + return None + + self.check_values(['username', 'password']) + username = bytes(self.values['username']) + password = bytes(self.values['password']) + + mac = hmac.HMAC(key=password, digestmod=self.hash) + + mac.update(challenge) + + return username + b' ' + bytes(mac.hexdigest()) + + def okay(self): + """ + """ + return True + + def get_user(self): + """ + """ + return self.values['username'] + + +register_mechanism('CRAM-', 20, CRAM_MD5) |