| Index: third_party/twisted_8_1/twisted/words/protocols/jabber/component.py
|
| diff --git a/third_party/twisted_8_1/twisted/words/protocols/jabber/component.py b/third_party/twisted_8_1/twisted/words/protocols/jabber/component.py
|
| deleted file mode 100644
|
| index c6be76c52a291dd76d407245320dc0ae4585279f..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/words/protocols/jabber/component.py
|
| +++ /dev/null
|
| @@ -1,229 +0,0 @@
|
| -# -*- test-case-name: twisted.words.test.test_jabbercomponent -*-
|
| -#
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -External server-side components.
|
| -
|
| -Most Jabber server implementations allow for add-on components that act as a
|
| -seperate entity on the Jabber network, but use the server-to-server
|
| -functionality of a regular Jabber IM server. These so-called 'external
|
| -components' are connected to the Jabber server using the Jabber Component
|
| -Protocol as defined in U{JEP-0114<http://www.jabber.org/jeps/jep-0114.html>}.
|
| -
|
| -This module allows for writing external server-side component by assigning one
|
| -or more services implementing L{ijabber.IService} up to L{ServiceManager}. The
|
| -ServiceManager connects to the Jabber server and is responsible for the
|
| -corresponding XML stream.
|
| -"""
|
| -
|
| -from zope.interface import implements
|
| -
|
| -from twisted.application import service
|
| -from twisted.internet import defer
|
| -from twisted.words.xish import domish
|
| -from twisted.words.protocols.jabber import ijabber, jstrports, xmlstream
|
| -
|
| -def componentFactory(componentid, password):
|
| - """
|
| - XML stream factory for external server-side components.
|
| -
|
| - @param componentid: JID of the component.
|
| - @type componentid: L{unicode}
|
| - @param password: password used to authenticate to the server.
|
| - @type password: L{str}
|
| - """
|
| - a = ConnectComponentAuthenticator(componentid, password)
|
| - return xmlstream.XmlStreamFactory(a)
|
| -
|
| -class ComponentInitiatingInitializer(object):
|
| - """
|
| - External server-side component authentication initializer for the
|
| - initiating entity.
|
| -
|
| - @ivar xmlstream: XML stream between server and component.
|
| - @type xmlstream: L{xmlstream.XmlStream}
|
| - """
|
| -
|
| - def __init__(self, xs):
|
| - self.xmlstream = xs
|
| - self._deferred = None
|
| -
|
| - def initialize(self):
|
| - xs = self.xmlstream
|
| - hs = domish.Element((self.xmlstream.namespace, "handshake"))
|
| - hs.addContent(xmlstream.hashPassword(xs.sid,
|
| - xs.authenticator.password))
|
| -
|
| - # Setup observer to watch for handshake result
|
| - xs.addOnetimeObserver("/handshake", self._cbHandshake)
|
| - xs.send(hs)
|
| - self._deferred = defer.Deferred()
|
| - return self._deferred
|
| -
|
| - def _cbHandshake(self, _):
|
| - # we have successfully shaken hands and can now consider this
|
| - # entity to represent the component JID.
|
| - self.xmlstream.thisEntity = self.xmlstream.otherEntity
|
| - self._deferred.callback(None)
|
| -
|
| -class ConnectComponentAuthenticator(xmlstream.ConnectAuthenticator):
|
| - """
|
| - Authenticator to permit an XmlStream to authenticate against a Jabber
|
| - server as an external component (where the Authenticator is initiating the
|
| - stream).
|
| - """
|
| - namespace = 'jabber:component:accept'
|
| -
|
| - def __init__(self, componentjid, password):
|
| - """
|
| - @type componentjid: L{str}
|
| - @param componentjid: Jabber ID that this component wishes to bind to.
|
| -
|
| - @type password: L{str}
|
| - @param password: Password/secret this component uses to authenticate.
|
| - """
|
| - # Note that we are sending 'to' our desired component JID.
|
| - xmlstream.ConnectAuthenticator.__init__(self, componentjid)
|
| - self.password = password
|
| -
|
| - def associateWithStream(self, xs):
|
| - xs.version = (0, 0)
|
| - xmlstream.ConnectAuthenticator.associateWithStream(self, xs)
|
| -
|
| - xs.initializers = [ComponentInitiatingInitializer(xs)]
|
| -
|
| -class ListenComponentAuthenticator(xmlstream.Authenticator):
|
| - """
|
| - Placeholder for listening components.
|
| - """
|
| -
|
| -class Service(service.Service):
|
| - """
|
| - External server-side component service.
|
| - """
|
| -
|
| - implements(ijabber.IService)
|
| -
|
| - def componentConnected(self, xs):
|
| - pass
|
| -
|
| - def componentDisconnected(self):
|
| - pass
|
| -
|
| - def transportConnected(self, xs):
|
| - pass
|
| -
|
| - def send(self, obj):
|
| - """
|
| - Send data over service parent's XML stream.
|
| -
|
| - @note: L{ServiceManager} maintains a queue for data sent using this
|
| - method when there is no current established XML stream. This data is
|
| - then sent as soon as a new stream has been established and initialized.
|
| - Subsequently, L{componentConnected} will be called again. If this
|
| - queueing is not desired, use C{send} on the XmlStream object (passed to
|
| - L{componentConnected}) directly.
|
| -
|
| - @param obj: data to be sent over the XML stream. This is usually an
|
| - object providing L{domish.IElement}, or serialized XML. See
|
| - L{xmlstream.XmlStream} for details.
|
| - """
|
| -
|
| - self.parent.send(obj)
|
| -
|
| -class ServiceManager(service.MultiService):
|
| - """
|
| - Business logic representing a managed component connection to a Jabber
|
| - router.
|
| -
|
| - This service maintains a single connection to a Jabber router and provides
|
| - facilities for packet routing and transmission. Business logic modules are
|
| - services implementing L{ijabber.IService} (like subclasses of L{Service}), and
|
| - added as sub-service.
|
| - """
|
| -
|
| - def __init__(self, jid, password):
|
| - service.MultiService.__init__(self)
|
| -
|
| - # Setup defaults
|
| - self.jabberId = jid
|
| - self.xmlstream = None
|
| -
|
| - # Internal buffer of packets
|
| - self._packetQueue = []
|
| -
|
| - # Setup the xmlstream factory
|
| - self._xsFactory = componentFactory(self.jabberId, password)
|
| -
|
| - # Register some lambda functions to keep the self.xmlstream var up to
|
| - # date
|
| - self._xsFactory.addBootstrap(xmlstream.STREAM_CONNECTED_EVENT,
|
| - self._connected)
|
| - self._xsFactory.addBootstrap(xmlstream.STREAM_AUTHD_EVENT, self._authd)
|
| - self._xsFactory.addBootstrap(xmlstream.STREAM_END_EVENT,
|
| - self._disconnected)
|
| -
|
| - # Map addBootstrap and removeBootstrap to the underlying factory -- is
|
| - # this right? I have no clue...but it'll work for now, until i can
|
| - # think about it more.
|
| - self.addBootstrap = self._xsFactory.addBootstrap
|
| - self.removeBootstrap = self._xsFactory.removeBootstrap
|
| -
|
| - def getFactory(self):
|
| - return self._xsFactory
|
| -
|
| - def _connected(self, xs):
|
| - self.xmlstream = xs
|
| - for c in self:
|
| - if ijabber.IService.providedBy(c):
|
| - c.transportConnected(xs)
|
| -
|
| - def _authd(self, xs):
|
| - # Flush all pending packets
|
| - for p in self._packetQueue:
|
| - self.xmlstream.send(p)
|
| - self._packetQueue = []
|
| -
|
| - # Notify all child services which implement the IService interface
|
| - for c in self:
|
| - if ijabber.IService.providedBy(c):
|
| - c.componentConnected(xs)
|
| -
|
| - def _disconnected(self, _):
|
| - self.xmlstream = None
|
| -
|
| - # Notify all child services which implement
|
| - # the IService interface
|
| - for c in self:
|
| - if ijabber.IService.providedBy(c):
|
| - c.componentDisconnected()
|
| -
|
| - def send(self, obj):
|
| - """
|
| - Send data over the XML stream.
|
| -
|
| - When there is no established XML stream, the data is queued and sent
|
| - out when a new XML stream has been established and initialized.
|
| -
|
| - @param obj: data to be sent over the XML stream. This is usually an
|
| - object providing L{domish.IElement}, or serialized XML. See
|
| - L{xmlstream.XmlStream} for details.
|
| - """
|
| -
|
| - if self.xmlstream != None:
|
| - self.xmlstream.send(obj)
|
| - else:
|
| - self._packetQueue.append(obj)
|
| -
|
| -def buildServiceManager(jid, password, strport):
|
| - """
|
| - Constructs a pre-built L{ServiceManager}, using the specified strport
|
| - string.
|
| - """
|
| -
|
| - svc = ServiceManager(jid, password)
|
| - client_svc = jstrports.client(strport, svc.getFactory())
|
| - client_svc.setServiceParent(svc)
|
| - return svc
|
|
|