From 71ea430c6244e77ce4b238ff7c19afff2cc6d93a Mon Sep 17 00:00:00 2001 From: Lance Stout Date: Fri, 20 Jan 2012 01:24:05 -0800 Subject: [PATCH] Add support for X-FACEBOOK-PLATFORM SASL mechanism. This requires an extra credential for SASL authentication: xmpp = ClientXMPP('user@chat.facebook.com', '...access_token...') xmpp.credentials['api_key'] = '...api_key...' --- .../thirdparty/suelta/mechanisms/__init__.py | 1 + .../suelta/mechanisms/facebook_platform.py | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 sleekxmpp/thirdparty/suelta/mechanisms/facebook_platform.py diff --git a/sleekxmpp/thirdparty/suelta/mechanisms/__init__.py b/sleekxmpp/thirdparty/suelta/mechanisms/__init__.py index e115e5d5..e3facdee 100644 --- a/sleekxmpp/thirdparty/suelta/mechanisms/__init__.py +++ b/sleekxmpp/thirdparty/suelta/mechanisms/__init__.py @@ -4,3 +4,4 @@ from sleekxmpp.thirdparty.suelta.mechanisms.cram_md5 import CRAM_MD5 from sleekxmpp.thirdparty.suelta.mechanisms.digest_md5 import DIGEST_MD5 from sleekxmpp.thirdparty.suelta.mechanisms.scram_hmac import SCRAM_HMAC from sleekxmpp.thirdparty.suelta.mechanisms.messenger_oauth2 import X_MESSENGER_OAUTH2 +from sleekxmpp.thirdparty.suelta.mechanisms.facebook_platform import X_FACEBOOK_PLATFORM diff --git a/sleekxmpp/thirdparty/suelta/mechanisms/facebook_platform.py b/sleekxmpp/thirdparty/suelta/mechanisms/facebook_platform.py new file mode 100644 index 00000000..5b80c9f5 --- /dev/null +++ b/sleekxmpp/thirdparty/suelta/mechanisms/facebook_platform.py @@ -0,0 +1,39 @@ +from sleekxmpp.thirdparty.suelta.util import bytes +from sleekxmpp.thirdparty.suelta.sasl import Mechanism, register_mechanism + +try: + import urlparse +except ImportError: + import urllib.parse as urlparse + + + +class X_FACEBOOK_PLATFORM(Mechanism): + + def __init__(self, sasl, name): + super(X_FACEBOOK_PLATFORM, self).__init__(sasl, name) + self.check_values(['access_token', 'api_key']) + + def process(self, challenge=None): + if challenge is not None: + values = {} + for kv in challenge.split('&'): + key, value = kv.split('=') + values[key] = value + + resp_data = { + 'method': values['method'], + 'v': '1.0', + 'call_id': '1.0', + 'nonce': values['nonce'], + 'access_token': self.values['access_token'], + 'api_key': self.values['api_key'] + } + resp = '&'.join(['%s=%s' % (k, v) for k, v in resp_data.items()]) + return bytes(resp) + return bytes('') + + def okay(self): + return True + +register_mechanism('X-FACEBOOK-PLATFORM', 40, X_FACEBOOK_PLATFORM, use_hashes=False)