summaryrefslogtreecommitdiff
path: root/src/ejabberd_captcha.erl
diff options
context:
space:
mode:
authorBadlop <badlop@process-one.net>2011-02-14 12:58:33 +0100
committerBadlop <badlop@process-one.net>2011-02-14 13:11:21 +0100
commitf91eb52890bec51c53e529dd972d57c61259e437 (patch)
treea76265485a5d649dbaff32fb5411ee0b0b35c2eb /src/ejabberd_captcha.erl
parentFix typo in French translation (diff)
Provide HTTPS URL in CAPTCHA form when listener has 'tls' option (EJAB-1406)
Diffstat (limited to 'src/ejabberd_captcha.erl')
-rw-r--r--src/ejabberd_captcha.erl46
1 files changed, 43 insertions, 3 deletions
diff --git a/src/ejabberd_captcha.erl b/src/ejabberd_captcha.erl
index cd6a1b89..a589ef38 100644
--- a/src/ejabberd_captcha.erl
+++ b/src/ejabberd_captcha.erl
@@ -405,13 +405,53 @@ get_prog_name() ->
end.
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()