jarn.xmpp的核心包
项目描述
简介
jarn.xmpp.core 是一个基于XMPP服务的Plone插件,提供以下功能:
将Plone用户帐户与XMPP帐户和身份验证集成。
基于XMPP PubSub的类似于twitter/yammer的微型博客环境。
消息传递。
它是旨在为Plone提供XMPP服务的包系列的一部分。其他两个包是
jarn.xmpp.twisted,为twisted提供XMPP特定的协议实现。
jarn.xmpp.collaboration 提供了一个用于实时协作编辑的XMPP协议以及一个针对Plone的实现。
安装
在设置包之前,您需要有一个运行中的XMPP服务器和访问服务器上的管理帐户。该包仅与ejabberd 2.1.5及以上版本进行了测试,推荐使用。在任何情况下,以下XMPP扩展都需要由您要使用的服务器支持
XEP-0071 XHTML-IM。
XEP-0054 vCard-temp。
XEP-0144 Roster Item Exchange。
XEP-0060 Publish-Subscribe。
XEP-0248 PubSub Collection Nodes。
XEP-0133 Service Administration。
XEP-0124 同步HTTP双向流(BOSH)
XEP-0206 XMPP通过BOSH
XEP-0049 私有XML存储
构建配置
您可以使用以下链接作为起点来获取一个示例构建配置:jarn.xmpp.buildout.
设置ejabberd(>=2.1.5)
自动配置
使用jarn.xmpp.buildout中提供的配方(在这种情况下,您需要安装Erlang)或下载ejabberd安装程序。
可以使用jarn.xmpp.buildout中的ejabberd.cfg部分方便地生成ejabberd的最小配置。您需要复制templates目录并相应地修改配方配置
[ejabberd.cfg] recipe = collective.recipe.template input = templates/ejabberd.cfg.in output = ${buildout:directory}/etc/ejabberd.cfg xmppdomain = localhost admin_userid = admin collaboration_allowed_subnet = 0,0,0,0 collaboration_port = 5347 component_password = secret
其中,xmppdomain是运行在您的XMPP服务器上的域名(或虚拟主机),admin_userid是Plone将要用来与服务器交互的管理员账户的ID。其余选项由jarn.xmpp.collaboration用于连接到XMPP服务器的协作编辑组件。在此处,collaboration_allowed_subnet指定XMPP服务器将从哪些IP地址接受连接,应与您的Plone实例将要使用的IP地址匹配。将其保留为0,0,0,0将允许所有IP地址,127,0,0,1将仅允许localhost。最后,collaboration_port是协作组件将要连接到的端口,component_password是组件和XMPP服务器之间的共享密码。
手动配置
如果您已经运行了一个XMPP服务器,以下是一些设置它的提示
我们假设您的xmpp域名是localhost。应该存在一个管理员账户admin@localhost。如果您打算在jarn.xmpp.*包中的任何测试中运行一些测试,如果您使用其他域名进行生产,则需要在一个localhost上运行一个额外的XMPP节点。如果您不感兴趣,可以安全地删除任何对localhost的引用。
请确保已启用http_bind模块,因为javascript客户端将使用它来连接。您的ejabberd.cfg中应该有类似以下内容:
{5280, ejabberd_http, [ http_bind, web_admin ]}
因为ejabberd对XEP-0060的实现不是标准的,所以需要使用ejabberd的dag模块。因此,请确保已正确配置pubsub模块。
{mod_pubsub, [ {access_createnode, pubsub_createnode}, {ignore_pep_from_offline, true}, {last_item_cache, false}, {nodetree, "dag"}, {plugins, ["dag", "flat", "hometree", "pep"]}, {max_items_node, 1000} ]},
为了测试和运行自定义XMPP组件(例如,由jarn.xmpp.collaboration提供的协作编辑组件),您需要允许它们连接。这意味着您应该有类似以下配置:
{5347, ejabberd_service, [ {access, all}, {shaper_rule, fast}, {ip, {127, 0, 0, 1}}, {hosts, ["collaboration.localhost"], [{password, "secret"}] } ]},
其余的标准选项应该没问题。
管理员账户
如果在安装过程中没有这样做,您可能需要手动创建管理员账户。在ejabberd文件夹中执行
./bin/ejabberdctl register admin localhost your_password
通过登录到管理界面(通常是https://127.0.0.1:5280/admin)来测试您是否可以访问ejabberd。您还应该能够访问http-bind界面,位于https://127.0.0.1:5280/http-bind。
设置您的前端代理
在客户端,每个经过身份验证的用户将通过HTTP的模拟双向流连接到您的Jabber服务器。为了实现这一点,您需要在Plone前面设置一个代理,该代理将XMPP流重定向到您的XMPP服务器。虽然没有代理也可以使用较次的Flash插件解决方案,但此方案将不再得到支持。
假设您在端口8080上以代理模式运行nginx,针对域名localhost,Zope监听8081端口,存在一个ID为“Plone”的Plone站点,并且您的ejabberd已将http_bind配置为端口5280,则您的nginx配置将如下所示
http { server { listen 8080; server_name localhost; location ~ ^/http-bind/ { proxy_pass https://127.0.0.1:5280; } location / { proxy_pass https://127.0.0.1:8081/VirtualHostBase/http/localhost:8080/Plone/VirtualHostRoot/; } } }
设置您的Plone实例
您的实例需要维护与XMPP服务器管理员账户的连接。这是通过Twisted完成的,您需要在每个实例上运行一个Twisted反应器。要这样做,请将以下内容包含在您的buildout实例部分
zcml-additional = <configure xmlns="http://namespaces.zope.org/zope"> <include package="jarn.xmpp.twisted" file="reactor.zcml" /> </configure>
再次提醒,您可以参考jarn.xmpp.buildout中提供的示例buildout。
设置新的Plone站点
启动ejabberd(如果您使用了构建ejabberd的配方,bin/ejabberd将执行此任务)。
启动Nginx前端。bin/frontend start
启动您的Zope实例。
直接在https://127.0.0.1:8081/manage访问Zope,并使用jarn.xmpp.core(或如果您想安装该包,则使用jarn.xmpp.collaboration)创建一个新的Plone站点。
转到Plone控制面板,进入注册设置。编辑jarn.xmpp.*设置以反映您的安装、密码等。
重新启动您的Plone实例。
在第一次请求时,管理员将登录到他的账户。您应该在日志中看到发生的事情,如果出现错误,可能是因为您的安装有问题。
设置用户和pubsub节点。您可以通过调用@@setup-xmpp(例如,https://127.0.0.1:8080/@@setup-xmpp)来完成此操作。表单不会报告任何错误,因为所有操作都是异步发生的,但您将在控制台看到结果/失败信息。
如果您打算在现有网站上使用此方案,您只需要在确保XMPP管理员已连接后执行最后一步。
确保一切正常 ;)
这是一个复杂的基础设施,有时很难知道出了什么问题。不要绝望,这里有一些您可以尝试的事情
确保ejabberd正在运行。以管理员用户身份连接到它。
验证ejabberd上的http绑定是否设置正确。访问https://127.0.0.1:5280/http-bind应告诉您它正在工作。
验证XMPP请求是否可以通过代理正确通过。访问https://127.0.0.1:8080/http-bind/应给出与上面相同的结果。
当您在前景中启动Zope实例时,您可以验证Twisted反应器是否运行良好
2011-09-01 14:37:38 INFO jarn.xmpp.twisted Starting Twisted reactor... 2011-09-01 14:37:38 INFO jarn.xmpp.twisted Twisted reactor started 2011-09-01 14:37:38 INFO Zope Ready to handle requests
在向网站发出第一个请求后,您还应该在日志中看到
2011-09-01 14:45:48 INFO jarn.xmpp.core XMPP admin client has authenticated succesfully.
在运行@@setup-xmpp后,使用用户登录Plone站点时,也应对用户进行XMPP服务器的身份验证。这将在日志中指示
2011-09-01 14:45:50 INFO jarn.xmpp.core Pre-binded ggozad@localhost/auto-QravOoyEeE
实验
用法
添加一些用户。
以其中之一登录,并在不同的浏览器中以其他身份登录。使用前端访问网站,如果您使用了上述设置,这应该是https://127.0.0.1:8080。
所有操作都通过右上角的视图组件进行:在线用户将显示当前登录的用户。点击它将显示用户列表。您可以直接给他们发消息或查看他们的个人动态。
尝试在您的动态中发布一条帖子。链接将被自动转换。提交后,其他登录用户将实时收到通知。使用支持地理位置的较新浏览器,您还可以在发布时共享您的位置。
尝试在动态帖子上发表评论。
通过点击“关注”用户操作,您可以选择您想关注的用户,或关注所有用户。
您可以通过点击视图组件上的站点动态来查看所有帖子。
安全
jarn.xmpp.twisted实现了根据XEP-0206在BOSH上认证客户端的实现。这实际上意味着javascript客户端永远不需要知道XMPP用户的密码。相反,用户在XMPP服务器和Plone实例之间直接进行认证。交换一对有效期为短时间(约2分钟)的秘密令牌。这对令牌被提供给javascript客户端,而不是密码。
当创建用户时(无论是通过Plone界面还是通过为现有用户运行@@setup-xmpp),将生成一个随机密码并在持久化工具中内部存储。
如果您不需要在Plone实例之外访问XMPP账户,您还可以将整个XMPP服务隐藏在防火墙后面,并且只允许从Plone实例连接到它。这与HTTPS结合使用应该足以满足我们中的偏执者。
测试
其中一些包含的测试是功能测试,需要在本地的localhost上运行XMPP服务器,以及在此服务器上设置具有JID admin@localhost 和密码 admin 的管理员账户。如果您想运行这些测试,您必须在测试运行器上指定级别 2,即。
./bin/test -a 2 -s jarn.xmpp.core
致谢
UI由Denys Mishunov设计和实现。
这项工作的绝大部分是在Jarn AS员工可用的10%时间内用于开源项目开发的。
变更日志
0.34 - 2011-12-9
修复Google地图初始化。[ggozad]
0.33 - 2011-12-07
IE9兼容性。[ggozad]
BOSH认证无缓存。[ggozad]
0.32 - 2011-11-30
UI/UX改进。[mishunov]
修复了一个无标题的组件错误。[ggozad]
修复了一个会导致存储只从每个节点加载10个条目的错误。[ggozad]
修复了json视图以正确设置json头。[ggozad]
0.31 - 2011-11-28
版本修复。[ggozad]
0.3 - 2011-11-28
支持pubsub节点的一级线程。[ggozad]
允许用户订阅单个节点。[ggozad]
异步加载PubSub条目。[ggozad]
在XMPP上实现XEP-0049私有存储。[ggozad]
实现vCard 2.0支持。允许所有用户元数据和头像存储在XMPP服务器上,避免对Plone的所有调用。[ggozad]
修复了一个罕见的情况,即Safari浏览器可能会真的表现不佳并有时崩溃。撤销了对Strophe的补丁,以允许WebKit浏览器在页面卸载时进行同步而不是异步调用断开连接。[ggozad]
样式![mishunov]
更新德语翻译 [potzenheimer]
更新法语翻译 [toutpt]
0.23 - 2011-11-02
添加德语翻译 [potzenheimer]
添加意大利语翻译 [giacomos]
添加法语翻译 [toutpt]
0.22 - 2011-11-02
支持i18n。目前为挪威语和希腊语。[ggozad]
提供一个显示PubSub动态的组件。[ggozad]
修复了当URL指向二进制文件时的魔法链接错误。https://github.com/ggozad/jarn.xmpp.core/issues/13 [ggozad]
0.21 - 2011-10-27
除非必要,否则不要跟踪用户的地理位置。[ggozad]
代理下载favicon(关闭#11)。[ggozad]
在feed视图中将头像链接到个人流。(关闭#10)。[ggozad]
pubsub feed的“美观日期”。(关闭#8)。[ggozad]
0.2 - 2011-10-20
添加地理位置功能。现在发布到feed时可以包含地理位置数据。[ggozad]
使用sessionStorage存储用户信息数据,以便在每次会话中只获取一次。[ggozad]
0.2b1 - 2011-10-09
设计和实现消息、存在、pubsub feed的出色UI。[mishunov, ggozad]
用js替换发布到节点的python视图/工具。[ggozad]
提供pubsub项视图,并在pubsub feed视图中异步加载它们。[ggozad]
在支持此功能的浏览器中开始使用sessionStorage。[ggozad]
移除多用户聊天。当用例被定义后,它将正确地再次进入。[ggozad]
0.1b4 - 2011-09-30
恢复使用Strophe 1.0.1作为解决破损xml解析器问题的方法,该解析器坚持对一切进行转义。[ggozad]
0.1b3 - 2011-09-18
修改strophe以进行同步请求,以便在onbeforeunload时真正断开连接。这是为了防止基于WebKit的浏览器在超时前一直保持用户连接。此外,由于我们修补了它们,不再使用strophe库的压缩版本。[ggozad]
更新文档。[tkimnguyen]
0.1b2 - 2011-09-02
修复启动订阅者,如果产品尚未安装,则不执行任何操作。这允许你在现有网站上安装。[ggozad]
更新到Strophe 1.0.2 [ggozad]
0.1b1 - 2011-09-01
简化配置并修复注册表中的混淆性错别字。[ggozad]
现在管理员客户端处理连接失败以及断开连接。当发生这种情况时,管理员客户端实用程序将取消注册并在下一次请求时重试。[ggozad]
现在可以通过一个视图执行所有操作。[ggozad]
在buildout中添加了构建ejabberd的食谱。需要有效的erlang安装。[ggozad]
JS修复[ggozad]
0.1a3 - 2011-06-06
包括使用collective.recipe.template生成工作ejabberd.cfg的食谱。[ggozad]
为pubsub添加了一些基本测试。[ggozad]
仅在测试运行器指定级别2时运行需要EJABBERD层的测试。[ggozad]
0.1a2 - 2011-05-11
更新了如何添加最新wokkel的文档。[ggozad]
0.1a1 - 2011-05-09
初始发布[ggozad]