From 4caf2c8674420ac8f9f5617ec66f44372eb7d802 Mon Sep 17 00:00:00 2001 From: Badlop Date: Thu, 3 Mar 2011 11:35:47 +0100 Subject: [PATCH] If the port number isn't listener, then specify the protocol (EJAB-1418) --- doc/guide.tex | 6 +++++- src/ejabberd_captcha.erl | 21 ++++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/doc/guide.tex b/doc/guide.tex index 64bd61d01..381eef342 100644 --- a/doc/guide.tex +++ b/doc/guide.tex @@ -1709,11 +1709,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. @@ -1725,6 +1728,7 @@ Example configuration: {captcha_cmd, "/lib/ejabberd/priv/bin/captcha.sh"}. {captcha_host, "example.org:5280"}. +%% {captcha_host, "https://example.org:443"}. {listen, [ diff --git a/src/ejabberd_captcha.erl b/src/ejabberd_captcha.erl index 9ddd4f142..0c939b58f 100644 --- a/src/ejabberd_captcha.erl +++ b/src/ejabberd_captcha.erl @@ -626,23 +626,21 @@ get_prog_name() -> %% @doc (Str::string()) -> string() 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( @@ -655,7 +653,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