def testJIDchange(self): """Test changing JID of the form 'user@server/resource/with/slashes'""" j = JID('user1@someserver1/some1/resource1') j.user = '******' j.domain = 'someserver' j.resource = 'some/resource' self.check_jid(j, 'user', 'someserver', 'some/resource', 'user@someserver', 'user@someserver/some/resource', 'user@someserver/some/resource')
async def _set_roster(self, iq): try: self.delay_pushes += 1 items = {} try: contacts = iq['roster'].get_items() if len(contacts) != 1: raise XMPPError('bad-request') for jid, values in contacts.items(): if jid.bare == self.stream.boundjid.bare: raise XMPPError('not-allowed') if values.get('subscription', 'none') != 'remove': if jid.user == '': # the request might be addressed to a nickname; # I haven't found any reference for that actually # being allowed, so for now, treat that as a # query for a username on the local server # (while also telling the client to remove the # original request, just in case). items[jid] = {'subscription': 'remove'} jid = JID(jid) jid.user = jid.domain jid.domain = self.stream.host items[jid] = await self._update_contact(jid, values) else: items[jid] = await self._remove_contact(jid) except Exception as e: iq.exception(e) return iq.reply().send() # push to other resources of the same user del iq['from'] iq['roster'].set_items(items) await self.stream.ipc_send('roster.push', self.stream.boundjid, iq.xml) finally: self.delay_pushes -= 1 if self.delay_pushes == 0: pushes = self.delayed_pushes self.delayed_pushes = [] for xml, checked in pushes: await self._relay_push(xml, checked)