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,
|
key_data/0, key_bin/0, key_id/0, key_name/0,
|
||||||
user_id/0, user_name/0, contact_info/0, user_data/0,
|
user_id/0, user_name/0, contact_info/0, user_data/0,
|
||||||
lower0_9/0, label/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]).
|
outcome/0]).
|
||||||
|
|
||||||
-include("zx_logger.hrl").
|
-include("zx_logger.hrl").
|
||||||
@ -77,20 +77,7 @@
|
|||||||
-type contact_info() :: {Type :: string(), Data :: string()}.
|
-type contact_info() :: {Type :: string(), Data :: string()}.
|
||||||
-type lower0_9() :: [$a..$z | $0..$9 | $_].
|
-type lower0_9() :: [$a..$z | $0..$9 | $_].
|
||||||
-type label() :: [$a..$z | $0..$9 | $_ | $- | $.].
|
-type label() :: [$a..$z | $0..$9 | $_ | $- | $.].
|
||||||
-type package_meta() :: #{package_id := package_id(),
|
-type ss_tag() :: {serial(), erlang:timestamp()}.
|
||||||
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 search_tag() :: string().
|
-type search_tag() :: string().
|
||||||
|
|
||||||
-type description() :: {description,
|
-type description() :: {description,
|
||||||
@ -793,7 +780,7 @@ fetch2(ID) ->
|
|||||||
-spec execute(Type, PackageID, Meta, Dir, RunArgs) -> no_return()
|
-spec execute(Type, PackageID, Meta, Dir, RunArgs) -> no_return()
|
||||||
when Type :: app | cli | gui | lib,
|
when Type :: app | cli | gui | lib,
|
||||||
PackageID :: package_id(),
|
PackageID :: package_id(),
|
||||||
Meta :: package_meta(),
|
Meta :: zx_zsp:meta(),
|
||||||
Dir :: file:filename(),
|
Dir :: file:filename(),
|
||||||
RunArgs :: [string()].
|
RunArgs :: [string()].
|
||||||
%% @private
|
%% @private
|
||||||
|
|||||||
@ -118,7 +118,7 @@ submit2(ZspBin) ->
|
|||||||
end.
|
end.
|
||||||
|
|
||||||
submit3(ZspBin) ->
|
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),
|
UserName = select_auth(Realm),
|
||||||
case zx_daemon:get_key(private, {Realm, KeyName}) of
|
case zx_daemon:get_key(private, {Realm, KeyName}) of
|
||||||
{ok, DKey} ->
|
{ok, DKey} ->
|
||||||
@ -187,9 +187,9 @@ review4(PackageID, Socket) ->
|
|||||||
review5(PackageID, ZspBin) ->
|
review5(PackageID, ZspBin) ->
|
||||||
{ok, Requested} = zx_lib:package_string(PackageID),
|
{ok, Requested} = zx_lib:package_string(PackageID),
|
||||||
case zx_zsp:meta(ZspBin) of
|
case zx_zsp:meta(ZspBin) of
|
||||||
{ok, {PackageID, _, _, _, _}} ->
|
{ok, #{package_id := PackageID}} ->
|
||||||
zx_zsp:extract(ZspBin, cwd);
|
zx_zsp:extract(ZspBin, cwd);
|
||||||
{ok, {UnexpectedID, _, _, _, _}} ->
|
{ok, #{package_id := UnexpectedID}} ->
|
||||||
{ok, Unexpected} = zx_lib:package_string(UnexpectedID),
|
{ok, Unexpected} = zx_lib:package_string(UnexpectedID),
|
||||||
Message = "Requested ~ts, but inside was ~ts! Aborting.",
|
Message = "Requested ~ts, but inside was ~ts! Aborting.",
|
||||||
ok = log(warning, Message, [Requested, Unexpected]),
|
ok = log(warning, Message, [Requested, Unexpected]),
|
||||||
@ -218,14 +218,13 @@ accept2(ZspBin) ->
|
|||||||
error -> {error, bad_package}
|
error -> {error, bad_package}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
accept3(ZspBin, Meta) ->
|
accept3(ZspBin, Meta = #{package_id := {Realm, _, _}}) ->
|
||||||
Realm = element(1, element(1, Meta)),
|
|
||||||
case connect_auth(Realm) of
|
case connect_auth(Realm) of
|
||||||
{ok, AuthConn} -> accept4(ZspBin, Meta, AuthConn);
|
{ok, AuthConn} -> accept4(ZspBin, Meta, AuthConn);
|
||||||
Error -> Error
|
Error -> Error
|
||||||
end.
|
end.
|
||||||
|
|
||||||
accept4(ZspBin, Meta = {_, KeyName, _, _, _}, AuthConn = {_, KeyName, Key, _, _}) ->
|
accept4(ZspBin, Meta = #{key_name := KeyName}, AuthConn = {_, KeyName, Key, _, _}) ->
|
||||||
case zx_zsp:verify(ZspBin, Key) of
|
case zx_zsp:verify(ZspBin, Key) of
|
||||||
true ->
|
true ->
|
||||||
accept5(ZspBin, Meta, AuthConn);
|
accept5(ZspBin, Meta, AuthConn);
|
||||||
@ -237,7 +236,7 @@ accept4(ZspBin, Meta = {_, KeyName, _, _, _}, AuthConn = {_, KeyName, Key, _, _}
|
|||||||
ok = io:format(Message),
|
ok = io:format(Message),
|
||||||
{error, bad_sig}
|
{error, bad_sig}
|
||||||
end;
|
end;
|
||||||
accept4(_, {_, PackageKey, _, _, _}, {_, UserKey, _, _, _}) ->
|
accept4(_, #{key_name := PackageKey}, {_, UserKey, _, _, _}) ->
|
||||||
Message =
|
Message =
|
||||||
"~nERROR: BAD KEY~n"
|
"~nERROR: BAD KEY~n"
|
||||||
"The package signature key and your auth key do not match.~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}) ->
|
connect_auth4(Socket, Realm, UD = {UserName, KeyName, Key}) ->
|
||||||
Null = 0,
|
Null = 0,
|
||||||
Timestamp = calendar:universal_time(),
|
Now = os:timestamp(),
|
||||||
Payload = {Realm, Timestamp, UserName, KeyName},
|
Payload = {Realm, Now, UserName, KeyName},
|
||||||
NullRequest = pack_and_sign(Null, Payload, Key),
|
NullRequest = pack_and_sign(Null, Payload, Key),
|
||||||
ok = gen_tcp:send(Socket, <<"ZOMP AUTH 1:", NullRequest/binary>>),
|
ok = gen_tcp:send(Socket, <<"ZOMP AUTH 1:", NullRequest/binary>>),
|
||||||
receive
|
receive
|
||||||
|
|||||||
@ -231,7 +231,7 @@ realm_meta(Realm) ->
|
|||||||
|
|
||||||
|
|
||||||
-spec read_project_meta() -> Result
|
-spec read_project_meta() -> Result
|
||||||
when Result :: {ok, zx:package_meta()}
|
when Result :: {ok, zx_zsp:meta()}
|
||||||
| {error, file:posix()}.
|
| {error, file:posix()}.
|
||||||
%% @private
|
%% @private
|
||||||
%% @equiv read_meta(".")
|
%% @equiv read_meta(".")
|
||||||
|
|||||||
@ -12,7 +12,8 @@
|
|||||||
-copyright("Craig Everett <zxq9@zxq9.com>").
|
-copyright("Craig Everett <zxq9@zxq9.com>").
|
||||||
-license("GPL-3.0").
|
-license("GPL-3.0").
|
||||||
|
|
||||||
-export([pack/2,
|
-export([new_meta/0,
|
||||||
|
pack/2,
|
||||||
unpack/1, blithely_unpack/1,
|
unpack/1, blithely_unpack/1,
|
||||||
extract/2, blithely_extract/2,
|
extract/2, blithely_extract/2,
|
||||||
verify/1, verify/2,
|
verify/1, verify/2,
|
||||||
@ -24,17 +25,41 @@
|
|||||||
-include("zx_logger.hrl").
|
-include("zx_logger.hrl").
|
||||||
|
|
||||||
|
|
||||||
-type meta() :: {PackageID :: zx:package_id(),
|
-type meta() :: #{package_id := undefined | zx:package_id(),
|
||||||
KeyName :: zx:key_name(),
|
name := string(),
|
||||||
DisplayName :: string(),
|
desc := string(),
|
||||||
Desc :: string(),
|
author := string(),
|
||||||
Author :: string(),
|
a_email := string(),
|
||||||
AEmail :: string(),
|
copyright := string(),
|
||||||
WebURL :: string(),
|
c_email := string(),
|
||||||
RepoURL :: string(),
|
ws_url := string(),
|
||||||
Tags :: [string()],
|
repo_url := string(),
|
||||||
Deps :: [zx:package_id()],
|
prefix := string(),
|
||||||
Modules :: [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
|
-spec pack(TargetDir, Key) -> Result
|
||||||
@ -77,23 +102,11 @@ pack3(TargetDir, PackageID, Meta, {KeyName, Key}, ZspFile) ->
|
|||||||
ok = erl_tar:create(TarGzPath, Targets, [compressed]),
|
ok = erl_tar:create(TarGzPath, Targets, [compressed]),
|
||||||
{ok, TgzBin} = file:read_file(TarGzPath),
|
{ok, TgzBin} = file:read_file(TarGzPath),
|
||||||
ok = file:delete(TarGzPath),
|
ok = file:delete(TarGzPath),
|
||||||
MetaData =
|
MetaData = Meta#{key_name := KeyName, modules := Modules},
|
||||||
{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},
|
|
||||||
MetaBin = term_to_binary(MetaData),
|
MetaBin = term_to_binary(MetaData),
|
||||||
MetaSize = byte_size(MetaBin),
|
MetaSize = byte_size(MetaBin),
|
||||||
SignMe = <<MetaSize:24, MetaBin:MetaSize/binary, TgzBin/binary>>,
|
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),
|
SigSize = byte_size(Sig),
|
||||||
ZspData = <<SigSize:24, Sig:SigSize/binary, SignMe/binary>>,
|
ZspData = <<SigSize:24, Sig:SigSize/binary, SignMe/binary>>,
|
||||||
ok = file:set_cwd(CWD),
|
ok = file:set_cwd(CWD),
|
||||||
@ -119,20 +132,6 @@ unpack(ZspFile) ->
|
|||||||
end.
|
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
|
-spec extract(ZspBin, Location) -> Outcome
|
||||||
when ZspBin :: binary(),
|
when ZspBin :: binary(),
|
||||||
Location :: cwd
|
Location :: cwd
|
||||||
@ -150,13 +149,28 @@ extract(ZspBin, Location) ->
|
|||||||
end.
|
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) ->
|
blithely_extract(ZspBin, cwd) ->
|
||||||
{ok, Meta} = meta(ZspBin),
|
{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);
|
install(ZspBin, PackageString);
|
||||||
blithely_extract(ZspBin, lib) ->
|
blithely_extract(ZspBin, lib) ->
|
||||||
{ok, Meta} = meta(ZspBin),
|
{ok, Meta} = meta(ZspBin),
|
||||||
PackageID = element(1, Meta),
|
PackageID = maps:get(package_id, Meta),
|
||||||
Path = zx_lib:ppath(lib, PackageID),
|
Path = zx_lib:ppath(lib, PackageID),
|
||||||
install(ZspBin, Path).
|
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>>) ->
|
meta(<<SS:24, _:SS/binary, MS:24, MetaBin:MS/binary, _/binary>>) ->
|
||||||
case zx_lib:b_to_ts(MetaBin) of
|
case zx_lib:b_to_ts(MetaBin) of
|
||||||
{ok, Meta = {_, _, _, _, _}} -> {ok, Meta};
|
{ok, Meta} -> {ok, Meta};
|
||||||
_ -> {error, bad_zsp}
|
_ -> {error, bad_zsp}
|
||||||
end.
|
end;
|
||||||
|
meta(_) ->
|
||||||
|
{error, bad_zsp}.
|
||||||
|
|
||||||
|
|
||||||
-spec package_id(binary()) -> {ok, zx:package_id()} | {error, bad_zsp}.
|
-spec package_id(binary()) -> {ok, zx:package_id()} | {error, bad_zsp}.
|
||||||
|
|
||||||
package_id(Bin) ->
|
package_id(Bin) ->
|
||||||
case meta(Bin) of
|
case meta(Bin) of
|
||||||
{ok, Meta} -> {ok, element(1, Meta)};
|
{ok, Meta} -> {ok, maps:get(package_id, Meta)};
|
||||||
Error -> Error
|
Error -> Error
|
||||||
end.
|
end.
|
||||||
|
|
||||||
@ -275,16 +291,17 @@ resign(_, _, _) ->
|
|||||||
|
|
||||||
resign2(Realm, KeyName, Key, MetaBin, TarGZ) ->
|
resign2(Realm, KeyName, Key, MetaBin, TarGZ) ->
|
||||||
case zx_lib:b_to_ts(MetaBin) of
|
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};
|
{ok, _} -> {error, bad_realm};
|
||||||
error -> {error, bad_zsp}
|
error -> {error, bad_zsp}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
resign3(KeyName, Key, Meta, TarGZ) ->
|
resign3(Realm, KeyName, Key, Meta = #{package_id = {_, Name, Version}}, TarGZ) ->
|
||||||
MetaBin = term_to_binary(setelement(2, Meta, KeyName)),
|
NewMeta = Meta#{package_id := {Realm, Name, Version}, key_name := KeyName},
|
||||||
|
MetaBin = term_to_binary(NewMeta),
|
||||||
MetaSize = byte_size(MetaBin),
|
MetaSize = byte_size(MetaBin),
|
||||||
SignMe = <<MetaSize:24, MetaBin:MetaSize/binary, TarGZ/binary>>,
|
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),
|
SigSize = byte_size(Sig),
|
||||||
ZspBin = <<SigSize:24, Sig:SigSize/binary, SignMe/binary>>,
|
ZspBin = <<SigSize:24, Sig:SigSize/binary, SignMe/binary>>,
|
||||||
{ok, ZspBin}.
|
{ok, ZspBin}.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user