source: ralphm-patches/roster_server.patch @ 62:3e957d5a5064

Last change on this file since 62:3e957d5a5064 was 62:3e957d5a5064, checked in by Ralph Meijer <ralphm@…>, 8 years ago

Undo code move from wokkel.xmppim to wokkel.im.

This also adds a new patch for defining Wokkel's version in wokkel.version
and defers the JID cleanup.

File size: 4.3 KB
  • wokkel/test/test_xmppim.py

    Add server side support for the roster protocol.
    
     * Implements roster get by calling `getRoster` and using the returned `list`
       of `RosterItem`s to send back the roster.
    
    TODO:
     * Add more docstrings.
     * Use `dict` instead of `list` as return value of `getRoster`.
     * Add support for roster sets?
    
    diff --git a/wokkel/test/test_xmppim.py b/wokkel/test/test_xmppim.py
    a b  
    13301330        d = self.handleRequest(xml)
    13311331        d.addCallback(cb)
    13321332        return d
     1333
     1334
     1335
     1336class RosterServerProtocolTest(unittest.TestCase, TestableRequestHandlerMixin):
     1337    """
     1338    Tests for L{xmppim.RosterServerProtocol}.
     1339    """
     1340
     1341    def setUp(self):
     1342        self.stub = XmlStreamStub()
     1343        self.service = xmppim.RosterServerProtocol()
     1344        self.service.makeConnection(self.stub.xmlstream)
     1345        self.service.connectionInitialized()
     1346
     1347
     1348    def test_onRosterGet(self):
     1349        """
     1350        A roster get request should trigger getRoster with the request.
     1351        """
     1352        xml = """
     1353          <iq type='get' from='user@example.org' to='user@example.org'>
     1354            <query xmlns='jabber:iq:roster'/>
     1355          </iq>
     1356        """
     1357
     1358        def getRoster(request):
     1359            self.assertEqual(JID('user@example.org'), request.sender)
     1360            item = xmppim.RosterItem(JID('other@example.org'), True, False,
     1361                                 'The User')
     1362            return defer.succeed([item])
     1363
     1364        def cb(element):
     1365            self.assertEquals('query', element.name)
     1366            self.assertEquals(NS_ROSTER, element.uri)
     1367            itemElements = list(domish.generateElementsQNamed(
     1368                element.children, 'item', NS_ROSTER))
     1369            self.assertEqual(1, len(itemElements))
     1370            item = itemElements[0]
     1371            self.assertEquals(u'other@example.org', item.getAttribute('jid'))
     1372            self.assertEquals(u'to', item.getAttribute('subscription'))
     1373            self.assertEquals(u'The User', item.getAttribute('name'))
     1374
     1375        self.service.getRoster = getRoster
     1376        d = self.handleRequest(xml)
     1377        d.addCallback(cb)
     1378        return d
     1379
     1380
     1381    def test_onRosterGetNotOverridden(self):
     1382        """
     1383        If getRoster is not overridden, return feature-not-implemented.
     1384        """
     1385        xml = """
     1386          <iq type='get' from='user@example.org' to='user@example.org'>
     1387            <query xmlns='jabber:iq:roster'/>
     1388          </iq>
     1389        """
     1390
     1391        d = self.handleRequest(xml)
     1392        self.assertFailure(d, NotImplementedError)
     1393        return d
     1394
     1395
     1396    def test_onRosterSet(self):
     1397        """
     1398        Roster set is not yet supported.
     1399        """
     1400        xml = """
     1401          <iq type='set' from='user@example.org' to='user@example.org'>
     1402            <query xmlns='jabber:iq:roster'>
     1403              <item jid='other@example.org' name='Other User'/>
     1404            </query>
     1405          </iq>
     1406        """
     1407
     1408        d = self.handleRequest(xml)
     1409        self.assertFailure(d, NotImplementedError)
     1410        return d
  • wokkel/xmppim.py

    diff --git a/wokkel/xmppim.py b/wokkel/xmppim.py
    a b  
    2525NS_ROSTER = 'jabber:iq:roster'
    2626
    2727XPATH_ROSTER_SET = "/iq[@type='set']/query[@xmlns='%s']" % NS_ROSTER
     28XPATH_ROSTER_GET = "/iq[@type='get']/query[@xmlns='%s']" % NS_ROSTER
    2829
    2930
    3031
     
    10631064        """
    10641065        Called when a message stanza was received.
    10651066        """
     1067
     1068
     1069
     1070class RosterServerProtocol(XMPPHandler, IQHandlerMixin):
     1071    """
     1072    XMPP subprotocol handler for the roster, server side.
     1073    """
     1074
     1075    iqHandlers = {
     1076            XPATH_ROSTER_GET: '_onRosterGet',
     1077            # XPATH_ROSTER_SET: '_onRosterSet',
     1078            }
     1079
     1080    def connectionInitialized(self):
     1081        self.xmlstream.addObserver(XPATH_ROSTER_GET, self.handleRequest)
     1082        self.xmlstream.addObserver(XPATH_ROSTER_SET, self.handleRequest)
     1083
     1084
     1085    def _toRosterReply(self, roster, request):
     1086        response = domish.Element((NS_ROSTER, 'query'))
     1087
     1088        for item in roster:
     1089            response.addChild(item.toElement())
     1090
     1091        return response
     1092
     1093
     1094    def _onRosterGet(self, iq):
     1095        request = Stanza.fromElement(iq)
     1096
     1097        d = self.getRoster(request)
     1098        d.addCallback(self._toRosterReply, request)
     1099        return d
     1100
     1101
     1102    def getRoster(self, entity):
     1103        raise NotImplementedError()
Note: See TracBrowser for help on using the repository browser.