From 68b01718380e371aa58a42a49d49f6cf7584a93f Mon Sep 17 00:00:00 2001 From: Roman Perekhod Date: Tue, 11 Jun 2024 17:12:11 +0200 Subject: [PATCH] The libregraph public link type representation added to the PROPFIND response --- changelog/unreleased/ocdav-link-type.md | 5 ++++ .../owncloud/ocdav/propfind/propfind.go | 6 +++++ pkg/conversions/role.go | 23 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 changelog/unreleased/ocdav-link-type.md diff --git a/changelog/unreleased/ocdav-link-type.md b/changelog/unreleased/ocdav-link-type.md new file mode 100644 index 0000000000..9310416b10 --- /dev/null +++ b/changelog/unreleased/ocdav-link-type.md @@ -0,0 +1,5 @@ +Enhancement: The public link type added + +The libregraph public link type representation added to the PROPFIND response. + +https://github.com/cs3org/reva/pull/4722 diff --git a/internal/http/services/owncloud/ocdav/propfind/propfind.go b/internal/http/services/owncloud/ocdav/propfind/propfind.go index b2cb26113e..b9d7bbee1a 100644 --- a/internal/http/services/owncloud/ocdav/propfind/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind/propfind.go @@ -1344,6 +1344,12 @@ func mdToPropResponse(ctx context.Context, pf *XML, md *provider.ResourceInfo, p } else { appendToNotFound(prop.NotFound("oc:public-link-permission")) } + case "public-link-type": // only on a share root node + if ls != nil && md.PermissionSet != nil { + appendToOK(prop.Escaped("oc:public-link-type", role.OCSPermissionsToPublicLinkType(md.Type))) + } else { + appendToNotFound(prop.NotFound("oc:public-link-type")) + } case "public-link-item-type": // only on a share root node if ls != nil { if md.Type == provider.ResourceType_RESOURCE_TYPE_CONTAINER { diff --git a/pkg/conversions/role.go b/pkg/conversions/role.go index 6bf92d4ea9..6320595184 100644 --- a/pkg/conversions/role.go +++ b/pkg/conversions/role.go @@ -149,6 +149,29 @@ func (r *Role) WebDAVPermissions(isDir, isShared, isMountpoint, isPublic bool) s return b.String() } +// OCSPermissionsToPublicLinkType converts the public link OCSPermission to the sharingLinkType representation +// +// VIEW SharingLinkType = "view" +// UPLOAD SharingLinkType = "upload" +// EDIT SharingLinkType = "edit" +// CREATE_ONLY SharingLinkType = "createOnly" +func (r *Role) OCSPermissionsToPublicLinkType(rt provider.ResourceType) string { + p := r.OCSPermissions() + switch { + case p == PermissionRead: + return "view" + case p == PermissionRead|PermissionWrite && rt == provider.ResourceType_RESOURCE_TYPE_FILE: + return "edit" + case p == PermissionRead|PermissionCreate && rt == provider.ResourceType_RESOURCE_TYPE_CONTAINER: + return "upload" + case p == PermissionRead|PermissionWrite|PermissionCreate|PermissionDelete && rt == provider.ResourceType_RESOURCE_TYPE_CONTAINER: + return "edit" + case p == PermissionCreate && rt == provider.ResourceType_RESOURCE_TYPE_CONTAINER: + return "createOnly" + } + return "" +} + // RoleFromName creates a role from the name func RoleFromName(name string) *Role { switch name {