diff --git a/include/mod_muc.hrl b/include/mod_muc.hrl index f801b29e1..c8984f885 100644 --- a/include/mod_muc.hrl +++ b/include/mod_muc.hrl @@ -23,8 +23,9 @@ opts = [] :: list() | '_'}). -record(muc_registered, - {us_host = {{<<"">>, <<"">>}, <<"">>} :: {{binary(), binary()}, binary()} | '$1', - nick = <<"">> :: binary()}). + {us_host = {{<<"">>, <<"">>}, <<"">>} :: {{binary() | '$1', binary() | '$2'}, + binary() | '_'} | '$1', + nick = <<"">> :: binary() | '$3'}). -record(muc_online_room, {name_host :: {binary(), binary()} | '$1' | {'_', binary()} | '_', diff --git a/src/mod_muc.erl b/src/mod_muc.erl index 279156113..8d6601ddd 100644 --- a/src/mod_muc.erl +++ b/src/mod_muc.erl @@ -67,6 +67,8 @@ count_online_rooms/1, register_online_user/4, unregister_online_user/4, + get_register_nick/3, + get_register_nicks/2, iq_set_register_info/5, count_online_rooms_by_user/3, get_online_rooms_by_user/3, @@ -102,6 +104,7 @@ -callback can_use_nick(binary(), binary(), jid(), binary()) -> boolean(). -callback get_rooms(binary(), binary()) -> [#muc_room{}]. -callback get_nick(binary(), binary(), jid()) -> binary() | error. +-callback get_nicks(binary(), binary()) -> [{binary(), binary(), binary()}] | error. -callback set_nick(binary(), binary(), jid(), binary()) -> {atomic, ok | false}. -callback register_online_room(binary(), binary(), binary(), pid()) -> any(). -callback unregister_online_room(binary(), binary(), binary(), pid()) -> any(). @@ -1107,6 +1110,16 @@ get_nick(ServerHost, Host, From) -> Mod = gen_mod:db_mod(LServer, ?MODULE), Mod:get_nick(LServer, Host, From). +-spec get_register_nick(binary(), binary(), jid()) -> binary() | error. +get_register_nick(ServerHost, Host, From) -> + get_nick(ServerHost, Host, From). + +-spec get_register_nicks(binary(), binary()) -> [{binary(), binary(), binary()}]. +get_register_nicks(ServerHost, Host) -> + LServer = jid:nameprep(ServerHost), + Mod = gen_mod:db_mod(LServer, ?MODULE), + Mod:get_nicks(LServer, Host). + iq_get_register_info(ServerHost, Host, From, Lang) -> {Nick, Registered} = case get_nick(ServerHost, Host, From) of error -> {<<"">>, false}; diff --git a/src/mod_muc_mnesia.erl b/src/mod_muc_mnesia.erl index 02ecb3ce8..86cc2d212 100644 --- a/src/mod_muc_mnesia.erl +++ b/src/mod_muc_mnesia.erl @@ -29,7 +29,7 @@ %% API -export([init/2, import/3, store_room/5, restore_room/3, forget_room/3, - can_use_nick/4, get_rooms/2, get_nick/3, set_nick/4]). + can_use_nick/4, get_rooms/2, get_nick/3, get_nicks/2, set_nick/4]). -export([register_online_room/4, unregister_online_room/4, find_online_room/3, get_online_rooms/3, count_online_rooms/2, rsm_supported/0, register_online_user/4, unregister_online_user/4, @@ -122,6 +122,14 @@ get_nick(_LServer, Host, From) -> [#muc_registered{nick = Nick}] -> Nick end. +get_nicks(_LServer, Host) -> + mnesia:dirty_select(muc_registered, + [{#muc_registered{us_host = {{'$1', '$2'}, Host}, + nick = '$3', _ = '_'}, + [], + [{{'$1', '$2', '$3'}}] + }]). + set_nick(_LServer, ServiceOrRoom, From, Nick) -> {LUser, LServer, _} = jid:tolower(From), LUS = {LUser, LServer}, diff --git a/src/mod_muc_sql.erl b/src/mod_muc_sql.erl index 31c8703c1..11ca5db0e 100644 --- a/src/mod_muc_sql.erl +++ b/src/mod_muc_sql.erl @@ -31,7 +31,7 @@ %% API -export([init/2, store_room/5, store_changes/4, restore_room/3, forget_room/3, - can_use_nick/4, get_rooms/2, get_nick/3, set_nick/4, + can_use_nick/4, get_rooms/2, get_nick/3, get_nicks/2, set_nick/4, import/3, export/1]). -export([register_online_room/4, unregister_online_room/4, find_online_room/3, get_online_rooms/3, count_online_rooms/2, rsm_supported/0, @@ -344,6 +344,23 @@ get_nick(LServer, Host, From) -> _ -> error end. +get_nicks(LServer, Host) -> + case catch ejabberd_sql:sql_query(LServer, + ?SQL("select @(jid)s, @(nick)s from muc_registered where" + " host=%(Host)s")) + of + {selected, Results} -> + lists:map(fun({JidBin, Nick}) -> + {User, Server, _Resource} = + jid:tolower( + jid:decode(JidBin)), + {User, Server, Nick} + end, + Results); + _ -> + error + end. + set_nick(LServer, ServiceOrRoom, From, Nick) -> JID = jid:encode(jid:tolower(jid:remove_resource(From))), F = fun () ->