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).