WIP: NWO
This commit is contained in:
parent
2508b17637
commit
8251a805a7
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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(".")
|
||||
|
||||
@ -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};
|
||||
_ -> {error, bad_zsp}
|
||||
end.
|
||||
{ok, Meta} -> {ok, Meta};
|
||||
_ -> {error, bad_zsp}
|
||||
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, _} -> {error, bad_realm};
|
||||
error -> {error, bad_zsp}
|
||||
{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}.
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user