diff --git a/sleekxmpp/plugins/xep_0060/pubsub.py b/sleekxmpp/plugins/xep_0060/pubsub.py index cb6cbac..fadcf65 100644 --- a/sleekxmpp/plugins/xep_0060/pubsub.py +++ b/sleekxmpp/plugins/xep_0060/pubsub.py @@ -283,7 +283,8 @@ class xep_0060(base_plugin): return iq.send(block=block, callback=callback, timeout=timeout) def publish(self, jid, node, item_id=None, payload=None, items=None, - ifrom=None, block=True, callback=None, timeout=None): + options=None, ifrom=None, block=True, callback=None, + timeout=None): """ Add or edit items in a node. @@ -304,6 +305,8 @@ class xep_0060(base_plugin): item['id'] = id item['payload'] = payload iq['pubsub']['publish'].append(item) + if options is not None: + iq['pubsub']['publish_options'] = options return iq.send(block=block, callback=callback, timeout=timeout) def retract(self, jid, node, item, ifrom=None, block=True, diff --git a/sleekxmpp/plugins/xep_0060/stanza/pubsub.py b/sleekxmpp/plugins/xep_0060/stanza/pubsub.py index 139992e..6a9a3df 100644 --- a/sleekxmpp/plugins/xep_0060/stanza/pubsub.py +++ b/sleekxmpp/plugins/xep_0060/stanza/pubsub.py @@ -257,12 +257,16 @@ class PublishOptions(ElementBase): return form def set_publish_options(self, value): - self.xml.append(value.getXML()) + if value is None: + del self['publish_options'] + else: + self.xml.append(value.getXML()) return self def del_publish_options(self): config = self.xml.find('{jabber:x:data}x') - self.xml.remove(config) + if config is not None: + self.xml.remove(config) registerStanzaPlugin(Pubsub, PublishOptions) diff --git a/tests/test_stream_xep_0060.py b/tests/test_stream_xep_0060.py index 048e41e..9feb629 100644 --- a/tests/test_stream_xep_0060.py +++ b/tests/test_stream_xep_0060.py @@ -416,9 +416,58 @@ class TestStreamPubsub(SleekTest): t.join() - def testPublishSingleOptions(self): """Test publishing a single item, with options.""" + payload = AtomEntry() + payload['title'] = 'Test' + + register_stanza_plugin(self.xmpp['xep_0060'].stanza.Item, AtomEntry) + + options = self.xmpp['xep_0004'].make_form() + options.add_field(var='FORM_TYPE', ftype='hidden', + value='http://jabber.org/protocol/pubsub#publish-options') + options.add_field(var='pubsub#access_model', ftype='text-single', + value='presence') + options['type'] = 'submit' + + t = threading.Thread(name='publish_single', + target=self.xmpp['xep_0060'].publish, + args=('pubsub.example.com', 'somenode'), + kwargs={'item_id': 'ID42', + 'payload': payload, + 'options': options}) + t.start() + + self.send(""" + + + + + + Test + + + + + + + http://jabber.org/protocol/pubsub#publish-options + + + presence + + + + + + """, use_values=False) + + self.recv(""" + + """) + + t.join() def testPublishMulti(self): """Test publishing multiple items."""