Skip to content

Commit b71fcb2

Browse files
committed
Use new ocm 1.2 fields from CS3APIs
1 parent 6e1c8de commit b71fcb2

File tree

13 files changed

+82
-41
lines changed

13 files changed

+82
-41
lines changed

internal/grpc/services/ocmshareprovider/ocmshareprovider.go

+1
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ func (s *service) getWebdavProtocol(share *ocm.Share, m *ocm.AccessMethod_Webdav
191191

192192
return &ocmd.WebDAV{
193193
Permissions: perms,
194+
Requirements: m.WebdavOptions.Requirements,
194195
URI: s.webdavURL(share),
195196
SharedSecret: share.Token,
196197
}

internal/http/services/experimental/sciencemesh/apps.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func (h *appsHandler) webappTemplate(ctx context.Context, id *ocmpb.ShareId) (st
121121
return "", errtypes.BadRequest("share does not contain webapp protocol")
122122
}
123123

124-
return webapp.UriTemplate, nil
124+
return webapp.Uri, nil
125125
}
126126

127127
func getWebappProtocol(protocols []*ocmpb.Protocol) (*ocmpb.WebappProtocol, bool) {

internal/http/services/experimental/sciencemesh/share.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) {
103103

104104
perm, viewMode := getPermissionsByRole(req.Role)
105105

106-
log.Debug().Msg("calling gatewayClient.CreateOCMShare from sciencemesh/share.go")
106+
log.Debug().Msg("calling gatewayClient.CreateOCMShare")
107107
shareRes, err := h.gatewayClient.CreateOCMShare(ctx, &ocm.CreateOCMShareRequest{
108108
ResourceId: statRes.Info.Id,
109109
Grantee: &providerpb.Grantee{
@@ -117,11 +117,11 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) {
117117
},
118118
RecipientMeshProvider: recipientProviderInfo.ProviderInfo,
119119
AccessMethods: []*ocm.AccessMethod{
120-
share.NewWebDavAccessMethod(perm),
120+
share.NewWebDavAccessMethod(perm, []string{}),
121121
share.NewWebappAccessMethod(viewMode),
122122
},
123123
})
124-
log.Debug().Msg("called gatewayClient.CreateOCMShare from sciencemesh/share.go")
124+
log.Debug().Any("response", shareRes).Msg("called gatewayClient.CreateOCMShare")
125125

126126
switch {
127127
case err != nil:

internal/http/services/opencloudmesh/ocmd/shares.go

+15-13
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,12 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) {
6868
ctx := r.Context()
6969
log := appctx.GetLogger(ctx)
7070
req, err := getCreateShareRequest(r)
71+
72+
log.Info().Any("req", req).Msg("OCM /shares request received")
7173
if err != nil {
7274
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, err.Error(), nil)
7375
return
7476
}
75-
log.Info().Any("req", req).Msg("OCM /shares request received")
7677

7778
_, meshProvider, err := getIDAndMeshProvider(req.Sender)
7879
log.Debug().Msgf("Determined Mesh Provider '%s' from req.Sender '%s'", meshProvider, req.Sender)
@@ -99,7 +100,7 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) {
99100
Provider: &providerInfo,
100101
})
101102
if err != nil {
102-
reqres.WriteError(w, r, reqres.APIErrorServerError, "error sending a grpc is provider allowed request", err)
103+
reqres.WriteError(w, r, reqres.APIErrorServerError, "error sending a grpc isProviderAllowed request", err)
103104
return
104105
}
105106
if providerAllowedResp.Status.Code != rpc.Code_CODE_OK {
@@ -249,45 +250,46 @@ func getOCMShareType(t string) ocm.ShareType {
249250
func getAndResolveProtocols(p Protocols, r *http.Request) ([]*ocm.Protocol, error) {
250251
protos := make([]*ocm.Protocol, 0, len(p))
251252
for _, data := range p {
253+
var uri string
252254
ocmProto := data.ToOCMProtocol()
253255
protocolName := GetProtocolName(data)
254-
var uri string
255-
var isLocalhost bool
256-
257256
switch protocolName {
258257
case "webdav":
259258
uri = ocmProto.GetWebdavOptions().Uri
260-
isLocalhost = strings.Contains(uri, "localhost")
259+
reqs := ocmProto.GetWebdavOptions().Requirements
260+
if len(reqs) > 0 {
261+
// we currently do not support any kind of requirement
262+
return nil, errtypes.BadRequest(fmt.Sprintf("incoming OCM share with requirements %+v not supported at this endpoint", reqs))
263+
}
261264
case "webapp":
262-
uri = ocmProto.GetWebappOptions().UriTemplate
263-
isLocalhost = strings.Contains(uri, "localhost")
265+
uri = ocmProto.GetWebappOptions().Uri
264266
}
265267

266-
// Irrespective from the presence of a full `uri` in the payload (deprecated), resolve the remote root
268+
// Irrespective from the presence of a full `uri` in the payload (deprecated), validate the
269+
// remote is an OCM server and resolve the remote root
267270
// yet skip this if the remote is localhost (for integration tests)
268-
if isLocalhost {
271+
if strings.Contains(uri, "localhost") {
269272
protos = append(protos, ocmProto)
270273
continue
271274
}
272275
remoteRoot, err := discoverOcmRoot(r, protocolName)
273276
if err != nil {
274277
return nil, err
275278
}
276-
uri, _ = url.JoinPath(remoteRoot, uri[strings.LastIndex(uri, "/")+1:])
277279

280+
uri, _ = url.JoinPath(remoteRoot, uri[strings.LastIndex(uri, "/")+1:])
278281
switch protocolName {
279282
case "webdav":
280283
ocmProto.GetWebdavOptions().Uri = uri
281284
case "webapp":
282-
ocmProto.GetWebappOptions().UriTemplate = uri
285+
ocmProto.GetWebappOptions().Uri = uri
283286
}
284287
protos = append(protos, ocmProto)
285288
}
286289

287290
return protos, nil
288291
}
289292

290-
291293
func discoverOcmRoot(r *http.Request, proto string) (string, error) {
292294
// implements the OCM discovery logic to fetch the root at the remote host that sent the share for the given proto, see
293295
// https://cs3org.github.io/OCM-API/docs.html?branch=v1.1.0&repo=OCM-API&user=cs3org#/paths/~1ocm-provider/get

internal/http/services/opencloudmesh/ocmd/specs.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ type Protocols []Protocol
9898
// Protocol represents the way of access the resource
9999
// in the OCM share.
100100
type Protocol interface {
101-
// ToOCMProtocol converts the protocol to a OCM `Protocol` struct
101+
// ToOCMProtocol converts the protocol to a CS3API OCM `Protocol` struct
102102
ToOCMProtocol() *ocm.Protocol
103103
}
104104

@@ -131,7 +131,7 @@ func (w *WebDAV) ToOCMProtocol() *ocm.Protocol {
131131
}
132132
}
133133

134-
return ocmshare.NewWebDAVProtocol(w.URI, w.SharedSecret, perms)
134+
return ocmshare.NewWebDAVProtocol(w.URI, w.SharedSecret, perms, w.Requirements)
135135
}
136136

137137
// Webapp contains the parameters for the Webapp protocol.
@@ -226,7 +226,7 @@ func (p Protocols) MarshalJSON() ([]byte, error) {
226226
for _, prot := range p {
227227
d[GetProtocolName(prot)] = prot
228228
}
229-
// fill in the OCM v1.0 properties: for now we only create OCM 1.1 payloads,
229+
// fill in the OCM v1.0 properties: we only create OCM 1.1+ payloads,
230230
// irrespective from the capabilities of the remote server.
231231
d["name"] = "multi"
232232
d["options"] = map[string]any{}

internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/remote.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ func (h *Handler) createFederatedCloudShare(w http.ResponseWriter, r *http.Reque
111111
},
112112
RecipientMeshProvider: providerInfoResp.ProviderInfo,
113113
AccessMethods: []*ocm.AccessMethod{
114-
share.NewWebDavAccessMethod(role.CS3ResourcePermissions()),
114+
share.NewWebDavAccessMethod(role.CS3ResourcePermissions(), []string{}),
115115
share.NewWebappAccessMethod(getViewModeFromRole(role)),
116116
},
117117
})

internal/http/services/reqres/reqres.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ type APIError struct {
6161
// WriteError handles writing error responses.
6262
func WriteError(w http.ResponseWriter, r *http.Request, code APIErrorCode, message string, e error) {
6363
if e != nil {
64-
appctx.GetLogger(r.Context()).Error().Err(e).Msg(message)
64+
appctx.GetLogger(r.Context()).Error().Err(e).Any("code", code).Str("message", message).Msg("sending back error response")
6565
}
6666

6767
var encoded []byte

pkg/ocm/share/repository/nextcloud/nextcloud.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ func (sm *Manager) efssShareToOcm(resp *EfssShare) *ocm.Share {
181181
// first generate the map of access methods, assuming WebDAV is always present
182182
var am = make([]*ocm.AccessMethod, 0, 3)
183183
am = append(am, share.NewWebDavAccessMethod(conversions.RoleFromOCSPermissions(
184-
conversions.Permissions(resp.Protocols.WebDAV.Permissions)).CS3ResourcePermissions()))
184+
conversions.Permissions(resp.Protocols.WebDAV.Permissions)).CS3ResourcePermissions(), []string{}))
185185
if resp.Protocols.WebApp.ViewMode != "" {
186186
am = append(am, share.NewWebappAccessMethod(utils.GetAppViewMode(resp.Protocols.WebApp.ViewMode)))
187187
}
@@ -326,7 +326,7 @@ func efssReceivedShareToOcm(resp *ReceivedEfssShare) *ocm.ReceivedShare {
326326
var proto = make([]*ocm.Protocol, 0, 3)
327327
proto = append(proto, share.NewWebDAVProtocol(resp.Share.Protocols.WebDAV.URI, resp.Share.Token, &ocm.SharePermissions{
328328
Permissions: conversions.RoleFromOCSPermissions(conversions.Permissions(resp.Share.Protocols.WebDAV.Permissions)).CS3ResourcePermissions(),
329-
}))
329+
}, []string{}))
330330
if resp.Share.Protocols.WebApp.ViewMode != "" {
331331
proto = append(proto, share.NewWebappProtocol(resp.Share.Protocols.WebApp.URI, utils.GetAppViewMode(resp.Share.Protocols.WebApp.ViewMode)))
332332
}

