You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by rn...@apache.org on 2015/07/05 14:51:40 UTC

couch commit: updated refs/heads/2740-force-loopback to bea89a4

Repository: couchdb-couch
Updated Branches:
  refs/heads/2740-force-loopback [created] bea89a4da


Force loopback if there are no admins

COUCHDB-2740


Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch/commit/bea89a4d
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch/tree/bea89a4d
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch/diff/bea89a4d

Branch: refs/heads/2740-force-loopback
Commit: bea89a4dae3220a5d26adb747d55fb0c8d24afa8
Parents: f29e590
Author: Robert Newson <rn...@apache.org>
Authored: Sun Jul 5 13:51:04 2015 +0100
Committer: Robert Newson <rn...@apache.org>
Committed: Sun Jul 5 13:51:04 2015 +0100

----------------------------------------------------------------------
 src/couch_httpd.erl | 12 +-----------
 src/couch_util.erl  | 31 +++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/bea89a4d/src/couch_httpd.erl
----------------------------------------------------------------------
diff --git a/src/couch_httpd.erl b/src/couch_httpd.erl
index 8e5555c..81926e4 100644
--- a/src/couch_httpd.erl
+++ b/src/couch_httpd.erl
@@ -87,8 +87,7 @@ start_link(https) ->
          {ssl_opts, SslOpts}],
     start_link(https, Options).
 start_link(Name, Options) ->
-    BindAddress = with_default(config:get("httpd", "bind_address"), any),
-    validate_bind_address(BindAddress),
+    BindAddress = couch_util:bind_address("httpd", any),
     DefaultSpec = "{couch_httpd_db, handle_request}",
     DefaultFun = make_arity_1_fun(
         config:get("httpd", "default_handler", DefaultSpec)
@@ -1085,12 +1084,3 @@ check_for_last(#mp{buffer=Buffer, data_fun=DataFun}=Mp) ->
         check_for_last(Mp#mp{buffer= <<Buffer/binary, Data/binary>>,
                 data_fun = DataFun2})
     end.
-
-validate_bind_address(Address) ->
-    case inet_parse:address(Address) of
-        {ok, _} -> ok;
-        _ -> throw({error, invalid_bind_address})
-    end.
-
-with_default(undefined, Default) -> Default;
-with_default(Value, _) -> Value.

http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/bea89a4d/src/couch_util.erl
----------------------------------------------------------------------
diff --git a/src/couch_util.erl b/src/couch_util.erl
index 742ab70..a1d4e66 100644
--- a/src/couch_util.erl
+++ b/src/couch_util.erl
@@ -34,6 +34,7 @@
 -export([find_in_binary/2]).
 -export([callback_exists/3, validate_callback_exists/3]).
 -export([with_proc/4]).
+-export([bind_address/2]).
 
 -include_lib("couch/include/couch_db.hrl").
 
@@ -587,3 +588,33 @@ with_proc(M, F, A, Timeout) ->
         erlang:demonitor(Ref, [flush]),
         {error, timeout}
     end.
+
+%% Insist on binding to localhost until admin is created
+bind_address(Section, Default) ->
+    case couch_server:has_admins() of
+        true ->
+            Address = config:get(Section, "bind_address", Default),
+            ok = validate_bind_address(Address),
+            Address;
+        false ->
+            Loopback = loopback_address(),
+            couch_log:error("Forcing bind_address to ~p as no admin is configured!", [Loopback]),
+            Loopback
+    end.
+
+validate_bind_address(any) ->
+    ok;
+validate_bind_address(Address) ->
+    case inet_parse:address(Address) of
+        {ok, _} -> ok;
+        _ -> throw({error, invalid_bind_address})
+    end.
+
+loopback_address() ->
+    {ok, IFs} = inet:getifaddrs(),
+    [{_, Opts} | _] = lists:filter(fun is_loopback/1, IFs),
+    hd(lists:sort([A || {addr, A} <- Opts])).
+
+is_loopback({_Name, Opts}) ->
+    {flags, Flags} = lists:keyfind(flags, 1, Opts),
+    lists:member(loopback, Flags).