diff options
-rw-r--r-- | src/ejabberd_c2s.erl | 14 | ||||
-rw-r--r-- | src/ejabberd_commands.erl | 9 | ||||
-rw-r--r-- | src/mod_admin_extra.erl | 31 | ||||
-rw-r--r-- | src/mod_muc_room.erl | 32 | ||||
-rw-r--r-- | src/mod_private.erl | 3 | ||||
-rw-r--r-- | src/mod_register.erl | 13 | ||||
-rw-r--r-- | src/mod_roster.erl | 3 |
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). |