This commit is contained in:
Craig Everett 2019-12-11 20:21:28 +09:00
parent 2508b17637
commit 8251a805a7
4 changed files with 81 additions and 78 deletions

View File

@ -42,7 +42,7 @@
key_data/0, key_bin/0, key_id/0, key_name/0,
user_id/0, user_name/0, contact_info/0, user_data/0,
lower0_9/0, label/0,
package_meta/0, ss_tag/0, search_tag/0, description/0, package_type/0,
ss_tag/0, search_tag/0, description/0, package_type/0,
outcome/0]).
-include("zx_logger.hrl").
@ -77,20 +77,7 @@
-type contact_info() :: {Type :: string(), Data :: string()}.
-type lower0_9() :: [$a..$z | $0..$9 | $_].
-type label() :: [$a..$z | $0..$9 | $_ | $- | $.].
-type package_meta() :: #{package_id := package_id(),
name := string(),
desc := string(),
author := string(),
a_email := string(),
copyright := string(),
c_email := string(),
ws_url := string(),
repo_url := string(),
prefix := string(),
tags := [search_tag()],
deps := [package_id()],
type := package_type()}.
-type ss_tag() :: {serial(), calendar:timestamp()}.
-type ss_tag() :: {serial(), erlang:timestamp()}.
-type search_tag() :: string().
-type description() :: {description,
@ -793,7 +780,7 @@ fetch2(ID) ->
-spec execute(Type, PackageID, Meta, Dir, RunArgs) -> no_return()
when Type :: app | cli | gui | lib,
PackageID :: package_id(),
Meta :: package_meta(),
Meta :: zx_zsp:meta(),
Dir :: file:filename(),
RunArgs :: [string()].
%% @private

View File

@ -118,7 +118,7 @@ submit2(ZspBin) ->
end.
submit3(ZspBin) ->
{ok, {{Realm, Name, Version}, KeyName, _, _, _}} = zx_zsp:meta(ZspBin),
{ok, #{project_id := {Realm, Name, Version}, key_name := KeyName}} = zx_zsp:meta(ZspBin),
UserName = select_auth(Realm),
case zx_daemon:get_key(private, {Realm, KeyName}) of
{ok, DKey} ->
@ -187,9 +187,9 @@ review4(PackageID, Socket) ->
review5(PackageID, ZspBin) ->
{ok, Requested} = zx_lib:package_string(PackageID),
case zx_zsp:meta(ZspBin) of
{ok, {PackageID, _, _, _, _}} ->
{ok, #{package_id := PackageID}} ->
zx_zsp:extract(ZspBin, cwd);
{ok, {UnexpectedID, _, _, _, _}} ->
{ok, #{package_id := UnexpectedID}} ->
{ok, Unexpected} = zx_lib:package_string(UnexpectedID),
Message = "Requested ~ts, but inside was ~ts! Aborting.",
ok = log(warning, Message, [Requested, Unexpected]),
@ -218,14 +218,13 @@ accept2(ZspBin) ->
error -> {error, bad_package}
end.
accept3(ZspBin, Meta) ->
Realm = element(1, element(1, Meta)),
accept3(ZspBin, Meta = #{package_id := {Realm, _, _}}) ->
case connect_auth(Realm) of
{ok, AuthConn} -> accept4(ZspBin, Meta, AuthConn);
Error -> Error
end.
accept4(ZspBin, Meta = {_, KeyName, _, _, _}, AuthConn = {_, KeyName, Key, _, _}) ->
accept4(ZspBin, Meta = #{key_name := KeyName}, AuthConn = {_, KeyName, Key, _, _}) ->
case zx_zsp:verify(ZspBin, Key) of
true ->
accept5(ZspBin, Meta, AuthConn);
@ -237,7 +236,7 @@ accept4(ZspBin, Meta = {_, KeyName, _, _, _}, AuthConn = {_, KeyName, Key, _, _}
ok = io:format(Message),
{error, bad_sig}
end;
accept4(_, {_, PackageKey, _, _, _}, {_, UserKey, _, _, _}) ->
accept4(_, #{key_name := PackageKey}, {_, UserKey, _, _, _}) ->
Message =
"~nERROR: BAD KEY~n"
"The package signature key and your auth key do not match.~n"
@ -529,8 +528,8 @@ connect_auth3(Realm, RealmConf, UserData) ->
connect_auth4(Socket, Realm, UD = {UserName, KeyName, Key}) ->
Null = 0,
Timestamp = calendar:universal_time(),
Payload = {Realm, Timestamp, UserName, KeyName},
Now = os:timestamp(),
Payload = {Realm, Now, UserName, KeyName},
NullRequest = pack_and_sign(Null, Payload, Key),
ok = gen_tcp:send(Socket, <<"ZOMP AUTH 1:", NullRequest/binary>>),
receive

View File

@ -231,7 +231,7 @@ realm_meta(Realm) ->
-spec read_project_meta() -> Result
when Result :: {ok, zx:package_meta()}
when Result :: {ok, zx_zsp:meta()}
| {error, file:posix()}.
%% @private
%% @equiv read_meta(".")

View File

@ -12,7 +12,8 @@
-copyright("Craig Everett <zxq9@zxq9.com>").
-license("GPL-3.0").
-export([pack/2,
-export([new_meta/0,
pack/2,
unpack/1, blithely_unpack/1,
extract/2, blithely_extract/2,
verify/1, verify/2,
@ -24,17 +25,41 @@
-include("zx_logger.hrl").
-type meta() :: {PackageID :: zx:package_id(),
KeyName :: zx:key_name(),
DisplayName :: string(),
Desc :: string(),
Author :: string(),
AEmail :: string(),
WebURL :: string(),
RepoURL :: string(),
Tags :: [string()],
Deps :: [zx:package_id()],
Modules :: [string()]}.
-type meta() :: #{package_id := undefined | zx:package_id(),
name := string(),
desc := string(),
author := string(),
a_email := string(),
copyright := string(),
c_email := string(),
ws_url := string(),
repo_url := string(),
prefix := string(),
tags := [string()],
deps := [zx:package_id()],
modules := [string()],
type := undefined | zx:package_type(),
key_name := none | zx:key_name()}.
-spec new_meta() -> meta().
new_meta() ->
#{package_id => undefined,
name => "",
desc => "",
author => "",
a_email => "",
copyright => "",
c_email => "",
ws_url => "",
repo_url => "",
prefix => "",
tags => [],
deps => [],
modules => [],
type => undefined,
key_name => none}.
-spec pack(TargetDir, Key) -> Result
@ -77,23 +102,11 @@ pack3(TargetDir, PackageID, Meta, {KeyName, Key}, ZspFile) ->
ok = erl_tar:create(TarGzPath, Targets, [compressed]),
{ok, TgzBin} = file:read_file(TarGzPath),
ok = file:delete(TarGzPath),
MetaData =
{PackageID,
KeyName,
maps:get(name, Meta, Name),
maps:get(type, Meta),
maps:get(desc, Meta, ""),
maps:get(author, Meta, ""),
maps:get(a_email, Meta, ""),
maps:get(ws_url, Meta, ""),
maps:get(repo_url, Meta, ""),
maps:get(tags, Meta, []),
maps:get(deps, Meta, []),
Modules},
MetaData = Meta#{key_name := KeyName, modules := Modules},
MetaBin = term_to_binary(MetaData),
MetaSize = byte_size(MetaBin),
SignMe = <<MetaSize:24, MetaBin:MetaSize/binary, TgzBin/binary>>,
Sig = public_key:sign(SignMe, sha512, Key),
Sig = zx_key:sign(SignMe, Key),
SigSize = byte_size(Sig),
ZspData = <<SigSize:24, Sig:SigSize/binary, SignMe/binary>>,
ok = file:set_cwd(CWD),
@ -119,20 +132,6 @@ unpack(ZspFile) ->
end.
-spec blithely_unpack(ZspFile) -> Outcome
when ZspFile :: file:filename(),
Outcome :: ok
| {error, Reason},
Reason :: bad_zsp
| file:posix().
blithely_unpack(ZspFile) ->
case file:read_file(ZspFile) of
{ok, ZspBin} -> blithely_extract(ZspBin, cwd);
Error -> Error
end.
-spec extract(ZspBin, Location) -> Outcome
when ZspBin :: binary(),
Location :: cwd
@ -150,13 +149,28 @@ extract(ZspBin, Location) ->
end.
-spec blithely_unpack(ZspFile) -> Outcome
when ZspFile :: file:filename(),
Outcome :: ok
| {error, Reason},
Reason :: bad_zsp
| file:posix().
blithely_unpack(ZspFile) ->
case file:read_file(ZspFile) of
{ok, ZspBin} -> blithely_extract(ZspBin, cwd);
Error -> Error
end.
blithely_extract(ZspBin, cwd) ->
{ok, Meta} = meta(ZspBin),
{ok, PackageString} = zx_lib:package_string(element(1, Meta)),
PackageID = maps:get(package_id, Meta),
{ok, PackageString} = zx_lib:package_string(PackageID),
install(ZspBin, PackageString);
blithely_extract(ZspBin, lib) ->
{ok, Meta} = meta(ZspBin),
PackageID = element(1, Meta),
PackageID = maps:get(package_id, Meta),
Path = zx_lib:ppath(lib, PackageID),
install(ZspBin, Path).
@ -221,16 +235,18 @@ verify(<<Size:24, Sig:Size/binary, Signed/binary>>, PubKey) ->
meta(<<SS:24, _:SS/binary, MS:24, MetaBin:MS/binary, _/binary>>) ->
case zx_lib:b_to_ts(MetaBin) of
{ok, Meta = {_, _, _, _, _}} -> {ok, Meta};
{ok, Meta} -> {ok, Meta};
_ -> {error, bad_zsp}
end.
end;
meta(_) ->
{error, bad_zsp}.
-spec package_id(binary()) -> {ok, zx:package_id()} | {error, bad_zsp}.
package_id(Bin) ->
case meta(Bin) of
{ok, Meta} -> {ok, element(1, Meta)};
{ok, Meta} -> {ok, maps:get(package_id, Meta)};
Error -> Error
end.
@ -275,16 +291,17 @@ resign(_, _, _) ->
resign2(Realm, KeyName, Key, MetaBin, TarGZ) ->
case zx_lib:b_to_ts(MetaBin) of
{ok, Meta = {{Realm, _, _}, _, _, _, _}} -> resign3(KeyName, Key, Meta, TarGZ);
{ok, Meta} -> resign3(Realm, KeyName, Key, Meta, TarGZ);
{ok, _} -> {error, bad_realm};
error -> {error, bad_zsp}
end.
resign3(KeyName, Key, Meta, TarGZ) ->
MetaBin = term_to_binary(setelement(2, Meta, KeyName)),
resign3(Realm, KeyName, Key, Meta = #{package_id = {_, Name, Version}}, TarGZ) ->
NewMeta = Meta#{package_id := {Realm, Name, Version}, key_name := KeyName},
MetaBin = term_to_binary(NewMeta),
MetaSize = byte_size(MetaBin),
SignMe = <<MetaSize:24, MetaBin:MetaSize/binary, TarGZ/binary>>,
Sig = public_key:sign(SignMe, sha512, Key),
Sig = zx_key:sign(SignMe, Key),
SigSize = byte_size(Sig),
ZspBin = <<SigSize:24, Sig:SigSize/binary, SignMe/binary>>,
{ok, ZspBin}.