rroemhild / docker-ejabberd

Dockerfile for Ejabberd server
MIT License
268 stars 160 forks source link

Ejabberd shared roaster group with members @all@ #178

Closed brunopistone closed 5 years ago

brunopistone commented 6 years ago

Hi, I've tried to create a container docker with a docker-compose file with the following configuration:

ejabberd:
    build: ejabberd
    container_name: ejabberd
    volumes:
      - ./ejabberd/conf/ejabberd.yml:/opt/ejabberd/conf/ejabberd.yml
      - ./ejabberd/database/:/opt/ejabberd/database/
      - ./ejabberd/certs/:/opt/ejabberd/certs/
    expose:
      - "4369"
      - "5222"
      - "5269"
      - "5280"
      - "7070"
      - "9090"
    environment:
      - ERLANG_NODE=ejabberd@localhost
      - XMPP_DOMAIN=test.biz
      - EJABBERD_ADMINS=admin@test.biz
      - EJABBERD_GROUPS=test@test.biz
      - EJABBERD_GROUP_MEMBERS=@all@:test@test.biz
    networks:
      default:
        ipv4_address: 10.5.0.8

So I tried to create a shared roaster group with members @all@, but it not working. The group was created correctly, but with no members. Is it possible to do this?

youmad commented 5 years ago

@bp91 Actually the mod_admin_extra is not activated by default (at least until #187), so for using shared roster groups you need to additionally set EJABBERD_MOD_ADMIN_EXTRA to true. After merging #187 using of the special directive @all@ will be available in the following format:

DIRECTIVE@VIRTUALHOST:GROUPNAME@VIRTUALHOST

For example:

EJABBERD_GROUP_MEMBERS=@all@@example.com:shared@example.com
brunopistone commented 5 years ago

Hi @youmad, I found a parsing error into the script 30_ejabberd_setup_groups.sh, in the methods register_group_member and register_all_group_members:

register_group_member() {
    local user=$1
    local host=$2
    local group=$3
    local grouphost=$4

    echo "Adding ${user} ${host} to roster group ${group}@${grouphost}"
    # Do not exit if user is already a member
    ${EJABBERDCTL} srg_user_add ${user} ${host} ${group} ${grouphost} || true
}

register_all_group_members() {
    # register shared roster group members from environment $EJABBERD_GROUP_MEMBERS
    # Use whitespace to seperate groups.
    #
    # sample:
    # - add two users to groups:
    #   -e "EJABBERD_GROUP_MEMBERS=user@xmpp.kx.gd:group@xmpp.kx.gd user2@xmpp.kx.gd:group@xmpp.kx.gd"

    for member in ${EJABBERD_GROUP_MEMBERS} ; do
        local user=${member%%:*}
        local group=${member#*:}

        if [ $user = @all@ ]
        then
            local username=@all@
            local userhost=${user#*@}
        else
            local username=${user%%@*}
            local userhost=${user#*@}
        fi

        local groupname=${group%%@*}
        local grouphost=${group#*@}

        echo 'user: ' $user
        echo 'group: ' $group
        echo 'username: ' $username
        echo 'userhost: ' $userhost
        echo 'groupname: ' $groupname
        echo 'grouphost: ' $grouphost

        register_group_member ${username} ${userhost} ${groupname} ${grouphost}
    done
}

The problem now is solved, I don't know if you want to insert this in the repo. I can close. Thanks.

youmad commented 5 years ago

@bp91 similar corrections are present here: https://github.com/rroemhild/docker-ejabberd/pull/187/files#diff-c60c65c4756d6a1b70d29ddcd05e8728

brunopistone commented 5 years ago

Great, in register_all_group_members() should be local username=${user%%@*} instead of local username=${user%@*}. Thanks again

youmad commented 5 years ago

With ${user%%@*} it doesn't match @all@ directive:

$ cat test.sh 
#!/bin/bash
set -e

register_all_group_members() {
    echo '----------'
    for member in ${EJABBERD_GROUP_MEMBERS} ; do
        local user=${member%%:*}
        local group=${member#*:}

        local username=${user%%@*}
        local userhost=${user##*@}

        local groupname=${group%@*}
        local grouphost=${group##*@}

        echo 'username: ' $username
        echo 'userhost: ' $userhost
        echo 'groupname: ' $groupname
        echo 'grouphost: ' $grouphost
        echo '----------'
    done
}

register_all_group_members
exit 0

$ EJABBERD_GROUP_MEMBERS='user@xmpp.kx.gd:group@xmpp.kx.gd user2@xmpp.kx.gd:group@xmpp.kx.gd @all@@example.com:group@example.com' ./test.sh 
----------
username:  user
userhost:  xmpp.kx.gd
groupname:  group
grouphost:  xmpp.kx.gd
----------
username:  user2
userhost:  xmpp.kx.gd
groupname:  group
grouphost:  xmpp.kx.gd
----------
username: 
userhost:  example.com
groupname:  group
grouphost:  example.com
----------

with local username=${user%@*} it does:

$ cat test.sh
#!/bin/bash
set -e

register_all_group_members() {
    echo '----------'
    for member in ${EJABBERD_GROUP_MEMBERS} ; do
        local user=${member%%:*}
        local group=${member#*:}

        local username=${user%@*}
        local userhost=${user##*@}

        local groupname=${group%@*}
        local grouphost=${group##*@}

        echo 'username: ' $username
        echo 'userhost: ' $userhost
        echo 'groupname: ' $groupname
        echo 'grouphost: ' $grouphost
        echo '----------'
    done
}

register_all_group_members
exit 0

$ EJABBERD_GROUP_MEMBERS='user@xmpp.kx.gd:group@xmpp.kx.gd user2@xmpp.kx.gd:group@xmpp.kx.gd @all@@example.com:group@example.com' ./test.sh
----------
username:  user
userhost:  xmpp.kx.gd
groupname:  group
grouphost:  xmpp.kx.gd
----------
username:  user2
userhost:  xmpp.kx.gd
groupname:  group
grouphost:  xmpp.kx.gd
----------
username:  @all@
userhost:  example.com
groupname:  group
grouphost:  example.com
----------