]> granicus.if.org Git - ejabberd/commitdiff
Better detection of duplicated routes/hosts
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>
Sun, 8 Jul 2018 17:28:11 +0000 (20:28 +0300)
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>
Sun, 8 Jul 2018 17:28:11 +0000 (20:28 +0300)
src/ejabberd_config.erl
src/mod_echo.erl
src/mod_http_upload.erl
src/mod_mix.erl
src/mod_muc.erl
src/mod_multicast.erl
src/mod_proxy65.erl
src/mod_pubsub.erl
src/mod_vcard.erl

index a3165143035b00ad84873dd638dfc35de410390a..ca4b427d44cad64c2e6732abd7b44fbac1365efc 100644 (file)
@@ -34,7 +34,7 @@
         prepare_opt_val/4, transform_options/1, collect_options/1,
         convert_to_yaml/1, convert_to_yaml/2, v_db/2,
         env_binary_to_list/2, opt_type/1, may_hide_data/1,
-        is_elixir_enabled/0, v_dbs/1, v_dbs_mods/1,
+        is_elixir_enabled/0, v_dbs/1, v_dbs_mods/1, v_host/1, v_hosts/1,
         default_db/1, default_db/2, default_ram_db/1, default_ram_db/2,
         default_queue_type/1, queue_dir/0, fsm_limit_opts/1,
         use_cache/1, cache_size/1, cache_missed/1, cache_life_time/1,
@@ -971,6 +971,33 @@ v_dbs_mods(Mod) ->
                                       (atom_to_binary(M, utf8))/binary>>, utf8)
              end, v_dbs(Mod)).
 
+-spec v_host(binary()) -> binary().
+v_host(Host) ->
+    hd(v_hosts([Host])).
+
+-spec v_hosts([binary()]) -> [binary()].
+v_hosts(Hosts) ->
+    ServerHosts = get_myhosts(),
+    lists:foldr(
+      fun(Host, Acc) ->
+             case lists:member(Host, ServerHosts) of
+                 true ->
+                     ?ERROR_MSG("Failed to reuse route ~s because it's "
+                                "already registered on a virtual host",
+                                [Host]),
+                     erlang:error(badarg);
+                 false ->
+                     case lists:member(Host, Acc) of
+                         true ->
+                             ?ERROR_MSG("Host ~s is defined multiple times",
+                                        [Host]),
+                             erlang:error(badarg);
+                         false ->
+                             [Host|Acc]
+                     end
+             end
+      end, [], Hosts).
+
 -spec default_db(module()) -> atom().
 default_db(Module) ->
     default_db(global, Module).
index a218c5f40b90a1f8f60f69a166ceab0fbc7f2795..26cf60611f99933af4180ae21f501b4f8c6717e2 100644 (file)
@@ -60,9 +60,8 @@ reload(Host, NewOpts, OldOpts) ->
 depends(_Host, _Opts) ->
     [].
 
-mod_opt_type(host) -> fun iolist_to_binary/1;
-mod_opt_type(hosts) ->
-    fun(L) -> lists:map(fun iolist_to_binary/1, L) end.
+mod_opt_type(host) -> fun ejabberd_config:v_host/1;
+mod_opt_type(hosts) -> fun ejabberd_config:v_hosts/1.
 
 mod_options(_Host) ->
     [{host, <<"echo.@HOST@">>}, {hosts, []}].
index 846071a2a71cb6a92da791ac9365cfcd70246674..afba0f09a5cfa4a7d7c5dc098d7977eb677a6a1e 100644 (file)
@@ -151,9 +151,9 @@ stop(ServerHost) ->
 
 -spec mod_opt_type(atom()) -> fun((term()) -> term()) | [atom()].
 mod_opt_type(host) ->
-    fun iolist_to_binary/1;
+    fun ejabberd_config:v_host/1;
 mod_opt_type(hosts) ->
-    fun (L) -> lists:map(fun iolist_to_binary/1, L) end;
+    fun ejabberd_config:v_hosts/1;
 mod_opt_type(name) ->
     fun iolist_to_binary/1;
 mod_opt_type(access) ->
index 51464e63fe03e4e110a6325bdf3e3d00f0f9a856..78e5d0251d415434eaf8fd0a1717c3bc7aadf407 100644 (file)
@@ -315,9 +315,8 @@ is_not_subscribed({error, StanzaError}) ->
 depends(_Host, _Opts) ->
     [{mod_pubsub, hard}].
 
