diff --git a/src/ejabberd_captcha.erl b/src/ejabberd_captcha.erl index cd6a1b897..a589ef38f 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()