processone / ejabberd

Robust, Ubiquitous and Massively Scalable Messaging Platform (XMPP, MQTT, SIP Server)
https://www.process-one.net/ejabberd/
Other
6.12k stars 1.51k forks source link

MucSub subscriptions not broadcasted #3828

Closed cesar-cardinale closed 2 years ago

cesar-cardinale commented 2 years ago

Environment

Configuration

```yaml hosts: - ejabberd - ${EJABBERD_DOMAIN} loglevel: 5 log_rotate_size: 10485760 log_rotate_count: 1 #Default volatile (in-memory) storage for ejabberd. Modules and other components (e.g. session management) may have its own value. #The default value is mnesia. default_ram_db: redis #all modules that support MySQL as db_type default_db: sql #Modules may have its own value of the option. The value of ram means that queues will be kept in memory. queue_type: ram #Enable or disable cache use_cache: true #mysql connexion sql_type: mysql sql_server: "ejabberddb" sql_database: "ejabberd" sql_username: "ejabberd" sql_password: "${DB_PASSWORD}" ## If you want to specify the port: sql_port: 3306 # use it to store transient data, such as records for C2S (client) sessions redis_server: ejabberdredis redis_db: 1 certfiles: - /home/ejabberd/conf/server.pem ca_file: "/home/ejabberd/conf/cacert.pem" ## When using let's encrypt to generate certificates ##certfiles: ## - /etc/letsencrypt/live/localhost/fullchain.pem ## - /etc/letsencrypt/live/localhost/privkey.pem ## ##ca_file: "/etc/letsencrypt/live/localhost/fullchain.pem" #auth_method: # - anonymous #anonymous_protocol: login_anon auth_method: - jwt - external extauth_program: php /home/ejabberd/external-auth/start.php extauth_pool_size: 3 jwt_key: /home/ejabberd/conf/jwt_key auth_use_cache: false allow_multiple_connections: true #jwt_jid_field: "identifier" #jwt_key: "/home/ejabberd/conf/jwtKey" listen: - port: 5222 ip: "::" module: ejabberd_c2s max_stanza_size: 262144 shaper: c2s_shaper access: c2s starttls_required: true - port: 5269 ip: "::" module: ejabberd_s2s_in max_stanza_size: 524288 - port: 5443 ip: "::" module: ejabberd_http #tls: true request_handlers: "/admin": ejabberd_web_admin "/api": mod_http_api "/bosh": mod_bosh "/captcha": ejabberd_captcha "/upload": mod_http_upload "/ws": ejabberd_http_ws "/oauth": ejabberd_oauth - port: 5280 ip: "::" module: ejabberd_http request_handlers: #"/admin": ejabberd_web_admin "/api": mod_http_api "/bosh": mod_bosh "/captcha": ejabberd_captcha "/upload": mod_http_upload "/ws": ejabberd_http_ws "/oauth": ejabberd_oauth - port: 5380 ip: "::" module: ejabberd_http request_handlers: "/": ejabberd_web_admin - port: 1883 ip: "::" module: mod_mqtt backlog: 1000 s2s_use_starttls: optional acl: local: user_regexp: "" loopback: ip: - 127.0.0.0/8 - ::1/128 - ::FFFF:127.0.0.1/128 admin: user: - "hello\\40example.com@${EJABBERD_DOMAIN}" access_rules: local: allow: local c2s: deny: blocked allow: all announce: allow: admin configure: allow: admin muc_create: allow: local pubsub_createnode: allow: local trusted_network: allow: loopback api_permissions: "console commands": from: - ejabberd_ctl who: all what: "*" "admin access": who: - access: - allow: - acl: admin - oauth: - scope: "ejabberd:admin" - access: - allow: - acl: admin from: - ejabberd_ctl - mod_http_api what: - all - "*" - "!stop" - "!start" "public commands": who: - ip: 127.0.0.1/8 what: - status - connected_users_number shaper: normal: 1000 fast: 50000 shaper_rules: max_user_sessions: 10 max_user_offline_messages: - 5000: poweruser - 2000: admin - 100 c2s_shaper: none: admin normal: all s2s_shaper: fast max_fsm_queue: 10000 acme: contact: "mailto:example-admin@example.com" ca_url: "https://acme-staging-v02.api.letsencrypt.org/directory" 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: {} # Removing mod_fail2ban because connection happens from the pusher and we don't want to ban it #mod_fail2ban: {} mod_http_api: {} ##mod_restful_admin: ## api: ## - path: [ "admin" ] ## module: mod_restful_admin ## params: ## key: "secret" ## allowed_commands: [ register, unregister,status, add_rosteritem, create_room, send_direct_invitation, set_room_affiliation ] ## - path: [ "register" ] ## module: mod_restful_register ## params: ## key: "secret" 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_subscription: true # enable MucSub mam: false persistent: true anonymous: false mod_muc_admin: {} mod_offline: db_type: sql access_max_user_messages: max_user_offline_messages store_groupchat: true mod_ping: {} mod_privacy: {} mod_private: {} mod_proxy65: access: local max_connections: 5 mod_pubsub: db_type: sql access_createnode: pubsub_createnode ignore_pep_from_offline: true last_item_cache: false plugins: - flat - pep force_node_config: ## Avoid buggy clients to make their bookmarks public storage:bookmarks: access_model: whitelist mod_push: {} mod_push_keepalive: resume_timeout: 72 wake_on_start: false wake_on_timeout: true 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 store_current_id: false mod_sip: {} mod_s2s_dialback: {} mod_shared_roster: {} mod_stream_mgmt: ack_timeout: infinity resend_on_timeout: if_offline mod_vcard: {} mod_vcard_xupdate: {} mod_version: show_os: false websocket_ping_interval: 300 websocket_timeout: 900 ```

