diff options
Diffstat (limited to 'sleekxmpp/componentxmpp.py')
-rw-r--r-- | sleekxmpp/componentxmpp.py | 164 |
1 files changed, 0 insertions, 164 deletions
diff --git a/sleekxmpp/componentxmpp.py b/sleekxmpp/componentxmpp.py deleted file mode 100644 index 4b229a6f..00000000 --- a/sleekxmpp/componentxmpp.py +++ /dev/null @@ -1,164 +0,0 @@ -# -*- coding: utf-8 -*- -""" - sleekxmpp.clientxmpp - ~~~~~~~~~~~~~~~~~~~~ - - This module provides XMPP functionality that - is specific to external server component connections. - - Part of SleekXMPP: The Sleek XMPP Library - - :copyright: (c) 2011 Nathanael C. Fritz - :license: MIT, see LICENSE for more details -""" - -from __future__ import absolute_import - -import logging -import sys -import hashlib - -from sleekxmpp.basexmpp import BaseXMPP -from sleekxmpp.xmlstream import XMLStream -from sleekxmpp.xmlstream import ET -from sleekxmpp.xmlstream.matcher import MatchXPath -from sleekxmpp.xmlstream.handler import Callback - - -log = logging.getLogger(__name__) - - -class ComponentXMPP(BaseXMPP): - - """ - SleekXMPP's basic XMPP server component. - - Use only for good, not for evil. - - :param jid: The JID of the component. - :param secret: The secret or password for the component. - :param host: The server accepting the component. - :param port: The port used to connect to the server. - :param plugin_config: A dictionary of plugin configurations. - :param plugin_whitelist: A list of approved plugins that - will be loaded when calling - :meth:`~sleekxmpp.basexmpp.BaseXMPP.register_plugins()`. - :param use_jc_ns: Indicates if the ``'jabber:client'`` namespace - should be used instead of the standard - ``'jabber:component:accept'`` namespace. - Defaults to ``False``. - """ - - def __init__(self, jid, secret, host=None, port=None, plugin_config=None, plugin_whitelist=None, use_jc_ns=False): - - if not plugin_whitelist: - plugin_whitelist = [] - if not plugin_config: - plugin_config = {} - - if use_jc_ns: - default_ns = 'jabber:client' - else: - default_ns = 'jabber:component:accept' - BaseXMPP.__init__(self, jid, default_ns) - - self.auto_authorize = None - self.stream_header = "<stream:stream %s %s to='%s'>" % ( - 'xmlns="jabber:component:accept"', - 'xmlns:stream="%s"' % self.stream_ns, - jid) - self.stream_footer = "</stream:stream>" - self.server_host = host - self.server_port = port - self.secret = secret - - self.plugin_config = plugin_config - self.plugin_whitelist = plugin_whitelist - self.is_component = True - - self.register_handler( - Callback('Handshake', - MatchXPath('{jabber:component:accept}handshake'), - self._handle_handshake)) - self.add_event_handler('presence_probe', - self._handle_probe) - - def connect(self, host=None, port=None, use_ssl=False, - use_tls=False, reattempt=True): - """Connect to the server. - - Setting ``reattempt`` to ``True`` will cause connection attempts to - be made every second until a successful connection is established. - - :param host: The name of the desired server for the connection. - Defaults to :attr:`server_host`. - :param port: Port to connect to on the server. - Defauts to :attr:`server_port`. - :param use_ssl: Flag indicating if SSL should be used by connecting - directly to a port using SSL. - :param use_tls: Flag indicating if TLS should be used, allowing for - connecting to a port without using SSL immediately and - later upgrading the connection. - :param reattempt: Flag indicating if the socket should reconnect - after disconnections. - """ - if host is None: - host = self.server_host - if port is None: - port = self.server_port - - self.server_name = self.boundjid.host - - if use_tls: - log.info("XEP-0114 components can not use TLS") - - log.debug("Connecting to %s:%s", host, port) - return XMLStream.connect(self, host=host, port=port, - use_ssl=use_ssl, - use_tls=False, - reattempt=reattempt) - - def incoming_filter(self, xml): - """ - Pre-process incoming XML stanzas by converting any - ``'jabber:client'`` namespaced elements to the component's - default namespace. - - :param xml: The XML stanza to pre-process. - """ - if xml.tag.startswith('{jabber:client}'): - xml.tag = xml.tag.replace('jabber:client', self.default_ns) - return xml - - def start_stream_handler(self, xml): - """ - Once the streams are established, attempt to handshake - with the server to be accepted as a component. - - :param xml: The incoming stream's root element. - """ - BaseXMPP.start_stream_handler(self, xml) - - # Construct a hash of the stream ID and the component secret. - sid = xml.get('id', '') - pre_hash = '%s%s' % (sid, self.secret) - if sys.version_info >= (3, 0): - # Handle Unicode byte encoding in Python 3. - pre_hash = bytes(pre_hash, 'utf-8') - - handshake = ET.Element('{jabber:component:accept}handshake') - handshake.text = hashlib.sha1(pre_hash).hexdigest().lower() - self.send_xml(handshake, now=True) - - def _handle_handshake(self, xml): - """The handshake has been accepted. - - :param xml: The reply handshake stanza. - """ - self.session_bind_event.set() - self.session_started_event.set() - self.event('session_bind', self.boundjid, direct=True) - self.event('session_start') - - def _handle_probe(self, pres): - self.roster[pres['to']][pres['from']].handle_probe(pres) |