aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ejabberd_c2s.erl14
-rw-r--r--src/ejabberd_commands.erl9
-rw-r--r--src/mod_admin_extra.erl31
-rw-r--r--src/mod_muc_room.erl32
-rw-r--r--src/mod_private.erl3
-rw-r--r--src/mod_register.erl13
-rw-r--r--src/mod_roster.erl3
7 files changed, 65 insertions, 40 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index f2d16e878..5cdb8e1c9 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -457,14 +457,14 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
false ->
[]
end,
+ StreamFeatures1 = TLSFeature ++ CompressFeature ++ Mechs,
+ StreamFeatures = ejabberd_hooks:run_fold(c2s_stream_features,
+ Server, StreamFeatures1, [Server]),
send_element(StateData,
#xmlel{name = <<"stream:features">>,
attrs = [],
children =
- TLSFeature ++ CompressFeature ++ Mechs
- ++
- ejabberd_hooks:run_fold(c2s_stream_features,
- Server, [], [Server])}),
+ StreamFeatures}),
fsm_next_state(wait_for_feature_request,
StateData#state{
server = Server,
@@ -489,7 +489,7 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
false ->
[]
end,
- StreamFeatures = [#xmlel{name = <<"bind">>,
+ StreamFeatures1 = [#xmlel{name = <<"bind">>,
attrs = [{<<"xmlns">>, ?NS_BIND}],
children = []},
#xmlel{name = <<"session">>,
@@ -499,9 +499,9 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
RosterVersioningFeature ++
StreamManagementFeature ++
ejabberd_hooks:run_fold(c2s_post_auth_features,
- Server, [], [Server]) ++
- ejabberd_hooks:run_fold(c2s_stream_features,
Server, [], [Server]),
+ StreamFeatures = ejabberd_hooks:run_fold(c2s_stream_features,
+ Server, StreamFeatures1, [Server]),
send_element(StateData,
#xmlel{name = <<"stream:features">>,
attrs = [],
diff --git a/src/ejabberd_commands.erl b/src/ejabberd_commands.erl
index a4f38e836..a5ba98ae8 100644
--- a/src/ejabberd_commands.erl
+++ b/src/ejabberd_commands.erl
@@ -382,6 +382,15 @@ check_access_commands(AccessCommands, Auth, Method, Command, Arguments) ->
Method, Arguments);
false ->
false
+ end;
+ ({Access, Commands}) ->
+ ArgumentRestrictions = [],
+ case check_access(Access, Auth) of
+ true ->
+ check_access_command(Commands, Command, ArgumentRestrictions,
+ Method, Arguments);
+ false ->
+ false
end
end,
AccessCommands),
diff --git a/src/mod_admin_extra.erl b/src/mod_admin_extra.erl
index 49e6a9869..3687c1edf 100644
--- a/src/mod_admin_extra.erl
+++ b/src/mod_admin_extra.erl
@@ -70,7 +70,6 @@
push_alltoall/2,
%% mod_last
get_last/2,
- set_last/4,
%% mod_private
private_get/4,
private_set/3,
@@ -191,7 +190,7 @@ commands() ->
desc = "Check if the password hash is correct",
longdesc = "Allowed hash methods: md5, sha.",
module = ?MODULE, function = check_password_hash,
- args = [{user, binary}, {host, binary}, {passwordhash, binary}, {hashmethod, binary}],
+ args = [{user, binary}, {host, binary}, {passwordhash, string}, {hashmethod, string}],
result = {res, rescode}},
#ejabberd_commands{name = change_password, tags = [accounts],
desc = "Change the password of an account",
@@ -435,7 +434,7 @@ commands() ->
result = {res, rescode}},
#ejabberd_commands{name = get_last, tags = [last],
- desc = "Get last activity information",
+ desc = "Get last activity information (timestamp and status)",
longdesc = "Timestamp is the seconds since"
"1970-01-01 00:00:00 UTC, for example: date +%s",
module = ?MODULE, function = get_last,
@@ -445,8 +444,8 @@ commands() ->
desc = "Set last activity information",
longdesc = "Timestamp is the seconds since"
"1970-01-01 00:00:00 UTC, for example: date +%s",
- module = ?MODULE, function = set_last,
- args = [{user, string}, {host, string}, {timestamp, integer}, {status, string}],
+ module = mod_last, function = store_last_info,
+ args = [{user, binary}, {host, binary}, {timestamp, integer}, {status, binary}],
result = {res, rescode}},
#ejabberd_commands{name = private_get, tags = [private],
@@ -680,7 +679,7 @@ delete_old_users(Days, Users) ->
%% If it isnt
[] ->
%% Look for his last_activity
- case (get_lastactivity_module(LServer)):get_last_info(LUser, LServer) of
+ case mod_last:get_last_info(LUser, LServer) of
%% If it is
%% existent:
{ok, TimeStamp, _Status} ->
@@ -714,13 +713,6 @@ delete_old_users(Days, Users) ->
Users_removed = lists:filter(F, Users),
{removed, length(Users_removed), Users_removed}.
-get_lastactivity_module(Server) ->
- case lists:member(mod_last, gen_mod:loaded_modules(Server)) of
- true -> mod_last;
- _ -> mod_last_odbc
- end.
-
-
%%
%% Ban account
@@ -1220,13 +1212,12 @@ build_broadcast(U, S, SubsAtom) when is_atom(SubsAtom) ->
%%%
get_last(User, Server) ->
- Mod = get_lastactivity_module(Server),
case ejabberd_sm:get_user_resources(User, Server) of
[] ->
- case Mod:get_last_info(User, Server) of
+ case mod_last:get_last_info(User, Server) of
not_found ->
"Never";
- {ok, Shift, _Status} ->
+ {ok, Shift, Status} ->
TimeStamp = {Shift div 1000000,
Shift rem 1000000,
0},
@@ -1234,17 +1225,13 @@ get_last(User, Server) ->
calendar:now_to_local_time(TimeStamp),
lists:flatten(
io_lib:format(
- "~w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w",
- [Year, Month, Day, Hour, Minute, Second]))
+ "~w-~.2.0w-~.2.0w ~.2.0w:~.2.0w:~.2.0w ~s",
+ [Year, Month, Day, Hour, Minute, Second, Status]))
end;
_ ->
"Online"
end.
-set_last(User, Server, Timestamp, Status) ->
- Mod = get_lastactivity_module(Server),
- Mod:store_last_info(User, Server, Timestamp, Status).
-
%%%
%%% Private Storage
%%%
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl
index f381e8458..c52b4e320 100644
--- a/src/mod_muc_room.erl
+++ b/src/mod_muc_room.erl
@@ -55,6 +55,8 @@
-define(MAX_USERS_DEFAULT_LIST,
[5, 10, 20, 30, 50, 100, 200, 500, 1000, 2000, 5000]).
+-define(DEFAULT_MAX_USERS_PRESENCE,1000).
+
%-define(DBGFSM, true).
-ifdef(DBGFSM).
@@ -570,7 +572,10 @@ normal_state({route, From, ToNick,
FromNickJID =
jlib:jid_replace_resource(StateData#state.jid,
FromNick),
- [ejabberd_router:route(FromNickJID, ToJID, Packet)
+ X = #xmlel{name = <<"x">>,
+ attrs = [{<<"xmlns">>, ?NS_MUC_USER}]},
+ PrivMsg = xml:append_subtags(Packet, [X]),
+ [ejabberd_router:route(FromNickJID, ToJID, PrivMsg)
|| ToJID <- ToJIDs];
true ->
ErrText =
@@ -2098,10 +2103,23 @@ extract_history([#xmlel{attrs = Attrs} = El | Els],
extract_history([_ | Els], Type) ->
extract_history(Els, Type).
+is_room_overcrowded(StateData) ->
+ MaxUsersPresence = gen_mod:get_module_opt(StateData#state.server_host,
+ mod_muc, max_users_presence,
+ fun(MUP) when is_integer(MUP) -> MUP end,
+ ?DEFAULT_MAX_USERS_PRESENCE),
+ (?DICT):size(StateData#state.users) > MaxUsersPresence.
+
send_update_presence(JID, StateData) ->
send_update_presence(JID, <<"">>, StateData).
send_update_presence(JID, Reason, StateData) ->
+ case is_room_overcrowded(StateData) of
+ true -> ok;
+ false -> send_update_presence1(JID, Reason, StateData)
+ end.
+
+send_update_presence1(JID, Reason, StateData) ->
LJID = jlib:jid_tolower(JID),
LJIDs = case LJID of
{U, S, <<"">>} ->
@@ -2127,6 +2145,12 @@ send_new_presence(NJID, StateData) ->
send_new_presence(NJID, <<"">>, StateData).
send_new_presence(NJID, Reason, StateData) ->
+ case is_room_overcrowded(StateData) of
+ true -> ok;
+ false -> send_new_presence1(NJID, Reason, StateData)
+ end.
+
+send_new_presence1(NJID, Reason, StateData) ->
#user{nick = Nick} =
(?DICT):fetch(jlib:jid_tolower(NJID),
StateData#state.users),
@@ -2213,6 +2237,12 @@ send_new_presence(NJID, Reason, StateData) ->
(?DICT):to_list(StateData#state.users)).
send_existing_presences(ToJID, StateData) ->
+ case is_room_overcrowded(StateData) of
+ true -> ok;
+ false -> send_existing_presences1(ToJID, StateData)
+ end.
+
+send_existing_presences1(ToJID, StateData) ->
LToJID = jlib:jid_tolower(ToJID),
{ok, #user{jid = RealToJID, role = Role}} =
(?DICT):find(LToJID, StateData#state.users),
diff --git a/src/mod_private.erl b/src/mod_private.erl
index e127c2029..f09c6100e 100644
--- a/src/mod_private.erl
+++ b/src/mod_private.erl
@@ -60,15 +60,12 @@ start(Host, Opts) ->
end,
ejabberd_hooks:add(remove_user, Host, ?MODULE,
remove_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_PRIVATE, ?MODULE, process_sm_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
?NS_PRIVATE, ?MODULE, process_sm_iq, IQDisc).
stop(Host) ->
ejabberd_hooks:delete(remove_user, Host, ?MODULE,
remove_user, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_PRIVATE),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host,
?NS_PRIVATE).
diff --git a/src/mod_register.erl b/src/mod_register.erl
index cd68af936..1c03fb3e9 100644
--- a/src/mod_register.erl
+++ b/src/mod_register.erl
@@ -68,10 +68,15 @@ stop(Host) ->
?NS_REGISTER).
stream_feature_register(Acc, _Host) ->
- [#xmlel{name = <<"register">>,
- attrs = [{<<"xmlns">>, ?NS_FEATURE_IQREGISTER}],
- children = []}
- | Acc].
+ case lists:keymember(<<"mechanisms">>, 2, Acc) of
+ true ->
+ [#xmlel{name = <<"register">>,
+ attrs = [{<<"xmlns">>, ?NS_FEATURE_IQREGISTER}],
+ children = []}
+ | Acc];
+ false ->
+ Acc
+ end.
unauthenticated_iq_register(_Acc, Server,
#iq{xmlns = ?NS_REGISTER} = IQ, IP) ->
diff --git a/src/mod_roster.erl b/src/mod_roster.erl
index 2f5d771ce..605e8e367 100644
--- a/src/mod_roster.erl
+++ b/src/mod_roster.erl
@@ -100,8 +100,6 @@ start(Host, Opts) ->
webadmin_page, 50),
ejabberd_hooks:add(webadmin_user, Host, ?MODULE,
webadmin_user, 50),
- gen_iq_handler:add_iq_handler(ejabberd_local, Host,
- ?NS_ROSTER, ?MODULE, process_iq, IQDisc),
gen_iq_handler:add_iq_handler(ejabberd_sm, Host,
?NS_ROSTER, ?MODULE, process_iq, IQDisc).
@@ -128,7 +126,6 @@ stop(Host) ->
webadmin_page, 50),
ejabberd_hooks:delete(webadmin_user, Host, ?MODULE,
webadmin_user, 50),
- gen_iq_handler:remove_iq_handler(ejabberd_local, Host, ?NS_ROSTER),
gen_iq_handler:remove_iq_handler(ejabberd_sm, Host,
?NS_ROSTER).