pkg/ocm/share/repository/sql/conversions.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,9 @@ func convertToCS3OCMReceivedShare(s *dbReceivedShare, p []*ocm.Protocol) *ocm.Re
267267
func convertToCS3AccessMethod(m *dbAccessMethod) *ocm.AccessMethod {
268268
switch m.Type {
269269
case WebDAVAccessMethod:
270-
return share.NewWebDavAccessMethod(conversions.RoleFromOCSPermissions(conversions.Permissions(*m.WebDAVPermissions)).CS3ResourcePermissions())
270+
return share.NewWebDavAccessMethod(
271+
conversions.RoleFromOCSPermissions(conversions.Permissions(*m.WebDAVPermissions)).CS3ResourcePermissions(),
272+
[]string{}) // TODO persist requirements
271273
case WebappAccessMethod:
272274
return share.NewWebappAccessMethod(appprovider.ViewMode(*m.WebAppViewMode))
273275
case TransferAccessMethod:
@@ -281,7 +283,7 @@ func convertToCS3Protocol(p *dbProtocol) *ocm.Protocol {
281283
case WebDAVProtocol:
282284
return share.NewWebDAVProtocol(*p.WebDAVURI, *p.WebDAVSharedSecret, &ocm.SharePermissions{
283285
Permissions: conversions.RoleFromOCSPermissions(conversions.Permissions(*p.WebDavPermissions)).CS3ResourcePermissions(),
284-
})
286+
}, []string{}) // TODO persist requirements
285287
case WebappProtocol:
286288
return share.NewWebappProtocol(*p.WebappURI, appprovider.ViewMode(*p.WebappViewMode))
287289
case TransferProtocol:

pkg/ocm/share/repository/sql/sql.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -572,7 +572,7 @@ func storeWebappProtocol(tx *sql.Tx, shareID int64, o *ocm.Protocol_WebappOption
572572
}
573573

574574
query := "INSERT INTO ocm_protocol_webapp SET ocm_protocol_id=?, uri_template=?, view_mode=?"
575-
params := []any{pID, o.WebappOptions.UriTemplate, o.WebappOptions.ViewMode}
575+
params := []any{pID, o.WebappOptions.Uri, o.WebappOptions.ViewMode}
576576

577577
_, err = tx.Exec(query, params...)
578578
return err

pkg/ocm/share/repository/sql/sql_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ func createReceivedShareTables(ctx *sql.Context, initData []*ocm.ReceivedShare)
286286
must(webdav.Insert(ctx, sql.NewRow(i, prot.WebdavOptions.Uri, prot.WebdavOptions.SharedSecret, int64(conversions.RoleFromResourcePermissions(prot.WebdavOptions.Permissions.Permissions).OCSPermissions()))))
287287
case *ocm.Protocol_WebappOptions:
288288
must(protocols.Insert(ctx, sql.NewRow(i, mustInt(share.Id.OpaqueId), int8(WebappProtocol))))
289-
must(webapp.Insert(ctx, sql.NewRow(i, prot.WebappOptions.UriTemplate, int8(prot.WebappOptions.ViewMode))))
289+
must(webapp.Insert(ctx, sql.NewRow(i, prot.WebappOptions.Uri, int8(prot.WebappOptions.ViewMode))))
290290
case *ocm.Protocol_TransferOptions:
291291
must(protocols.Insert(ctx, sql.NewRow(i, mustInt(share.Id.OpaqueId), int8(TransferProtocol))))
292292
must(transfer.Insert(ctx, sql.NewRow(i, prot.TransferOptions.SourceUri, prot.TransferOptions.SharedSecret, int64(prot.TransferOptions.Size))))

pkg/ocm/share/utils.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,26 @@ import (
2525
)
2626

2727
// NewWebDAVProtocol is an abstraction for creating a WebDAV protocol.
28-
func NewWebDAVProtocol(uri, sharedSecret string, perms *ocm.SharePermissions) *ocm.Protocol {
28+
func NewWebDAVProtocol(uri, sharedSecret string, perms *ocm.SharePermissions, reqs []string) *ocm.Protocol {
2929
return &ocm.Protocol{
3030
Term: &ocm.Protocol_WebdavOptions{
3131
WebdavOptions: &ocm.WebDAVProtocol{
3232
Uri: uri,
3333
SharedSecret: sharedSecret,
3434
Permissions: perms,
35+
Requirements: reqs,
3536
},
3637
},
3738
}
3839
}
3940

4041
// NewWebappProtocol is an abstraction for creating a Webapp protocol.
41-
func NewWebappProtocol(uriTemplate string, viewMode appprovider.ViewMode) *ocm.Protocol {
42+
func NewWebappProtocol(uri string, viewMode appprovider.ViewMode) *ocm.Protocol {
4243
return &ocm.Protocol{
4344
Term: &ocm.Protocol_WebappOptions{
4445
WebappOptions: &ocm.WebappProtocol{
45-
UriTemplate: uriTemplate,
46-
ViewMode: viewMode,
46+
Uri: uri,
47+
ViewMode: viewMode,
4748
},
4849
},
4950
}
@@ -63,11 +64,12 @@ func NewTransferProtocol(sourceURI, sharedSecret string, size uint64) *ocm.Proto
6364
}
6465

6566
// NewWebDavAccessMethod is an abstraction for creating a WebDAV access method.
66-
func NewWebDavAccessMethod(perms *provider.ResourcePermissions) *ocm.AccessMethod {
67+
func NewWebDavAccessMethod(perms *provider.ResourcePermissions, reqs []string) *ocm.AccessMethod {
6768
return &ocm.AccessMethod{
6869
Term: &ocm.AccessMethod_WebdavOptions{
6970
WebdavOptions: &ocm.WebDAVAccessMethod{
70-
Permissions: perms,
71+
Permissions: perms,
72+
Requirements: reqs,
7173
},
7274
},
7375
}

tests/integration/grpc/ocm_share_test.go

+41-7
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ var _ = Describe("ocm share", func() {
197197
},
198198
},
199199
AccessMethods: []*ocmv1beta1.AccessMethod{
200-
share.NewWebDavAccessMethod(conversions.NewViewerRole().CS3ResourcePermissions()),
200+
share.NewWebDavAccessMethod(conversions.NewViewerRole().CS3ResourcePermissions(), []string{}),
201201
},
202202
RecipientMeshProvider: cesnet.ProviderInfo,
203203
})
@@ -278,7 +278,7 @@ var _ = Describe("ocm share", func() {
278278
},
279279
},
280280
AccessMethods: []*ocmv1beta1.AccessMethod{
281-
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()),
281+
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions(), []string{}),
282282
},
283283
RecipientMeshProvider: cesnet.ProviderInfo,
284284
})
@@ -374,7 +374,7 @@ var _ = Describe("ocm share", func() {
374374
},
375375
},
376376
AccessMethods: []*ocmv1beta1.AccessMethod{
377-
share.NewWebDavAccessMethod(conversions.NewViewerRole().CS3ResourcePermissions()),
377+
share.NewWebDavAccessMethod(conversions.NewViewerRole().CS3ResourcePermissions(), []string{}),
378378
},
379379
RecipientMeshProvider: cesnet.ProviderInfo,
380380
})
@@ -477,7 +477,7 @@ var _ = Describe("ocm share", func() {
477477
},
478478
},
479479
AccessMethods: []*ocmv1beta1.AccessMethod{
480-
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()),
480+
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions(), []string{}),
481481
},
482482
RecipientMeshProvider: cesnet.ProviderInfo,
483483
})
@@ -626,7 +626,7 @@ var _ = Describe("ocm share", func() {
626626
},
627627
},
628628
AccessMethods: []*ocmv1beta1.AccessMethod{
629-
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()),
629+
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions(), []string{}),
630630
},
631631
RecipientMeshProvider: cesnet.ProviderInfo,
632632
})
@@ -643,7 +643,7 @@ var _ = Describe("ocm share", func() {
643643
},
644644
},
645645
AccessMethods: []*ocmv1beta1.AccessMethod{
646-
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()),
646+
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions(), []string{}),
647647
},
648648
RecipientMeshProvider: cesnet.ProviderInfo,
649649
})
@@ -668,7 +668,7 @@ var _ = Describe("ocm share", func() {
668668
},
669669
},
670670
AccessMethods: []*ocmv1beta1.AccessMethod{
671-
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()),
671+
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions(), []string{}),
672672
},
673673
RecipientMeshProvider: cesnet.ProviderInfo,
674674
})
@@ -677,6 +677,40 @@ var _ = Describe("ocm share", func() {
677677
})
678678
})
679679

