Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions src/hex_registry.erl
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,13 @@ encode_names(Names) ->

%% @private
decode_names(Payload, no_verify) ->
#{packages := Packages} = hex_pb_names:decode_msg(Payload, 'Names'),
{ok, Packages};
#{repository := Repository, packages := Packages} = hex_pb_names:decode_msg(Payload, 'Names'),
{ok, #{repository => Repository, packages => Packages}};
Copy link
Copy Markdown
Member

@wojtekmach wojtekmach Jun 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, actually should we just go with this?

Suggested change
#{repository := Repository, packages := Packages} = hex_pb_names:decode_msg(Payload, 'Names'),
{ok, #{repository => Repository, packages => Packages}};
{ok, hex_pb_names:decode_msg(Payload, 'Names')}.

as long as it's safe, i.e. decode_msg doesn't return an error tuple or something?

in hindsight, it was a big mistake to initially return just the subset of the protobuf, just the packages field. With this change we're in sync with the protobuf which means if we ever add another field, we'll immediately start returning it here.

Copy link
Copy Markdown
Contributor Author

@aj-foster aj-foster Jun 6, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Went ahead and made this change in 85e5964 — easy to revert if necessary. I also made the similar change to decode_versions/2 and decode_package/3.

Edit: there was a choice to make for the "verified" function clause, which could use review. I have it verifying the same fields for now.


decode_names(Payload, Repository) ->
case hex_pb_names:decode_msg(Payload, 'Names') of
#{repository := Repository, packages := Packages} ->
{ok, Packages};
{ok, #{repository => Repository, packages => Packages}};
_ ->
{error, unverified}
end.
Expand All @@ -80,13 +80,13 @@ encode_versions(Versions) ->

%% @private
decode_versions(Payload, no_verify) ->
#{packages := Packages} = hex_pb_versions:decode_msg(Payload, 'Versions'),
{ok, Packages};
#{repository := Repository, packages := Packages} = hex_pb_versions:decode_msg(Payload, 'Versions'),
{ok, #{repository => Repository, packages => Packages}};

decode_versions(Payload, Repository) ->
case hex_pb_versions:decode_msg(Payload, 'Versions') of
#{repository := Repository, packages := Packages} ->
{ok, Packages};
{ok, #{repository => Repository, packages => Packages}};
_ ->
{error, unverified}
end.
Expand All @@ -111,13 +111,13 @@ encode_package(Package) ->

%% @private
decode_package(Payload, no_verify, no_verify) ->
#{releases := Releases} = hex_pb_package:decode_msg(Payload, 'Package'),
{ok, Releases};
#{repository := Repository, name := Package, releases := Releases} = hex_pb_package:decode_msg(Payload, 'Package'),
{ok, #{repository => Repository, name => Package, releases => Releases}};

decode_package(Payload, Repository, Package) ->
case hex_pb_package:decode_msg(Payload, 'Package') of
#{repository := Repository, name := Package, releases := Releases} ->
{ok, Releases};
{ok, #{repository => Repository, name => Package, releases => Releases}};
_ ->
{error, unverified}
end.
Expand Down
30 changes: 18 additions & 12 deletions src/hex_repo.erl
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,12 @@
get_names(Config) when is_map(Config) ->
Verify = maps:get(repo_verify_origin, Config, true),
Decoder = fun(Data) ->
case Verify of
true -> hex_registry:decode_names(Data, repo_name(Config));
false -> hex_registry:decode_names(Data, no_verify)
end
{ok, #{packages := Packages}} =
case Verify of
true -> hex_registry:decode_names(Data, repo_name(Config));
false -> hex_registry:decode_names(Data, no_verify)
end,
{ok, Packages}
end,
get_protobuf(Config, <<"names">>, Decoder).

Expand All @@ -55,10 +57,12 @@ get_names(Config) when is_map(Config) ->
get_versions(Config) when is_map(Config) ->
Verify = maps:get(repo_verify_origin, Config, true),
Decoder = fun(Data) ->
case Verify of
true -> hex_registry:decode_versions(Data, repo_name(Config));
false -> hex_registry:decode_versions(Data, no_verify)
end
{ok, #{packages := Packages}} =
case Verify of
true -> hex_registry:decode_versions(Data, repo_name(Config));
false -> hex_registry:decode_versions(Data, no_verify)
end,
{ok, Packages}
end,
get_protobuf(Config, <<"versions">>, Decoder).

Expand All @@ -81,10 +85,12 @@ get_versions(Config) when is_map(Config) ->
get_package(Config, Name) when is_binary(Name) and is_map(Config) ->
Verify = maps:get(repo_verify_origin, Config, true),
Decoder = fun(Data) ->
case Verify of
true -> hex_registry:decode_package(Data, repo_name(Config), Name);
false -> hex_registry:decode_package(Data, no_verify, no_verify)
end
{ok, #{releases := Releases}} =
case Verify of
true -> hex_registry:decode_package(Data, repo_name(Config), Name);
false -> hex_registry:decode_package(Data, no_verify, no_verify)
end,
{ok, Releases}
end,
get_protobuf(Config, <<"packages/", Name/binary>>, Decoder).

Expand Down
14 changes: 7 additions & 7 deletions test/hex_registry_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ names_test(_Config) ->
packages => Packages
},
Payload = hex_registry:build_names(Names, TestPrivateKey),
?assertMatch({ok, Packages}, hex_registry:unpack_names(Payload, <<"hexpm">>, TestPublicKey)),
?assertMatch({ok, Packages}, hex_registry:unpack_names(Payload, no_verify, TestPublicKey)),
?assertMatch({ok, Names}, hex_registry:unpack_names(Payload, <<"hexpm">>, TestPublicKey)),
?assertMatch({ok, Names}, hex_registry:unpack_names(Payload, no_verify, TestPublicKey)),
?assertMatch({error, unverified}, hex_registry:unpack_names(Payload, <<"other_repo">>, TestPublicKey)),
ok.

Expand All @@ -49,8 +49,8 @@ versions_test(_Config) ->
packages => Packages
},
Payload = hex_registry:build_versions(Versions, TestPrivateKey),
?assertMatch({ok, Packages}, hex_registry:unpack_versions(Payload, <<"hexpm">>, TestPublicKey)),
?assertMatch({ok, Packages}, hex_registry:unpack_versions(Payload, no_verify, TestPublicKey)),
?assertMatch({ok, Versions}, hex_registry:unpack_versions(Payload, <<"hexpm">>, TestPublicKey)),
?assertMatch({ok, Versions}, hex_registry:unpack_versions(Payload, no_verify, TestPublicKey)),
?assertMatch({error, unverified}, hex_registry:unpack_versions(Payload, <<"other_repo">>, TestPublicKey)),
ok.

Expand Down Expand Up @@ -90,8 +90,8 @@ package_test(_Config) ->
releases => Releases
},
Payload = hex_registry:build_package(Package, TestPrivateKey),
?assertMatch({ok, Releases}, hex_registry:unpack_package(Payload, <<"hexpm">>, <<"foobar">>, TestPublicKey)),
?assertMatch({ok, Releases}, hex_registry:unpack_package(Payload, no_verify, no_verify, TestPublicKey)),
?assertMatch({ok, Package}, hex_registry:unpack_package(Payload, <<"hexpm">>, <<"foobar">>, TestPublicKey)),
?assertMatch({ok, Package}, hex_registry:unpack_package(Payload, no_verify, no_verify, TestPublicKey)),
?assertMatch({error, unverified}, hex_registry:unpack_package(Payload, <<"other_repo">>, <<"foobar">>, TestPublicKey)),
?assertMatch({error, unverified}, hex_registry:unpack_package(Payload, <<"hexpm">>, <<"other_package">>, TestPublicKey)),
ok.
Expand All @@ -107,7 +107,7 @@ signed_test(_Config) ->
Signed = hex_registry:sign_protobuf(Payload, TestPrivateKey),
#{payload := Payload} = hex_registry:decode_signed(Signed),
{ok, Payload} = hex_registry:decode_and_verify_signed(Signed, TestPublicKey),
{ok, []} = hex_registry:decode_names(Payload, <<"hexpm">>),
{ok, #{packages := []}} = hex_registry:decode_names(Payload, <<"hexpm">>),

{error, bad_key} = hex_registry:decode_and_verify_signed(Signed, <<"bad">>),

Expand Down