diff options
Diffstat (limited to 'lib/kernel/src/auth.erl')
-rw-r--r-- | lib/kernel/src/auth.erl | 94 |
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) -> |