Philipp Hörist pushed to branch master at gajim / python-nbxmpp
Commits: d85cb5e5 by Philipp Hörist at 2019-01-21T21:33:26Z Add Blocking (XEP-0191) module
- - - - - f90126ec by Philipp Hörist at 2019-01-21T21:33:26Z BOSH: Fix setting language on stream
- - - - -
4 changed files:
- nbxmpp/bosh.py - nbxmpp/dispatcher_nb.py - + nbxmpp/modules/blocking.py - nbxmpp/structs.py
Changes:
===================================== nbxmpp/bosh.py ===================================== @@ -45,7 +45,6 @@ class NonBlockingBOSH(NonBlockingTransport): idlequeue, estabilish_tls, certs, tls_version, cipher_list)
self.bosh_sid = None - self.bosh_xml_lang = self._owner.lang
self.http_version = 'HTTP/1.1' self.http_persistent = True @@ -414,7 +413,7 @@ class NonBlockingBOSH(NonBlockingTransport): t = BOSHBody( attrs={ 'to': self.bosh_to, 'sid': self.bosh_sid, - 'xml:lang': self.bosh_xml_lang, + 'xml:lang': self._owner.lang, 'xmpp:restart': 'true', 'secure': self.bosh_secure, 'xmlns:xmpp': 'urn:xmpp:xbosh'}) @@ -425,7 +424,7 @@ class NonBlockingBOSH(NonBlockingTransport): 'route': 'xmpp:%s:%s' % (self.route_host, self.route_port), 'to': self.bosh_to, 'wait': str(self.bosh_wait), - 'xml:lang': self.bosh_xml_lang, + 'xml:lang': self._owner.lang, 'xmpp:version': '1.0', 'ver': '1.6', 'xmlns:xmpp': 'urn:xmpp:xbosh'})
===================================== nbxmpp/dispatcher_nb.py ===================================== @@ -55,6 +55,7 @@ from nbxmpp.modules.signed import Signed from nbxmpp.modules.vcard_avatar import VCardAvatar from nbxmpp.modules.captcha import Captcha from nbxmpp.modules.entity_caps import EntityCaps +from nbxmpp.modules.blocking import Blocking from nbxmpp.modules.misc import unwrap_carbon from nbxmpp.modules.misc import unwrap_mam from nbxmpp.util import get_properties_struct @@ -177,6 +178,7 @@ class XMPPDispatcher(PlugIn): self._modules['Signed'] = Signed(self._owner) self._modules['VCardAvatar'] = VCardAvatar(self._owner) self._modules['EntityCaps'] = EntityCaps(self._owner) + self._modules['Blocking'] = Blocking(self._owner)
for instance in self._modules.values(): for handler in instance.handlers:
===================================== nbxmpp/modules/blocking.py ===================================== @@ -0,0 +1,81 @@ +# Copyright (C) 2018 Philipp Hörist <philipp AT hoerist.com> +# +# This file is part of nbxmpp. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 3 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; If not, see http://www.gnu.org/licenses/. + +import logging + +from nbxmpp.protocol import NS_BLOCKING +from nbxmpp.protocol import Iq +from nbxmpp.protocol import isResultNode +from nbxmpp.structs import BlockingListResult +from nbxmpp.structs import CommonResult +from nbxmpp.util import call_on_response +from nbxmpp.util import callback + +log = logging.getLogger('nbxmpp.m.blocking') + + +class Blocking: + def __init__(self, client): + self._client = client + self.handlers = [] + + @call_on_response('_blocking_list_received') + def get_blocking_list(self): + iq = Iq('get', NS_BLOCKING) + iq.setQuery('blocklist') + return iq + + @callback + def _blocking_list_received(self, stanza): + blocked = [] + if not isResultNode(stanza): + log.info('Error: %s', stanza.getErrorMsg()) + return BlockingListResult(blocking_list=blocked, + error=stanza.getErrorMsg()) + + blocklist = stanza.getTag('blocklist', namespace=NS_BLOCKING) + for item in blocklist.getTags('item'): + blocked.append(item.getAttr('jid')) + + log.info('Received blocking list: %s', blocked) + return BlockingListResult(blocking_list=blocked) + + @call_on_response('_default_response') + def block(self, jids): + log.info('Block: %s', jids) + iq = Iq('set', NS_BLOCKING) + query = iq.setQuery(name='block') + for jid in jids: + query.addChild(name='item', attrs={'jid': jid}) + return iq + + @call_on_response('_default_response') + def unblock(self, jids): + log.info('Unblock: %s', jids) + iq = Iq('set', NS_BLOCKING) + query = iq.setQuery(name='unblock') + for jid in jids: + query.addChild(name='item', attrs={'jid': jid}) + return iq + + @callback + def _default_response(self, stanza): + if not isResultNode(stanza): + log.info('Error: %s', stanza.getErrorMsg()) + return CommonResult(jid=stanza.getFrom(), + error=stanza.getErrorMsg()) + return CommonResult(jid=stanza.getFrom())
===================================== nbxmpp/structs.py ===================================== @@ -294,14 +294,23 @@ class CommonResult(BaseResult, namedtuple('CommonResult', 'jid error')):
CommonResult.__new__.__defaults__ = (None,)
+ class AffiliationResult(BaseResult, namedtuple('AffiliationResult', 'jid affiliation users error')): pass
AffiliationResult.__new__.__defaults__ = (None, None)
+ class MucConfigResult(BaseResult, namedtuple('MucConfigResult', 'jid form error')): pass
MucConfigResult.__new__.__defaults__ = (None, None) + + +class BlockingListResult(BaseResult, namedtuple('BlockingListResult', + 'blocking_list error')): + pass + +BlockingListResult.__new__.__defaults__ = (None,)
View it on GitLab: https://dev.gajim.org/gajim/python-nbxmpp/compare/00189cbbcfd51063c2bb3ebe0d...