summaryrefslogtreecommitdiff
path: root/lib/kernel/src/auth.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kernel/src/auth.erl')
-rw-r--r--lib/kernel/src/auth.erl94
1 files changed, 66 insertions, 28 deletions
diff --git a/lib/kernel/src/auth.erl b/lib/kernel/src/auth.erl
index f61ceb9461..8f2fc99647 100644
--- a/lib/kernel/src/auth.erl
+++ b/lib/kernel/src/auth.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2021. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2022. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -45,7 +45,7 @@
-type cookie() :: atom().
-record(state, {
our_cookie :: cookie(), %% Our own cookie
- other_cookies :: ets:tab() %% The send-cookies of other nodes
+ other_cookies :: ets:table()%% The send-cookies of other nodes
}).
-type state() :: #state{}.
@@ -375,26 +375,64 @@ init_setcookie([], OurCookies, OtherCookies) ->
ets_new_cookies() ->
ets:new(cookies, [?COOKIE_ETS_PROTECTION]).
+%% Read cookie from:
+%% 1. $HOME/.erlang.cookie
+%% 2. $XDG_CONFIG_HOME/erlang/.erlang.cookie
+%%
+%% If neither are present, we generate $HOME/.erlang.cookie
read_cookie() ->
+ XDGPath = filename:join(
+ filename:basedir(user_config, "erlang"),
+ ".erlang.cookie"),
case init:get_argument(home) of
{ok, [[Home]]} ->
- read_cookie(filename:join(Home, ".erlang.cookie"));
+ HomePath = filename:join(Home, ".erlang.cookie"),
+ case read_cookie(HomePath) of
+ {error, enoent} ->
+ case read_cookie(XDGPath) of
+ {error, enoent} ->
+ case create_cookie(HomePath) of
+ ok ->
+ {ok, Cookie} = read_cookie(HomePath),
+ Cookie;
+ Error -> Error
+ end;
+ {ok, Cookie} ->
+ Cookie;
+ Error ->
+ Error
+ end;
+ {ok, Cookie} ->
+ Cookie;
+ Error ->
+ Error
+ end;
_ ->
- {error, "No home for cookie file"}
+ %% Failed to read find home, try xdg path
+ case read_cookie(XDGPath) of
+ {error, enoent} ->
+ case create_cookie(XDGPath) of
+ ok ->
+ {ok, Cookie} = read_cookie(XDGPath),
+ Cookie;
+ Error -> Error
+ end;
+ {ok, Cookie} ->
+ Cookie;
+ _Error ->
+ {error, "No home for cookie file"}
+ end
end.
read_cookie(Name) ->
case file:raw_read_file_info(Name) of
{ok, #file_info {type=Type, mode=Mode, size=Size}} ->
case check_attributes(Name, Type, Mode, os:type()) of
- ok -> read_cookie(Name, Size);
- Error -> Error
- end;
- {error, enoent} ->
- case create_cookie(Name) of
- ok -> read_cookie(Name);
+ ok -> {ok, read_cookie(Name, Size)};
Error -> Error
end;
+ {error, enoent} ->
+ {error, enoent};
{error, Reason} ->
{error, make_error(Name, Reason)}
end.
@@ -454,24 +492,24 @@ create_cookie(Name) ->
bxor erlang:unique_integer()),
Cookie = random_cookie(20, Seed, []),
case file:open(Name, [write, raw]) of
- {ok, File} ->
- R1 = file:write(File, Cookie),
- ok = file:close(File),
- R2 = file:raw_write_file_info(Name, make_info(Name)),
- case {R1, R2} of
- {ok, ok} ->
- ok;
- {{error,Reason}, _} ->
- {error,
- lists:flatten(
- io_lib:format("Failed to write to cookie file '~ts': ~p", [Name, Reason]))};
- {ok, {error, Reason}} ->
- {error, "Failed to change mode: " ++ atom_to_list(Reason)}
- end;
- {error,Reason} ->
- {error,
- lists:flatten(
- io_lib:format("Failed to create cookie file '~ts': ~p", [Name, Reason]))}
+ {ok, File} ->
+ R1 = file:write(File, Cookie),
+ ok = file:close(File),
+ R2 = file:raw_write_file_info(Name, make_info(Name)),
+ case {R1, R2} of
+ {ok, ok} ->
+ ok;
+ {{error,Reason}, _} ->
+ {error,
+ lists:flatten(
+ io_lib:format("Failed to write to cookie file '~ts': ~p", [Name, Reason]))};
+ {ok, {error, Reason}} ->
+ {error, "Failed to change mode: " ++ atom_to_list(Reason)}
+ end;
+ {error,Reason} ->
+ {error,
+ lists:flatten(
+ io_lib:format("Failed to create cookie file '~ts': ~p", [Name, Reason]))}
end.
random_cookie(0, _, Result) ->