diff --git a/changelog/unreleased/remove-public-share-fix.md b/changelog/unreleased/remove-public-share-fix.md new file mode 100644 index 0000000000..340d831f84 --- /dev/null +++ b/changelog/unreleased/remove-public-share-fix.md @@ -0,0 +1,7 @@ +Bugfix: Handle removal of public shares by token or ID + +Previously different drivers handled removing public shares using different +means, either the token or the ID. Now, both the drivers support both these +methods. + +https://github.com/cs3org/reva/pull/1334 diff --git a/internal/grpc/services/publicshareprovider/publicshareprovider.go b/internal/grpc/services/publicshareprovider/publicshareprovider.go index 1a7ad6dd2f..8ca0801298 100644 --- a/internal/grpc/services/publicshareprovider/publicshareprovider.go +++ b/internal/grpc/services/publicshareprovider/publicshareprovider.go @@ -132,7 +132,7 @@ func (s *service) RemovePublicShare(ctx context.Context, req *link.RemovePublicS log.Info().Str("publicshareprovider", "remove").Msg("remove public share") user := user.ContextMustGetUser(ctx) - err := s.sm.RevokePublicShare(ctx, user, req.Ref.GetId().OpaqueId) + err := s.sm.RevokePublicShare(ctx, user, req.Ref) if err != nil { return &link.RemovePublicShareResponse{ Status: status.NewInternal(ctx, err, "error deleting public share"), diff --git a/pkg/publicshare/manager/json/json.go b/pkg/publicshare/manager/json/json.go index 3e4614dbf1..9e4c1a1702 100644 --- a/pkg/publicshare/manager/json/json.go +++ b/pkg/publicshare/manager/json/json.go @@ -361,7 +361,7 @@ func (m *manager) ListPublicShares(ctx context.Context, u *user.User, filters [] } // RevokePublicShare undocumented. -func (m *manager) RevokePublicShare(ctx context.Context, u *user.User, id string) error { +func (m *manager) RevokePublicShare(ctx context.Context, u *user.User, ref *link.PublicShareReference) error { m.mutex.Lock() defer m.mutex.Unlock() @@ -370,7 +370,18 @@ func (m *manager) RevokePublicShare(ctx context.Context, u *user.User, id string return err } - delete(db, id) + switch { + case ref.GetId().OpaqueId != "": + delete(db, ref.GetId().OpaqueId) + case ref.GetToken() != "": + share, err := m.getByToken(ctx, ref.GetToken()) + if err != nil { + return err + } + delete(db, share.Id.OpaqueId) + default: + return errors.New("reference does not exist") + } return m.writeDb(db) } diff --git a/pkg/publicshare/manager/memory/memory.go b/pkg/publicshare/manager/memory/memory.go index 8977fa59a6..e8c3372785 100644 --- a/pkg/publicshare/manager/memory/memory.go +++ b/pkg/publicshare/manager/memory/memory.go @@ -191,13 +191,24 @@ func (m *manager) ListPublicShares(ctx context.Context, u *user.User, filters [] return shares, nil } -func (m *manager) RevokePublicShare(ctx context.Context, u *user.User, id string) (err error) { +func (m *manager) RevokePublicShare(ctx context.Context, u *user.User, ref *link.PublicShareReference) error { // check whether the reference exists - if _, err := m.GetPublicShareByToken(ctx, id, ""); err != nil { + switch { + case ref.GetId().OpaqueId != "": + s, err := m.getPublicShareByTokenID(ctx, *ref.GetId()) + if err != nil { + return errors.New("reference does not exist") + } + m.shares.Delete(s.Token) + case ref.GetToken() != "": + if _, err := m.GetPublicShareByToken(ctx, ref.GetToken(), ""); err != nil { + return errors.New("reference does not exist") + } + m.shares.Delete(ref.GetToken()) + default: return errors.New("reference does not exist") } - m.shares.Delete(id) - return + return nil } func (m *manager) GetPublicShareByToken(ctx context.Context, token string, password string) (*link.PublicShare, error) { diff --git a/pkg/publicshare/publicshare.go b/pkg/publicshare/publicshare.go index fe1d9c55bb..25a7f9247b 100644 --- a/pkg/publicshare/publicshare.go +++ b/pkg/publicshare/publicshare.go @@ -32,6 +32,6 @@ type Manager interface { UpdatePublicShare(ctx context.Context, u *user.User, req *link.UpdatePublicShareRequest, g *link.Grant) (*link.PublicShare, error) GetPublicShare(ctx context.Context, u *user.User, ref *link.PublicShareReference) (*link.PublicShare, error) ListPublicShares(ctx context.Context, u *user.User, filters []*link.ListPublicSharesRequest_Filter, md *provider.ResourceInfo) ([]*link.PublicShare, error) - RevokePublicShare(ctx context.Context, u *user.User, id string) error + RevokePublicShare(ctx context.Context, u *user.User, ref *link.PublicShareReference) error GetPublicShareByToken(ctx context.Context, token, password string) (*link.PublicShare, error) }