跳转到主要内容

为启用XMPP功能的Plone插件提供核心功能。

项目描述

简介

collective.xmpp.core 是 Yiorgis Gozadinos (@ggozad) 编写的 jarn.xmpp.twistedjarn.xmpp.core 的分支/合并。

它从 jarn.xmpp.core 中移除了 PubSub 和消息功能,旨在作为Plone插件XMPP功能的基础。

目前它提供了以下功能

  • 通过实现以下XMPP扩展的部分来扩展 wokkel

  • 与 Zope 实例并行运行的 Twisted 反应器。

  • 提供两种 XMPP 客户端的实用程序,一种是初始连接、执行任务后立即断开连接的 deferred 客户端,另一种是保持连接并可以响应 XMPP 事件的正常客户端。

  • 用于编写自定义组件的 XMPP 组件基类。

  • 将 plone 用户帐户与 XMPP 帐户和身份验证集成。

安装

在设置包之前,您需要一个可工作的 XMPP 服务器并访问服务器上的管理帐户。该软件包仅在 ejabberd 版本 2.1.5 及以上版本上进行过测试,建议使用。在任何情况下,您将要使用的服务器都需要支持以下 XMPP 扩展

Buildout

您可以使用 collective.xmpp.buildout 作为起点的一个示例 buildout 可以在 collective.xmpp.buildout 中找到。

设置 ejabberd (>=2.1.5)

