Skip to content

Commit 97fa98f

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

File tree

17 files changed

+156
-118
lines changed

17 files changed

+156
-118
lines changed

cmd/reva/ocm-share-create.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func getAccessMethods(webdav, webapp, datatx bool, rol string) ([]*ocm.AccessMet
197197
if err != nil {
198198
return nil, err
199199
}
200-
m = append(m, ocmshare.NewWebDavAccessMethod(perm))
200+
m = append(m, ocmshare.NewWebDavAccessMethod(perm, []string{}))
201201
}
202202
if webapp {
203203
v, err := getOCMViewMode(rol)

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ require (
1313
github.com/coreos/go-oidc/v3 v3.12.0
1414
github.com/creasty/defaults v1.8.0
1515
github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e
16-
github.com/cs3org/go-cs3apis v0.0.0-20241105092511-3ad35d174fc1
16+
github.com/cs3org/go-cs3apis v0.0.0-20250218144737-544dd3919658
1717
github.com/dgraph-io/ristretto v0.2.0
1818
github.com/dolthub/go-mysql-server v0.14.0
1919
github.com/gdexlab/go-render v1.0.1

go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -891,8 +891,8 @@ github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYK
891891
github.com/creasty/defaults v1.8.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM=
892892
github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e h1:tqSPWQeueWTKnJVMJffz4pz0o1WuQxJ28+5x5JgaHD8=
893893
github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4=
894-
github.com/cs3org/go-cs3apis v0.0.0-20241105092511-3ad35d174fc1 h1:RU6LT6mkD16xZs011+8foU7T3LrPvTTSWeTQ9OgfhkA=
895-
github.com/cs3org/go-cs3apis v0.0.0-20241105092511-3ad35d174fc1/go.mod h1:DedpcqXl193qF/08Y04IO0PpxyyMu8+GrkD6kWK2MEQ=
894+
github.com/cs3org/go-cs3apis v0.0.0-20250218144737-544dd3919658 h1:CmH7twDuNUrHQXChZMafWjsEp1V47KutJlOAt6FjzGA=
895+
github.com/cs3org/go-cs3apis v0.0.0-20250218144737-544dd3919658/go.mod h1:DedpcqXl193qF/08Y04IO0PpxyyMu8+GrkD6kWK2MEQ=
896896
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
897897
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
898898
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

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

+18-17
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ 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+
log.Info().Any("req", req).Msg("OCM /shares request received")
7172
if err != nil {
7273
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, err.Error(), nil)
7374
return
7475
}
75-
log.Info().Any("req", req).Msg("OCM /shares request received")
7676

7777
_, meshProvider, err := getIDAndMeshProvider(req.Sender)
7878
log.Debug().Msgf("Determined Mesh Provider '%s' from req.Sender '%s'", meshProvider, req.Sender)
@@ -99,7 +99,7 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) {
9999
Provider: &providerInfo,
100100
})
101101
if err != nil {
102-
reqres.WriteError(w, r, reqres.APIErrorServerError, "error sending a grpc is provider allowed request", err)
102+
reqres.WriteError(w, r, reqres.APIErrorServerError, "error sending a grpc isProviderAllowed request", err)
103103
return
104104
}
105105
if providerAllowedResp.Status.Code != rpc.Code_CODE_OK {
@@ -109,7 +109,7 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) {
109109

110110
shareWith, _, err := getIDAndMeshProvider(req.ShareWith)
111111
if err != nil {
112-
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, err.Error(), nil)
112+
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, "error with mesh provider", err)
113113
return
114114
}
115115

@@ -127,19 +127,19 @@ func (h *sharesHandler) CreateShare(w http.ResponseWriter, r *http.Request) {
127127

128128
owner, err := getUserIDFromOCMUser(req.Owner)
129129
if err != nil {
130-
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, err.Error(), nil)
130+
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, "error with remote owner", err)
131131
return
132132
}
133133

134134
sender, err := getUserIDFromOCMUser(req.Sender)
135135
if err != nil {
136-
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, err.Error(), nil)
136+
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, "error with remote sender", err)
137137
return
138138
}
139139

140140
protocols, err := getAndResolveProtocols(req.Protocols, r)
141141
if err != nil {
142-
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, err.Error(), nil)
142+
reqres.WriteError(w, r, reqres.APIErrorInvalidParameter, "error with protocols payload", err)
143143
return
144144
}
145145

