user3485661
user3485661

Reputation: 3

Setting up XMPP Publish-Subscribe nodes: item-forbidden error posting items to the node

I'm trying to set up an XMPP Publish-Subscribe node and to configure it such that when new items are posted to the node, the payload gets automatically delivered to all the subscribers. For this I am setting the "pubsub#deliver_payloads" configuration option to true, but when posting items to the node, I get an error. Here are the details of what I'm doing:

First I create the node:

<body rid='614709033' xmlns='http://jabber.org/protocol/httpbind' sid='515c16e0'>
    <iq to='pubsub.myserver' type='set' xmlns='jabber:client' id='2:sendIQ'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub'>
            <create node='mynode'/>
        </pubsub>
    </iq>
</body>

The server replies saying that it's ok:

<body xmlns='http://jabber.org/protocol/httpbind'>
    <iq xmlns="jabber:client" type="result" id="2:sendIQ" from="pubsub.myserver" to="user@myserver/515c16e0"/>
</body>

Then I configure the node setting the "pubsub#deliver_payloads" option to "true", in this way:

<body rid='614709036' xmlns='http://jabber.org/protocol/httpbind' sid='515c16e0'>
    <iq from='user@myserver' to='pubsub.myserver' type='set' xmlns='jabber:client' id='4:sendIQ'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
            <configure node='mynode'>
                <x xmlns='jabber:x:data' type='submit'>
                    <field var='pubsub#deliver_payloads'>
                        <value>true</value>
                    </field>
                </x>
            </configure>
        </pubsub>
    </iq>
</body>

The server replies successfully:

<body xmlns='http://jabber.org/protocol/httpbind'>
    <iq xmlns="jabber:client" type="result" id="4:sendIQ" from="pubsub.myserver" to="user@myserver/515c16e0"/>
</body>

But when I try to post some data onto that node, like this:

<body rid='614709038' xmlns='http://jabber.org/protocol/httpbind' sid='515c16e0'>
    <iq type='set' to='pubsub.myserver' xmlns='jabber:client' id='5:sendIQ'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub'>
            <publish node='mynode'>
                <item id='test'>
                    <geoloc xmlns='http://jabber.org/protocol/geoloc' xml:lang='en'>
                    <lat>0.55</lat>
                    <lon>1.66</lon>
                    <timestamp>2014-04-02T15:14:58.783Z</timestamp>
                    </geoloc>
                </item>
            </publish>
        </pubsub>
    </iq>
</body>

The server replies with this error:

<body xmlns='http://jabber.org/protocol/httpbind'>
    <iq xmlns="jabber:client" type="error" id="5:sendIQ" from="pubsub.myserver" to="user@myserver/515c16e0">
        <pubsub xmlns="http://jabber.org/protocol/pubsub">
            <publish node="mynode">
                <item id="test">
                    <geoloc xmlns="http://jabber.org/protocol/geoloc" xml:lang="en">
                        <lat>0.55</lat>
                        <lon>1.66</lon>
                        <timestamp>2014-04-02T15:14:58.783Z</timestamp>
                    </geoloc>
                </item>
            </publish>
        </pubsub>
        <error code="400" type="modify">
            <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
            <item-forbidden xmlns="http://jabber.org/protocol/pubsub#errors"/>
        </error>
    </iq>
</body>

I'm using Openfire 3.9.1 as a server, while on the client side I'm using javascript and the Strophe library.

Can anyone explain me why I get this error?

I tried to use different configurations on the node, and when I omit the "pubsub#deliver_payloads" option I get no errors while posting items to the node...

Upvotes: 0

Views: 1099

Answers (2)

user3485661
user3485661

Reputation: 3

Ok, I see, having only the option "pubsub#deliver_payloads" in the configuration the node is considered a "transient node" (no items allowed).

However, if I change the configuration to make the node "persistent" (i.e. adding the "pubsub#persist_items" and setting it to true), the server should not complain, according to 4.3 Event Types of the XEP-0060, Table 4.

But with this configuration:

<iq from='user@myserver' to='pubsub.myserver' type='set' xmlns='jabber:client' id='5:sendIQ'>
    <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
        <configure node='mynode'>
            <x xmlns='jabber:x:data' type='submit'>
                <field var='pubsub#persist_items'>
                    <value>true</value>
                </field>
                <field var='pubsub#deliver_payloads'>
                    <value>true</value>
                </field>
            </x>
        </configure>
    </pubsub>
</iq>

if I try to post an item to the node I still get the same error:

<iq xmlns="jabber:client" type="error" id="13:sendIQ" from="pubsub.myserver" to="user@myserver/2b35c426">
    <pubsub xmlns="http://jabber.org/protocol/pubsub">
        <publish node="mynode">
            <item id="test">
                <geoloc xmlns="http://jabber.org/protocol/geoloc" xml:lang="en">
                    <lat>0.55</lat>
                    <lon>1.66</lon>
                    <timestamp>2014-04-03T08:50:48.682Z</timestamp>
                </geoloc>
            </item>
        </publish>
    </pubsub>
    <error code="400" type="modify">
        <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
        <item-forbidden xmlns="http://jabber.org/protocol/pubsub#errors"/>
    </error>
</iq>

I solved the problem by simply chenging the value in the configuration from "true" to "1". Actually while reading the XEP-0060 specifications, both "true" - "false" and "1" - "0" values are used in configuration examples. However, in the form that the Openfire server sends me when I ask to configure the node, only "1" - "0" values are used.

With the following configuration all works fine:

<iq from='user@myserver' to='pubsub.myserver' type='set' xmlns='jabber:client' id='5:sendIQ'>
    <pubsub xmlns='http://jabber.org/protocol/pubsub#owner'>
        <configure node='mynode'>
            <x xmlns='jabber:x:data' type='submit'>
                <field var='pubsub#persist_items'>
                    <value>1</value>
                </field>
                <field var='pubsub#deliver_payloads'>
                    <value>1</value>
                </field>
            </x>
        </configure>
    </pubsub>
</iq>

Upvotes: 0

Flow
Flow

Reputation: 24083

All error conditions are explained in XEP-0060: Publish-Subscribe. You can find the item-forbidden error message at 7.1.3.6 Request Does Not Match Configuration, where it reads:

If the event type is notification + transient and the publisher provides an item, the service MUST bounce the publication request with a error and a pubsub-specific error condition of .

Upvotes: 1

Related Questions