自动配置

  • 使用 collective.xmpp.buildout 中提供的配方(在这种情况下,您需要安装 erlang,Debian 上的 erlang-nox)或下载 ejabberd 安装程序。

  • 可以通过 collective.xmpp.buildoutejabberd.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。其余选项由 collective.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。此外,如果您打算在任何 collective.xmpp.* 包中运行一些测试,那么如果您在生产中使用其他域,您需要在 localhost 上运行一个额外的 XMPP 节点。如果您不打算这样做,您可以安全地删除任何关于 localhost 的引用。

  • 请确保您已启用 http_bind 模块,因为 JavaScript 客户端将使用它进行连接。您的 ejabberd.cfg 应该有类似以下内容:

    {5280, ejabberd_http, [
         http_bind,
         web_admin
         ]}
  • 为了测试和运行自定义 XMPP 组件(例如由 collective.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

测试您是否可以通过登录到管理界面(通常是 http://localhost:5280/admin)来访问您的 ejabberd。您也应该能够访问位于 http://localhost:5280/http-bind 的 http-bind 界面。

设置您的前端代理

在客户端,每个经过身份验证的用户将通过通过 HTTP 模拟的双向流连接到您的 jabber 服务器。为了实现这一点,您需要在 Plone 前面设置一个代理,该代理将重定向 XMPP 流到您的 XMPP 服务器。虽然没有代理也可以使用较低的解决方案(例如 Flash 插件),但这将不会得到支持。

假设您以代理模式在端口 8080 上运行您的 web 服务器,Zope 监听端口 8081,存在一个 ID 为 Plone 的 Plone 网站,并且您的 ejabberd 已将 http_bind 配置为端口 5280,您的 nginxapache 配置将如下所示:

Nginx

http {
    server {
        listen       8080;
        server_name  localhost;
        location ~ ^/http-bind/ {
            proxy_pass http://localhost:5280;
        }
        location / {
            proxy_pass http://localhost:8081/VirtualHostBase/http/localhost:8080/Plone/VirtualHostRoot/;
        }
    }
}

Apache

<VirtualHost *:8080>
    ServerName localhost
    RewriteEngine On
    RewriteRule ^/http-bind(.*) http://localhost:5280/http-bind$1 [P,L]
    RewriteRule ^/(.*) http://localhost:8081/VirtualHostBase/http/%{HTTP_HOST}:8080/Plone/VirtualHostRoot/$1 [P,L]
</VirtualHost>

设置您的 Plone 实例

您的实例需要与 XMPP 服务器的管理员账户保持连接。这是通过 Twisted 实现的,您需要在每个实例上运行一个 Twisted 反应器。为此,请将以下内容包含在您的 buildout 实例部分:

zcml-additional =
  <configure xmlns="http://namespaces.zope.org/zope">
    <include package="collective.xmpp.core" file="reactor.zcml" />
  </configure>

此外,如果您的 Plone buildout 不使用 plone.dexterity,并且您想避免引入此依赖项,请在您的 CFG 文件中添加以下行

[versions]
Products.UserAndGroupSelectionWidget = 2.0.4

再次,您可以查看在 collective.xmpp.buildout 中提供的示例 buildout。

设置新的 Plone 网站

  • 启动 ejabberd(如果您使用了构建 ejabberd 的配方,bin/ejabberd 将会执行此操作)。

  • 启动 Nginx 前端。 bin/frontend start

  • 启动您的 Zope 实例。

  • 直接在 http://localhost:8081/manage 访问 Zope 并使用 collective.xmpp.core 创建一个新的 Plone 网站。

  • 转到 Plone 控制面板,点击 Plone 配置 下的 XMPP 集成 链接。确保 XMPP 设置反映了您的安装。

  • 重新启动您的 Plone 实例。

  • 在首次请求时,管理员将登录到他的账户。您应该在日志中看到一些操作,如果出现任何错误,则可能存在安装问题。

  • 当您创建新的 Plone 用户时,他们将被自动注册在 XMPP 服务器上。您现有的用户也可以通过回到控制面板中的 XMPP 集成 配置,然后点击 用户注册 选项卡进行注册。请密切关注控制台中的 instance.log 追踪回溯,以确保没有错误。您可以通过访问 XMPP 管理界面 localhost:5280/admin 来查看已注册的用户。

确保一切正常 ;)

这是一个复杂的基础设施,有时很难知道出了什么问题。不要绝望,这里有一些你可以尝试的方法。

  • 确保ejabberd正在运行。以管理员用户的身份连接到它。

  • 请检查ejabberd上http绑定是否设置正确。访问http://localhost:5280/http-bind应该告诉你它是否正常工作。

  • 请验证XMPP请求能够正确通过你的代理。访问http://localhost:8080/http-bind/应该给出与上面相同的结果。

  • 当你以前台启动你的Zope实例时,你可以验证Twisted反应器是否运行正常。

    2011-09-01 14:37:38 INFO collective.xmpp.core Starting Twisted reactor...
    2011-09-01 14:37:38 INFO collective.xmpp.core Twisted reactor started
    2011-09-01 14:37:38 INFO Zope Ready to handle requests
  • 在首次请求站点后,你应该在日志中看到

    2011-09-01 14:45:48 INFO collective.xmpp.core XMPP admin client has authenticated succesfully.
  • 如果你的Plone用户在XMPP服务器上成功注册,使用该用户登录Plone站点也应通过XMPP服务器进行身份验证。这会在日志中通过以下内容表示

    2011-09-01 14:45:50 INFO collective.xmpp.core Pre-binded ggozad@localhost/auto-QravOoyEeE

实验

用法

  • 添加一些用户。

  • 以其中之一登录,并在不同的浏览器中以其他身份登录。使用前端访问站点,如果你使用了上面的设置,这应该是http://localhost:8080

  • 所有操作都是通过顶部右侧的视图操作完成的:在线用户将显示当前登录的用户。点击它将给出用户列表。你可以直接向他们发送消息或查看他们的个人动态。

  • 尝试向你的动态发送条目。链接将被自动转换。提交后,其他登录用户将实时收到通知。使用支持地理位置的较新浏览器,你还可以在发布时分享你的位置。

  • 尝试在动态帖子上发表评论。

  • 通过点击“关注”用户操作,你可以选择你想关注的用户,或者关注所有用户。

  • 你可以通过点击视图上的站点动态来查看所有帖子。

安全

这里包含了一个根据XEP-0206在BOSH上实现的认证客户端的实现。这实际上意味着JavaScript客户端永远不需要知道XMPP用户的密码。相反,用户直接在XMPP服务器和Plone实例之间进行身份验证。交换一对有效期为短时间(约2分钟)的密钥。这对密钥被提供给JavaScript客户端而不是密码。

当Plone用户在XMPP服务器上注册时,会生成一个随机密码并存储在ZODB中一个持久性工具中。

如果你不需要在Plone实例之外访问XMPP账户,你还可以将整个XMPP服务隐藏在防火墙后面,并且只允许从Plone实例连接到它。这与HTTPS结合应该足以满足我们中的某些人的担忧。

测试

其中一些包含的测试是功能测试,它们需要一个在localhost上运行的XMPP服务器以及一个在服务器上设置的管理员账户,JID为admin@localhost,密码为admin。如果你要运行这些测试,你必须指定测试运行器的级别 2,即

./bin/test -a 2 -s collective.xmpp.core

你还需要配置ejabberd以监听端口5347以供外部组件使用。

最低要求是向listen关键字添加以下条目:

{listen,
    [
    % Add only the line below
    {{5347, {0,0,0,0} }, ejabberd_service, []}
    ]
}

生产部署提示

不要缓存@@xmpp-loader

确保不缓存URL ${site_url}/@@xmpp-loader。此视图返回一个身份验证令牌,每次重新加载页面时都必须不同。

如果你缓存它,令牌将不会改变,你将无法与XMPP服务器通信。

致谢

  • 感谢Yiorgis Gozadinos (@ggozad) 为编写jarn.xmpp.core以及第一个将XMPP集成到Plone中。

更改日志

0.3 (2013-06-28)

  • 功能:当 Jabber 服务器返回未授权时,从存储中删除密码以尝试再次创建用户,因为当密码仍然存在但 Jabber 服务器不再有该用户时,会出现此错误 [ichim-david]

  • 功能:在尝试绑定客户端并失败时记录 Jabber 服务器响应 [ichim-david]

  • 修复:无法获取具有自定义个人资料的用户的肖像数据 [jcbrand]

  • 功能:添加一个新控制面板选项来更新所有用户的 vCard [jcbrand]

  • 修复:在预绑定时,从 IXMPPSettings 获取管理员用户的密码 [jcbrand]

0.2 (2013-03-20)

  • 功能:在 vCard 中包含用户的肖像 [jcbrand]

  • 功能:当用户更改个人首选项时更新用户的 vCard [jcbrand]

  • 修复:XMPP 服务器忽略最后用户的罗列建议 [jcbrand]

0.1 (2013-03-15)

  • 已发布。 [jcbrand]

0.1b8 (2013-03-09)

  • 修复:在注销用户子集时,所有 xmpp 密码都被清除 [jcbrand]

0.1b7 (2013-03-05)

  • 前一个版本有损坏。未包含 ZCML 文件。 [jcbrand]

0.1b6 (2013-03-04)

  • 修复了当通过将 readme.rst 和 history.txt 合并的 pypi 读取时出现的问题 [ichim-david]

0.1b5 (2013-03-04)

  • 功能:“完全清除密码存储”操作现在在 zope 日志中记录 [alecghica]

  • 修复:添加本地用户时出现“ComponentLookupError”错误 [alecghica]

  • 功能:当无法将用户绑定到 Jabber 服务器时,添加错误图像和“无法与聊天服务器通信”消息 [alecghica]

  • 功能:在 XMPP 服务器上注册用户时添加 vCard [jcbrand]

  • 功能:使手动用户注册幂等(忽略已注册用户)。 [jcbrand]

  • 用户创建时不再注册。他们必须手动注册,或者在下次登录访问时注册。 [jcbrand]

0.1b4 (2013-02-02)

  • 修复了 @@xmpp-user-setup 页面上的“注销所有”的修复。回调方法中没有设置站点根。 [jcbrand]

0.1b3 (2013-01-17)

  • 添加选项以完全清除 XMPP 密码工具。 [jcbrand]

  • 添加升级步骤以确保重新加载注册表,以便添加“自动在登录时注册”条目。 [jcbrand]

  • 修复:始终从注册表中获取 XMPP 虚拟主机。 [jcbrand]

  • 修复:在自动订阅时,LDAP 用户的完整名称没有显示。 [jcbrand]

0.1b2 (2013-01-17)

  • 添加配置设置以启用登录时的自动注册。默认情况下已禁用。 [jcbrand]

0.1b1 (2013-01-16)

  • 功能:如果尚未注册,Plone 用户在登录时会在 Jabber 服务器上注册 [alecghica]

  • 修复:对于在登录时注册的用户,无需刷新浏览器,它们会即时绑定 [alecghica]

  • 修复:“注销所有用户”功能,在 IXMPPPasswordStorage 中留下了未删除的凭据,导致注册/注销用户时出现各种错误 [alecghica]

  • 修复:添加了新 Plone 用户时订阅的问题 [alecghica]

  • 修复:用户仅被自动订阅到当前会话中添加的其他用户 [alecghica]

  • 修复:新用户现在仅自动订阅到现有的 XMPP 用户 [alecghica]

0.1a8 (2012-12-13)

  • 修复:在 dbconfig.py 中检查 GS 配置版本,以避免在没有运行 GS 升级步骤的情况下启动实例。 [jcbrand]

0.1a7 (2012-12-13)

  • 更新了文档,包括 Apache 配置示例。 [alecghica]

  • 清理了已随 Plone 一起发货的依赖项 [alecghica]

  • 将 Products.UserAndGroupSelectionWidget 包设置为可选。只有在包版本大于 2.0.4 时才会导入 Products.UserAndGroupSelectionWidget,因为它引入了与当前 Plone 版本中找到的其他包冲突的依赖项,如 plone.dexterity。 [alecghica]

  • 修复了未安装/使用 Products.UserAndGroupSelectionWidget 时无法工作的注册用户表单 [alecghica]

  • 添加了有关如何使 plone.dexterity 可选的信息 [alecghica]

  • 显式存储 XMPP 服务器的主机名,而不仅仅是使用 XMPP 域。还存储端口号,而不仅仅是使用默认值。 [jcbrand]

  • 允许通过 buildout 配置注册表设置。请参阅 dbconfig.py [jcbrand]

0.1a6 (2012-11-22)

  • 添加了西班牙语翻译。 [macagua]

  • 增加了对国际化支持的改进。[macagua]

  • 修复了错误。防止 getAllMemberIds 返回重复项。[jcbrand]

0.1a5 (2012-11-19)

  • 修复了 RST 格式化错误。[jcbrand]

0.1a4 (2012-11-19)

  • 更新了文档。[jcbrand]

  • 修复了 HISTORY.txt 标记。[alecghica]

  • 修复了用于 Products.UserAndGroupSelectionWidget 的版本,将其设置为 >2.04,因为早期版本由于 API 变更可能会崩溃。[alecghica]

  • 修复了错误。密码工具在用户注册时忘记用户密码。[jcbrand]

0.1a3 (2012-11-09)

  • 修复了从 0.1a1 升级到 0.1a2 时可能发生的 RuntimeError。[jcbrand]

0.1a2 (2012-11-09)

  • 添加了控制面板配置小工具以配置和注册 XMPP 用户。[jcbrand]

  • 添加了对 PAS 插件(如 LDAP)的支持。[jcbrand]

0.1a1 (2012-10-18)

  • 从 jarn.xmpp.core 0.34 分支。[jcbrand]

  • 合并了 jarn.xmpp.twisted 0.1。[jcbrand]

  • 移除了所有 PubSub 和 Messaging 相关功能。[jcbrand]

  • 添加了 browserlayer 并在处理事件时检查它。[jcbrand]

  • 修复了 @@setup-xmpp 脚本,使其仅在完成上一个用户注册后注册下一个用户。[jcbrand]

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪一个,请了解更多关于 安装软件包 的信息。

源代码分发

collective.xmpp.core-0.3.zip (161.6 kB 查看哈希值)

上传时间 源代码

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面