]> granicus.if.org Git - ejabberd/commitdiff
Offer CSI stream feature only if configured
authorHolger Weiss <holger@zedat.fu-berlin.de>
Thu, 25 Sep 2014 16:28:20 +0000 (18:28 +0200)
committerHolger Weiss <holger@zedat.fu-berlin.de>
Thu, 25 Sep 2014 16:28:20 +0000 (18:28 +0200)
Don't offer the CSI stream feature when mod_client_state isn't actually
configured to filter stanzas.  This makes sure clients won't send CSI
tags that end up being ignored.

src/ejabberd_c2s.erl
src/mod_client_state.erl

index bb39b37e7dac96f3875908b9b28f6ba7e1c818cc..9bfe225cf541ca09f3f5cd7d489a07b5c371fffb 100644 (file)
@@ -479,10 +479,6 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
                                              false ->
                                                  []
                                            end,
-                                       ClientStateFeature =
-                                           [#xmlel{name = <<"csi">>,
-                                                   attrs = [{<<"xmlns">>, ?NS_CLIENT_STATE}],
-                                                   children = []}],
                                        StreamFeatures = [#xmlel{name = <<"bind">>,
                                                                attrs = [{<<"xmlns">>, ?NS_BIND}],
                                                                children = []},
@@ -492,7 +488,6 @@ wait_for_stream({xmlstreamstart, _Name, Attrs}, StateData) ->
                                                            ++
                                                            RosterVersioningFeature ++
                                                            StreamManagementFeature ++
-                                                           ClientStateFeature ++
                                                            ejabberd_hooks:run_fold(c2s_post_auth_features,
                                                                Server, [], [Server]) ++
                                                            ejabberd_hooks:run_fold(c2s_stream_features,
index 83363162dcec1d18505d13ae474749f7e637f8b1..b43683bb76d7cbf627ab1b3ee7e4581280282e49 100644 (file)
@@ -28,7 +28,8 @@
 
 -behavior(gen_mod).
 
--export([start/2, stop/1, filter_presence/2, filter_chat_states/2]).
+-export([start/2, stop/1, add_stream_feature/2, filter_presence/2,
+        filter_chat_states/2]).
 
 -include("ejabberd.hrl").
 -include("logger.hrl").
@@ -39,14 +40,19 @@ start(Host, Opts) ->
                                    fun(true) -> true end, false),
     DropChatStates = gen_mod:get_opt(drop_chat_states, Opts,
                                     fun(true) -> true end, false),
-    if QueuePresence ->
-          ejabberd_hooks:add(csi_filter_stanza, Host, ?MODULE,
-                             filter_presence, 50);
-       true -> ok
-    end,
-    if DropChatStates ->
-          ejabberd_hooks:add(csi_filter_stanza, Host, ?MODULE,
-                             filter_chat_states, 50);
+    if QueuePresence; DropChatStates ->
+          ejabberd_hooks:add(c2s_post_auth_features, Host, ?MODULE,
+                             add_stream_feature, 50),
+          if QueuePresence ->
+                 ejabberd_hooks:add(csi_filter_stanza, Host, ?MODULE,
+                                    filter_presence, 50);
+             true -> ok
+          end,
+          if DropChatStates ->
+                 ejabberd_hooks:add(csi_filter_stanza, Host, ?MODULE,
+                                    filter_chat_states, 50);
+             true -> ok
+          end;
        true -> ok
     end,
     ok.
@@ -56,8 +62,16 @@ stop(Host) ->
                          filter_presence, 50),
     ejabberd_hooks:delete(csi_filter_stanza, Host, ?MODULE,
                          filter_chat_states, 50),
+    ejabberd_hooks:delete(c2s_post_auth_features, Host, ?MODULE,
+                         add_stream_feature, 50),
     ok.
 
+add_stream_feature(Features, _Host) ->
+    Feature = #xmlel{name = <<"csi">>,
+                    attrs = [{<<"xmlns">>, ?NS_CLIENT_STATE}],
+                    children = []},
+    [Feature | Features].
+
 filter_presence(_Action, #xmlel{name = <<"presence">>, attrs = Attrs}) ->
     case xml:get_attr(<<"type">>, Attrs) of
       {value, Type} when Type /= <<"unavailable">> ->