%% @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()