]> granicus.if.org Git - ejabberd/commitdiff
If the port number isn't listener, then specify the protocol (EJAB-1418)
authorBadlop <badlop@process-one.net>
Thu, 3 Mar 2011 10:35:47 +0000 (11:35 +0100)
committerBadlop <badlop@process-one.net>
Thu, 3 Mar 2011 10:38:00 +0000 (11:38 +0100)
doc/guide.tex
src/ejabberd_captcha.erl

index c51baca90bf9d784af3a2ca4234587b0d80bc5be..72bb132471a172a797c7778337b6d850e54a5180 100644 (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,
  [
index 0f3aee76cd3910252d63a61cd96392d434027073..797a6152daa46e337ab0a9c0d50fbfa0e41a0fc9 100644 (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