If the port number isn't listener, then specify the protocol (EJAB-1418)

This commit is contained in:
Badlop 2011-03-03 11:35:47 +01:00
parent e0d14c3b8d
commit a1f20a5bc0
2 changed files with 15 additions and 12 deletions

View File

@ -1633,11 +1633,14 @@ The configurable options are:
\titem{\{captcha\_cmd, Path\}}
Full path to a script that generates the image.
The default value is an empty string: \term{""}
\titem{\{captcha\_host, HostPort\}}
\titem{\{captcha\_host, ProtocolHostPort\}}
Host part of the URL sent to the user,
and the port number where ejabberd listens for CAPTCHA requests.
The URL sent to the user is formed by: \term{http://Host:Port/captcha/}
The default value is: the first hostname configured, and port 5280.
If the port number you specify does not match exactly an ejabberd listener
(because you are using a reverse proxy or other port-forwarding tool),
then specify also the transfer protocol, as seen in the example below.
\end{description}
Additionally, an \term{ejabberd\_http} listener must be enabled with the \term{captcha} option.
@ -1649,6 +1652,7 @@ Example configuration:
{captcha_cmd, "/lib/ejabberd/priv/bin/captcha.sh"}.
{captcha_host, "example.org:5280"}.
%% {captcha_host, "https://example.org:443"}.
{listen,
[

View File

@ -406,23 +406,21 @@ get_prog_name() ->
get_url(Str) ->
CaptchaHost = ejabberd_config:get_local_option(captcha_host),
case CaptchaHost of
Host when is_list(Host) ->
TransferProt = atom_to_list(get_transfer_protocol(CaptchaHost)),
TransferProt ++ "://" ++ Host ++ "/captcha/" ++ Str;
case string:tokens(CaptchaHost, ":") of
[TransferProt, Host, PortString] ->
TransferProt ++ ":" ++ Host ++ ":" ++ PortString ++ "/captcha/" ++ Str;
[Host, PortString] ->
TransferProt = atom_to_list(get_transfer_protocol(PortString)),
TransferProt ++ "://" ++ Host ++ ":" ++ PortString ++ "/captcha/" ++ Str;
_ ->
"http://" ++ ?MYNAME ++ ":5280/captcha/" ++ Str
end.
get_transfer_protocol(CaptchaHost) ->
PortNumber = get_port_number_from_captcha_host_option(CaptchaHost),
get_transfer_protocol(PortString) ->
PortNumber = list_to_integer(PortString),
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(
@ -435,7 +433,8 @@ get_port_listeners(PortNumber) ->
get_captcha_transfer_protocol([]) ->
throw("The port number mentioned in captcha_host is not "
"a ejabberd_http listener with 'captcha' option.");
"a ejabberd_http listener with 'captcha' option. "
"Change the port number or specify http:// in that option.");
get_captcha_transfer_protocol([{{_Port, _Ip, tcp}, ejabberd_http, Opts}
| Listeners]) ->
case lists:member(captcha, Opts) of