-mod_opt_type(host) -> fun iolist_to_binary/1;
-mod_opt_type(hosts) ->
-    fun (L) -> lists:map(fun iolist_to_binary/1, L) end.
+mod_opt_type(host) -> fun ejabberd_config:v_host/1;
+mod_opt_type(hosts) -> fun ejabberd_config:v_hosts/1.
 
 mod_options(_Host) ->
     [{host, <<"mix.@HOST@">>},
index d7bb194c1d87d78b9b55985e63a9ab15d2e8413d..8a7fd1664fb786b66d41a51a5fbff79511b762e2 100644 (file)
@@ -889,10 +889,9 @@ mod_opt_type(db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
 mod_opt_type(ram_db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
 mod_opt_type(history_size) ->
     fun (I) when is_integer(I), I >= 0 -> I end;
-mod_opt_type(host) -> fun iolist_to_binary/1;
+mod_opt_type(host) -> fun ejabberd_config:v_host/1;
 mod_opt_type(name) -> fun iolist_to_binary/1;
-mod_opt_type(hosts) ->
-    fun (L) -> lists:map(fun iolist_to_binary/1, L) end;
+mod_opt_type(hosts) -> fun ejabberd_config:v_hosts/1;
 mod_opt_type(max_room_desc) ->
     fun (infinity) -> infinity;
        (I) when is_integer(I), I > 0 -> I
index ea6e5b4429990359e85d612d5dc4880c8861e469..632c3d27160a406f5121da49b4dd6d332e746804 100644 (file)
@@ -1083,9 +1083,8 @@ depends(_Host, _Opts) ->
 
 mod_opt_type(access) ->
     fun acl:access_rules_validator/1;
-mod_opt_type(host) -> fun iolist_to_binary/1;
-mod_opt_type(hosts) ->
-    fun(L) -> lists:map(fun iolist_to_binary/1, L) end;
+mod_opt_type(host) -> fun ejabberd_config:v_host/1;
+mod_opt_type(hosts) -> fun ejabberd_config:v_hosts/1;
 mod_opt_type(name) -> fun iolist_to_binary/1;
 mod_opt_type({limits, Type}) when (Type == local) or (Type == remote) ->
     fun(L) ->
index 5a348a819cc9a3e014ea24d71da0ada4d4969fa3..cc3546cf20e3eaa2863dd0cc507e888b158d9927 100644 (file)
@@ -113,9 +113,8 @@ depends(_Host, _Opts) ->
     [].
 
 mod_opt_type(access) -> fun acl:access_rules_validator/1;
-mod_opt_type(host) -> fun iolist_to_binary/1;
-mod_opt_type(hosts) ->
-    fun(L) -> lists:map(fun iolist_to_binary/1, L) end;
+mod_opt_type(host) -> fun ejabberd_config:v_host/1;
+mod_opt_type(hosts) -> fun ejabberd_config:v_hosts/1;
 mod_opt_type(hostname) ->
     fun(undefined) -> undefined;
        (H) -> iolist_to_binary(H)
index 8ca4c6564ba7a21e9123d9c240851530a0176b72..d96933e11440b5a91b14976fd0b926556da6839b 100644 (file)
@@ -3847,9 +3847,8 @@ purge_offline(Host, LJID, Node) ->
 mod_opt_type(access_createnode) -> fun acl:access_rules_validator/1;
 mod_opt_type(db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
 mod_opt_type(name) -> fun iolist_to_binary/1;
-mod_opt_type(host) -> fun iolist_to_binary/1;
-mod_opt_type(hosts) ->
-    fun (L) -> lists:map(fun iolist_to_binary/1, L) end;
+mod_opt_type(host) -> fun ejabberd_config:v_host/1;
+mod_opt_type(hosts) -> fun ejabberd_config:v_hosts/1;
 mod_opt_type(ignore_pep_from_offline) ->
     fun (A) when is_boolean(A) -> A end;
 mod_opt_type(last_item_cache) ->
index fe8af76f4cda47f030d3cc8908599a321c3400ad..39da3472e20d251652c71eec180f25cfc7398476 100644 (file)
@@ -531,9 +531,8 @@ mod_opt_type(allow_return_all) ->
     fun (B) when is_boolean(B) -> B end;
 mod_opt_type(db_type) -> fun(T) -> ejabberd_config:v_db(?MODULE, T) end;
 mod_opt_type(name) -> fun iolist_to_binary/1;
-mod_opt_type(host) -> fun iolist_to_binary/1;
-mod_opt_type(hosts) ->
-    fun (L) -> lists:map(fun iolist_to_binary/1, L) end;
+mod_opt_type(host) -> fun ejabberd_config:v_host/1;
+mod_opt_type(hosts) -> fun ejabberd_config:v_hosts/1;
 mod_opt_type(matches) ->
     fun (infinity) -> infinity;
        (I) when is_integer(I), I > 0 -> I