Опция автоматического присоединения закладки xmpp не работает
Я пытаюсь автоматически присоединиться к комнатам, используя XEP-0048 - Закладки ( http://xmpp.org/extensions/xep-0048.html).
Я использую RobbieHanson XMPPFramework, ejabberd v13.x До сих пор я смог добавить закладку в комнату, используя следующий код:
-(void) createBookmarkforRoom:(NSString *)roomJid {
NSXMLElement *nick = [NSXMLElement elementWithName:@"nick" stringValue:@"Marge"];
NSXMLElement *conference = [DDXMLNode elementWithName:@"conference"];
[conference addAttributeWithName:@"name" stringValue:@"BookmarkName"];
[conference addAttributeWithName:@"autojoin" stringValue:@"true"];
[conference addAttributeWithName:@"jid" stringValue:roomJid];
[conference addChild:nick];
NSXMLElement *storage =[DDXMLNode elementWithName:@"storage"];
[storage addAttributeWithName:@"xmlns" stringValue:@"storage:bookmarks"];
[storage addChild:conference];
NSDictionary *options = [NSDictionary dictionaryWithObjects:@[@"pubsub#persist_items",@"pubsub#access_model"]
forKeys:@[@"true",@"whitelist"]];
[self.publishSubscribeModule publishToNode:@"storage:bookmarks"
entry:(NSXMLElement *)storage
withItemID:(NSString *)@"current"
options:(NSDictionary *)options];
}
Следующий xml успешно отправлен:
<iq type="set" id="2749368B-E365-45D6-A4B0-2F79DC6F4747">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<publish node="storage:bookmarks">
<item id="current">
<storage xmlns="storage:bookmarks">
<conference name="BookmarkName" autojoin="true" jid="testroom@conference.mydomain.com">
<nick>Marge</nick>
</conference>
</storage>
</item>
</publish>
<publish-options>
<x xmlns="jabber:x:data" type="submit">
<field var="FORM_TYPE" type="hidden">
<value>http://jabber.org/protocol/pubsub#publish-options</value>
</field>
<field var="true">
<value>pubsub#persist_items</value>
</field>
<field var="whitelist">
<value>pubsub#access_model</value>
</field>
</x>
</publish-options>
</pubsub>
</iq>
И я получаю:
<iq xmlns="jabber:client" from="marge@mydomain.com" to="marge@mydomain.com/41045582821403862604272126" id="2749368B-E365-45D6-A4B0-2F79DC6F4747" type="result">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<publish node="storage:bookmarks">
<item id="current" />
</publish>
</pubsub>
</iq>
Когда я пытаюсь получить закладки, используя следующий код:
-(void)requestBookmarks {
DDXMLElement *pubsub = [DDXMLElement elementWithName:@"pubsub" xmlns:@"http://jabber.org/protocol/pubsub"];
DDXMLElement *items = [DDXMLElement elementWithName:@"items"];
[items addAttributeWithName:@"node" stringValue:@"storage:bookmarks"];
[pubsub addChild:items];
XMPPIQ *iqBookmark = [XMPPIQ iqWithType:@"get" elementID:@"retrievebookmark10" child:pubsub];
[self.stream sendElement:iqBookmark];
}
Он отправляет следующий XML:
<iq type="get" id="retrievebookmark10">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<items node="storage:bookmarks"/>
</pubsub>
</iq>
и я получаю:
<iq xmlns="jabber:client" from="marge@mydomain.com" to="marge@mydomain.com/41045582821403862604272126" id="retrievebookmark10" type="result">
<pubsub xmlns="http://jabber.org/protocol/pubsub">
<items node="storage:bookmarks">
<item id="current">
<storage xmlns="storage:bookmarks">
<conference name="BookmarkName" autojoin="true" jid="testroom@conference.mydomain.com">
<nick>Marge</nick>
</conference>
</storage>
</item>
</items>
</pubsub>
</iq>
Так что, похоже, я могу успешно хранить закладки и извлекать их. Но когда я пытаюсь говорить в комнате testroom@conference.mydomain.com
без ручного подключения я получаю сообщение об ошибке, в котором говорится, что мне нужно присоединиться к комнате, прежде чем я смогу говорить в комнате. Если я присоединяюсь к комнате (вручную), все работает нормально.
На стороне сервера я использовал mod_pubsub
модуль со следующими параметрами:
mod_pubsub:
access_createnode: pubsub_createnode
## reduces resource comsumption, but XEP incompliant
ignore_pep_from_offline: true
## XEP compliant, but increases resource comsumption
## ignore_pep_from_offline: false
last_item_cache: false
plugins:
- "flat"
- "hometree"
- "pep" # pep requires mod_caps
Мне интересно, почему я должен вручную присоединиться к закладке с "auto-join = true" комнатами. Любая подсказка?
1 ответ
Автосоединение комнат с закладками - полностью клиентская функция - клиент должен извлекать закладки при запуске и явно присоединяться к комнатам, помеченным как "автоматическое объединение".