@@ -249,45 +249,46 @@ func getOCMShareType(t string) ocm.ShareType {
249249
func getAndResolveProtocols(p Protocols, r *http.Request) ([]*ocm.Protocol, error) {
250250
protos := make([]*ocm.Protocol, 0, len(p))
251251
for _, data := range p {
252+
var uri string
252253
ocmProto := data.ToOCMProtocol()
253254
protocolName := GetProtocolName(data)
254-
var uri string
255-
var isLocalhost bool
256-
257255
switch protocolName {
258256
case "webdav":
259257
uri = ocmProto.GetWebdavOptions().Uri
260-
isLocalhost = strings.Contains(uri, "localhost")
258+
reqs := ocmProto.GetWebdavOptions().Requirements
259+
if len(reqs) > 0 {
260+
// we currently do not support any kind of requirement
261+
return nil, errtypes.BadRequest(fmt.Sprintf("incoming OCM share with requirements %+v not supported at this endpoint", reqs))
262+
}
261263
case "webapp":
262-
uri = ocmProto.GetWebappOptions().UriTemplate
263-
isLocalhost = strings.Contains(uri, "localhost")
264+
uri = ocmProto.GetWebappOptions().Uri
264265
}
265266

266-
// Irrespective from the presence of a full `uri` in the payload (deprecated), resolve the remote root
267+
// Irrespective from the presence of a full `uri` in the payload (deprecated), validate the
268+
// remote is an OCM server and resolve the remote root
267269
// yet skip this if the remote is localhost (for integration tests)
268-
if isLocalhost {
270+
if strings.Contains(uri, "localhost") {
269271
protos = append(protos, ocmProto)
270272
continue
271273
}
272274
remoteRoot, err := discoverOcmRoot(r, protocolName)
273275
if err != nil {
274276
return nil, err
275277
}
276-
uri, _ = url.JoinPath(remoteRoot, uri[strings.LastIndex(uri, "/")+1:])
277278

279+
uri, _ = url.JoinPath(remoteRoot, uri[strings.LastIndex(uri, "/")+1:])
278280
switch protocolName {
279281
case "webdav":
280282
ocmProto.GetWebdavOptions().Uri = uri
281283
case "webapp":
282-
ocmProto.GetWebappOptions().UriTemplate = uri
284+
ocmProto.GetWebappOptions().Uri = uri
283285
}
284286
protos = append(protos, ocmProto)
285287
}
286288

287289
return protos, nil
288290
}
289291

290-
291292
func discoverOcmRoot(r *http.Request, proto string) (string, error) {
292293
// implements the OCM discovery logic to fetch the root at the remote host that sent the share for the given proto, see
293294
// 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-3
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ type APIError struct {
6060

6161
// WriteError handles writing error responses.
6262
func WriteError(w http.ResponseWriter, r *http.Request, code APIErrorCode, message string, e error) {
63-
if e != nil {
64-
appctx.GetLogger(r.Context()).Error().Err(e).Msg(message)
65-
}
63+
appctx.GetLogger(r.Context()).Error().Err(e).Any("code", code).Str("message", message).Msg("sending back error response")
6664

6765
var encoded []byte
6866
var err error

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/nextcloud/nextcloud_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ var _ = Describe("Nextcloud", func() {
283283
OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c",
284284
},
285285
AccessMethods: []*ocm.AccessMethod{
286-
ocmshare.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()),
286+
ocmshare.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions(), []string{}),
287287
ocmshare.NewWebappAccessMethod(appprovider.ViewMode_VIEW_MODE_READ_WRITE),
288288
ocmshare.NewTransferAccessMethod(),
289289
},
@@ -422,7 +422,7 @@ var _ = Describe("Nextcloud", func() {
422422
},
423423
ShareType: ocm.ShareType_SHARE_TYPE_USER,
424424
AccessMethods: []*ocm.AccessMethod{
425-
ocmshare.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions()),
425+
ocmshare.NewWebDavAccessMethod(conversions.NewEditorRole().CS3ResourcePermissions(), []string{}),
426426
ocmshare.NewWebappAccessMethod(appprovider.ViewMode_VIEW_MODE_READ_WRITE),
427427
ocmshare.NewTransferAccessMethod(),
428428
},
@@ -475,7 +475,7 @@ var _ = Describe("Nextcloud", func() {
475475
Protocols: []*ocm.Protocol{
476476
ocmshare.NewWebDAVProtocol("webdav-uri", "some-token", &ocm.SharePermissions{
477477
Permissions: conversions.NewEditorRole().CS3ResourcePermissions(),
478-
}),
478+
}, []string{}),
479479
ocmshare.NewWebappProtocol("app-uri-template", appprovider.ViewMode_VIEW_MODE_READ_WRITE),
480480
ocmshare.NewTransferProtocol("source-uri", "some-token", 1),
481481
},
@@ -533,7 +533,7 @@ var _ = Describe("Nextcloud", func() {
533533
Protocols: []*ocm.Protocol{
534534
ocmshare.NewWebDAVProtocol("webdav-uri", "some-token", &ocm.SharePermissions{
535535
Permissions: conversions.NewEditorRole().CS3ResourcePermissions(),
536-
}),
536+
}, []string{}),
537537
ocmshare.NewWebappProtocol("app-uri-template", appprovider.ViewMode_VIEW_MODE_READ_WRITE),
538538
ocmshare.NewTransferProtocol("source-uri", "some-token", 1),
539539
},
@@ -622,7 +622,7 @@ var _ = Describe("Nextcloud", func() {
622622
Protocols: []*ocm.Protocol{
623623
ocmshare.NewWebDAVProtocol("webdav-uri", "some-token", &ocm.SharePermissions{
624624
Permissions: conversions.NewEditorRole().CS3ResourcePermissions(),
625-
}),
625+
}, []string{}),
626626
ocmshare.NewWebappProtocol("app-uri-template", appprovider.ViewMode_VIEW_MODE_READ_WRITE),
627627
ocmshare.NewTransferProtocol("source-uri", "some-token", 1),
628628
},

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

0 commit comments

Comments
 (0)