680+
Context("einstein creates a share with a requirement that cannot be met", func() {
681+
It("fail with bad request error", func() {
682+
fileToShare := &provider.Reference{
683+
Path: "/home/file-with-req",
684+
}
685+
By("creating a file")
686+
Expect(helpers.CreateFile(ctxEinstein, cernboxgw, fileToShare.Path, []byte("test"))).To(Succeed())
687+
688+
By("share the file with marie")
689+
info, err := stat(ctxEinstein, cernboxgw, fileToShare)
690+
Expect(err).ToNot(HaveOccurred())
691+
692+
cesnet, err := cernboxgw.GetInfoByDomain(ctxEinstein, &ocmproviderpb.GetInfoByDomainRequest{
693+
Domain: "cesnet.cz",
694+
})
695+
Expect(err).ToNot(HaveOccurred())
696+
Expect(cesnet.Status.Code).To(Equal(rpcv1beta1.Code_CODE_OK))
697+
698+
createShareRes, err := cernboxgw.CreateOCMShare(ctxEinstein, &ocmv1beta1.CreateOCMShareRequest{
699+
ResourceId: info.Id,
700+
Grantee: &provider.Grantee{
701+
Id: &provider.Grantee_UserId{
702+
UserId: marie.Id,
703+
},
704+
},
705+
AccessMethods: []*ocmv1beta1.AccessMethod{
706+
share.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions(), []string{"unsupported-requirement"}),
707+
},
708+
RecipientMeshProvider: cesnet.ProviderInfo,
709+
})
710+
Expect(err).ToNot(HaveOccurred())
711+
Expect(createShareRes.Status.Code).To(Equal(rpcv1beta1.Code_CODE_INVALID_ARGUMENT))
712+
})
713+
})
680714
})
681715
})
682716

0 commit comments

Comments
 (0)