From d8f77e7b51aa4ddae8ec18b26bf881b611f0089d Mon Sep 17 00:00:00 2001 From: Gary Belvin Date: Wed, 19 Aug 2015 17:07:50 -0700 Subject: [PATCH] Implement empty response --- keyserver/key_server.go | 30 +++++++++++++++++++++++++++--- keyserver/key_server_test.go | 15 +++++++++++---- proto/v2/e2ekeys.proto | 3 ++- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/keyserver/key_server.go b/keyserver/key_server.go index d048c91b3..e5512771c 100644 --- a/keyserver/key_server.go +++ b/keyserver/key_server.go @@ -16,15 +16,18 @@ package keyserver import ( + "encoding/hex" + + "github.com/golang/protobuf/proto" "github.com/google/e2e-key-server/auth" "github.com/google/e2e-key-server/merkle" "github.com/google/e2e-key-server/storage" + "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes" corepb "github.com/google/e2e-key-server/proto/core" v2pb "github.com/google/e2e-key-server/proto/v2" - context "golang.org/x/net/context" proto3 "google/protobuf" ) @@ -53,17 +56,38 @@ func (s *Server) GetUser(ctx context.Context, in *v2pb.GetUserRequest) (*v2pb.En if err != nil { return nil, err } + vuf, err := hex.DecodeString(index) + if err != nil { + return nil, err + } - e, err := s.s.Read(ctx, index) + entryStorage, err := s.s.Read(ctx, index) + seu := new(v2pb.SignedEntryUpdate) + entry := new(v2pb.Entry) if err != nil { + if grpc.Code(err) == codes.NotFound { + // Return an empty proof. + return &v2pb.EntryProfileAndProof{ + IndexSignature: &v2pb.UVF{[]byte(vuf)}, + }, nil + } return nil, err } + if err := proto.Unmarshal(entryStorage.EntryUpdate, seu); err != nil { + return nil, grpc.Errorf(codes.InvalidArgument, "Cannot unmarshal signed_entry_update") + } + if err := proto.Unmarshal(seu.Entry, entry); err != nil { + return nil, grpc.Errorf(codes.InvalidArgument, "Cannot unmarshal entry") + } + // This key server doesn't employ a merkle tree yet. This is why most of // fields in EntryProfileAndProof do not exist. // TODO(cesarghali): integrate merkle tree. result := &v2pb.EntryProfileAndProof{ - Profile: e.Profile, + Entry: entry, + Profile: entryStorage.Profile, + IndexSignature: &v2pb.UVF{[]byte(index)}, } return result, nil } diff --git a/keyserver/key_server_test.go b/keyserver/key_server_test.go index 2ee02be2b..f850c3972 100644 --- a/keyserver/key_server_test.go +++ b/keyserver/key_server_test.go @@ -216,10 +216,17 @@ func TestGetNonExistantUser(t *testing.T) { defer env.Close() ctx := context.Background() // Unauthenticated request. - _, err := env.Client.GetUser(ctx, &v2pb.GetUserRequest{UserId: "nobody"}) + resp, err := env.Client.GetUser(ctx, &v2pb.GetUserRequest{UserId: "nobody"}) + if err != nil { + t.Fatalf("Query for nonexistant failed %v", err) + } - if got, want := grpc.Code(err), codes.NotFound; got != want { - t.Errorf("Query for nonexistant user = %v, want: %v", got, want) + // TODO: TEST nonexistant proof. + if resp.GetEntry() != nil { + t.Errorf("Entry returned for nonexistant user") + } + if len(resp.Profile) != 0 { + t.Errorf("Profile returned for nonexistant user") } } @@ -233,7 +240,7 @@ func TestGetValidUser(t *testing.T) { res, err := env.Client.GetUser(ctx, &v2pb.GetUserRequest{UserId: primaryUserEmail}) if err != nil { - t.Errorf("GetUser failed: %v", err) + t.Fatalf("GetUser failed: %v", err) } // Unmarshaling the resulted profile. p := new(v2pb.Profile) diff --git a/proto/v2/e2ekeys.proto b/proto/v2/e2ekeys.proto index 76d28b7ad..847472b9b 100644 --- a/proto/v2/e2ekeys.proto +++ b/proto/v2/e2ekeys.proto @@ -101,6 +101,7 @@ message EpochHead { message UVF { //TODO: fill with data needed for to verify the Unpredictable Verifiable //Function. + bytes vrf = 1; } message EntryProfileAndProof { @@ -129,7 +130,7 @@ message EntryProfileAndProof { // which are made available to verifiers. message Step { oneof type { - // entry_changed contains serialized SignedEntryUpdate. + // entry_changed contains a serialized SignedEntryUpdate. bytes entry_changed = 1; SignedEpochHead seh = 2; }