]> granicus.if.org Git - ejabberd/commitdiff
Provide HTTPS URL in CAPTCHA form when listener has 'tls' option (EJAB-1406)
authorBadlop <badlop@process-one.net>
Mon, 14 Feb 2011 11:58:33 +0000 (12:58 +0100)
committerBadlop <badlop@process-one.net>
Mon, 14 Feb 2011 12:01:46 +0000 (13:01 +0100)
src/ejabberd_captcha.erl

index 688996adf98740621b9bccbd0cca5164cd2f092d..a82596c4fc96de31871d9fce1bdd00d28861832f 100644 (file)
@@ -625,13 +625,53 @@ get_prog_name() ->
 
 %% @doc (Str::string()) -> string()
 get_url(Str) ->
-    case ejabberd_config:get_local_option(captcha_host) of
+    CaptchaHost = ejabberd_config:get_local_option(captcha_host),
+    TransferProt = atom_to_list(get_transfer_protocol(CaptchaHost)),
+    case CaptchaHost of
        Host when is_list(Host) ->
-           "http://" ++ Host ++ "/captcha/" ++ Str;
+           TransferProt ++ "://" ++ Host ++ "/captcha/" ++ Str;
        _ ->
-           "http://" ++ ?MYNAME ++ "/captcha/" ++ Str
+           TransferProt ++ "://" ++ ?MYNAME ++ "/captcha/" ++ Str
     end.
 
+get_transfer_protocol(CaptchaHost) ->
+    PortNumber = get_port_number_from_captcha_host_option(CaptchaHost),
+    PortListeners = get_port_listeners(PortNumber),
+    get_captcha_transfer_protocol(PortListeners).
+
+get_port_number_from_captcha_host_option(CaptchaHost) ->
+    [_Host, PortString] = string:tokens(CaptchaHost, ":"),
+    list_to_integer(PortString).
+
+get_port_listeners(PortNumber) ->
+    AllListeners = ejabberd_config:get_local_option(listen),
+    lists:filter(
+      fun({{Port, _Ip, _Netp}, _Module1, _Opts1}) when Port == PortNumber ->
+             true;
+        (_) ->
+             false
+      end,
+      AllListeners).
+
+get_captcha_transfer_protocol([]) ->
+    throw("The port number mentioned in captcha_host is not "
+         "a ejabberd_http listener with 'captcha' option.");
+get_captcha_transfer_protocol([{{_Port, _Ip, tcp}, ejabberd_http, Opts}
+                              | Listeners]) ->
+    case lists:member(captcha, Opts) of
+       true ->
+           case lists:member(tls, Opts) of
+               true ->
+                   https;
+               false ->
+                   http
+           end;
+       false ->
+           get_captcha_transfer_protocol(Listeners)
+    end;
+get_captcha_transfer_protocol([_ | Listeners]) ->
+    get_captcha_transfer_protocol(Listeners).
+
 %%--------------------------------------------------------------------
 %% Function: cmd(Cmd) -> Data | {error, Reason}
 %% Cmd = string()