diff options
Diffstat (limited to 'examples/thirdpary_auth.py')
-rw-r--r-- | examples/thirdpary_auth.py | 247 |
1 files changed, 0 insertions, 247 deletions
diff --git a/examples/thirdpary_auth.py b/examples/thirdpary_auth.py deleted file mode 100644 index 727311ae..00000000 --- a/examples/thirdpary_auth.py +++ /dev/null @@ -1,247 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" - SleekXMPP: The Sleek XMPP Library - Copyright (C) 2010 Nathanael C. Fritz - This file is part of SleekXMPP. - - See the file LICENSE for copying permission. -""" - -import sys -import logging -import getpass -from optparse import OptionParser - -try: - from httplib import HTTPSConnection - from urllib import urlencode -except ImportError: - from urllib.parse import urlencode - from http.client import HTTPSConnection - -import sleekxmpp -from sleekxmpp.xmlstream import JID - -# Python versions before 3.0 do not use UTF-8 encoding -# by default. To ensure that Unicode is handled properly -# throughout SleekXMPP, we will set the default encoding -# ourselves to UTF-8. -if sys.version_info < (3, 0): - reload(sys) - sys.setdefaultencoding('utf8') -else: - raw_input = input - - -class ThirdPartyAuthBot(sleekxmpp.ClientXMPP): - - """ - A simple SleekXMPP bot that will echo messages it - receives, along with a short thank you message. - - This version uses a thirdpary service for authentication, - such as Facebook or Google. - """ - - def __init__(self, jid, password): - sleekxmpp.ClientXMPP.__init__(self, jid, password) - - # The X-GOOGLE-TOKEN mech is ranked lower than PLAIN - # due to Google only allowing a single SASL attempt per - # connection. So PLAIN will be used for TLS connections, - # and X-GOOGLE-TOKEN for non-TLS connections. To use - # X-GOOGLE-TOKEN with a TLS connection, explicitly select - # it using: - # - # sleekxmpp.ClientXMPP.__init__(self, jid, password, - # sasl_mech="X-GOOGLE-TOKEN") - - # The session_start event will be triggered when - # the bot establishes its connection with the server - # and the XML streams are ready for use. We want to - # listen for this event so that we we can initialize - # our roster. - self.add_event_handler("session_start", self.start) - - # The message event is triggered whenever a message - # stanza is received. Be aware that that includes - # MUC messages and error messages. - self.add_event_handler("message", self.message) - - def start(self, event): - """ - Process the session_start event. - - Typical actions for the session_start event are - requesting the roster and broadcasting an initial - presence stanza. - - Arguments: - event -- An empty dictionary. The session_start - event does not provide any additional - data. - """ - self.send_presence() - self.get_roster() - - def message(self, msg): - """ - Process incoming message stanzas. Be aware that this also - includes MUC messages and error messages. It is usually - a good idea to check the messages's type before processing - or sending replies. - - Arguments: - msg -- The received message stanza. See the documentation - for stanza objects and the Message stanza to see - how it may be used. - """ - if msg['type'] in ('chat', 'normal'): - msg.reply("Thanks for sending\n%(body)s" % msg).send() - - -if __name__ == '__main__': - # Setup the command line arguments. - optp = OptionParser() - - # Output verbosity options. - optp.add_option('-q', '--quiet', help='set logging to ERROR', - action='store_const', dest='loglevel', - const=logging.ERROR, default=logging.INFO) - optp.add_option('-d', '--debug', help='set logging to DEBUG', - action='store_const', dest='loglevel', - const=logging.DEBUG, default=logging.INFO) - optp.add_option('-v', '--verbose', help='set logging to COMM', - action='store_const', dest='loglevel', - const=5, default=logging.INFO) - - # JID and password options. - optp.add_option("-j", "--jid", dest="jid", - help="JID to use") - optp.add_option("-p", "--password", dest="password", - help="password to use") - - opts, args = optp.parse_args() - - # Setup logging. - logging.basicConfig(level=opts.loglevel, - format='%(levelname)-8s %(message)s') - - if opts.jid is None: - opts.jid = raw_input("Username: ") - if opts.password is None: - opts.password = getpass.getpass("Password: ") - - - access_token = None - - # Since documentation on how to work with Google tokens - # can be difficult to find, we'll demo a basic version - # here. Note that responses could refer to a Captcha - # URL that would require a browser. - - # Using Facebook or MSN's custom authentication requires - # a browser, but the process is the same once a token - # has been retrieved. - - # Request an access token from Google: - try: - conn = HTTPSConnection('www.google.com') - except: - print('Could not connect to Google') - sys.exit() - - params = urlencode({ - 'accountType': 'GOOGLE', - 'service': 'mail', - 'Email': JID(opts.jid).bare, - 'Passwd': opts.password - }) - headers = { - 'Content-Type': 'application/x-www-form-urlencoded' - } - try: - conn.request('POST', '/accounts/ClientLogin', params, headers) - resp = conn.getresponse().read() - data = {} - for line in resp.split(): - k, v = line.split(b'=', 1) - data[k] = v - except Exception as e: - print('Could not retrieve login data') - sys.exit() - - if b'SID' not in data: - print('Required data not found') - sys.exit() - - - params = urlencode({ - 'SID': data[b'SID'], - 'LSID': data[b'LSID'], - 'service': 'mail' - }) - try: - conn.request('POST', '/accounts/IssueAuthToken', params, headers) - resp = conn.getresponse() - data = resp.read().split() - except: - print('Could not retrieve auth data') - sys.exit() - - if not data: - print('Could not retrieve token') - sys.exit() - - access_token = data[0] - - - # Setup the ThirdPartyAuthBot and register plugins. Note that while plugins - # may have interdependencies, the order in which you register them does not - # matter. - - # If using MSN, the JID should be "user@messenger.live.com", which will - # be overridden on session bind. - - # We're using an access token instead of a password, so we'll use `''` as - # a password argument filler. - - xmpp = ThirdPartyAuthBot(opts.jid, '') - xmpp.credentials['access_token'] = access_token - - # The credentials dictionary is used to provide additional authentication - # information beyond just a password. - - xmpp.register_plugin('xep_0030') # Service Discovery - xmpp.register_plugin('xep_0004') # Data Forms - xmpp.register_plugin('xep_0060') # PubSub - - # MSN will kill connections that have been inactive for even - # short periods of time. So use pings to keep the session alive; - # whitespace keepalives do not work. - xmpp.register_plugin('xep_0199', {'keepalive': True, 'frequency': 60}) - - # If you are working with an OpenFire server, you may need - # to adjust the SSL version used: - # xmpp.ssl_version = ssl.PROTOCOL_SSLv3 - - # If you want to verify the SSL certificates offered by a server: - # xmpp.ca_certs = "path/to/ca/cert" - - # Connect to the XMPP server and start processing XMPP stanzas. - # Google only allows one SASL attempt per connection, so in order to - # enable the X-GOOGLE-TOKEN mechanism, we'll disable TLS. - if xmpp.connect(use_tls=False): - # If you do not have the dnspython library installed, you will need - # to manually specify the name of the server if it does not match - # the one in the JID. For example, to use Google Talk you would - # need to use: - # - # if xmpp.connect(('talk.google.com', 5222)): - # ... - xmpp.process(block=True) - print("Done") - else: - print("Unable to connect.") |