zx/zomp/lib/otpr/zx/0.12.8/src/zx_userconf.erl
Craig Everett e397d57ef2 Minor fixes:
- Fix report propagation bug in zx_daemon
- Extend download timeout
2023-04-29 17:53:18 +09:00

88 lines
2.2 KiB
Erlang

%%% @doc
%%% ZX UserConf
%%%
%%% Handling user configuration data.
%%% @end
-module(zx_userconf).
-vsn("0.12.8").
-author("Craig Everett <zxq9@zxq9.com>").
-copyright("Craig Everett <zxq9@zxq9.com>").
-license("GPL-3.0").
-export([new/0, save/1, load/1, merge/2, merge/3, path/1]).
-type data() :: #{realm := string(),
username := string(),
realname := string(),
contact_info := [zx:contact_info()],
keys := [binary()]}.
new() ->
#{realm => "",
username => "",
realname => "",
contact_info => "",
keys => []}.
-spec save(data()) -> ok | {error, file:posix()}.
save(Data = #{realm := Realm, username := UserName}) ->
Path = path({Realm, UserName}),
ok = filelib:ensure_dir(Path),
Terms = maps:to_list(Data),
zx_lib:write_terms(Path, Terms).
-spec load(UserID) -> Result
when UserID :: zx:user_id(),
Result :: {ok, zx:userconf()}
| {error, Reason},
Reason :: bad_realm
| bad_user
| file:posix().
load(UserID = {Realm, _}) ->
case zx_lib:realm_exists(Realm) of
true -> load2(UserID);
false -> {error, bad_realm}
end.
load2(UserID) ->
case file:consult(path(UserID)) of
{ok, Terms} -> {ok, maps:from_list(Terms)};
{error, enoent} -> {error, bad_user};
Error -> Error
end.
-spec merge(New, Old) -> Merged
when New :: data(),
Old :: data(),
Merged :: data().
merge(New, Old) ->
merge(New, Old, []).
-spec merge(New, Old, Keys) -> Merged
when New :: data(),
Old :: data(),
Keys :: [zx:key_data()],
Merged :: data().
merge(New, Old, KeyData) ->
KeySet = sets:from_list([element(1, K) || K <- KeyData]),
NewKeySet = sets:from_list(maps:get(keys, New)),
OldKeySet = sets:from_list(maps:get(keys, Old)),
UltimateKeySet = sets:intersection([KeySet, NewKeySet, OldKeySet]),
maps:put(keys, sets:to_list(UltimateKeySet), maps:merge(Old, New)).
-spec path(zx:user_id()) -> file:filename().
path({Realm, UserName}) ->
filename:join(zx_lib:path(etc, Realm), UserName ++ ".user").