Как зарегистрировать пользовательскую реализацию узла pubjub Ejabberd? - PullRequest
1 голос
/ 14 января 2020

Я хотел бы использовать пользовательскую реализацию узла pubsub (gen_pubsub_node). Я создал фиктивную реализацию в elixir (делегирует все в node_flat_ sql):

defmodule CustomNodePlugin do
  @behaviour :gen_pubsub_node

  defdelegate init(host, server_host, opts), to: :node_flat_sql
  defdelegate terminate(host, server_host), to: :node_flat_sql
  defdelegate options(), to: :node_flat_sql
  defdelegate features(), to: :node_flat_sql
  defdelegate create_node_permission(host, server_host, node, parent_node, owner), to: :node_flat_sql
  defdelegate create_node(node_idx, owner), to: :node_flat_sql
  defdelegate delete_node(nodes), to: :node_flat_sql
  defdelegate purge_node(node_idx), to: :node_flat_sql
  defdelegate subscribe_node(
    node_idx,
    sender,
    subscriber,
    access_model,
    send_last,
    pesesnce_subscription,
    roster_group, options
  ), to: :node_flat_sql
  defdelegate unsubscribe_node(
    node_idx,
    sender,
    subscriber,
    sub_id
  ), to: :node_flat_sql
  defdelegate publish_item(
    node_idx,
    publisher,
    publish_model,
    max_items,
    item_id,
    payload,
    options
  ), to: :node_flat_sql
  defdelegate delete_item(
    node_idx,
    publisher,
    publish_model,
    item_id
  ), to: :node_flat_sql
  defdelegate remove_extra_items(
    node_idx,
    max_items,
    item_ids
  ), to: :node_flat_sql
  defdelegate get_node_affiliations(node_idx), to: :node_flat_sql
  defdelegate get_entity_affiliations(
    host,
    owner
  ), to: :node_flat_sql
  defdelegate get_affiliation(node_idx, owner), to: :node_flat_sql
  defdelegate set_affiliation(node_idx, owner, affiliation), to: :node_flat_sql

  # needs to be implemented
  defdelegate get_node_subscriptions(node_idx), to: :node_flat_sql
  defdelegate get_entity_subscriptions(host, key), to: :node_flat_sql
  defdelegate get_subscriptions(node_idx, owner), to: :node_flat_sql
  defdelegate get_pending_nodes(host, owner), to: :node_flat_sql
  defdelegate get_states(node_idx), to: :node_flat_sql
  defdelegate get_state(node_idx, key), to: :node_flat_sql
  defdelegate set_state(state), to: :node_flat_sql
  defdelegate get_items(
    node_idx,
    jid,
    access_model,
    param1,
    param2,
    param3,
    param4
  ), to: :node_flat_sql
  defdelegate get_items(
    node_idx,
    jid,
    access_model
  ), to: :node_flat_sql
  defdelegate get_last_items(node_idx, jid, rsm_set), to: :node_flat_sql
  defdelegate get_only_item(node_idx, jid), to: :node_flat_sql
  defdelegate get_item(
    node_idx,
    jid,
    access_model,
    presence_subscription,
    roster_group,
    sub_id
  ), to: :node_flat_sql
  defdelegate get_item(
    node_idx,
    item_id
  ), to: :node_flat_sql
  defdelegate set_item(), to: :node_flat_sql
  defdelegate get_item_name(host, server_host, node_idx), to: :node_flat_sql
  defdelegate node_to_path(node_idx), to: :node_flat_sql
  defdelegate path_to_node(node_idx), to: :node_flat_sql
end

Я не могу понять, как интегрировать его в ejabberd, я попытался просто зарегистрировать его внутри ejabberd.yml:

...
  mod_pubsub:
    access_createnode: pubsub_createnode
    db_type: sql
    plugins:
      - "flat"
      - "pep"
      - "CustomNodePlugin"
    force_node_config:
      ## Change from "whitelist" to "open" to enable OMEMO support
      ## See https://github.com/processone/ejabberd/issues/2425
      "eu.siacs.conversations.axolotl.*":
        access_model: open
      ## Avoid buggy clients to make their bookmarks public
      "storage:bookmarks":
        access_model: open
...

но я получаю следующую ошибку: Не удалось запустить приложение ejabberd: Неверное значение дополнительных модулей-> mod_pubsub-> plugins-> 3: неожиданное значение: CustomNodePlugin. Вы имели в виду квартиру? Возможные значения: flat, pep

Пробовал просматривать документацию (https://docs.ejabberd.im/developer/extending-ejabberd/pubsub/#pubsub -просмотр ) и https://github.com/processone/ejabberd/blob/master/src/mod_pubsub.erl#L257, но не могу найти, где могу подключить новую реализацию в. Есть ли способ зарегистрировать новый узел через файл конфигурации? Как?

1 Ответ

0 голосов
/ 26 января 2020

Мне удается понять это, плюшка только для pubsub. В документации конфигурации говорится, что узлы PEP могут использовать реализацию cutom через pep_mapping (https://docs.ejabberd.im/admin/configuration/#mod -pubsub поиск pep_mapping), здесь вы можете заставить узел использовать вашу пользовательскую реализацию, добавив элемент pep_mapping, например,

mod_pubsub:
  pep_mapping:
    "custom:node": custom

Во время выполнения (с конфигурацией по умолчанию) Ejabberd будет искать модуль с именем node_custom. Если SQL настроен как бэкэнд, Ejabberd будет искать модуль с именем node_custom_ sql. Модули Elixir могут иметь атомы в качестве имен, поэтому вы должны определить модуль как:

defmodule :node_custom_sql do
...

Подвести итог:

  1. Зарегистрировать отображение PEP в конфигурации
  2. Определить модуль с именем "node_" + + "_ sql" (для SQL бэкэнда, если настроен). Имя модуля: atom
  3. Реализация поведения gen_pubsub_node
...