Bug description

A user (A) subscribe to a MUC Room, with all events : urn:xmpp:mucsub:nodes:subscribers, urn:xmpp:mucsub:nodes:presence, ... . Another user (B) subscribe to this same MUC Room, the (A) user does not receive the subscription from the user (B).

But in the documentation of ejabberd, it said that if you subscribe to this node you will receive the new subscriptions and also the unsubscriptions from other. But I receive all other type of message like presence message etc ...

Did I made something wrong ?

Thank you.

badlop commented 2 years ago

It works for me using ejabberd 21.12 and 22.05 compile from source code. I'll describe how I tested it, maybe it gives you some hint, you can compare with your method, or you can try this method to see if there's some goblin tricking you:

  1. I use the default configuration with just those changes:
--- a/ejabberd.yml.example
+++ b/ejabberd.yml.example
@@ -16,6 +16,7 @@

 hosts:
   - localhost
+  - shakespeare.example

 loglevel: info

@@ -185,6 +186,8 @@ modules:
     default: always
   mod_mqtt: {}
   mod_muc:
+    hosts:
+      - muc.@HOST@
     access:
       - allow
     access_admin:
@@ -194,7 +197,9 @@ modules:
     access_mam:
       - allow
     default_room_options:
+      allow_subscription: true
       mam: true
+      persistent: true
   mod_muc_admin: {}
   mod_offline:
     access_max_user_messages: max_user_offline_messages
  1. Then I register accounts hag66@shakespeare.example and bubu@shakespeare.example

  2. The first account joins the room coven, so that it gets created.

  3. First account subscribes:

<iq from='hag66@shakespeare.example'
    to='coven@muc.shakespeare.example'
    type='set'
    id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
  <subscribe xmlns='urn:xmpp:mucsub:0'
             nick='mynick'
             password='roompassword'>
    <event node='urn:xmpp:mucsub:nodes:affiliations' />
    <event node='urn:xmpp:mucsub:nodes:config' />
    <event node='urn:xmpp:mucsub:nodes:messages' />
    <event node='urn:xmpp:mucsub:nodes:presence' />
    <event node='urn:xmpp:mucsub:nodes:subject' />
    <event node='urn:xmpp:mucsub:nodes:subscribers' />
    <event node='urn:xmpp:mucsub:nodes:system' />
  </subscribe>
</iq>
  1. server response to first client:
<message to='hag66@shakespeare.example'
    from='coven@muc.shakespeare.example'>
  <event xmlns='http://jabber.org/protocol/pubsub#event'>
    <items node='urn:xmpp:mucsub:nodes:subscribers'>
      <item id='1371773332584390325'>
        <subscribe jid='hag66@shakespeare.example'
    nick='mynick'
    xmlns='urn:xmpp:mucsub:0'/>
      </item>
    </items>
  </event>
</message>

