【问题标题】:ejabberd: Manipulate bookmarks with ejabberdctlejabberd:使用 ejabberdctl 操作书签
【发布时间】:2015-12-31 23:46:08
【问题描述】:

我目前正在编写将数据从 LDAP 推送到 ejabberd 的 shell 代码,涉及 MUC 房间。我需要做的最后一步是将一些 MUC 房间添加到用户的书签中,以便他们自动加入他们的客户端。似乎没有像 Prosody 中那样的模块。

所以我假设我需要管理用户的私有 XML 存储,特别是 storage:bookmarks 部分。我可以通过以下方式获取所有现有书签:

ejabberdctl private_get user host storage storage:bookmarks

然后,还有ejabberdctl private_set,不过我不是很懂。据我所知,我似乎需要一次替换整个 storage 元素,并将新旧条目合并在一起。

有没有其他方法可以将conference 子元素添加到节点,或者以其他方式添加书签?

我尝试使用private_set,但它似乎在元素字符串中的空格处中断。我尝试了所有可能的方式来逃避它们,但无济于事。

【问题讨论】:

    标签: xmpp ejabberd


    【解决方案1】:

    好的,我确定将新会议添加到书签需要重新上传整个书签存储集。这意味着正确的方法是使用private_get,如问题所示,然后修改XML以添加新条目,然后使用private_set重新上传所有条目。

    关于空格的问题:Erlang shell(这就是 ejabberdctl 是什么)需要另一个级别的单引号引用,因此某些 XML 会在 shell 参数中变为 "'<storage xmlns="storage:bookmarks"><conference jid=…'" 等等。

    您可以在此处找到使用 ejabberdctl 执行此操作以及更多功能的 shell 脚本:https://www.teckids.org/gitweb/?p=verein.git;a=blob;f=sysadmin/scripts/teckids-ejmaint

    【讨论】:

    • 自 Ejabberd 18 起,引用方面似乎不再正确。以下命令正常工作:./ejabberdctl private_set user domain.com "<storage xmlns='storage:bookmarks'><conference jid='test@conference.domain.com' autojoin='true' name='test'><nick>nickname</nick></conference></storage>"
    【解决方案2】:

    XMPP 中有两个 MUC 书签标准。旧标准 XEP-0049 使用可通过 private_set 命令修改的私有 XML 存储。但最近的标准是将书签存储在 PEP 中:XEP-0223

    Dominik George 的答案适用于旧标准;对于您可以使用的新 PEP 方法:

    sudo ./ejabberdctl send_stanza user@domain.tld user@domain.tld '
    <iq type="set" id="asdf">
       <pubsub xmlns="http://jabber.org/protocol/pubsub">
          <publish node="storage:bookmarks">
             <item id="current">
                <storage xmlns="storage:bookmarks">
                   <conference jid="room@conference.domain.tld" autojoin="true" name="name">
                      <nick>nick</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="pubsub#access_model">
                   <value>whitelist</value>
                </field>
             </x>
          </publish-options>
       </pubsub>
    </iq>
    '
    

    也可以使用 REST API 访问此命令:https://docs.ejabberd.im/developer/ejabberd-api/admin-api/#send-stanza

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 2015-11-01
      • 1970-01-01
      • 2020-05-04
      • 2015-11-24
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多