diff --git a/changelog/unreleased/remote-share-id.md b/changelog/unreleased/remote-share-id.md new file mode 100644 index 00000000000..083bd7065ae --- /dev/null +++ b/changelog/unreleased/remote-share-id.md @@ -0,0 +1,3 @@ +Bugfix: Pass remote share id and shared secret in OCM call + +https://github.com/cs3org/reva/pull/3852 diff --git a/cmd/reva/ocm-share-list-received.go b/cmd/reva/ocm-share-list-received.go index 11d34e68375..f6e9971c262 100644 --- a/cmd/reva/ocm-share-list-received.go +++ b/cmd/reva/ocm-share-list-received.go @@ -54,11 +54,11 @@ func ocmShareListReceivedCommand() *command { if len(w) == 0 { t := table.NewWriter() t.SetOutputMirror(os.Stdout) - t.AppendHeader(table.Row{"#", "Owner.Idp", "Owner.OpaqueId", "ResourceId", "Type", + t.AppendHeader(table.Row{"#", "Owner.Idp", "Owner.OpaqueId", "RemoteShareId", "Type", "Grantee.Idp", "Grantee.OpaqueId", "Created", "Updated", "State", "ShareType"}) for _, s := range shareRes.Shares { t.AppendRows([]table.Row{ - {s.Id.OpaqueId, s.Owner.Idp, s.Owner.OpaqueId, s.ResourceId.String(), + {s.Id.OpaqueId, s.Owner.Idp, s.Owner.OpaqueId, s.RemoteShareId, s.Grantee.Type.String(), s.Grantee.GetUserId().Idp, s.Grantee.GetUserId().OpaqueId, time.Unix(int64(s.Ctime.Seconds), 0), time.Unix(int64(s.Mtime.Seconds), 0), s.State.String(), s.ShareType.String()}, diff --git a/go.mod b/go.mod index 3649a5d4307..203457cdb54 100644 --- a/go.mod +++ b/go.mod @@ -14,9 +14,8 @@ require ( github.com/cenkalti/backoff v2.2.1+incompatible github.com/ceph/go-ceph v0.15.0 github.com/cheggaaa/pb v1.0.29 - github.com/coreos/go-oidc v2.2.1+incompatible github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e - github.com/cs3org/go-cs3apis v0.0.0-20230331073620-011a5b8a3115 + github.com/cs3org/go-cs3apis v0.0.0-20230508132523-e0d062e63b3b github.com/dgraph-io/ristretto v0.1.1 github.com/dolthub/go-mysql-server v0.14.0 github.com/eventials/go-tus v0.0.0-20200718001131-45c7ec8f5d59 @@ -152,7 +151,6 @@ require ( github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pkg/term v1.1.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/pquerna/cachecontrol v0.1.0 // indirect github.com/prometheus/client_golang v1.13.0 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.37.0 // indirect @@ -174,7 +172,6 @@ require ( golang.org/x/tools v0.6.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/ini.v1 v1.66.6 // indirect - gopkg.in/square/go-jose.v2 v2.6.0 // indirect gopkg.in/src-d/go-errors.v1 v1.0.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 3959aff6e34..a18fef0bf35 100644 --- a/go.sum +++ b/go.sum @@ -288,8 +288,6 @@ github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDG github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= -github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc/v3 v3.5.0 h1:VxKtbccHZxs8juq7RdJntSqtXFtde9YpNpGn0yqgEHw= github.com/coreos/go-oidc/v3 v3.5.0/go.mod h1:ecXRtV4romGPeO6ieExAsUK9cb/3fp9hXNz1tlv8PIM= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -308,8 +306,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e h1:tqSPWQeueWTKnJVMJffz4pz0o1WuQxJ28+5x5JgaHD8= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= -github.com/cs3org/go-cs3apis v0.0.0-20230331073620-011a5b8a3115 h1:WR5sDbfsHZZViXKB0036V2hobzZSxew1MomrSk1kWyI= -github.com/cs3org/go-cs3apis v0.0.0-20230331073620-011a5b8a3115/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= +github.com/cs3org/go-cs3apis v0.0.0-20230508132523-e0d062e63b3b h1:UCO7Rnf5bvIvRtETguV8IaTx73cImLlFWxrApCB0QsQ= +github.com/cs3org/go-cs3apis v0.0.0-20230508132523-e0d062e63b3b/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -378,8 +376,8 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/glpatcern/go-mime v0.0.0-20221026162842-2a8d71ad17a9 h1:3um08ooi0/lyRmK2eE1XTKmRQHDzPu0IvpCPMljyMZ8= github.com/glpatcern/go-mime v0.0.0-20221026162842-2a8d71ad17a9/go.mod h1:EJaddanP+JfU3UkVvn0rYYF3b/gD7eZRejbTHqiQExA= -github.com/gmgigi96/go-cs3apis v0.0.0-20230228153318-d227be9140af h1:HmFIcBqhz0IM5NxoCN8jYZY5Ms9PQp2QXshTjGzr0us= -github.com/gmgigi96/go-cs3apis v0.0.0-20230228153318-d227be9140af/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= +github.com/gmgigi96/go-cs3apis v0.0.0-20230508122407-26b2c32caabc h1:/KUUgL9AkNP8TEOtALru0VzDlZh7IH6DBAwQrl5xw8Y= +github.com/gmgigi96/go-cs3apis v0.0.0-20230508122407-26b2c32caabc/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= github.com/go-acme/lego/v4 v4.4.0/go.mod h1:l3+tFUFZb590dWcqhWZegynUthtaHJbG2fevUpoOOE0= github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= @@ -977,8 +975,6 @@ github.com/pkg/xattr v0.4.5/go.mod h1:sBD3RAqlr8Q+RC3FutZcikpT8nyDrIEEBw2J744gVW github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= -github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/pquerna/otp v1.3.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/alertmanager v0.24.0 h1:HBWR3lk4uy3ys+naDZthDdV7yEsxpaNeZuUS+hJgrOw= @@ -1397,8 +1393,6 @@ golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7Lm golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1904,8 +1898,6 @@ gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ns1/ns1-go.v2 v2.4.4/go.mod h1:GMnKY+ZuoJ+lVLL+78uSTjwTz2jMazq6AfGKQOYhsPk= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= -gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-errors.v1 v1.0.0 h1:cooGdZnCjYbeS1zb1s6pVAAimTdKceRrpn7aKOnNIfc= gopkg.in/src-d/go-errors.v1 v1.0.0/go.mod h1:q1cBlomlw2FnDBDNGlnh6X0jPihy+QxZfMMNxPCbdYg= gopkg.in/telebot.v3 v3.0.0/go.mod h1:7rExV8/0mDDNu9epSrDm/8j22KLaActH1Tbee6YjzWg= diff --git a/internal/grpc/services/gateway/ocmshareprovider.go b/internal/grpc/services/gateway/ocmshareprovider.go index ddcadd44d32..1470318bde0 100644 --- a/internal/grpc/services/gateway/ocmshareprovider.go +++ b/internal/grpc/services/gateway/ocmshareprovider.go @@ -219,7 +219,7 @@ func (s *svc) UpdateReceivedOCMShare(ctx context.Context, req *ocm.UpdateReceive case ocm.ShareState_SHARE_STATE_PENDING: // currently no consequences case ocm.ShareState_SHARE_STATE_REJECTED: - s.removeReference(ctx, share.ResourceId) // error is logged inside removeReference + // TODO // FIXME we are ignoring an error from removeReference here return res, nil } diff --git a/internal/grpc/services/gateway/usershareprovider.go b/internal/grpc/services/gateway/usershareprovider.go index 01f927af51c..da838771492 100644 --- a/internal/grpc/services/gateway/usershareprovider.go +++ b/internal/grpc/services/gateway/usershareprovider.go @@ -129,8 +129,6 @@ func (s *svc) RemoveShare(ctx context.Context, req *collaboration.RemoveShareReq return nil, errors.Wrap(err, "gateway: error calling RemoveShare") } - s.removeReference(ctx, share.ResourceId) - // if we don't need to commit we return earlier if !s.c.CommitShareToStorageGrant && !s.c.CommitShareToStorageRef { return res, nil diff --git a/internal/grpc/services/ocmcore/ocmcore.go b/internal/grpc/services/ocmcore/ocmcore.go index be4332701ae..6cd63987f80 100644 --- a/internal/grpc/services/ocmcore/ocmcore.go +++ b/internal/grpc/services/ocmcore/ocmcore.go @@ -117,10 +117,8 @@ func (s *service) CreateOCMCoreShare(ctx context.Context, req *ocmcore.CreateOCM } share, err := s.repo.StoreReceivedShare(ctx, &ocm.ReceivedShare{ - ResourceId: &providerpb.ResourceId{ - OpaqueId: req.ResourceId, - }, - Name: req.Name, + RemoteShareId: req.ResourceId, + Name: req.Name, Grantee: &providerpb.Grantee{ Type: providerpb.GranteeType_GRANTEE_TYPE_USER, Id: &providerpb.Grantee_UserId{ diff --git a/internal/grpc/services/ocmproviderauthorizer/ocmproviderauthorizer.go b/internal/grpc/services/ocmproviderauthorizer/ocmproviderauthorizer.go index 0bf9b19a722..9d0892068d5 100644 --- a/internal/grpc/services/ocmproviderauthorizer/ocmproviderauthorizer.go +++ b/internal/grpc/services/ocmproviderauthorizer/ocmproviderauthorizer.go @@ -22,6 +22,7 @@ import ( "context" ocmprovider "github.com/cs3org/go-cs3apis/cs3/ocm/provider/v1beta1" + "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/ocm/provider" "github.com/cs3org/reva/pkg/ocm/provider/authorizer/registry" @@ -118,6 +119,8 @@ func (s *service) GetInfoByDomain(ctx context.Context, req *ocmprovider.GetInfoB } func (s *service) IsProviderAllowed(ctx context.Context, req *ocmprovider.IsProviderAllowedRequest) (*ocmprovider.IsProviderAllowedResponse, error) { + log := appctx.GetLogger(ctx) + log.Debug().Msgf("is provider '%s' allowed?", req.Provider.Domain) err := s.pa.IsProviderAllowed(ctx, req.Provider) if err != nil { return &ocmprovider.IsProviderAllowedResponse{ diff --git a/internal/grpc/services/ocmshareprovider/ocmshareprovider.go b/internal/grpc/services/ocmshareprovider/ocmshareprovider.go index 9112af18fe2..37b0307545a 100644 --- a/internal/grpc/services/ocmshareprovider/ocmshareprovider.go +++ b/internal/grpc/services/ocmshareprovider/ocmshareprovider.go @@ -193,8 +193,9 @@ func (s *service) getWebdavProtocol(ctx context.Context, share *ocm.Share, m *oc } return &ocmd.WebDAV{ - Permissions: perms, - URL: s.webdavURL(ctx, share), + Permissions: perms, + URL: s.webdavURL(ctx, share), + SharedSecret: share.Token, } } @@ -299,7 +300,7 @@ func (s *service) CreateOCMShare(ctx context.Context, req *ocm.CreateOCMShareReq newShareReq := &client.NewShareRequest{ ShareWith: formatOCMUser(req.Grantee.GetUserId()), Name: ocmshare.Name, - ResourceID: fmt.Sprintf("%s:%s", req.ResourceId.StorageId, req.ResourceId.OpaqueId), + ProviderID: ocmshare.Id.OpaqueId, Owner: formatOCMUser(&userpb.UserId{ OpaqueId: info.Owner.OpaqueId, Idp: s.conf.ProviderDomain, // FIXME: this is not generally true in case of resharing diff --git a/internal/http/services/ocmd/shares.go b/internal/http/services/ocmd/shares.go index 8ba0861f069..6a491ba974b 100644 --- a/internal/http/services/ocmd/shares.go +++ b/internal/http/services/ocmd/shares.go @@ -37,6 +37,7 @@ import ( rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" "github.com/cs3org/reva/internal/http/services/reqres" + "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" "github.com/cs3org/reva/pkg/utils" "github.com/go-playground/validator/v10" @@ -63,7 +64,7 @@ type createShareRequest struct { ShareWith string `json:"shareWith" validate:"required"` // identifier of the recipient of the share Name string `json:"name" validate:"required"` // name of the resource Description string `json:"description"` // (optional) description of the resource - ResourceID string `json:"resourceId" validate:"required"` // unique identifier of the resource at provider side + ProviderID string `json:"providerId" validate:"required"` // unique identifier of the resource at provider side Owner string `json:"owner" validate:"required"` // unique identifier of the owner at provider side Sender string `json:"sender" validate:"required"` // unique indentifier of the user who wants to share the resource at provider side OwnerDisplayName string `json:"ownerDisplayName"` // display name of the owner of the resource @@ -78,7 +79,7 @@ type createShareRequest struct { // synchronization between the two services. func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - + log := appctx.GetLogger(ctx) req, err := getCreateShareRequest(r) if err != nil { reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, err.Error(), nil) @@ -86,6 +87,7 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) { } _, meshProvider, err := getIDAndMeshProvider(req.Sender) + log.Debug().Msgf("Determined Mesh Provider '%s' from req.Sender '%s'", meshProvider, req.Sender) if err != nil { reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, err.Error(), nil) return @@ -150,7 +152,7 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) { createShareReq := &ocmcore.CreateOCMCoreShareRequest{ Description: req.Description, Name: req.Name, - ResourceId: req.ResourceID, + ResourceId: req.ProviderID, Owner: owner, Sender: sender, ShareWith: userRes.User.Id, diff --git a/internal/http/services/sciencemesh/share.go b/internal/http/services/sciencemesh/share.go index 130cbd0505e..ac84dc41ad4 100644 --- a/internal/http/services/sciencemesh/share.go +++ b/internal/http/services/sciencemesh/share.go @@ -103,6 +103,7 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) { perm, viewMode := getPermissionsByRole(req.Role) + log.Debug().Msg("calling gatewayClient.CreateOCMShare from sciencemesh/share.go") shareRes, err := h.gatewayClient.CreateOCMShare(ctx, &ocm.CreateOCMShareRequest{ ResourceId: statRes.Info.Id, Grantee: &providerpb.Grantee{ @@ -120,6 +121,8 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) { share.NewWebappAccessMethod(viewMode), }, }) + log.Debug().Msg("called gatewayClient.CreateOCMShare from sciencemesh/share.go") + switch { case err != nil: reqres.WriteError(w, r, reqres.APIErrorServerError, "error sending a grpc CreateOCMShare", err) diff --git a/pkg/ocm/client/client.go b/pkg/ocm/client/client.go index a0a91914128..4f291bd6d69 100644 --- a/pkg/ocm/client/client.go +++ b/pkg/ocm/client/client.go @@ -28,6 +28,7 @@ import ( "time" "github.com/cs3org/reva/internal/http/services/ocmd" + "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rhttp" "github.com/pkg/errors" @@ -158,7 +159,7 @@ type NewShareRequest struct { ShareWith string `json:"shareWith"` Name string `json:"name"` Description string `json:"description"` - ResourceID string `json:"resourceId"` + ProviderID string `json:"providerId"` Owner string `json:"owner"` Sender string `json:"sender"` OwnerDisplayName string `json:"ownerDisplayName"` @@ -195,6 +196,8 @@ func (c *OCMClient) NewShare(ctx context.Context, endpoint string, r *NewShareRe return nil, err } + log := appctx.GetLogger(ctx) + log.Debug().Msgf("Sending OCM /shares POST to %s: %s", url, body) req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, body) if err != nil { return nil, errors.Wrap(err, "error creating request") diff --git a/pkg/ocm/provider/authorizer/json/json.go b/pkg/ocm/provider/authorizer/json/json.go index 33d90fa7bbd..e4592871c01 100644 --- a/pkg/ocm/provider/authorizer/json/json.go +++ b/pkg/ocm/provider/authorizer/json/json.go @@ -28,6 +28,7 @@ import ( "sync" ocmprovider "github.com/cs3org/go-cs3apis/cs3/ocm/provider/v1beta1" + "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/ocm/provider" "github.com/cs3org/reva/pkg/ocm/provider/authorizer/registry" @@ -114,6 +115,7 @@ func (a *authorizer) GetInfoByDomain(ctx context.Context, domain string) (*ocmpr } func (a *authorizer) IsProviderAllowed(ctx context.Context, pi *ocmprovider.ProviderInfo) error { + log := appctx.GetLogger(ctx) var err error normalizedDomain, err := normalizeDomain(pi.Domain) if err != nil { @@ -142,6 +144,7 @@ func (a *authorizer) IsProviderAllowed(ctx context.Context, pi *ocmprovider.Prov var ocmHost string for _, p := range a.providers { + log.Debug().Msgf("Comparing '%s' to '%s'", p.Domain, normalizedDomain) if p.Domain == normalizedDomain { ocmHost, err = a.getOCMHost(p) if err != nil { diff --git a/pkg/ocm/share/repository/json/json.go b/pkg/ocm/share/repository/json/json.go index 109a3d367eb..76218300364 100644 --- a/pkg/ocm/share/repository/json/json.go +++ b/pkg/ocm/share/repository/json/json.go @@ -379,11 +379,6 @@ func receivedShareEqual(ref *ocm.ShareReference, s *ocm.ReceivedShare) bool { if ref.GetId().OpaqueId == s.Id.OpaqueId { return true } - } else if ref.GetKey() != nil { - if (utils.UserEqual(ref.GetKey().Owner, s.Owner) || utils.UserEqual(ref.GetKey().Owner, s.Creator)) && - utils.ResourceIDEqual(ref.GetKey().ResourceId, s.ResourceId) && utils.GranteeEqual(ref.GetKey().Grantee, s.Grantee) { - return true - } } return false } diff --git a/pkg/ocm/share/repository/nextcloud/nextcloud.go b/pkg/ocm/share/repository/nextcloud/nextcloud.go index b1f3dcd9ba2..801a75b51fa 100644 --- a/pkg/ocm/share/repository/nextcloud/nextcloud.go +++ b/pkg/ocm/share/repository/nextcloud/nextcloud.go @@ -78,14 +78,14 @@ type GranteeAltMap struct { // ShareAltMap is an alternative map to JSON-unmarshal a Share. type ShareAltMap struct { - ID *ocm.ShareId `json:"id"` - ResourceID *provider.ResourceId `json:"resource_id"` - Permissions *ocm.SharePermissions `json:"permissions"` - Grantee *GranteeAltMap `json:"grantee"` - Owner *userpb.UserId `json:"owner"` - Creator *userpb.UserId `json:"creator"` - Ctime *typespb.Timestamp `json:"ctime"` - Mtime *typespb.Timestamp `json:"mtime"` + ID *ocm.ShareId `json:"id"` + RemoteShareID string `json:"remote_share_id"` + Permissions *ocm.SharePermissions `json:"permissions"` + Grantee *GranteeAltMap `json:"grantee"` + Owner *userpb.UserId `json:"owner"` + Creator *userpb.UserId `json:"creator"` + Ctime *typespb.Timestamp `json:"ctime"` + Mtime *typespb.Timestamp `json:"mtime"` } // ReceivedShareAltMap is an alternative map to JSON-unmarshal a ReceivedShare. @@ -179,8 +179,7 @@ func (sm *Manager) GetShare(ctx context.Context, user *userpb.User, ref *ocm.Sha return nil, err } return &ocm.Share{ - Id: altResult.ID, - ResourceId: altResult.ResourceID, + Id: altResult.ID, Grantee: &provider.Grantee{ Id: altResult.Grantee.ID, }, @@ -227,8 +226,7 @@ func (sm *Manager) UpdateShare(ctx context.Context, user *userpb.User, ref *ocm. return nil, err } return &ocm.Share{ - Id: altResult.ID, - ResourceId: altResult.ResourceID, + Id: altResult.ID, Grantee: &provider.Grantee{ Id: altResult.Grantee.ID, }, @@ -260,8 +258,7 @@ func (sm *Manager) ListShares(ctx context.Context, user *userpb.User, filters [] var lst = make([]*ocm.Share, 0, len(respArr)) for _, altResult := range respArr { lst = append(lst, &ocm.Share{ - Id: altResult.ID, - ResourceId: altResult.ResourceID, + Id: altResult.ID, Grantee: &provider.Grantee{ Id: altResult.Grantee.ID, }, @@ -312,8 +309,8 @@ func (sm *Manager) ListReceivedShares(ctx context.Context, user *userpb.User) ([ continue } res = append(res, &ocm.ReceivedShare{ - Id: altResultShare.ID, - ResourceId: altResultShare.ResourceID, + Id: altResultShare.ID, + RemoteShareId: altResultShare.RemoteShareID, // sic, see https://github.com/cs3org/reva/pull/3852#discussion_r1189681465 Grantee: &provider.Grantee{ Id: altResultShare.Grantee.ID, }, @@ -350,8 +347,8 @@ func (sm *Manager) GetReceivedShare(ctx context.Context, user *userpb.User, ref }, nil } return &ocm.ReceivedShare{ - Id: altResultShare.ID, - ResourceId: altResultShare.ResourceID, + Id: altResultShare.ID, + RemoteShareId: altResultShare.RemoteShareID, // sic, see https://github.com/cs3org/reva/pull/3852#discussion_r1189681465 Grantee: &provider.Grantee{ Id: altResultShare.Grantee.ID, }, @@ -396,8 +393,8 @@ func (sm *Manager) UpdateReceivedShare(ctx context.Context, user *userpb.User, s }, nil } return &ocm.ReceivedShare{ - Id: altResultShare.ID, - ResourceId: altResultShare.ResourceID, + Id: altResultShare.ID, + RemoteShareId: altResultShare.RemoteShareID, // sic, see https://github.com/cs3org/reva/pull/3852#discussion_r1189681465 Grantee: &provider.Grantee{ Id: altResultShare.Grantee.ID, }, diff --git a/pkg/ocm/share/repository/nextcloud/nextcloud_server_mock.go b/pkg/ocm/share/repository/nextcloud/nextcloud_server_mock.go index 75ccf42d6f1..377c6bbc8dc 100644 --- a/pkg/ocm/share/repository/nextcloud/nextcloud_server_mock.go +++ b/pkg/ocm/share/repository/nextcloud/nextcloud_server_mock.go @@ -51,7 +51,7 @@ var responses = map[string]Response{ `POST /apps/sciencemesh/~tester/api/ocm/ListShares [{"type":4,"Term":{"Creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}}]`: {200, `[{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}}]`, serverStateHome}, `POST /apps/sciencemesh/~tester/api/ocm/ListReceivedShares `: {200, `[{"share":{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2}]`, serverStateHome}, `POST /apps/sciencemesh/~tester/api/ocm/GetReceivedShare {"Spec":{"Id":{"opaque_id":"some-share-id"}}}`: {200, `{"share":{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2}`, serverStateHome}, - `POST /apps/sciencemesh/~tester/api/ocm/UpdateReceivedShare {"received_share":{"id":{},"resource_id":{},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890},"state":2},"field_mask":{"paths":["state"]}}`: {200, `{"share":{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2}`, serverStateHome}, + `POST /apps/sciencemesh/~tester/api/ocm/UpdateReceivedShare {"received_share":{"id":{},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890},"state":2},"field_mask":{"paths":["state"]}}`: {200, `{"share":{"id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2}`, serverStateHome}, `POST /index.php/apps/sciencemesh/~marie/api/ocm/addReceivedShare {"md":{"opaque_id":"fileid-/some/path"},"g":{"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"permissions":{"permissions":{"get_path":true}}},"provider_domain":"cern.ch","resource_type":"file","provider_id":2,"owner_opaque_id":"einstein","owner_display_name":"Albert Einstein","protocol":{"name":"webdav","options":{"sharedSecret":"secret","permissions":"webdav-property"}}}`: {200, `{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}}`, serverStateHome}, `POST /index.php/apps/sciencemesh/~marie/api/ocm/GetShare {"Spec":{"Id":{"opaque_id":"some-share-id"}}}`: {200, `{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}}`, serverStateHome}, @@ -60,7 +60,7 @@ var responses = map[string]Response{ `POST /index.php/apps/sciencemesh/~marie/api/ocm/ListShares [{"type":4,"Term":{"Creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}}]`: {200, `[{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}}]`, serverStateHome}, `POST /index.php/apps/sciencemesh/~marie/api/ocm/ListReceivedShares `: {200, `[{"share":{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2}]`, serverStateHome}, `POST /index.php/apps/sciencemesh/~marie/api/ocm/GetReceivedShare {"Spec":{"Id":{"opaque_id":"some-share-id"}}}`: {200, `{"share":{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2}`, serverStateHome}, - `POST /index.php/apps/sciencemesh/~marie/api/ocm/UpdateReceivedShare {"received_share":{"share":{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2},"field_mask":{"paths":["state"]}}`: {200, `{"share":{"id":{},"resource_id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2}`, serverStateHome}, + `POST /index.php/apps/sciencemesh/~marie/api/ocm/UpdateReceivedShare {"received_share":{"share":{"id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2},"field_mask":{"paths":["state"]}}`: {200, `{"share":{"id":{},"permissions":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890}},"state":2}`, serverStateHome}, } // GetNextcloudServerMock returns a handler that pretends to be a remote Nextcloud server. diff --git a/pkg/ocm/share/repository/nextcloud/nextcloud_test.go b/pkg/ocm/share/repository/nextcloud/nextcloud_test.go index ec1e764e463..b0934d22ed2 100644 --- a/pkg/ocm/share/repository/nextcloud/nextcloud_test.go +++ b/pkg/ocm/share/repository/nextcloud/nextcloud_test.go @@ -257,8 +257,7 @@ var _ = Describe("Nextcloud", func() { }) Expect(err).ToNot(HaveOccurred()) Expect(*share).To(Equal(ocm.Share{ - Id: &ocm.ShareId{}, - ResourceId: &provider.ResourceId{}, + Id: &ocm.ShareId{}, Grantee: &provider.Grantee{ Id: &provider.Grantee_UserId{ UserId: &userpb.UserId{ @@ -353,8 +352,7 @@ var _ = Describe("Nextcloud", func() { }) Expect(err).ToNot(HaveOccurred()) Expect(*share).To(Equal(ocm.Share{ - Id: &ocm.ShareId{}, - ResourceId: &provider.ResourceId{}, + Id: &ocm.ShareId{}, Grantee: &provider.Grantee{ Id: &provider.Grantee_UserId{ UserId: &userpb.UserId{ @@ -414,8 +412,7 @@ var _ = Describe("Nextcloud", func() { Expect(err).ToNot(HaveOccurred()) Expect(len(shares)).To(Equal(1)) Expect(*shares[0]).To(Equal(ocm.Share{ - Id: &ocm.ShareId{}, - ResourceId: &provider.ResourceId{}, + Id: &ocm.ShareId{}, Grantee: &provider.Grantee{ Id: &provider.Grantee_UserId{ UserId: &userpb.UserId{ @@ -464,8 +461,8 @@ var _ = Describe("Nextcloud", func() { Expect(err).ToNot(HaveOccurred()) Expect(len(receivedShares)).To(Equal(1)) Expect(*receivedShares[0]).To(Equal(ocm.ReceivedShare{ - Id: &ocm.ShareId{}, - ResourceId: &provider.ResourceId{}, + Id: &ocm.ShareId{}, + RemoteShareId: "", Grantee: &provider.Grantee{ Id: &provider.Grantee_UserId{ UserId: &userpb.UserId{ @@ -520,8 +517,8 @@ var _ = Describe("Nextcloud", func() { }) Expect(err).ToNot(HaveOccurred()) Expect(*receivedShare).To(Equal(ocm.ReceivedShare{ - Id: &ocm.ShareId{}, - ResourceId: &provider.ResourceId{}, + Id: &ocm.ShareId{}, + RemoteShareId: "", Grantee: &provider.Grantee{ Id: &provider.Grantee_UserId{ UserId: &userpb.UserId{ @@ -569,8 +566,8 @@ var _ = Describe("Nextcloud", func() { receivedShare, err := am.UpdateReceivedShare(ctx, user, &ocm.ReceivedShare{ - Id: &ocm.ShareId{}, - ResourceId: &provider.ResourceId{}, + Id: &ocm.ShareId{}, + RemoteShareId: "", Grantee: &provider.Grantee{ Id: &provider.Grantee_UserId{ UserId: &userpb.UserId{ @@ -611,8 +608,8 @@ var _ = Describe("Nextcloud", func() { }) Expect(err).ToNot(HaveOccurred()) Expect(*receivedShare).To(Equal(ocm.ReceivedShare{ - Id: &ocm.ShareId{}, - ResourceId: &provider.ResourceId{}, + Id: &ocm.ShareId{}, + RemoteShareId: "", Grantee: &provider.Grantee{ Id: &provider.Grantee_UserId{ UserId: &userpb.UserId{ @@ -648,7 +645,7 @@ var _ = Describe("Nextcloud", func() { }, State: ocm.ShareState_SHARE_STATE_ACCEPTED, })) - checkCalled(called, `POST /apps/sciencemesh/~tester/api/ocm/UpdateReceivedShare {"received_share":{"id":{},"resource_id":{},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890},"state":2},"field_mask":{"paths":["state"]}}`) + checkCalled(called, `POST /apps/sciencemesh/~tester/api/ocm/UpdateReceivedShare {"received_share":{"id":{},"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"owner":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"creator":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1},"ctime":{"seconds":1234567890},"mtime":{"seconds":1234567890},"state":2},"field_mask":{"paths":["state"]}}`) }) }) diff --git a/pkg/ocm/share/repository/sql/conversions.go b/pkg/ocm/share/repository/sql/conversions.go index b565a09617b..cf2149161a5 100644 --- a/pkg/ocm/share/repository/sql/conversions.go +++ b/pkg/ocm/share/repository/sql/conversions.go @@ -148,19 +148,18 @@ type dbAccessMethod struct { } type dbReceivedShare struct { - ID int - Name string - Prefix string - ItemSource string - ItemType ItemType - ShareWith string - Owner string - Initiator string - Ctime int - Mtime int - Expiration sql.NullInt64 - Type ShareType - State ShareState + ID int + Name string + RemoteShareID string + ItemType ItemType + ShareWith string + Owner string + Initiator string + Ctime int + Mtime int + Expiration sql.NullInt64 + Type ShareType + State ShareState } type dbProtocol struct { @@ -234,11 +233,8 @@ func convertToCS3OCMReceivedShare(s *dbReceivedShare, p []*ocm.Protocol) *ocm.Re Id: &ocm.ShareId{ OpaqueId: strconv.Itoa(s.ID), }, - ResourceId: &provider.ResourceId{ - StorageId: s.Prefix, - OpaqueId: s.ItemSource, - }, - Name: s.Name, + RemoteShareId: s.RemoteShareID, + Name: s.Name, Grantee: &provider.Grantee{ Type: provider.GranteeType_GRANTEE_TYPE_USER, Id: &provider.Grantee_UserId{ diff --git a/pkg/ocm/share/repository/sql/sql.go b/pkg/ocm/share/repository/sql/sql.go index 894ca1d778f..ca7e6a9597c 100644 --- a/pkg/ocm/share/repository/sql/sql.go +++ b/pkg/ocm/share/repository/sql/sql.go @@ -513,8 +513,8 @@ func storeProtocol(tx *sql.Tx, shareID int64, p Protocol) (int64, error) { // StoreReceivedShare stores a received share. func (m *mgr) StoreReceivedShare(ctx context.Context, s *ocm.ReceivedShare) (*ocm.ReceivedShare, error) { if err := transaction(ctx, m.db, func(tx *sql.Tx) error { - query := "INSERT INTO ocm_received_shares SET name=?,fileid_prefix=?,item_source=?,item_type=?,share_with=?,owner=?,initiator=?,ctime=?,mtime=?,type=?,state=?" - params := []any{s.Name, s.ResourceId.StorageId, s.ResourceId.OpaqueId, convertFromCS3ResourceType(s.ResourceType), s.Grantee.GetUserId().OpaqueId, formatUserID(s.Owner), formatUserID(s.Creator), s.Ctime.Seconds, s.Mtime.Seconds, convertFromCS3OCMShareType(s.ShareType), convertFromCS3OCMShareState(s.State)} + query := "INSERT INTO ocm_received_shares SET name=?,remote_share_id=?,item_type=?,share_with=?,owner=?,initiator=?,ctime=?,mtime=?,type=?,state=?" + params := []any{s.Name, s.RemoteShareId, convertFromCS3ResourceType(s.ResourceType), s.Grantee.GetUserId().OpaqueId, formatUserID(s.Owner), formatUserID(s.Creator), s.Ctime.Seconds, s.Mtime.Seconds, convertFromCS3OCMShareType(s.ShareType), convertFromCS3OCMShareState(s.State)} if s.Expiration != nil { query += ",expiration=?" @@ -565,7 +565,7 @@ func (m *mgr) StoreReceivedShare(ctx context.Context, s *ocm.ReceivedShare) (*oc // ListReceivedShares returns the list of shares the user has access. func (m *mgr) ListReceivedShares(ctx context.Context, user *userpb.User) ([]*ocm.ReceivedShare, error) { - query := "SELECT id, name, fileid_prefix, item_source, item_type, share_with, owner, initiator, ctime, mtime, expiration, type, state FROM ocm_received_shares WHERE share_with=?" + query := "SELECT id, name, remote_share_id, item_type, share_with, owner, initiator, ctime, mtime, expiration, type, state FROM ocm_received_shares WHERE share_with=?" rows, err := m.db.QueryContext(ctx, query, user.Id.OpaqueId) if err != nil { @@ -576,7 +576,7 @@ func (m *mgr) ListReceivedShares(ctx context.Context, user *userpb.User) ([]*ocm shares := []*ocm.ReceivedShare{} var ids []any for rows.Next() { - if err := rows.Scan(&s.ID, &s.Name, &s.Prefix, &s.ItemSource, &s.ItemType, &s.ShareWith, &s.Owner, &s.Initiator, &s.Ctime, &s.Mtime, &s.Expiration, &s.Type, &s.State); err != nil { + if err := rows.Scan(&s.ID, &s.Name, &s.RemoteShareID, &s.ItemType, &s.ShareWith, &s.Owner, &s.Initiator, &s.Ctime, &s.Mtime, &s.Expiration, &s.Type, &s.State); err != nil { continue } shares = append(shares, convertToCS3OCMReceivedShare(&s, nil)) @@ -633,8 +633,6 @@ func (m *mgr) GetReceivedShare(ctx context.Context, user *userpb.User, ref *ocm. switch { case ref.GetId() != nil: s, err = m.getReceivedByID(ctx, user, ref.GetId()) - case ref.GetKey() != nil: - s, err = m.getReceivedByKey(ctx, user, ref.GetKey()) default: err = errtypes.NotFound(ref.String()) } @@ -643,31 +641,11 @@ func (m *mgr) GetReceivedShare(ctx context.Context, user *userpb.User, ref *ocm. } func (m *mgr) getReceivedByID(ctx context.Context, user *userpb.User, id *ocm.ShareId) (*ocm.ReceivedShare, error) { - query := "SELECT id, name, fileid_prefix, item_source, item_type, share_with, owner, initiator, ctime, mtime, expiration, type, state FROM ocm_received_shares WHERE id=? AND share_with=?" + query := "SELECT id, name, remote_share_id, item_type, share_with, owner, initiator, ctime, mtime, expiration, type, state FROM ocm_received_shares WHERE id=? AND share_with=?" params := []any{id.OpaqueId, user.Id.OpaqueId} var s dbReceivedShare - if err := m.db.QueryRowContext(ctx, query, params...).Scan(&s.ID, &s.Name, &s.Prefix, &s.ItemSource, &s.ItemType, &s.ShareWith, &s.Owner, &s.Initiator, &s.Ctime, &s.Mtime, &s.Expiration, &s.Type, &s.State); err != nil { - if err == sql.ErrNoRows { - return nil, share.ErrShareNotFound - } - return nil, err - } - - p, err := m.getProtocols(ctx, s.ID) - if err != nil { - return nil, err - } - - return convertToCS3OCMReceivedShare(&s, p), nil -} - -func (m *mgr) getReceivedByKey(ctx context.Context, user *userpb.User, key *ocm.ShareKey) (*ocm.ReceivedShare, error) { - query := "SELECT id, name, fileid_prefix, item_source, item_type, share_with, owner, initiator, ctime, mtime, expiration, type, state FROM ocm_received_shares WHERE owner=? AND fileid_prefix=? AND item_source=? AND share_with=?" - params := []any{formatUserID(key.Owner), key.ResourceId.StorageId, key.ResourceId.OpaqueId, key.Grantee.GetUserId().OpaqueId} - - var s dbReceivedShare - if err := m.db.QueryRowContext(ctx, query, params...).Scan(&s.ID, &s.Name, &s.Prefix, &s.ItemSource, &s.ItemType, &s.ShareWith, &s.Owner, &s.Initiator, &s.Ctime, &s.Mtime, &s.Expiration, &s.Type, &s.State); err != nil { + if err := m.db.QueryRowContext(ctx, query, params...).Scan(&s.ID, &s.Name, &s.RemoteShareID, &s.ItemType, &s.ShareWith, &s.Owner, &s.Initiator, &s.Ctime, &s.Mtime, &s.Expiration, &s.Type, &s.State); err != nil { if err == sql.ErrNoRows { return nil, share.ErrShareNotFound } diff --git a/pkg/ocm/share/repository/sql/sql_test.go b/pkg/ocm/share/repository/sql/sql_test.go index 4c9e0226d87..846916142e2 100644 --- a/pkg/ocm/share/repository/sql/sql_test.go +++ b/pkg/ocm/share/repository/sql/sql_test.go @@ -201,8 +201,7 @@ func createReceivedShareTables(ctx *sql.Context, initData []*ocm.ReceivedShare) tableShares := memory.NewTable(ocmReceivedShareTable, sql.NewPrimaryKeySchema(sql.Schema{ {Name: "id", Type: sql.Int64, Nullable: false, Source: ocmReceivedShareTable, PrimaryKey: true, AutoIncrement: true}, {Name: "name", Type: sql.Text, Nullable: false, Source: ocmReceivedShareTable}, - {Name: "fileid_prefix", Type: sql.Text, Nullable: false, Source: ocmReceivedShareTable}, - {Name: "item_source", Type: sql.Text, Nullable: false, Source: ocmReceivedShareTable}, + {Name: "remote_share_id", Type: sql.Text, Nullable: false, Source: ocmReceivedShareTable}, {Name: "item_type", Type: sql.Int8, Nullable: false, Source: ocmReceivedShareTable}, {Name: "share_with", Type: sql.Text, Nullable: false, Source: ocmReceivedShareTable}, {Name: "owner", Type: sql.Text, Nullable: false, Source: ocmReceivedShareTable}, @@ -268,7 +267,7 @@ func createReceivedShareTables(ctx *sql.Context, initData []*ocm.ReceivedShare) expiration = share.Expiration.Seconds } - must(tableShares.Insert(ctx, sql.NewRow(mustInt(share.Id.OpaqueId), share.Name, share.ResourceId.StorageId, share.ResourceId.OpaqueId, int8(convertFromCS3ResourceType(share.ResourceType)), share.Grantee.GetUserId().OpaqueId, fmt.Sprintf("%s@%s", share.Owner.OpaqueId, share.Owner.Idp), fmt.Sprintf("%s@%s", share.Creator.OpaqueId, share.Creator.Idp), share.Ctime.Seconds, share.Mtime.Seconds, expiration, int8(convertFromCS3OCMShareType(share.ShareType)), int8(convertFromCS3OCMShareState(share.State))))) + must(tableShares.Insert(ctx, sql.NewRow(mustInt(share.Id.OpaqueId), share.Name, share.RemoteShareId, int8(convertFromCS3ResourceType(share.ResourceType)), share.Grantee.GetUserId().OpaqueId, fmt.Sprintf("%s@%s", share.Owner.OpaqueId, share.Owner.Idp), fmt.Sprintf("%s@%s", share.Creator.OpaqueId, share.Creator.Idp), share.Ctime.Seconds, share.Mtime.Seconds, expiration, int8(convertFromCS3OCMShareType(share.ShareType)), int8(convertFromCS3OCMShareState(share.State))))) for _, p := range share.Protocols { i := id() @@ -1283,17 +1282,17 @@ func TestGetReceivedShare(t *testing.T) { description: "query by id", shares: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1304,70 +1303,18 @@ func TestGetReceivedShare(t *testing.T) { query: &ocm.ShareReference{Spec: &ocm.ShareReference_Id{Id: &ocm.ShareId{OpaqueId: "1"}}}, user: &userpb.User{Id: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}, expected: &ocm.ReceivedShare{ - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, - Expiration: &typesv1beta1.Timestamp{}, - Protocols: []*ocm.Protocol{ - share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ - Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), - }), - }, - }, - }, - { - description: "query by key", - shares: []*ocm.ReceivedShare{ - { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, - Protocols: []*ocm.Protocol{ - share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ - Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), - }), - }, - }, - }, - query: &ocm.ShareReference{ - Spec: &ocm.ShareReference_Key{ - Key: &ocm.ShareKey{ - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - }, - }, - }, - user: &userpb.User{Id: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}, - expected: &ocm.ReceivedShare{ - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, - Expiration: &typesv1beta1.Timestamp{}, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + Expiration: &typesv1beta1.Timestamp{}, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1375,55 +1322,21 @@ func TestGetReceivedShare(t *testing.T) { }, }, }, - { - description: "query by key", - shares: []*ocm.ReceivedShare{ - { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, - Protocols: []*ocm.Protocol{ - share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ - Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), - }), - }, - }, - }, - query: &ocm.ShareReference{ - Spec: &ocm.ShareReference_Key{ - Key: &ocm.ShareKey{ - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "marie"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - }, - }, - }, - user: &userpb.User{Id: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}, - err: share.ErrShareNotFound, - }, { description: "query by id - different user", shares: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1439,17 +1352,17 @@ func TestGetReceivedShare(t *testing.T) { description: "all protocols", shares: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1462,18 +1375,18 @@ func TestGetReceivedShare(t *testing.T) { query: &ocm.ShareReference{Spec: &ocm.ShareReference_Id{Id: &ocm.ShareId{OpaqueId: "1"}}}, user: &userpb.User{Id: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}, expected: &ocm.ReceivedShare{ - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, - Expiration: &typesv1beta1.Timestamp{}, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, + Expiration: &typesv1beta1.Timestamp{}, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1534,17 +1447,17 @@ func TestListReceviedShares(t *testing.T) { description: "share belong to user", shares: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1557,18 +1470,18 @@ func TestListReceviedShares(t *testing.T) { user: &userpb.User{Id: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}, expected: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, - Expiration: &typesv1beta1.Timestamp{}, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + Expiration: &typesv1beta1.Timestamp{}, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1583,17 +1496,17 @@ func TestListReceviedShares(t *testing.T) { description: "all shares belong to user", shares: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1603,17 +1516,17 @@ func TestListReceviedShares(t *testing.T) { }, }, { - Id: &ocm.ShareId{OpaqueId: "2"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + Id: &ocm.ShareId{OpaqueId: "2"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, Protocols: []*ocm.Protocol{ share.NewWebappProtocol("https://cernbox.cern.ch/ocm/54321", appprovider.ViewMode_VIEW_MODE_READ_ONLY), }, @@ -1622,18 +1535,18 @@ func TestListReceviedShares(t *testing.T) { user: &userpb.User{Id: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}, expected: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, - Expiration: &typesv1beta1.Timestamp{}, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, + Expiration: &typesv1beta1.Timestamp{}, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1643,18 +1556,18 @@ func TestListReceviedShares(t *testing.T) { }, }, { - Id: &ocm.ShareId{OpaqueId: "2"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, - Expiration: &typesv1beta1.Timestamp{}, + Id: &ocm.ShareId{OpaqueId: "2"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + Expiration: &typesv1beta1.Timestamp{}, Protocols: []*ocm.Protocol{ share.NewWebappProtocol("https://cernbox.cern.ch/ocm/54321", appprovider.ViewMode_VIEW_MODE_READ_ONLY), }, @@ -1665,17 +1578,17 @@ func TestListReceviedShares(t *testing.T) { description: "select share by user", shares: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1685,17 +1598,17 @@ func TestListReceviedShares(t *testing.T) { }, }, { - Id: &ocm.ShareId{OpaqueId: "2"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "einstein"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + Id: &ocm.ShareId{OpaqueId: "2"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "einstein"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "richard"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, Protocols: []*ocm.Protocol{ share.NewWebappProtocol("https://cernbox.cern.ch/ocm/54321", appprovider.ViewMode_VIEW_MODE_READ_WRITE), }, @@ -1704,18 +1617,18 @@ func TestListReceviedShares(t *testing.T) { user: &userpb.User{Id: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}, expected: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, - Expiration: &typesv1beta1.Timestamp{}, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein", Type: userpb.UserType_USER_TYPE_FEDERATED}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + Expiration: &typesv1beta1.Timestamp{}, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1786,16 +1699,16 @@ func TestStoreReceivedShare(t *testing.T) { description: "empty table", shares: []*ocm.ReceivedShare{}, toStore: &ocm.ReceivedShare{ - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1803,7 +1716,7 @@ func TestStoreReceivedShare(t *testing.T) { }, }, expected: storeReceivedShareExpected{ - shares: []sql.Row{{int64(1), "file-name", "storage", "opaque-id", int8(1), "marie", "einstein@cernbox", "einstein@cernbox", uint64(1670859468), uint64(1670859468), nil, int8(ShareTypeUser), int8(ShareStateAccepted)}}, + shares: []sql.Row{{int64(1), "file-name", "1-remote", int8(1), "marie", "einstein@cernbox", "einstein@cernbox", uint64(1670859468), uint64(1670859468), nil, int8(ShareTypeUser), int8(ShareStateAccepted)}}, protocols: []sql.Row{{int64(1), int64(1), int8(0)}}, webdav: []sql.Row{{int64(1), "webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", int64(15)}}, webapp: []sql.Row{}, @@ -1814,17 +1727,17 @@ func TestStoreReceivedShare(t *testing.T) { description: "non empty table", shares: []*ocm.ReceivedShare{ { - Id: &ocm.ShareId{OpaqueId: "1"}, - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "opaque-id"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_ACCEPTED, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, + Id: &ocm.ShareId{OpaqueId: "1"}, + RemoteShareId: "1-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "marie"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "einstein"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_ACCEPTED, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_FILE, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1833,16 +1746,16 @@ func TestStoreReceivedShare(t *testing.T) { }, }, toStore: &ocm.ReceivedShare{ - ResourceId: &providerv1beta1.ResourceId{StorageId: "storage", OpaqueId: "new-resource"}, - Name: "file-name", - Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "richard"}}}, - Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "marie"}, - Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "marie"}, - Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, - ShareType: ocm.ShareType_SHARE_TYPE_USER, - State: ocm.ShareState_SHARE_STATE_PENDING, - ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, + RemoteShareId: "2-remote", + Name: "file-name", + Grantee: &providerv1beta1.Grantee{Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, Id: &providerv1beta1.Grantee_UserId{UserId: &userpb.UserId{Idp: "cesnet", OpaqueId: "richard"}}}, + Owner: &userpb.UserId{Idp: "cernbox", OpaqueId: "marie"}, + Creator: &userpb.UserId{Idp: "cernbox", OpaqueId: "marie"}, + Ctime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + Mtime: &typesv1beta1.Timestamp{Seconds: 1670859468}, + ShareType: ocm.ShareType_SHARE_TYPE_USER, + State: ocm.ShareState_SHARE_STATE_PENDING, + ResourceType: providerv1beta1.ResourceType_RESOURCE_TYPE_CONTAINER, Protocols: []*ocm.Protocol{ share.NewWebDAVProtocol("webdav+https//cernbox.cern.ch/dav/ocm/1", "secret", &ocm.SharePermissions{ Permissions: conversions.NewEditorRole().CS3ResourcePermissions(), @@ -1853,8 +1766,8 @@ func TestStoreReceivedShare(t *testing.T) { }, expected: storeReceivedShareExpected{ shares: []sql.Row{ - {int64(1), "file-name", "storage", "opaque-id", int8(0), "marie", "einstein@cernbox", "einstein@cernbox", uint64(1670859468), uint64(1670859468), uint64(0), int8(ShareTypeUser), int8(ShareStateAccepted)}, - {int64(2), "file-name", "storage", "new-resource", int8(1), "richard", "marie@cernbox", "marie@cernbox", uint64(1670859468), uint64(1670859468), nil, int8(ShareTypeUser), int8(ShareStatePending)}, + {int64(1), "file-name", "1-remote", int8(0), "marie", "einstein@cernbox", "einstein@cernbox", uint64(1670859468), uint64(1670859468), uint64(0), int8(ShareTypeUser), int8(ShareStateAccepted)}, + {int64(2), "file-name", "2-remote", int8(1), "richard", "marie@cernbox", "marie@cernbox", uint64(1670859468), uint64(1670859468), nil, int8(ShareTypeUser), int8(ShareStatePending)}, }, protocols: []sql.Row{ {int64(1), int64(1), int8(WebDAVProtocol)},