<iq xml:lang='es'
    to='hag66@shakespeare.example/tka1'
    from='coven@muc.shakespeare.example'
    type='result'
    id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
  <subscribe nick='mynick'
    xmlns='urn:xmpp:mucsub:0'>
    <event node='urn:xmpp:mucsub:nodes:affiliations'/>
    <event node='urn:xmpp:mucsub:nodes:config'/>
    <event node='urn:xmpp:mucsub:nodes:messages'/>
    <event node='urn:xmpp:mucsub:nodes:presence'/>
    <event node='urn:xmpp:mucsub:nodes:subject'/>
    <event node='urn:xmpp:mucsub:nodes:subscribers'/>
  </subscribe>
</iq>
  1. Now the second account subscribes:
<iq
    to='coven@muc.shakespeare.example'
    type='set'
    id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
  <subscribe xmlns='urn:xmpp:mucsub:0'
             nick='mynick2'
             password='roompassword'>
    <event node='urn:xmpp:mucsub:nodes:affiliations' />
    <event node='urn:xmpp:mucsub:nodes:config' />
    <event node='urn:xmpp:mucsub:nodes:messages' />
    <event node='urn:xmpp:mucsub:nodes:presence' />
    <event node='urn:xmpp:mucsub:nodes:subject' />
    <event node='urn:xmpp:mucsub:nodes:subscribers' />
    <event node='urn:xmpp:mucsub:nodes:system' />
  </subscribe>
</iq>
  1. Second account receives the response:
<message to='bubu@shakespeare.example'
    from='coven@muc.shakespeare.example'>
  <event xmlns='http://jabber.org/protocol/pubsub#event'>
    <items node='urn:xmpp:mucsub:nodes:subscribers'>
      <item id='6932409545634587930'>
        <subscribe nick='mynick2'
    xmlns='urn:xmpp:mucsub:0'/>
      </item>
    </items>
  </event>
</message>

<iq xml:lang='es'
    to='bubu@shakespeare.example/tka1'
    from='coven@muc.shakespeare.example'
    type='result'
    id='E6E10350-76CF-40C6-B91B-1EA08C332FC7'>
  <subscribe nick='mynick2'
    xmlns='urn:xmpp:mucsub:0'>
    <event node='urn:xmpp:mucsub:nodes:affiliations'/>
    <event node='urn:xmpp:mucsub:nodes:config'/>
    <event node='urn:xmpp:mucsub:nodes:messages'/>
    <event node='urn:xmpp:mucsub:nodes:presence'/>
    <event node='urn:xmpp:mucsub:nodes:subject'/>
    <event node='urn:xmpp:mucsub:nodes:subscribers'/>
  </subscribe>
</iq>
  1. Immediately, the first account also receives:
<message to='hag66@shakespeare.example'
    from='coven@muc.shakespeare.example'>
  <event xmlns='http://jabber.org/protocol/pubsub#event'>
    <items node='urn:xmpp:mucsub:nodes:subscribers'>
      <item id='5455431537046146575'>
        <subscribe jid='bubu@shakespeare.example'
    nick='mynick2'
    xmlns='urn:xmpp:mucsub:0'/>
      </item>
    </items>
  </event>
</message>
cesar-cardinale commented 2 years ago

Hello, I followed what you said but unfortunately nothing change. I get my subscription response but others user doesn't get mine.

This is really annoying ... I don't even know where the problem comes from !

badlop commented 2 years ago

Ok, now I tried to do exactly like you say that you do it, with some changes compared to my previous step-by-step guide:

  1. Get ejabberd 21.12 from docker:

    docker run --name ejabberd -d -p 5222:5222 ejabberd/ecs:21.12
  2. To edit the configuration I use:

    docker exec ejabberd vi /home/ejabberd/conf/ejabberd.yml
  3. Then I reload the configuration and register the accounts:

    docker exec -it ejabberd bin/ejabberdctl reload_config
    docker exec -it ejabberd bin/ejabberdctl register hag66 shakespeare.example localhost
    docker exec -it ejabberd bin/ejabberdctl register bubu shakespeare.example localhost
  4. I use Tkabber client to login to the accounts, which has a XML console to put and read the XMPP stanzas. You can also use Gajim, Psi... I don't need to join the room or create it in any way: the room gets created when the first user subscribes to it.

  5. ... The remaining steps are identical. And it works correctly!

Quite obviously, you are doing something different than me. Repeat those steps carefully.