From bc6626fcb55576058bf00148cddb6c2764a48f02 Mon Sep 17 00:00:00 2001 From: Paul Meyer <49727155+katexochen@users.noreply.github.com> Date: Wed, 26 Jun 2024 15:08:43 +0200 Subject: [PATCH] recoveryapi: cleanup and remove Signed-off-by: Paul Meyer <49727155+katexochen@users.noreply.github.com> --- coordinator/internal/authority/authority.go | 2 - coordinator/internal/authority/recoveryapi.go | 39 ---- .../internal/authority/recoveryapi_test.go | 143 ------------ coordinator/internal/authority/userapi.go | 26 +++ .../internal/authority/userapi_test.go | 123 ++++++++++ coordinator/main.go | 2 - internal/recoveryapi/recoveryapi.go | 9 - internal/recoveryapi/recoveryapi.pb.go | 214 ------------------ internal/recoveryapi/recoveryapi.proto | 16 -- internal/recoveryapi/recoveryapi_grpc.pb.go | 109 --------- internal/userapi/userapi.pb.go | 172 ++++++++++++-- internal/userapi/userapi.proto | 8 + internal/userapi/userapi_grpc.pb.go | 37 +++ 13 files changed, 345 insertions(+), 555 deletions(-) delete mode 100644 coordinator/internal/authority/recoveryapi.go delete mode 100644 coordinator/internal/authority/recoveryapi_test.go delete mode 100644 internal/recoveryapi/recoveryapi.go delete mode 100644 internal/recoveryapi/recoveryapi.pb.go delete mode 100644 internal/recoveryapi/recoveryapi.proto delete mode 100644 internal/recoveryapi/recoveryapi_grpc.pb.go diff --git a/coordinator/internal/authority/authority.go b/coordinator/internal/authority/authority.go index f86e6df7a4..70c4c3cdce 100644 --- a/coordinator/internal/authority/authority.go +++ b/coordinator/internal/authority/authority.go @@ -21,7 +21,6 @@ import ( "github.com/edgelesssys/contrast/internal/attestation/snp" "github.com/edgelesssys/contrast/internal/ca" "github.com/edgelesssys/contrast/internal/manifest" - "github.com/edgelesssys/contrast/internal/recoveryapi" "github.com/edgelesssys/contrast/internal/userapi" "github.com/google/go-sev-guest/proto/sevsnp" "github.com/google/go-sev-guest/validate" @@ -54,7 +53,6 @@ type Authority struct { metrics metrics userapi.UnimplementedUserAPIServer - recoveryapi.UnimplementedRecoveryAPIServer } type metrics struct { diff --git a/coordinator/internal/authority/recoveryapi.go b/coordinator/internal/authority/recoveryapi.go deleted file mode 100644 index a0c13b3ef5..0000000000 --- a/coordinator/internal/authority/recoveryapi.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2024 Edgeless Systems GmbH -// SPDX-License-Identifier: AGPL-3.0-only - -package authority - -import ( - "context" - "errors" - - "github.com/edgelesssys/contrast/internal/recoveryapi" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -var ( - // ErrAlreadyRecovered is returned if seedEngine initialization was requested but a seed is already set. - ErrAlreadyRecovered = errors.New("coordinator is already recovered") - // ErrNeedsRecovery is returned if state exists, but no secrets are available, e.g. after restart. - ErrNeedsRecovery = errors.New("coordinator is in recovery mode") -) - -// Recover recovers the Coordinator from a seed and salt. -func (a *Authority) Recover(_ context.Context, req *recoveryapi.RecoverRequest) (*recoveryapi.RecoverResponse, error) { - a.logger.Info("Recover called") - - if err := a.initSeedEngine(req.Seed, req.Salt); errors.Is(err, ErrAlreadyRecovered) { - return nil, status.Error(codes.FailedPrecondition, err.Error()) - } else if err != nil { - // Pretty sure this failed because the seed was bad. - return nil, status.Errorf(codes.InvalidArgument, "initializing seed engine: %v", err) - } - - if err := a.syncState(); err != nil { - // This recovery attempt did not lead to a good state, let's roll it back. - a.se.Store(nil) - return nil, status.Errorf(codes.InvalidArgument, "recovery failed and was rolled back: %v", err) - } - return &recoveryapi.RecoverResponse{}, nil -} diff --git a/coordinator/internal/authority/recoveryapi_test.go b/coordinator/internal/authority/recoveryapi_test.go deleted file mode 100644 index 1899e4af22..0000000000 --- a/coordinator/internal/authority/recoveryapi_test.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2024 Edgeless Systems GmbH -// SPDX-License-Identifier: AGPL-3.0-only - -package authority - -import ( - "context" - "crypto/rand" - "crypto/rsa" - "encoding/json" - "log/slog" - "testing" - - "github.com/edgelesssys/contrast/internal/manifest" - "github.com/edgelesssys/contrast/internal/recoveryapi" - "github.com/edgelesssys/contrast/internal/userapi" - "github.com/prometheus/client_golang/prometheus" - "github.com/stretchr/testify/require" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" -) - -func TestRecovery(t *testing.T) { - var seed [32]byte - var salt [32]byte - testCases := []struct { - name string - seed []byte - salt []byte - wantCode codes.Code - }{ - { - name: "empty seed", - salt: salt[:], - wantCode: codes.InvalidArgument, - }, - { - name: "empty salt", - seed: seed[:], - wantCode: codes.InvalidArgument, - }, - { - name: "short seed", - seed: seed[:16], - salt: salt[:], - wantCode: codes.InvalidArgument, - }, - { - name: "short salt", - seed: seed[:], - salt: salt[:16], - wantCode: codes.InvalidArgument, - }, - { - name: "normal values", - seed: seed[:], - salt: salt[:], - wantCode: codes.OK, - }, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - require := require.New(t) - - a := newCoordinator() - _, err := a.Recover(context.Background(), &recoveryapi.RecoverRequest{ - Seed: tc.seed, - Salt: tc.salt, - }) - - require.Equal(tc.wantCode, status.Code(err)) - }) - } -} - -// TestRecoveryFlow exercises the recovery flow's expected path. -func TestRecoveryFlow(t *testing.T) { - require := require.New(t) - - // 1. A Coordinator is created from empty state. - - a := newCoordinator() - - // 2. A manifest is set and the returned seed is recorded. - seedShareOwnerKey, err := rsa.GenerateKey(rand.Reader, 2048) - require.NoError(err) - seedShareOwnerKeyBytes := manifest.MarshalSeedShareOwnerKey(&seedShareOwnerKey.PublicKey) - - mnfst, _, policies := newManifest(t) - mnfst.SeedshareOwnerPubKeys = []manifest.HexString{seedShareOwnerKeyBytes} - manifestBytes, err := json.Marshal(mnfst) - require.NoError(err) - - req := &userapi.SetManifestRequest{ - Manifest: manifestBytes, - Policies: policies, - } - resp1, err := a.SetManifest(context.Background(), req) - require.NoError(err) - require.NotNil(resp1) - seedSharesDoc := resp1.GetSeedSharesDoc() - require.NotNil(seedSharesDoc) - seedShares := seedSharesDoc.GetSeedShares() - require.Len(seedShares, 1) - - seed, err := manifest.DecryptSeedShare(seedShareOwnerKey, seedShares[0]) - require.NoError(err) - - recoverReq := &recoveryapi.RecoverRequest{ - Seed: seed, - Salt: seedSharesDoc.GetSalt(), - } - - // Recovery on this Coordinator should fail now that a manifest is set. - _, err = a.Recover(context.Background(), recoverReq) - require.ErrorContains(err, ErrAlreadyRecovered.Error()) - - // 3. A new Coordinator is created with the existing history. - // GetManifests and SetManifest are expected to fail. - - a = New(a.hist, prometheus.NewRegistry(), slog.Default()) - _, err = a.SetManifest(context.Background(), req) - require.ErrorContains(err, ErrNeedsRecovery.Error()) - - _, err = a.GetManifests(context.Background(), &userapi.GetManifestsRequest{}) - require.ErrorContains(err, ErrNeedsRecovery.Error()) - - // 4. Recovery is called. - _, err = a.Recover(context.Background(), recoverReq) - require.NoError(err) - - // 5. Coordinator should be operational and know about the latest manifest. - resp, err := a.GetManifests(context.Background(), &userapi.GetManifestsRequest{}) - require.NoError(err) - require.NotNil(resp) - require.Len(resp.Manifests, 1) - require.Equal([][]byte{manifestBytes}, resp.Manifests) - - // Recover on a recovered authority should fail. - _, err = a.Recover(context.Background(), recoverReq) - require.Error(err) -} diff --git a/coordinator/internal/authority/userapi.go b/coordinator/internal/authority/userapi.go index 054340e221..751a7b5324 100644 --- a/coordinator/internal/authority/userapi.go +++ b/coordinator/internal/authority/userapi.go @@ -214,6 +214,25 @@ func (a *Authority) GetManifests(_ context.Context, _ *userapi.GetManifestsReque return resp, nil } +// Recover recovers the Coordinator from a seed and salt. +func (a *Authority) Recover(_ context.Context, req *userapi.RecoverRequest) (*userapi.RecoverResponse, error) { + a.logger.Info("Recover called") + + if err := a.initSeedEngine(req.Seed, req.Salt); errors.Is(err, ErrAlreadyRecovered) { + return nil, status.Error(codes.FailedPrecondition, err.Error()) + } else if err != nil { + // Pretty sure this failed because the seed was bad. + return nil, status.Errorf(codes.InvalidArgument, "initializing seed engine: %v", err) + } + + if err := a.syncState(); err != nil { + // This recovery attempt did not lead to a good state, let's roll it back. + a.se.Store(nil) + return nil, status.Errorf(codes.InvalidArgument, "recovery failed and was rolled back: %v", err) + } + return &userapi.RecoverResponse{}, nil +} + func (a *Authority) validatePeer(ctx context.Context, latest *manifest.Manifest) error { if len(latest.WorkloadOwnerKeyDigests) == 0 { return errors.New("setting manifest is disabled") @@ -253,3 +272,10 @@ func getPeerPublicKey(ctx context.Context) ([]byte, error) { } return x509.MarshalPKIXPublicKey(tlsInfo.State.PeerCertificates[0].PublicKey) } + +var ( + // ErrAlreadyRecovered is returned if seedEngine initialization was requested but a seed is already set. + ErrAlreadyRecovered = errors.New("coordinator is already recovered") + // ErrNeedsRecovery is returned if state exists, but no secrets are available, e.g. after restart. + ErrNeedsRecovery = errors.New("coordinator is in recovery mode") +) diff --git a/coordinator/internal/authority/userapi_test.go b/coordinator/internal/authority/userapi_test.go index fbdc53782a..caa7ce7130 100644 --- a/coordinator/internal/authority/userapi_test.go +++ b/coordinator/internal/authority/userapi_test.go @@ -8,6 +8,7 @@ import ( "crypto/ecdsa" "crypto/elliptic" "crypto/rand" + "crypto/rsa" "crypto/sha256" "crypto/tls" "crypto/x509" @@ -247,6 +248,128 @@ func TestGetManifests(t *testing.T) { assert.Len(resp.Policies, len(m.Policies)) } +func TestRecovery(t *testing.T) { + var seed [32]byte + var salt [32]byte + testCases := []struct { + name string + seed []byte + salt []byte + wantCode codes.Code + }{ + { + name: "empty seed", + salt: salt[:], + wantCode: codes.InvalidArgument, + }, + { + name: "empty salt", + seed: seed[:], + wantCode: codes.InvalidArgument, + }, + { + name: "short seed", + seed: seed[:16], + salt: salt[:], + wantCode: codes.InvalidArgument, + }, + { + name: "short salt", + seed: seed[:], + salt: salt[:16], + wantCode: codes.InvalidArgument, + }, + { + name: "normal values", + seed: seed[:], + salt: salt[:], + wantCode: codes.OK, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + require := require.New(t) + + a := newCoordinator() + _, err := a.Recover(context.Background(), &userapi.RecoverRequest{ + Seed: tc.seed, + Salt: tc.salt, + }) + + require.Equal(tc.wantCode, status.Code(err)) + }) + } +} + +// TestRecoveryFlow exercises the recovery flow's expected path. +func TestRecoveryFlow(t *testing.T) { + require := require.New(t) + + // 1. A Coordinator is created from empty state. + + a := newCoordinator() + + // 2. A manifest is set and the returned seed is recorded. + seedShareOwnerKey, err := rsa.GenerateKey(rand.Reader, 2048) + require.NoError(err) + seedShareOwnerKeyBytes := manifest.MarshalSeedShareOwnerKey(&seedShareOwnerKey.PublicKey) + + mnfst, _, policies := newManifest(t) + mnfst.SeedshareOwnerPubKeys = []manifest.HexString{seedShareOwnerKeyBytes} + manifestBytes, err := json.Marshal(mnfst) + require.NoError(err) + + req := &userapi.SetManifestRequest{ + Manifest: manifestBytes, + Policies: policies, + } + resp1, err := a.SetManifest(context.Background(), req) + require.NoError(err) + require.NotNil(resp1) + seedSharesDoc := resp1.GetSeedSharesDoc() + require.NotNil(seedSharesDoc) + seedShares := seedSharesDoc.GetSeedShares() + require.Len(seedShares, 1) + + seed, err := manifest.DecryptSeedShare(seedShareOwnerKey, seedShares[0]) + require.NoError(err) + + recoverReq := &userapi.RecoverRequest{ + Seed: seed, + Salt: seedSharesDoc.GetSalt(), + } + + // Recovery on this Coordinator should fail now that a manifest is set. + _, err = a.Recover(context.Background(), recoverReq) + require.ErrorContains(err, ErrAlreadyRecovered.Error()) + + // 3. A new Coordinator is created with the existing history. + // GetManifests and SetManifest are expected to fail. + + a = New(a.hist, prometheus.NewRegistry(), slog.Default()) + _, err = a.SetManifest(context.Background(), req) + require.ErrorContains(err, ErrNeedsRecovery.Error()) + + _, err = a.GetManifests(context.Background(), &userapi.GetManifestsRequest{}) + require.ErrorContains(err, ErrNeedsRecovery.Error()) + + // 4. Recovery is called. + _, err = a.Recover(context.Background(), recoverReq) + require.NoError(err) + + // 5. Coordinator should be operational and know about the latest manifest. + resp, err := a.GetManifests(context.Background(), &userapi.GetManifestsRequest{}) + require.NoError(err) + require.NotNil(resp) + require.Len(resp.Manifests, 1) + require.Equal([][]byte{manifestBytes}, resp.Manifests) + + // Recover on a recovered authority should fail. + _, err = a.Recover(context.Background(), recoverReq) + require.Error(err) +} + // TestUserAPIConcurrent tests potential synchronization problems between the different // gRPCs of the server. func TestUserAPIConcurrent(t *testing.T) { diff --git a/coordinator/main.go b/coordinator/main.go index e9e4507da4..45a47b10c9 100644 --- a/coordinator/main.go +++ b/coordinator/main.go @@ -18,7 +18,6 @@ import ( "github.com/edgelesssys/contrast/internal/grpc/atlscredentials" "github.com/edgelesssys/contrast/internal/logger" "github.com/edgelesssys/contrast/internal/meshapi" - "github.com/edgelesssys/contrast/internal/recoveryapi" "github.com/edgelesssys/contrast/internal/userapi" grpcprometheus "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus" "github.com/prometheus/client_golang/prometheus" @@ -69,7 +68,6 @@ func run() (retErr error) { grpcServer := newGRPCServer(serverMetrics, logger) userapi.RegisterUserAPIServer(grpcServer, meshAuth) - recoveryapi.RegisterRecoveryAPIServer(grpcServer, meshAuth) serverMetrics.InitializeMetrics(grpcServer) eg := errgroup.Group{} diff --git a/internal/recoveryapi/recoveryapi.go b/internal/recoveryapi/recoveryapi.go deleted file mode 100644 index 5798052910..0000000000 --- a/internal/recoveryapi/recoveryapi.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2024 Edgeless Systems GmbH -// SPDX-License-Identifier: AGPL-3.0-only - -package recoveryapi - -//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative recoveryapi.proto - -// Port is the port of the coordinator API. -const Port = "1314" diff --git a/internal/recoveryapi/recoveryapi.pb.go b/internal/recoveryapi/recoveryapi.pb.go deleted file mode 100644 index dc0f652ba7..0000000000 --- a/internal/recoveryapi/recoveryapi.pb.go +++ /dev/null @@ -1,214 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.34.1 -// protoc v4.25.3 -// source: recoveryapi.proto - -package recoveryapi - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type RecoverRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Seed []byte `protobuf:"bytes,1,opt,name=Seed,proto3" json:"Seed,omitempty"` - Salt []byte `protobuf:"bytes,2,opt,name=Salt,proto3" json:"Salt,omitempty"` -} - -func (x *RecoverRequest) Reset() { - *x = RecoverRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_recoveryapi_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RecoverRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RecoverRequest) ProtoMessage() {} - -func (x *RecoverRequest) ProtoReflect() protoreflect.Message { - mi := &file_recoveryapi_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RecoverRequest.ProtoReflect.Descriptor instead. -func (*RecoverRequest) Descriptor() ([]byte, []int) { - return file_recoveryapi_proto_rawDescGZIP(), []int{0} -} - -func (x *RecoverRequest) GetSeed() []byte { - if x != nil { - return x.Seed - } - return nil -} - -func (x *RecoverRequest) GetSalt() []byte { - if x != nil { - return x.Salt - } - return nil -} - -type RecoverResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *RecoverResponse) Reset() { - *x = RecoverResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_recoveryapi_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RecoverResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RecoverResponse) ProtoMessage() {} - -func (x *RecoverResponse) ProtoReflect() protoreflect.Message { - mi := &file_recoveryapi_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RecoverResponse.ProtoReflect.Descriptor instead. -func (*RecoverResponse) Descriptor() ([]byte, []int) { - return file_recoveryapi_proto_rawDescGZIP(), []int{1} -} - -var File_recoveryapi_proto protoreflect.FileDescriptor - -var file_recoveryapi_proto_rawDesc = []byte{ - 0x0a, 0x11, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x61, 0x70, 0x69, - 0x22, 0x38, 0x0a, 0x0e, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x53, 0x65, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x52, 0x65, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x53, 0x0a, - 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x41, 0x50, 0x49, 0x12, 0x44, 0x0a, 0x07, - 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x65, 0x64, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x73, 0x79, 0x73, 0x2f, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x61, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x72, - 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} - -var ( - file_recoveryapi_proto_rawDescOnce sync.Once - file_recoveryapi_proto_rawDescData = file_recoveryapi_proto_rawDesc -) - -func file_recoveryapi_proto_rawDescGZIP() []byte { - file_recoveryapi_proto_rawDescOnce.Do(func() { - file_recoveryapi_proto_rawDescData = protoimpl.X.CompressGZIP(file_recoveryapi_proto_rawDescData) - }) - return file_recoveryapi_proto_rawDescData -} - -var file_recoveryapi_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_recoveryapi_proto_goTypes = []interface{}{ - (*RecoverRequest)(nil), // 0: recoveryapi.RecoverRequest - (*RecoverResponse)(nil), // 1: recoveryapi.RecoverResponse -} -var file_recoveryapi_proto_depIdxs = []int32{ - 0, // 0: recoveryapi.RecoveryAPI.Recover:input_type -> recoveryapi.RecoverRequest - 1, // 1: recoveryapi.RecoveryAPI.Recover:output_type -> recoveryapi.RecoverResponse - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_recoveryapi_proto_init() } -func file_recoveryapi_proto_init() { - if File_recoveryapi_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_recoveryapi_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecoverRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_recoveryapi_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecoverResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_recoveryapi_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_recoveryapi_proto_goTypes, - DependencyIndexes: file_recoveryapi_proto_depIdxs, - MessageInfos: file_recoveryapi_proto_msgTypes, - }.Build() - File_recoveryapi_proto = out.File - file_recoveryapi_proto_rawDesc = nil - file_recoveryapi_proto_goTypes = nil - file_recoveryapi_proto_depIdxs = nil -} diff --git a/internal/recoveryapi/recoveryapi.proto b/internal/recoveryapi/recoveryapi.proto deleted file mode 100644 index 7026d91721..0000000000 --- a/internal/recoveryapi/recoveryapi.proto +++ /dev/null @@ -1,16 +0,0 @@ -syntax = "proto3"; - -package recoveryapi; - -option go_package = "github.com/edgelesssys/contrast/internal/recoveryapi"; - -service RecoveryAPI { - rpc Recover(RecoverRequest) returns (RecoverResponse); -} - -message RecoverRequest { - bytes Seed = 1; - bytes Salt = 2; -} - -message RecoverResponse {} diff --git a/internal/recoveryapi/recoveryapi_grpc.pb.go b/internal/recoveryapi/recoveryapi_grpc.pb.go deleted file mode 100644 index 787ee5a5f4..0000000000 --- a/internal/recoveryapi/recoveryapi_grpc.pb.go +++ /dev/null @@ -1,109 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.3 -// source: recoveryapi.proto - -package recoveryapi - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -const ( - RecoveryAPI_Recover_FullMethodName = "/recoveryapi.RecoveryAPI/Recover" -) - -// RecoveryAPIClient is the client API for RecoveryAPI service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type RecoveryAPIClient interface { - Recover(ctx context.Context, in *RecoverRequest, opts ...grpc.CallOption) (*RecoverResponse, error) -} - -type recoveryAPIClient struct { - cc grpc.ClientConnInterface -} - -func NewRecoveryAPIClient(cc grpc.ClientConnInterface) RecoveryAPIClient { - return &recoveryAPIClient{cc} -} - -func (c *recoveryAPIClient) Recover(ctx context.Context, in *RecoverRequest, opts ...grpc.CallOption) (*RecoverResponse, error) { - out := new(RecoverResponse) - err := c.cc.Invoke(ctx, RecoveryAPI_Recover_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// RecoveryAPIServer is the server API for RecoveryAPI service. -// All implementations must embed UnimplementedRecoveryAPIServer -// for forward compatibility -type RecoveryAPIServer interface { - Recover(context.Context, *RecoverRequest) (*RecoverResponse, error) - mustEmbedUnimplementedRecoveryAPIServer() -} - -// UnimplementedRecoveryAPIServer must be embedded to have forward compatible implementations. -type UnimplementedRecoveryAPIServer struct { -} - -func (UnimplementedRecoveryAPIServer) Recover(context.Context, *RecoverRequest) (*RecoverResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Recover not implemented") -} -func (UnimplementedRecoveryAPIServer) mustEmbedUnimplementedRecoveryAPIServer() {} - -// UnsafeRecoveryAPIServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to RecoveryAPIServer will -// result in compilation errors. -type UnsafeRecoveryAPIServer interface { - mustEmbedUnimplementedRecoveryAPIServer() -} - -func RegisterRecoveryAPIServer(s grpc.ServiceRegistrar, srv RecoveryAPIServer) { - s.RegisterService(&RecoveryAPI_ServiceDesc, srv) -} - -func _RecoveryAPI_Recover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RecoverRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(RecoveryAPIServer).Recover(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: RecoveryAPI_Recover_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RecoveryAPIServer).Recover(ctx, req.(*RecoverRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// RecoveryAPI_ServiceDesc is the grpc.ServiceDesc for RecoveryAPI service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var RecoveryAPI_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "recoveryapi.RecoveryAPI", - HandlerType: (*RecoveryAPIServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Recover", - Handler: _RecoveryAPI_Recover_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "recoveryapi.proto", -} diff --git a/internal/userapi/userapi.pb.go b/internal/userapi/userapi.pb.go index 4b6c31e867..3fb1cad3bf 100644 --- a/internal/userapi/userapi.pb.go +++ b/internal/userapi/userapi.pb.go @@ -362,6 +362,99 @@ func (x *GetManifestsResponse) GetMeshCA() []byte { return nil } +type RecoverRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Seed []byte `protobuf:"bytes,1,opt,name=Seed,proto3" json:"Seed,omitempty"` + Salt []byte `protobuf:"bytes,2,opt,name=Salt,proto3" json:"Salt,omitempty"` +} + +func (x *RecoverRequest) Reset() { + *x = RecoverRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_userapi_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RecoverRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecoverRequest) ProtoMessage() {} + +func (x *RecoverRequest) ProtoReflect() protoreflect.Message { + mi := &file_userapi_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecoverRequest.ProtoReflect.Descriptor instead. +func (*RecoverRequest) Descriptor() ([]byte, []int) { + return file_userapi_proto_rawDescGZIP(), []int{6} +} + +func (x *RecoverRequest) GetSeed() []byte { + if x != nil { + return x.Seed + } + return nil +} + +func (x *RecoverRequest) GetSalt() []byte { + if x != nil { + return x.Salt + } + return nil +} + +type RecoverResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *RecoverResponse) Reset() { + *x = RecoverResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_userapi_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RecoverResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RecoverResponse) ProtoMessage() {} + +func (x *RecoverResponse) ProtoReflect() protoreflect.Message { + mi := &file_userapi_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RecoverResponse.ProtoReflect.Descriptor instead. +func (*RecoverResponse) Descriptor() ([]byte, []int) { + return file_userapi_proto_rawDescGZIP(), []int{7} +} + var File_userapi_proto protoreflect.FileDescriptor var file_userapi_proto_rawDesc = []byte{ @@ -400,21 +493,30 @@ var file_userapi_proto_rawDesc = []byte{ 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x52, 0x6f, 0x6f, 0x74, 0x43, 0x41, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x41, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x06, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x41, 0x32, 0xa0, 0x01, 0x0a, 0x07, 0x55, 0x73, 0x65, - 0x72, 0x41, 0x50, 0x49, 0x12, 0x48, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, - 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1c, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x61, - 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, - 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x12, 0x1c, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, - 0x73, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x32, 0x5a, 0x30, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x6c, 0x65, - 0x73, 0x73, 0x73, 0x79, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x2f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x06, 0x4d, 0x65, 0x73, 0x68, 0x43, 0x41, 0x22, 0x38, 0x0a, 0x0e, 0x52, 0x65, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x65, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x53, 0x65, 0x65, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x53, 0x61, + 0x6c, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xde, 0x01, 0x0a, 0x07, 0x55, 0x73, 0x65, 0x72, 0x41, 0x50, + 0x49, 0x12, 0x48, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x61, + 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, + 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x07, 0x52, 0x65, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x65, 0x64, 0x67, 0x65, 0x6c, 0x65, 0x73, 0x73, 0x73, 0x79, 0x73, + 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x73, 0x74, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -429,7 +531,7 @@ func file_userapi_proto_rawDescGZIP() []byte { return file_userapi_proto_rawDescData } -var file_userapi_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_userapi_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_userapi_proto_goTypes = []interface{}{ (*SetManifestRequest)(nil), // 0: userapi.SetManifestRequest (*SetManifestResponse)(nil), // 1: userapi.SetManifestResponse @@ -437,16 +539,20 @@ var file_userapi_proto_goTypes = []interface{}{ (*SeedShare)(nil), // 3: userapi.SeedShare (*GetManifestsRequest)(nil), // 4: userapi.GetManifestsRequest (*GetManifestsResponse)(nil), // 5: userapi.GetManifestsResponse + (*RecoverRequest)(nil), // 6: userapi.RecoverRequest + (*RecoverResponse)(nil), // 7: userapi.RecoverResponse } var file_userapi_proto_depIdxs = []int32{ 2, // 0: userapi.SetManifestResponse.SeedSharesDoc:type_name -> userapi.SeedShareDocument 3, // 1: userapi.SeedShareDocument.SeedShares:type_name -> userapi.SeedShare 0, // 2: userapi.UserAPI.SetManifest:input_type -> userapi.SetManifestRequest 4, // 3: userapi.UserAPI.GetManifests:input_type -> userapi.GetManifestsRequest - 1, // 4: userapi.UserAPI.SetManifest:output_type -> userapi.SetManifestResponse - 5, // 5: userapi.UserAPI.GetManifests:output_type -> userapi.GetManifestsResponse - 4, // [4:6] is the sub-list for method output_type - 2, // [2:4] is the sub-list for method input_type + 6, // 4: userapi.UserAPI.Recover:input_type -> userapi.RecoverRequest + 1, // 5: userapi.UserAPI.SetManifest:output_type -> userapi.SetManifestResponse + 5, // 6: userapi.UserAPI.GetManifests:output_type -> userapi.GetManifestsResponse + 7, // 7: userapi.UserAPI.Recover:output_type -> userapi.RecoverResponse + 5, // [5:8] is the sub-list for method output_type + 2, // [2:5] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name @@ -530,6 +636,30 @@ func file_userapi_proto_init() { return nil } } + file_userapi_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecoverRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_userapi_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecoverResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -537,7 +667,7 @@ func file_userapi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_userapi_proto_rawDesc, NumEnums: 0, - NumMessages: 6, + NumMessages: 8, NumExtensions: 0, NumServices: 1, }, diff --git a/internal/userapi/userapi.proto b/internal/userapi/userapi.proto index e5374fdd51..449cf126d0 100644 --- a/internal/userapi/userapi.proto +++ b/internal/userapi/userapi.proto @@ -7,6 +7,7 @@ option go_package = "github.com/edgelesssys/contrast/internal/userapi"; service UserAPI { rpc SetManifest(SetManifestRequest) returns (SetManifestResponse); rpc GetManifests(GetManifestsRequest) returns (GetManifestsResponse); + rpc Recover(RecoverRequest) returns (RecoverResponse); } message SetManifestRequest { @@ -43,3 +44,10 @@ message GetManifestsResponse { // PEM-encoded certificate bytes MeshCA = 4; } + +message RecoverRequest { + bytes Seed = 1; + bytes Salt = 2; +} + +message RecoverResponse {} diff --git a/internal/userapi/userapi_grpc.pb.go b/internal/userapi/userapi_grpc.pb.go index 21bb520271..546e621b7e 100644 --- a/internal/userapi/userapi_grpc.pb.go +++ b/internal/userapi/userapi_grpc.pb.go @@ -21,6 +21,7 @@ const _ = grpc.SupportPackageIsVersion7 const ( UserAPI_SetManifest_FullMethodName = "/userapi.UserAPI/SetManifest" UserAPI_GetManifests_FullMethodName = "/userapi.UserAPI/GetManifests" + UserAPI_Recover_FullMethodName = "/userapi.UserAPI/Recover" ) // UserAPIClient is the client API for UserAPI service. @@ -29,6 +30,7 @@ const ( type UserAPIClient interface { SetManifest(ctx context.Context, in *SetManifestRequest, opts ...grpc.CallOption) (*SetManifestResponse, error) GetManifests(ctx context.Context, in *GetManifestsRequest, opts ...grpc.CallOption) (*GetManifestsResponse, error) + Recover(ctx context.Context, in *RecoverRequest, opts ...grpc.CallOption) (*RecoverResponse, error) } type userAPIClient struct { @@ -57,12 +59,22 @@ func (c *userAPIClient) GetManifests(ctx context.Context, in *GetManifestsReques return out, nil } +func (c *userAPIClient) Recover(ctx context.Context, in *RecoverRequest, opts ...grpc.CallOption) (*RecoverResponse, error) { + out := new(RecoverResponse) + err := c.cc.Invoke(ctx, UserAPI_Recover_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // UserAPIServer is the server API for UserAPI service. // All implementations must embed UnimplementedUserAPIServer // for forward compatibility type UserAPIServer interface { SetManifest(context.Context, *SetManifestRequest) (*SetManifestResponse, error) GetManifests(context.Context, *GetManifestsRequest) (*GetManifestsResponse, error) + Recover(context.Context, *RecoverRequest) (*RecoverResponse, error) mustEmbedUnimplementedUserAPIServer() } @@ -76,6 +88,9 @@ func (UnimplementedUserAPIServer) SetManifest(context.Context, *SetManifestReque func (UnimplementedUserAPIServer) GetManifests(context.Context, *GetManifestsRequest) (*GetManifestsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetManifests not implemented") } +func (UnimplementedUserAPIServer) Recover(context.Context, *RecoverRequest) (*RecoverResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Recover not implemented") +} func (UnimplementedUserAPIServer) mustEmbedUnimplementedUserAPIServer() {} // UnsafeUserAPIServer may be embedded to opt out of forward compatibility for this service. @@ -125,6 +140,24 @@ func _UserAPI_GetManifests_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _UserAPI_Recover_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RecoverRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserAPIServer).Recover(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserAPI_Recover_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserAPIServer).Recover(ctx, req.(*RecoverRequest)) + } + return interceptor(ctx, in, info, handler) +} + // UserAPI_ServiceDesc is the grpc.ServiceDesc for UserAPI service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -140,6 +173,10 @@ var UserAPI_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetManifests", Handler: _UserAPI_GetManifests_Handler, }, + { + MethodName: "Recover", + Handler: _UserAPI_Recover_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "userapi.proto",