Как запретить пользователю отправлять сообщения группе, но продолжать получать сообщения из этой группы (только для чтения)? - PullRequest
0 голосов
/ 15 апреля 2020

Я использую ejabberd 20.03 и подход MucSub.

Я попытался установить affiliation = 'none', но пользователь все еще может отправлять сообщения в mu c. Подробности:

ejabberd.yml:

...
modules:
  mod_adhoc: {}
  mod_admin_extra: {}
  mod_announce:
    access: announce
  mod_avatar: {}
  mod_blocking: {}
  mod_bosh: {}
  mod_caps: {}
  mod_carboncopy: {}
  mod_client_state: {}
  mod_configure: {}
  mod_disco: {}
  mod_fail2ban:
    c2s_auth_ban_lifetime: 10
  mod_http_api: {}
  mod_http_upload:
    put_url: https://@HOST@:5443/upload
  mod_last: {}
  mod_mam:
    ## Mnesia is limited to 2GB, better to use an SQL backend
    ## For small servers SQLite is a good fit and is very easy
    ## to configure. Uncomment this when you have SQL configured:
    db_type: sql
    assume_mam_usage: true
    default: always
  mod_mqtt: {}
  mod_muc:
    access:
      - allow
    access_admin:
      - allow: admin
    access_create: muc_create
    access_persistent: muc_create
    access_mam:
      - allow
    default_room_options:
      allow_query_users: false
      allow_subscription: true  # enable MucSub
      mam: true
      persistent: true
      public: false
      public_list: false
  mod_muc_admin: {}
  mod_offline:
    access_max_user_messages: max_user_offline_messages
  mod_privacy: {}
  mod_private: {}
  mod_proxy65:
    access: local
    max_connections: 5
  mod_pubsub:
    access_createnode: pubsub_createnode
    plugins:
      - flat
      - pep
    force_node_config:
      ## Avoid buggy clients to make their bookmarks public
      storage:bookmarks:
        access_model: whitelist
  mod_push: {}
  mod_push_keepalive: {}
  mod_register:
    ## Only accept registration requests from the "trusted"
    ## network (see access_rules section above).
    ## Think twice before enabling registration from any
    ## address. See the Jabber SPAM Manifesto for details:
    ## https://github.com/ge0rg/jabber-spam-fighting-manifesto
    ip_access: trusted_network
  mod_roster:
    versioning: true
  mod_s2s_dialback: {}
  mod_shared_roster: {}
  mod_stream_mgmt:
    resend_on_timeout: if_offline
  mod_vcard: {}
  mod_vcard_xupdate: {}
  mod_version:
    show_os: false

Настройки комнаты:

[{title,<<"500">>},
 {description,<<"500">>},
 {allow_change_subj,false},
 {allow_query_users,false},
 {allow_private_messages,false},
 {allow_private_messages_from_visitors,anyone},
 {allow_visitor_status,true},
 {allow_visitor_nickchange,true},
 {public,false},
 {public_list,false},
 {persistent,true},
 {moderated,true},
 {members_by_default,true},
 {members_only,true},
 {allow_user_invites,false},
 {password_protected,true},
 {captcha_protected,false},
 {password,<<"_500_">>},
 {anonymous,false},
 {logging,false},
 {max_users,200},
 {allow_voice_requests,true},
 {allow_subscription,true},
 {mam,true},
 {presence_broadcast,[moderator,participant,visitor]},
 {voice_request_min_interval,1800},
 {vcard,<<"
<vCard
    xmlns='vcard-temp'>
    <TITLE>Room Title</TITLE>
    <DESC>Room Description</DESC>
</vCard>">>},
 {vcard_xupdate,<<>>},
 {pubsub,<<>>},
 {lang,<<"en">>},
 {captcha_whitelist,[]},
 {affiliations,[{{<<"21112">>,<<"domain.com">>,<<>>},
                 {admin,<<>>}},
                {{<<"21247">>,<<"domain.com">>,<<>>},
                 {member,<<>>}},
                {{<<"21966">>,<<"domain.com">>,<<>>},
                 {member,<<>>}},
                {{<<"admin">>,<<"domain.com">>,<<>>},
                 {owner,<<>>}}]},
 {subject,[]},
 {subject_author,<<>>}]

Я хочу, чтобы пользователь 21112 (администратор комнаты) мог настроить пользователя 21247 (комната член) в состоянии, которое запрещает 21247 отправлять сообщения в комнату, но 21247 все еще может получать сообщения из комнаты. Я попытался:

  1. Войдите в систему с пользователем 21112 и отправили следующую строфу:
<iq from="21112@domain.com/14965894906297405984175442" id="revoke_voice_c4ec85d0-7f14-11ea-8f19-77e4dd9aaad8" to="500@conference.domain.com" type="set"
    xmlns="jabber:client">
    <query
        xmlns="http://jabber.org/protocol/muc#admin">
        <item nick="21247" role="visitor"/>
    </query>
</iq>

и получили ошибку:

<iq
    xmlns='jabber:client' xml:lang='en'
    to='21112@domain.com/14965894906297405984175442'
    from='500@conference.domain.com'
    type='error'
    id='revoke_voice_c4ec85d0-7f14-11ea-8f19-77e4dd9aaad8'>
    <query
        xmlns='http://jabber.org/protocol/muc#admin'>
        <item nick='21247' role='visitor'/>
    </query>
    <error code='405' type='cancel'>
        <not-allowed
            xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
            <text xml:lang='en'
                xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>Changing role/affiliation is not allowed
            </text>
        </error>
    </iq>

I не знаю, почему возвращается ошибка выше. Я прочитал конфиги комнаты, а также подход MucSub, и мне интересно, если это из-за реализации MucSub. Я не знаю. Затем я просто установил принадлежность пользователя 21247 на «нет», но он все еще может отправить сообщение в комнату. В строфах:

<iq from="21112@domain.com/14965894906297405984175442" 
    id="change_affiliation" 
    to="500@conference.domain.com" 
    type="set"
    xmlns="jabber:client">
    <query
        xmlns="http://jabber.org/protocol/muc#admin">
        <item affiliation="none" jid="21247@domain.com" nick="21247"/>
    </query>
</iq>
<iq
    xmlns='jabber:client' 
    xml:lang='en' 
    to='21112@domain.com/14965894906297405984175442' 
    from='500@conference.domain.com' 
    type='result' 
    id='change_affiliation'/>

В моем понимании, поскольку я установил affiliation = 'none', я ожидал, что пользователь 21247 не сможет отправлять сообщения в комнату, но все же сможет получать новые сообщения, потому что он является абонентом комнаты (MucSub). У кого-нибудь есть идеи для достижения моей цели?

1 Ответ

1 голос
/ 16 апреля 2020

Ах, я понимаю, что вы имеете в виду. Вы правы, в текущей реализации MucSub нет способа ограничить подписчика от отправки сообщений в комнату.

Я заполнил проблему, объясняя случай и предоставляя исправление. С этим патчем есть конфигурация комнаты, которая позволяет подписчикам получать сообщения, но не отправлять их.

Если вы можете применить патч, скомпилируйте и установите ejabberd: https://github.com/processone/ejabberd/issues/3222

...