Changeset 62:3e957d5a5064 in ralphm-patches
- Timestamp:
- May 19, 2012, 10:46:18 PM (10 years ago)
- Branch:
- default
- Files:
-
- 1 added
- 1 deleted
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
c2s_stanza_handlers.patch
r57 r62 1 1 # HG changeset patch 2 # Parent 24c6e79ab1c449f41fd5d4c2cb843dc16efe2c592 # Parent 8c6fa8ea95402e5c968f57e7fde2f8e249c11d12 3 3 Add c2s protocol handlers for iq, message and presence stanzas. 4 4 … … 8 8 * Save last unavailable presence for future probes. 9 9 10 diff -r 24c6e79ab1c4 doc/examples/client_service.tac 11 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 12 +++ b/doc/examples/client_service.tac Wed Mar 28 13:23:36 2012 +0200 10 diff --git a/doc/examples/client_service.tac b/doc/examples/client_service.tac 11 new file mode 100644 12 --- /dev/null 13 +++ b/doc/examples/client_service.tac 13 14 @@ -0,0 +1,75 @@ 14 15 +from twisted.application import service, strports 15 16 +from twisted.internet import defer 16 17 + 17 +from wokkel import client, im18 +from wokkel import client, xmppim 18 19 +from wokkel.component import InternalComponent, Router 19 20 +from wokkel.generic import FallbackHandler 20 21 +from wokkel.ping import PingHandler 21 +from wokkel. im import RosterItem22 +from wokkel.xmppim import RosterItem 22 23 + 23 24 +from twisted.words.protocols.jabber.jid import internJID as JID … … 53 54 + 54 55 + 55 +class StaticRoster( im.RosterServerProtocol):56 +class StaticRoster(xmppim.RosterServerProtocol): 56 57 + 57 58 + def __init__(self, roster): 58 + im.RosterServerProtocol.__init__(self)59 + xmppim.RosterServerProtocol.__init__(self) 59 60 + self.roster = roster 60 61 + … … 74 75 +sessionManager.setHandlerParent(component) 75 76 + 76 + im.AccountIQHandler(sessionManager).setHandlerParent(component)77 + im.AccountMessageHandler(sessionManager).setHandlerParent(component)78 + im.PresenceServerHandler(sessionManager, domain, roster).setHandlerParent(component)77 +xmppim.AccountIQHandler(sessionManager).setHandlerParent(component) 78 +xmppim.AccountMessageHandler(sessionManager).setHandlerParent(component) 79 +xmppim.PresenceServerHandler(sessionManager, domain, roster).setHandlerParent(component) 79 80 +FallbackHandler().setHandlerParent(component) 80 81 +StaticRoster(roster).setHandlerParent(component) … … 87 88 + 88 89 +sessionManager.connectionManager = c2sFactory 89 diff -r 24c6e79ab1c4 wokkel/im.py 90 --- a/wokkel/im.py Wed Mar 28 13:22:34 2012 +0200 91 +++ b/wokkel/im.py Wed Mar 28 13:23:36 2012 +0200 92 @@ -10,7 +10,10 @@ 93 U{RFC 6121<http://www.xmpp.org/rfcs/rfc6121.html>} (XMPP IM). 94 """ 90 diff --git a/wokkel/test/test_xmppim.py b/wokkel/test/test_xmppim.py 91 --- a/wokkel/test/test_xmppim.py 92 +++ b/wokkel/test/test_xmppim.py 93 @@ -13,7 +13,7 @@ 94 from twisted.words.xish import domish, utility 95 96 from wokkel import xmppim 97 -from wokkel.generic import ErrorStanza, parseXml 98 +from wokkel.generic import ErrorStanza, Stanza, parseXml 99 from wokkel.test.helpers import TestableRequestHandlerMixin, XmlStreamStub 100 101 NS_XML = 'http://www.w3.org/XML/1998/namespace' 102 @@ -1333,6 +1333,82 @@ 103 104 105 106 +class AccountIQHandlerTest(unittest.TestCase): 107 + """ 108 + Tests for L{xmppim.AccountIQHandler}. 109 + """ 110 + 111 + def setUp(self): 112 + self.stub = XmlStreamStub() 113 + self.protocol = xmppim.AccountIQHandler(None) 114 + self.protocol.makeConnection(self.stub.xmlstream) 115 + self.protocol.connectionInitialized() 116 + 117 + 118 + def test_onIQNotUser(self): 119 + """ 120 + IQs to JIDs without local part are ignored. 121 + """ 122 + xml = """ 123 + <iq to='example.org'> 124 + <query xmlns='jabber:iq:version'/> 125 + </iq> 126 + """ 127 + 128 + iq = parseXml(xml) 129 + self.stub.send(iq) 130 + 131 + self.assertFalse(getattr(iq, 'handled')) 132 + 133 + 134 + 135 +class AccountMessageHandlerTest(unittest.TestCase): 136 + """ 137 + Tests for L{xmppim.AccountMessageHandler}. 138 + """ 139 + 140 + def setUp(self): 141 + self.stub = XmlStreamStub() 142 + self.protocol = xmppim.AccountMessageHandler(None) 143 + self.protocol.makeConnection(self.stub.xmlstream) 144 + self.protocol.connectionInitialized() 145 + 146 + 147 + def test_onMessageNotUser(self): 148 + """ 149 + Messages to JIDs without local part are ignored. 150 + """ 151 + xml = """ 152 + <message to='example.org'> 153 + <body>Hello</body> 154 + </message> 155 + """ 156 + 157 + message = parseXml(xml) 158 + self.stub.send(message) 159 + 160 + self.assertFalse(getattr(message, 'handled')) 161 + 162 + 163 + 164 +class ClonePresenceTest(unittest.TestCase): 165 + """ 166 + Tests for L{xmppim.clonePresence}. 167 + """ 168 + 169 + def test_rootElement(self): 170 + """ 171 + The copied presence stanza is not identical, but renders identically. 172 + """ 173 + originalElement = domish.Element((None, 'presence')) 174 + stanza = Stanza.fromElement(originalElement) 175 + copyElement = xmppim.clonePresence(stanza) 176 + 177 + self.assertNotIdentical(copyElement, originalElement) 178 + self.assertEquals(copyElement.toXml(), originalElement.toXml()) 179 + 180 + 181 + 182 class RosterServerProtocolTest(unittest.TestCase, TestableRequestHandlerMixin): 183 """ 184 Tests for L{xmppim.RosterServerProtocol}. 185 diff --git a/wokkel/xmppim.py b/wokkel/xmppim.py 186 --- a/wokkel/xmppim.py 187 +++ b/wokkel/xmppim.py 188 @@ -12,7 +12,10 @@ 189 190 import warnings 95 191 96 192 +import copy … … 99 195 +from twisted.python import log 100 196 from twisted.words.protocols.jabber import error 101 from twisted.words.protocols.jabber import jid197 from twisted.words.protocols.jabber.jid import JID 102 198 from twisted.words.xish import domish 103 @@ - 179,10 +182,7 @@199 @@ -408,10 +411,7 @@ 104 200 105 201 … … 113 209 114 210 presenceType = stanza.stanzaType or 'available' 115 @@ - 192,14 +192,22 @@211 @@ -421,14 +421,22 @@ 116 212 except KeyError: 117 213 return … … 138 234 139 235 140 @@ - 582,6 +590,440 @@236 @@ -1067,6 +1075,440 @@ 141 237 142 238 … … 168 264 + 169 265 + try: 170 + recipient = jid.internJID(iq['to'])266 + recipient = JID(iq['to']) 171 267 + except KeyError: 172 268 + return … … 218 314 + 219 315 + try: 220 + recipient = jid.internJID(message['to'])316 + recipient = JID(message['to']) 221 317 + except KeyError: 222 318 + return … … 351 447 + continue 352 448 + 353 + resourceJID = jid.JID(tuple=(fromJID.user,354 + 355 + 449 + resourceJID = JID(tuple=(fromJID.user, 450 + fromJID.host, 451 + otherResource)) 356 452 + outPresence = clonePresence(presence) 357 453 + outPresence['to'] = resourceJID.full() … … 378 474 + # broadcast to contact's available resources 379 475 + for itemResource in self.presences[item.entity.user]: 380 + resourceJID = jid.JID(tuple=(item.entity.user,381 + 382 + 476 + resourceJID = JID(tuple=(item.entity.user, 477 + item.entity.host, 478 + itemResource)) 383 479 + self.sessionManager.deliverStanza(outPresence, 384 480 + resourceJID) … … 458 554 + if toJID.user in self.presences: 459 555 + for resource in self.presences[toJID.user]: 460 + resourceJID = jid.JID(tuple=(toJID.user,461 + 462 + 556 + resourceJID = JID(tuple=(toJID.user, 557 + toJID.host, 558 + resource)) 463 559 + self.sessionManager.deliverStanza(presence.element, resourceJID) 464 560 + self.remotePresences[toJID.user][fromJID] = presence … … 579 675 """ 580 676 XMPP subprotocol handler for the roster, server side. 581 diff -r 24c6e79ab1c4 wokkel/test/test_im.py582 --- a/wokkel/test/test_im.py Wed Mar 28 13:22:34 2012 +0200583 +++ b/wokkel/test/test_im.py Wed Mar 28 13:23:36 2012 +0200584 @@ -13,7 +13,7 @@585 from twisted.words.xish import domish, utility586 587 from wokkel import im588 -from wokkel.generic import ErrorStanza, parseXml589 +from wokkel.generic import ErrorStanza, Stanza, parseXml590 from wokkel.test.helpers import TestableRequestHandlerMixin, XmlStreamStub591 592 NS_XML = 'http://www.w3.org/XML/1998/namespace'593 @@ -846,6 +846,82 @@594 595 596 597 +class AccountIQHandlerTest(unittest.TestCase):598 + """599 + Tests for L{im.AccountIQHandler}.600 + """601 +602 + def setUp(self):603 + self.stub = XmlStreamStub()604 + self.protocol = im.AccountIQHandler(None)605 + self.protocol.makeConnection(self.stub.xmlstream)606 + self.protocol.connectionInitialized()607 +608 +609 + def test_onIQNotUser(self):610 + """611 + IQs to JIDs without local part are ignored.612 + """613 + xml = """614 + <iq to='example.org'>615 + <query xmlns='jabber:iq:version'/>616 + </iq>617 + """618 +619 + iq = parseXml(xml)620 + self.stub.send(iq)621 +622 + self.assertFalse(getattr(iq, 'handled'))623 +624 +625 +626 +class AccountMessageHandlerTest(unittest.TestCase):627 + """628 + Tests for L{im.AccountMessageHandler}.629 + """630 +631 + def setUp(self):632 + self.stub = XmlStreamStub()633 + self.protocol = im.AccountMessageHandler(None)634 + self.protocol.makeConnection(self.stub.xmlstream)635 + self.protocol.connectionInitialized()636 +637 +638 + def test_onMessageNotUser(self):639 + """640 + Messages to JIDs without local part are ignored.641 + """642 + xml = """643 + <message to='example.org'>644 + <body>Hello</body>645 + </message>646 + """647 +648 + message = parseXml(xml)649 + self.stub.send(message)650 +651 + self.assertFalse(getattr(message, 'handled'))652 +653 +654 +655 +class ClonePresenceTest(unittest.TestCase):656 + """657 + Tests for L{im.clonePresence}.658 + """659 +660 + def test_rootElement(self):661 + """662 + The copied presence stanza is not identical, but renders identically.663 + """664 + originalElement = domish.Element((None, 'presence'))665 + stanza = Stanza.fromElement(originalElement)666 + copyElement = im.clonePresence(stanza)667 +668 + self.assertNotIdentical(copyElement, originalElement)669 + self.assertEquals(copyElement.toXml(), originalElement.toXml())670 +671 +672 +673 class RosterServerProtocolTest(unittest.TestCase, TestableRequestHandlerMixin):674 """675 Tests for L{im.RosterServerProtocol}. -
roster_server.patch
r54 r62 9 9 * Add support for roster sets? 10 10 11 diff -r e3c41b054210 wokkel/im.py 12 --- a/wokkel/im.py Wed Oct 05 09:32:22 2011 +0200 13 +++ b/wokkel/im.py Wed Oct 05 09:38:26 2011 +0200 14 @@ -23,6 +23,7 @@ 15 NS_ROSTER = 'jabber:iq:roster' 16 17 XPATH_ROSTER_SET = "/iq[@type='set']/query[@xmlns='%s']" % NS_ROSTER 18 +XPATH_ROSTER_GET = "/iq[@type='get']/query[@xmlns='%s']" % NS_ROSTER 19 20 21 22 @@ -549,3 +550,40 @@ 23 @param entity: The entity for which the roster item has been removed. 24 @type entity: L{jid.JID} 25 """ 26 + 27 + 28 + 29 +class RosterServerProtocol(XMPPHandler, IQHandlerMixin): 30 + """ 31 + XMPP subprotocol handler for the roster, server side. 32 + """ 33 + 34 + iqHandlers = { 35 + XPATH_ROSTER_GET: '_onRosterGet', 36 + # XPATH_ROSTER_SET: '_onRosterSet', 37 + } 38 + 39 + def connectionInitialized(self): 40 + self.xmlstream.addObserver(XPATH_ROSTER_GET, self.handleRequest) 41 + self.xmlstream.addObserver(XPATH_ROSTER_SET, self.handleRequest) 42 + 43 + 44 + def _toRosterReply(self, roster, request): 45 + response = domish.Element((NS_ROSTER, 'query')) 46 + 47 + for item in roster: 48 + response.addChild(item.toElement()) 49 + 50 + return response 51 + 52 + 53 + def _onRosterGet(self, iq): 54 + request = Stanza.fromElement(iq) 55 + 56 + d = self.getRoster(request) 57 + d.addCallback(self._toRosterReply, request) 58 + return d 59 + 60 + 61 + def getRoster(self, entity): 62 + raise NotImplementedError() 63 diff -r e3c41b054210 wokkel/test/test_im.py 64 --- a/wokkel/test/test_im.py Wed Oct 05 09:32:22 2011 +0200 65 +++ b/wokkel/test/test_im.py Wed Oct 05 09:38:26 2011 +0200 66 @@ -844,3 +844,80 @@ 11 diff --git a/wokkel/test/test_xmppim.py b/wokkel/test/test_xmppim.py 12 --- a/wokkel/test/test_xmppim.py 13 +++ b/wokkel/test/test_xmppim.py 14 @@ -1330,3 +1330,81 @@ 15 d = self.handleRequest(xml) 67 16 d.addCallback(cb) 68 17 return d 69 18 + 70 19 + 71 20 + 72 21 +class RosterServerProtocolTest(unittest.TestCase, TestableRequestHandlerMixin): 73 22 + """ 74 + Tests for L{ im.RosterServerProtocol}.23 + Tests for L{xmppim.RosterServerProtocol}. 75 24 + """ 76 25 + 77 26 + def setUp(self): 78 27 + self.stub = XmlStreamStub() 79 + self.service = im.RosterServerProtocol()28 + self.service = xmppim.RosterServerProtocol() 80 29 + self.service.makeConnection(self.stub.xmlstream) 81 30 + self.service.connectionInitialized() … … 94 43 + def getRoster(request): 95 44 + self.assertEqual(JID('user@example.org'), request.sender) 96 + item = im.RosterItem(JID('other@example.org'), True, False,45 + item = xmppim.RosterItem(JID('other@example.org'), True, False, 97 46 + 'The User') 98 47 + return defer.succeed([item]) … … 145 94 + self.assertFailure(d, NotImplementedError) 146 95 + return d 96 diff --git a/wokkel/xmppim.py b/wokkel/xmppim.py 97 --- a/wokkel/xmppim.py 98 +++ b/wokkel/xmppim.py 99 @@ -25,6 +25,7 @@ 100 NS_ROSTER = 'jabber:iq:roster' 101 102 XPATH_ROSTER_SET = "/iq[@type='set']/query[@xmlns='%s']" % NS_ROSTER 103 +XPATH_ROSTER_GET = "/iq[@type='get']/query[@xmlns='%s']" % NS_ROSTER 104 105 106 107 @@ -1063,3 +1064,40 @@ 108 """ 109 Called when a message stanza was received. 110 """ 111 + 112 + 113 + 114 +class RosterServerProtocol(XMPPHandler, IQHandlerMixin): 115 + """ 116 + XMPP subprotocol handler for the roster, server side. 117 + """ 118 + 119 + iqHandlers = { 120 + XPATH_ROSTER_GET: '_onRosterGet', 121 + # XPATH_ROSTER_SET: '_onRosterSet', 122 + } 123 + 124 + def connectionInitialized(self): 125 + self.xmlstream.addObserver(XPATH_ROSTER_GET, self.handleRequest) 126 + self.xmlstream.addObserver(XPATH_ROSTER_SET, self.handleRequest) 127 + 128 + 129 + def _toRosterReply(self, roster, request): 130 + response = domish.Element((NS_ROSTER, 'query')) 131 + 132 + for item in roster: 133 + response.addChild(item.toElement()) 134 + 135 + return response 136 + 137 + 138 + def _onRosterGet(self, iq): 139 + request = Stanza.fromElement(iq) 140 + 141 + d = self.getRoster(request) 142 + d.addCallback(self._toRosterReply, request) 143 + return d 144 + 145 + 146 + def getRoster(self, entity): 147 + raise NotImplementedError() -
series
r61 r62 1 pubsub_client_example.patch2 3 copy_xmppim.patch #+c2s4 jid_cleanup.patch #+c2s5 1 roster_server.patch #+c2s 6 2 router_unknown.patch #+c2s … … 10 6 c2s_stanza_handlers.patch #+c2s 11 7 8 version.patch 9 10 pubsub_client_example.patch 12 11 pubsub_resource_example.patch 13 12 … … 15 14 pubsub-item.patch #-compatible 16 15 16 jid_cleanup.patch #+deferred 17 17 pubsub-default-type-attribute.patch #+deferred 18 18 disco_simplify_gatherResults.patch #+deferred
Note: See TracChangeset
for help on using the changeset viewer.