def setup(self): self.running = True # Backplanes are like a global entry points that # can be accessible both for publishing and # recieving data. # In other words, a component interested # in advertising to many other components that # something happened may link one of its outbox # to a PublishTo component's inbox. # A component wishing to receive that piece of # information will link one of its inbox # to the SubscribeTo component's outbox. # This helps greatly to make components more # loosely connected but also allows for some data # to be dispatched at once to many (such as when # the server returns the per-session JID that # is of interest for most other components). self.backplanes.append(Backplane("JID.%s" % self.session_id).activate()) # Used to inform components that the session is now active self.backplanes.append(Backplane("BOUND.%s" % self.session_id).activate()) # Used to inform components of the supported features self.backplanes.append(Backplane("DISCO_FEAT.%s" % self.session_id).activate()) sub = SubscribeTo("JID.%s" % self.session_id) self.link((sub, 'outbox'), (self, 'jid')) self.addChildren(sub) sub.activate() sub = SubscribeTo("BOUND.%s" % self.session_id) self.link((sub, 'outbox'), (self, 'connected')) self.addChildren(sub) sub.activate() # Add two outboxes ro the ClientSteam to support specific extensions. ClientStream.Outboxes["%s.query" % XMPP_IBR_NS] = "Registration" ClientStream.Outboxes["%s.query" % XMPP_LAST_NS] = "Activity" ClientStream.Outboxes["%s.query" % XMPP_DISCO_INFO_NS] = "Discovery" ClientStream.Outboxes["%s.query" % XMPP_DISCO_ITEMS_NS] = "PubSub Discovery of Nodes" ClientStream.Outboxes["%s.subscribe" % XMPP_PUBSUB_NS] = "Pubsub subscription handler" ClientStream.Outboxes["%s.unsubscribe" % XMPP_PUBSUB_NS] = "Pubsub unsubscription handler" ClientStream.Outboxes["%s.subscriptions" % XMPP_PUBSUB_NS] = "Pubsub subscriptions handler" ClientStream.Outboxes["%s.affiliations" % XMPP_PUBSUB_NS] = "Pubsub affiliations handler" ClientStream.Outboxes["%s.create" % XMPP_PUBSUB_NS] = "Pubsub node creation handler" ClientStream.Outboxes["%s.purge" % XMPP_PUBSUB_OWNER_NS] = "Pubsub node purge handler" ClientStream.Outboxes["%s.delete" % XMPP_PUBSUB_OWNER_NS] = "Pubsub node delete handler" ClientStream.Outboxes["%s.publish" % XMPP_PUBSUB_NS] = "Pubsub item publication handler" ClientStream.Outboxes["%s.retract" % XMPP_PUBSUB_NS] = "Pubsub item deletion handler" ClientStream.Outboxes["%s.x" % XMPP_PUBSUB_EVENT_NS] = "" ClientStream.Outboxes["%s.event" % XMPP_PUBSUB_EVENT_NS] = "" self.client = ClientStream(self.jid, self.passwordLookup, use_tls=self.usetls) self.addChildren(self.client) self.client.activate() self.graph = Graphline(client = self, logger = Logger(path='./logs/%s.log' % self.username, stdout=True, name=self.session_id), tcp = TCPClient(self.server, self.port), xmlparser = XMLIncrParser(), xmpp = self.client, streamerr = StreamError(), saslerr = SaslError(), discohandler = DiscoHandler(self.jid, self.atompub, self.domain, session_id=self.session_id, profile=self.profile), activityhandler = ActivityHandler(session_id=self.session_id), rosterhandler = RosterHandler(self.jid, session_id=self.session_id), registerhandler = RegistrationHandler(self.username, self.password, self.session_id, profile=self.profile), msgdummyhandler = DummyMessageHandler(session_id=self.session_id, profile=self.profile), presencehandler = PresenceHandler(session_id=self.session_id), itemshandler = ItemsHandler(self.jid, self.atompub, self.domain, session_id=self.session_id, profile=self.profile), pubsubmsgeventhandler = MessageHandler(self.jid, self.atompub, self.domain, session_id=self.session_id, profile=self.profile), presencedisp = PresenceDispatcher(), rosterdisp = RosterDispatcher(), msgdisp = MessageDispatcher(), discodisp = DiscoveryDispatcher(), activitydisp = ActivityDispatcher(), registerdisp = RegisterDispatcher(), pubsubdisp = PubSubDispatcher(), pjid = PublishTo("JID.%s" % self.session_id), pbound = PublishTo("BOUND.%s" % self.session_id), linkages = {('xmpp', 'terminated'): ('client', 'inbox'), ('client', 'forward'): ('xmpp', 'forward'), ('client', 'outbox'): ('tcp', 'inbox'), ('client', 'signal'): ('tcp', 'control'), ("tcp", "outbox") : ("xmlparser", "inbox"), ("xmpp", "starttls") : ("tcp", "makessl"), ("tcp", "sslready") : ("xmpp", "tlssuccess"), ("xmlparser", "outbox") : ("xmpp" , "inbox"), ("xmpp", "outbox") : ("tcp" , "inbox"), ("xmpp", "reset"): ("xmlparser", "reset"), ("client", "log"): ("logger", "inbox"), ("xmpp", "log"): ("logger", "inbox"), ("xmpp", "jid"): ("pjid", "inbox"), ("xmpp", "bound"): ("pbound", "inbox"), ("xmpp", "features"): ("client", "streamfeat"), ("xmpp", "unhandled"): ("client", "unhandled"), ("client", "doauth"): ("xmpp", "auth"), # Registration ("xmpp", "%s.query" % XMPP_IBR_NS): ("registerdisp", "inbox"), ("registerdisp", "log"): ('logger', "inbox"), ("registerdisp", "xmpp.error"): ("registerhandler", "error"), ("registerdisp", "xmpp.result"): ("registerhandler", "inbox"), ("registerhandler", "outbox"): ("registerdisp", "forward"), ("client", "doregistration"): ("registerdisp", "forward"), ("registerdisp", "outbox"): ("xmpp", "forward"), # Presence ("xmpp", "%s.presence" % XMPP_CLIENT_NS): ("presencedisp", "inbox"), ("presencedisp", "log"): ('logger', "inbox"), ("presencedisp", "xmpp.subscribe"): ("presencehandler", "subscribe"), ("presencedisp", "xmpp.unsubscribe"): ("presencehandler", "unsubscribe"), ("presencehandler", "outbox"): ("presencedisp", "forward"), ("presencehandler", "roster"): ("rosterdisp", "forward"), ("presencedisp", "outbox"): ("xmpp", "forward"), # Roster ("xmpp", "%s.query" % XMPP_ROSTER_NS): ("rosterdisp", "inbox"), ("rosterdisp", "log"): ('logger', "inbox"), ('rosterdisp', 'xmpp.set'): ('rosterhandler', 'pushed'), ('rosterdisp', 'xmpp.result'): ('rosterhandler', 'inbox'), ('rosterhandler', 'result'): ('rosterdisp', 'forward'), ('rosterhandler', 'roster-updated'): ('msgdummyhandler', 'roster-received'), ("rosterdisp", "outbox"): ("xmpp", "forward"), # Discovery ("xmpp", "%s.query" % XMPP_DISCO_INFO_NS): ("discodisp", "features.inbox"), ("xmpp", "%s.query" % XMPP_DISCO_ITEMS_NS): ("discodisp", "items.inbox"), ("xmpp", "%s.affiliations" % XMPP_PUBSUB_NS): ("discodisp", "affiliation.inbox"), ("xmpp", "%s.subscriptions" % XMPP_PUBSUB_NS): ("discodisp", "subscription.inbox"), ("discodisp", "log"): ('logger', "inbox"), ("discohandler", "features-disco"): ('discodisp', "features.forward"), ('discohandler', 'items-disco'): ('discodisp', 'items.forward'), ('discohandler', 'subscriptions-disco'): ('discodisp', 'subscription.forward'), ('discohandler', 'affiliations-disco'): ('discodisp', 'affiliation.forward'), ("discodisp", "out.features.result"): ('discohandler', "features.result"), ("discodisp",'subscription.outbox'):('xmpp','forward'), ("discodisp",'affiliation.outbox'):('xmpp','forward'), ("discodisp",'out.subscription.result'): ('discohandler','subscriptions.result'), ("discodisp",'out.affiliation.result'): ('discohandler','affiliations.result'), ("discodisp", 'out.items.result'): ('discohandler', 'items.result'), ("discodisp", 'out.items.error'): ('discohandler', 'items.error'), ("discodisp", "outbox"): ("xmpp", "forward"), # Message ("xmpp", "%s.message" % XMPP_CLIENT_NS): ("msgdisp", "inbox"), ("msgdisp", "log"): ('logger', "inbox"), ("msgdisp", "xmpp.chat"): ('msgdummyhandler', 'inbox'), ("msgdummyhandler", "outbox"): ('msgdisp', 'forward'), ("msgdisp", "outbox"): ("xmpp", "forward"), # Activity ("xmpp", "%s.query" % XMPP_LAST_NS): ("activitydisp", "inbox"), ("activitydisp", "log"): ('logger', "inbox"), ("activitydisp", "outbox"): ("xmpp", "forward"), ("activityhandler", 'activity-supported'): ('rosterhandler', 'ask-activity'), ("rosterhandler", 'activity'): ('activitydisp', 'forward'), # Pubsub ("xmpp", "%s.create" % XMPP_PUBSUB_NS): ("pubsubdisp", "create.inbox"), ("xmpp", "%s.delete" % XMPP_PUBSUB_OWNER_NS): ("pubsubdisp", "delete.inbox"), ("xmpp", "%s.purge" % XMPP_PUBSUB_OWNER_NS): ("pubsubdisp", "purge.inbox"), ("xmpp", "%s.subscribe" % XMPP_PUBSUB_NS): ("pubsubdisp", "subscribe.inbox"), ("xmpp", "%s.unsubscribe" % XMPP_PUBSUB_NS):("pubsubdisp", "unsubscribe.inbox"), ("xmpp", "%s.publish" % XMPP_PUBSUB_NS): ("pubsubdisp", "publish.inbox"), ("xmpp", "%s.retract" % XMPP_PUBSUB_NS): ("pubsubdisp", "retract.inbox"), ("xmpp", "%s.x" % XMPP_PUBSUB_EVENT_NS): ("pubsubdisp", "message.inbox"), ("xmpp", "%s.event" % XMPP_PUBSUB_EVENT_NS): ("pubsubdisp", "message.inbox"), ("pubsubdisp", "log"): ('logger', "inbox"), ("discohandler", "create-node"): ("pubsubdisp", "create.forward"), ("discohandler", "delete-node"): ("pubsubdisp", "delete.forward"), ("discohandler", "subscribe-node"): ("pubsubdisp", "subscribe.forward"), ("discohandler", "unsubscribe-node"): ("pubsubdisp", "unsubscribe.forward"), ("pubsubdisp", "create.outbox"): ("xmpp", "forward"), ("pubsubdisp", "delete.outbox"): ("xmpp", "forward"), ("pubsubdisp", "purge.outbox"): ("xmpp", "forward"), ("pubsubdisp", "subscribe.outbox"): ("xmpp", "forward"), ("pubsubdisp", "unsubscribe.outbox"): ("xmpp", "forward"), ("pubsubdisp", "publish.outbox"): ("xmpp", "forward"), ("pubsubdisp", "retract.outbox"): ("xmpp", "forward"), ("pubsubdisp", "out.create.result"): ("discohandler", "created"), ("pubsubdisp", "out.subscribe.result"): ("discohandler", "subscribed"), ("pubsubdisp", "out.delete.result"): ("discohandler", "deleted"), ("pubsubdisp", "out.create.error"): ("discohandler", "error"), ("pubsubdisp", "out.delete.error"): ("discohandler", "error"), ("pubsubdisp", "out.publish.error"): ("itemshandler", "publish.error"), ("pubsubdisp", "out.retract.error"): ("itemshandler", "retract.error"), ("pubsubdisp", "out.publish.result"): ("itemshandler", "published"), ("pubsubdisp", "out.message"): ('pubsubmsgeventhandler', 'inbox'), ('itemshandler', 'publish'): ('pubsubdisp', 'publish.forward'), ('itemshandler', 'delete'): ('pubsubdisp', 'retract.forward'), ('itemshandler', 'purge'): ('pubsubdisp', 'purge.forward'), ("msgdummyhandler", "PI"): ('itemshandler', 'topublish'), ("msgdummyhandler", "GEO"): ('itemshandler', 'topublish'), ("msgdummyhandler", "DI"): ('itemshandler', 'todelete'), ("msgdummyhandler", "PN"): ('itemshandler', 'topurge'), ("msgdummyhandler", "CN"): ('discohandler', 'docreate'), ("msgdummyhandler", "DN"): ('discohandler', 'dodelete'), ("msgdummyhandler", "SN"): ('discohandler', 'dosubscribe'), ("msgdummyhandler", "UN"): ('discohandler', 'dounsubscribe'), ('pubsubmsgeventhandler', 'items-disco'): ('discodisp', 'items.forward'), } ) self.addChildren(self.graph) self.graph.activate() return 1
def setup(self): # Backplanes are like a global entry points that # can be accessible both for publishing and # recieving data. # In other words, a component interested # in advertising to many other components that # something happened may link one of its outbox # to a PublishTo component's inbox. # A component wishing to receive that piece of # information will link one of its inbox # to the SubscribeTo component's outbox. # This helps greatly to make components more # loosely connected but also allows for some data # to be dispatched at once to many (such as when # the server returns the per-session JID that # is of interest for most other components). Backplane("CONSOLE").activate() Backplane("JID").activate() # Used to inform components that the session is now active Backplane("BOUND").activate() # Used to inform components of the supported features Backplane("DISCO_FEAT").activate() sub = SubscribeTo("JID") self.link((sub, 'outbox'), (self, 'jid')) self.addChildren(sub) sub.activate() log = Logger(path=None, stdout=True, name='XmppLogger') Backplane('LOG_' + self.log_location).activate() Pipeline(SubscribeTo('LOG_' + self.log_location), log).activate() log_writable = WsgiLogWritable(self.log_location) log.activate() log_writable.activate() # We pipe everything typed into the console # directly to the console backplane so that # every components subscribed to the console # backplane inbox will get the typed data and # will decide it it's of concern or not. Pipeline(ConsoleReader(), PublishTo('CONSOLE')).activate() # Add two outboxes ro the ClientSteam to support specific extensions. ClientStream.Outboxes["%s.query" % XMPP_IBR_NS] = "Registration" ClientStream.Outboxes["%s.query" % XMPP_LAST_NS] = "Activity" ClientStream.Outboxes["%s.query" % XMPP_DISCO_INFO_NS] = "Discovery" self.client = ClientStream(self.jid, self.passwordLookup, use_tls=self.usetls) WsgiConfig ={ 'server_software' : "Example WSGI Web Server", 'server_admin' : "Jason Baker", 'wsgi_ver' : (1,0), } routing = [ ["/", SimpleWsgiFactory(log_writable, WsgiConfig, simple_app, '/simple')], ] #routing = [ ['/', Echoer]] self.graph = Graphline(client = self, console = SubscribeTo('CONSOLE'), logger = PublishTo('LOG_' + self.log_location), tcp = TCPClient(self.server, self.port), xmlparser = XMLIncrParser(), xmpp = self.client, streamerr = StreamError(), saslerr = SaslError(), discohandler = DiscoHandler(self.jid, self.domain), activityhandler = ActivityHandler(), rosterhandler = RosterHandler(self.jid), registerhandler = RegistrationHandler(self.username, self.password), msgdummyhandler = WebMessageHandler(), presencehandler = PresenceHandler(), presencedisp = PresenceDispatcher(), rosterdisp = RosterDispatcher(), msgdisp = MessageDispatcher(), discodisp = DiscoveryDispatcher(), activitydisp = ActivityDispatcher(), registerdisp = RegisterDispatcher(), pjid = PublishTo("JID"), pbound = PublishTo("BOUND"), proto_man = ProtocolManager(Protocol=HTTPProtocol(routing)), linkages = {('xmpp', 'terminated'): ('client', 'inbox'), ('console', 'outbox'): ('client', 'control'), ('client', 'forward'): ('xmpp', 'forward'), ('client', 'outbox'): ('tcp', 'inbox'), ('client', 'signal'): ('tcp', 'control'), ("tcp", "outbox") : ("xmlparser", "inbox"), ("xmpp", "starttls") : ("tcp", "makessl"), ("tcp", "sslready") : ("xmpp", "tlssuccess"), ("xmlparser", "outbox") : ("xmpp" , "inbox"), ("xmpp", "outbox") : ("tcp" , "inbox"), ("xmpp", "reset"): ("xmlparser", "reset"), ("client", "log"): ("logger", "inbox"), ("xmpp", "log"): ("logger", "inbox"), ("xmpp", "jid"): ("pjid", "inbox"), ("xmpp", "bound"): ("pbound", "inbox"), ("xmpp", "features"): ("client", "streamfeat"), ("client", "doauth"): ("xmpp", "auth"), # Registration ("xmpp", "%s.query" % XMPP_IBR_NS): ("registerdisp", "inbox"), ("registerdisp", "log"): ('logger', "inbox"), ("registerdisp", "xmpp.error"): ("registerhandler", "error"), ("registerdisp", "xmpp.result"): ("registerhandler", "inbox"), ("registerhandler", "outbox"): ("registerdisp", "forward"), ("client", "doregistration"): ("registerdisp", "forward"), ("registerdisp", "outbox"): ("xmpp", "forward"), # Presence ("xmpp", "%s.presence" % XMPP_CLIENT_NS): ("presencedisp", "inbox"), ("presencedisp", "log"): ('logger', "inbox"), ("presencedisp", "xmpp.subscribe"): ("presencehandler", "subscribe"), ("presencedisp", "xmpp.unsubscribe"): ("presencehandler", "unsubscribe"), ("presencehandler", "outbox"): ("presencedisp", "forward"), ("presencehandler", "roster"): ("rosterdisp", "forward"), ("presencedisp", "outbox"): ("xmpp", "forward"), # Roster ("xmpp", "%s.query" % XMPP_ROSTER_NS): ("rosterdisp", "inbox"), ("rosterdisp", "log"): ('logger', "inbox"), ('rosterdisp', 'xmpp.set'): ('rosterhandler', 'pushed'), ('rosterdisp', 'xmpp.result'): ('rosterhandler', 'inbox'), ('rosterhandler', 'result'): ('rosterdisp', 'forward'), ("rosterdisp", "outbox"): ("xmpp", "forward"), # Discovery ("xmpp", "%s.query" % XMPP_DISCO_INFO_NS): ("discodisp", "features.inbox"), ("discodisp", "log"): ('logger', "inbox"), ("discohandler", "features-disco"): ('discodisp', "features.forward"), ("discodisp", "out.features.result"): ('discohandler', "features.result"), ("discodisp", "outbox"): ("xmpp", "forward"), # Message ("xmpp", "%s.message" % XMPP_CLIENT_NS): ("msgdisp", "inbox"), ("msgdisp", "log"): ('logger', "inbox"), ("msgdisp", "xmpp.chat"): ('msgdummyhandler', 'inbox'), ("msgdummyhandler", "outbox"): ('msgdisp', 'forward'), ("msgdisp", "outbox"): ("xmpp", "forward"), ('msgdummyhandler', 'proto') : ('proto_man' , 'inbox'), ('proto_man', 'outbox') : ('msgdummyhandler', 'inbox'), # Activity ("xmpp", "%s.query" % XMPP_LAST_NS): ("activitydisp", "inbox"), ("activitydisp", "log"): ('logger', "inbox"), ("activitydisp", "outbox"): ("xmpp", "forward"), ("activityhandler", 'activity-supported'): ('rosterhandler', 'ask-activity'), ("rosterhandler", 'activity'): ('activitydisp', 'forward'), } ) self.addChildren(self.graph) self.graph.activate() return 1
class Client(component): Inboxes = {"inbox" : "", "jid" : "", "streamfeat" : "", "connected" : "", "unhandled" : "", "control" : "Shutdown the client stream"} Outboxes = {"outbox" : "", "forward" : "", "log" : "", "doauth" : "", "signal" : "Shutdown signal", "doregistration" : ""} Domain = None Host = u'localhost' Port = 5222 Sessions = {} def __init__(self, atompub, username, password, domain, resource=u"headstock-client1", server=u'localhost', port=5222, usetls=False, register=False, session_id=None, profile=None): super(Client, self).__init__() self.running = False self.connected = False self.atompub = atompub if not session_id: session_id = generate_unique() self.session_id = session_id self.backplanes = [] self.username = username self.password = password self.jid = JID(self.username, domain, '%s!%s' % (resource, session_id)) self.server = server self.port = port self.client = None self.graph = None self.domain = domain self.usetls = usetls self.register = register self.restartable = False self.profile = profile @staticmethod def start_clients(atompub, users): for username, password in users: profile = atompub.load_profile(username) Client.connect_jabber_user(atompub, username, password, profile) @staticmethod def register_jabber_user(atompub, username, password, profile): c = Client(atompub, unicode(username), unicode(password), domain=Client.Domain, server=Client.Host, port=Client.Port, usetls=False, register=True, profile=profile) Client.Sessions[c.username] = c c.activate() username = unicode('%s.microblogging' % username) c = Client(atompub, unicode(username), unicode(password), domain=Client.Domain, server=Client.Host, port=Client.Port, usetls=False, register=True, profile=profile) Client.Sessions[c.username] = c c.activate() @staticmethod def connect_jabber_user(atompub, username, password, profile): #c = Client(atompub, unicode(username), unicode(password), # domain=Client.Domain, server=Client.Host, port=Client.Port, # usetls=True, register=False, profile=profile) #Client.Sessions[c.username] = c #c.activate() username = unicode('%s.microblogging' % username) c = Client(atompub, unicode(username), unicode(password), domain=Client.Domain, server=Client.Host, port=Client.Port, usetls=False, register=False, profile=profile) Client.Sessions[c.username] = c c.activate() @staticmethod def disconnect_jabber_user(username): if username in Client.Sessions: c = Client.Sessions[username] del Client.Sessions[username] c.shutdown() @staticmethod def get_status(username): return username in Client.Sessions @staticmethod def is_registered(username): if username.lower() in Client.Sessions: return Client.Sessions[username.lower()] return False def passwordLookup(self, jid): return self.password def shutdown(self): #self.send(Presence.to_element(Presence(self.jid, type=u'unavailable')), 'forward') self.send('OUTGOING : </stream:stream>', 'log') self.send('</stream:stream>', 'outbox') self.running = False def abort(self): self.send('OUTGOING : </stream:stream>', 'log') self.send('</stream:stream>', 'outbox') self.running = False def setup(self): self.running = True # Backplanes are like a global entry points that # can be accessible both for publishing and # recieving data. # In other words, a component interested # in advertising to many other components that # something happened may link one of its outbox # to a PublishTo component's inbox. # A component wishing to receive that piece of # information will link one of its inbox # to the SubscribeTo component's outbox. # This helps greatly to make components more # loosely connected but also allows for some data # to be dispatched at once to many (such as when # the server returns the per-session JID that # is of interest for most other components). self.backplanes.append(Backplane("JID.%s" % self.session_id).activate()) # Used to inform components that the session is now active self.backplanes.append(Backplane("BOUND.%s" % self.session_id).activate()) # Used to inform components of the supported features self.backplanes.append(Backplane("DISCO_FEAT.%s" % self.session_id).activate()) sub = SubscribeTo("JID.%s" % self.session_id) self.link((sub, 'outbox'), (self, 'jid')) self.addChildren(sub) sub.activate() sub = SubscribeTo("BOUND.%s" % self.session_id) self.link((sub, 'outbox'), (self, 'connected')) self.addChildren(sub) sub.activate() # Add two outboxes ro the ClientSteam to support specific extensions. ClientStream.Outboxes["%s.query" % XMPP_IBR_NS] = "Registration" ClientStream.Outboxes["%s.query" % XMPP_LAST_NS] = "Activity" ClientStream.Outboxes["%s.query" % XMPP_DISCO_INFO_NS] = "Discovery" ClientStream.Outboxes["%s.query" % XMPP_DISCO_ITEMS_NS] = "PubSub Discovery of Nodes" ClientStream.Outboxes["%s.subscribe" % XMPP_PUBSUB_NS] = "Pubsub subscription handler" ClientStream.Outboxes["%s.unsubscribe" % XMPP_PUBSUB_NS] = "Pubsub unsubscription handler" ClientStream.Outboxes["%s.subscriptions" % XMPP_PUBSUB_NS] = "Pubsub subscriptions handler" ClientStream.Outboxes["%s.affiliations" % XMPP_PUBSUB_NS] = "Pubsub affiliations handler" ClientStream.Outboxes["%s.create" % XMPP_PUBSUB_NS] = "Pubsub node creation handler" ClientStream.Outboxes["%s.purge" % XMPP_PUBSUB_OWNER_NS] = "Pubsub node purge handler" ClientStream.Outboxes["%s.delete" % XMPP_PUBSUB_OWNER_NS] = "Pubsub node delete handler" ClientStream.Outboxes["%s.publish" % XMPP_PUBSUB_NS] = "Pubsub item publication handler" ClientStream.Outboxes["%s.retract" % XMPP_PUBSUB_NS] = "Pubsub item deletion handler" ClientStream.Outboxes["%s.x" % XMPP_PUBSUB_EVENT_NS] = "" ClientStream.Outboxes["%s.event" % XMPP_PUBSUB_EVENT_NS] = "" self.client = ClientStream(self.jid, self.passwordLookup, use_tls=self.usetls) self.addChildren(self.client) self.client.activate() self.graph = Graphline(client = self, logger = Logger(path='./logs/%s.log' % self.username, stdout=True, name=self.session_id), tcp = TCPClient(self.server, self.port), xmlparser = XMLIncrParser(), xmpp = self.client, streamerr = StreamError(), saslerr = SaslError(), discohandler = DiscoHandler(self.jid, self.atompub, self.domain, session_id=self.session_id, profile=self.profile), activityhandler = ActivityHandler(session_id=self.session_id), rosterhandler = RosterHandler(self.jid, session_id=self.session_id), registerhandler = RegistrationHandler(self.username, self.password, self.session_id, profile=self.profile), msgdummyhandler = DummyMessageHandler(session_id=self.session_id, profile=self.profile), presencehandler = PresenceHandler(session_id=self.session_id), itemshandler = ItemsHandler(self.jid, self.atompub, self.domain, session_id=self.session_id, profile=self.profile), pubsubmsgeventhandler = MessageHandler(self.jid, self.atompub, self.domain, session_id=self.session_id, profile=self.profile), presencedisp = PresenceDispatcher(), rosterdisp = RosterDispatcher(), msgdisp = MessageDispatcher(), discodisp = DiscoveryDispatcher(), activitydisp = ActivityDispatcher(), registerdisp = RegisterDispatcher(), pubsubdisp = PubSubDispatcher(), pjid = PublishTo("JID.%s" % self.session_id), pbound = PublishTo("BOUND.%s" % self.session_id), linkages = {('xmpp', 'terminated'): ('client', 'inbox'), ('client', 'forward'): ('xmpp', 'forward'), ('client', 'outbox'): ('tcp', 'inbox'), ('client', 'signal'): ('tcp', 'control'), ("tcp", "outbox") : ("xmlparser", "inbox"), ("xmpp", "starttls") : ("tcp", "makessl"), ("tcp", "sslready") : ("xmpp", "tlssuccess"), ("xmlparser", "outbox") : ("xmpp" , "inbox"), ("xmpp", "outbox") : ("tcp" , "inbox"), ("xmpp", "reset"): ("xmlparser", "reset"), ("client", "log"): ("logger", "inbox"), ("xmpp", "log"): ("logger", "inbox"), ("xmpp", "jid"): ("pjid", "inbox"), ("xmpp", "bound"): ("pbound", "inbox"), ("xmpp", "features"): ("client", "streamfeat"), ("xmpp", "unhandled"): ("client", "unhandled"), ("client", "doauth"): ("xmpp", "auth"), # Registration ("xmpp", "%s.query" % XMPP_IBR_NS): ("registerdisp", "inbox"), ("registerdisp", "log"): ('logger', "inbox"), ("registerdisp", "xmpp.error"): ("registerhandler", "error"), ("registerdisp", "xmpp.result"): ("registerhandler", "inbox"), ("registerhandler", "outbox"): ("registerdisp", "forward"), ("client", "doregistration"): ("registerdisp", "forward"), ("registerdisp", "outbox"): ("xmpp", "forward"), # Presence ("xmpp", "%s.presence" % XMPP_CLIENT_NS): ("presencedisp", "inbox"), ("presencedisp", "log"): ('logger', "inbox"), ("presencedisp", "xmpp.subscribe"): ("presencehandler", "subscribe"), ("presencedisp", "xmpp.unsubscribe"): ("presencehandler", "unsubscribe"), ("presencehandler", "outbox"): ("presencedisp", "forward"), ("presencehandler", "roster"): ("rosterdisp", "forward"), ("presencedisp", "outbox"): ("xmpp", "forward"), # Roster ("xmpp", "%s.query" % XMPP_ROSTER_NS): ("rosterdisp", "inbox"), ("rosterdisp", "log"): ('logger', "inbox"), ('rosterdisp', 'xmpp.set'): ('rosterhandler', 'pushed'), ('rosterdisp', 'xmpp.result'): ('rosterhandler', 'inbox'), ('rosterhandler', 'result'): ('rosterdisp', 'forward'), ('rosterhandler', 'roster-updated'): ('msgdummyhandler', 'roster-received'), ("rosterdisp", "outbox"): ("xmpp", "forward"), # Discovery ("xmpp", "%s.query" % XMPP_DISCO_INFO_NS): ("discodisp", "features.inbox"), ("xmpp", "%s.query" % XMPP_DISCO_ITEMS_NS): ("discodisp", "items.inbox"), ("xmpp", "%s.affiliations" % XMPP_PUBSUB_NS): ("discodisp", "affiliation.inbox"), ("xmpp", "%s.subscriptions" % XMPP_PUBSUB_NS): ("discodisp", "subscription.inbox"), ("discodisp", "log"): ('logger', "inbox"), ("discohandler", "features-disco"): ('discodisp', "features.forward"), ('discohandler', 'items-disco'): ('discodisp', 'items.forward'), ('discohandler', 'subscriptions-disco'): ('discodisp', 'subscription.forward'), ('discohandler', 'affiliations-disco'): ('discodisp', 'affiliation.forward'), ("discodisp", "out.features.result"): ('discohandler', "features.result"), ("discodisp",'subscription.outbox'):('xmpp','forward'), ("discodisp",'affiliation.outbox'):('xmpp','forward'), ("discodisp",'out.subscription.result'): ('discohandler','subscriptions.result'), ("discodisp",'out.affiliation.result'): ('discohandler','affiliations.result'), ("discodisp", 'out.items.result'): ('discohandler', 'items.result'), ("discodisp", 'out.items.error'): ('discohandler', 'items.error'), ("discodisp", "outbox"): ("xmpp", "forward"), # Message ("xmpp", "%s.message" % XMPP_CLIENT_NS): ("msgdisp", "inbox"), ("msgdisp", "log"): ('logger', "inbox"), ("msgdisp", "xmpp.chat"): ('msgdummyhandler', 'inbox'), ("msgdummyhandler", "outbox"): ('msgdisp', 'forward'), ("msgdisp", "outbox"): ("xmpp", "forward"), # Activity ("xmpp", "%s.query" % XMPP_LAST_NS): ("activitydisp", "inbox"), ("activitydisp", "log"): ('logger', "inbox"), ("activitydisp", "outbox"): ("xmpp", "forward"), ("activityhandler", 'activity-supported'): ('rosterhandler', 'ask-activity'), ("rosterhandler", 'activity'): ('activitydisp', 'forward'), # Pubsub ("xmpp", "%s.create" % XMPP_PUBSUB_NS): ("pubsubdisp", "create.inbox"), ("xmpp", "%s.delete" % XMPP_PUBSUB_OWNER_NS): ("pubsubdisp", "delete.inbox"), ("xmpp", "%s.purge" % XMPP_PUBSUB_OWNER_NS): ("pubsubdisp", "purge.inbox"), ("xmpp", "%s.subscribe" % XMPP_PUBSUB_NS): ("pubsubdisp", "subscribe.inbox"), ("xmpp", "%s.unsubscribe" % XMPP_PUBSUB_NS):("pubsubdisp", "unsubscribe.inbox"), ("xmpp", "%s.publish" % XMPP_PUBSUB_NS): ("pubsubdisp", "publish.inbox"), ("xmpp", "%s.retract" % XMPP_PUBSUB_NS): ("pubsubdisp", "retract.inbox"), ("xmpp", "%s.x" % XMPP_PUBSUB_EVENT_NS): ("pubsubdisp", "message.inbox"), ("xmpp", "%s.event" % XMPP_PUBSUB_EVENT_NS): ("pubsubdisp", "message.inbox"), ("pubsubdisp", "log"): ('logger', "inbox"), ("discohandler", "create-node"): ("pubsubdisp", "create.forward"), ("discohandler", "delete-node"): ("pubsubdisp", "delete.forward"), ("discohandler", "subscribe-node"): ("pubsubdisp", "subscribe.forward"), ("discohandler", "unsubscribe-node"): ("pubsubdisp", "unsubscribe.forward"), ("pubsubdisp", "create.outbox"): ("xmpp", "forward"), ("pubsubdisp", "delete.outbox"): ("xmpp", "forward"), ("pubsubdisp", "purge.outbox"): ("xmpp", "forward"), ("pubsubdisp", "subscribe.outbox"): ("xmpp", "forward"), ("pubsubdisp", "unsubscribe.outbox"): ("xmpp", "forward"), ("pubsubdisp", "publish.outbox"): ("xmpp", "forward"), ("pubsubdisp", "retract.outbox"): ("xmpp", "forward"), ("pubsubdisp", "out.create.result"): ("discohandler", "created"), ("pubsubdisp", "out.subscribe.result"): ("discohandler", "subscribed"), ("pubsubdisp", "out.delete.result"): ("discohandler", "deleted"), ("pubsubdisp", "out.create.error"): ("discohandler", "error"), ("pubsubdisp", "out.delete.error"): ("discohandler", "error"), ("pubsubdisp", "out.publish.error"): ("itemshandler", "publish.error"), ("pubsubdisp", "out.retract.error"): ("itemshandler", "retract.error"), ("pubsubdisp", "out.publish.result"): ("itemshandler", "published"), ("pubsubdisp", "out.message"): ('pubsubmsgeventhandler', 'inbox'), ('itemshandler', 'publish'): ('pubsubdisp', 'publish.forward'), ('itemshandler', 'delete'): ('pubsubdisp', 'retract.forward'), ('itemshandler', 'purge'): ('pubsubdisp', 'purge.forward'), ("msgdummyhandler", "PI"): ('itemshandler', 'topublish'), ("msgdummyhandler", "GEO"): ('itemshandler', 'topublish'), ("msgdummyhandler", "DI"): ('itemshandler', 'todelete'), ("msgdummyhandler", "PN"): ('itemshandler', 'topurge'), ("msgdummyhandler", "CN"): ('discohandler', 'docreate'), ("msgdummyhandler", "DN"): ('discohandler', 'dodelete'), ("msgdummyhandler", "SN"): ('discohandler', 'dosubscribe'), ("msgdummyhandler", "UN"): ('discohandler', 'dounsubscribe'), ('pubsubmsgeventhandler', 'items-disco'): ('discodisp', 'items.forward'), } ) self.addChildren(self.graph) self.graph.activate() return 1 def main(self): yield self.setup() while self.running: if self.dataReady("control"): mes = self.recv("control") if isinstance(mes, str): if mes.strip() == 'quit': self.shutdown() elif isinstance(mes, shutdownMicroprocess) or isinstance(mes, producerFinished): self.send(mes, "signal") break if self.dataReady("connected"): self.recv('connected') self.connected = True if self.dataReady("unhandled"): msg = self.recv('unhandled') self.send(('UNHANDLED', msg), 'log') if self.dataReady("inbox"): msg = self.recv('inbox') if msg == "quit": self.send(shutdownMicroprocess(), "signal") yield 1 break if self.dataReady("streamfeat"): feat = self.recv('streamfeat') if feat.register and self.register: self.send(Registration(), 'doregistration') elif self.register and not feat.register: print "The server does not support in-band registration. Closing connection." self.abort() else: self.send(feat, 'doauth') if self.dataReady("jid"): self.jid = self.recv('jid') if not self.anyReady(): self.pause() yield 1 yield shutdownMicroprocess(self, self.children, self.backplanes)