diff --git a/changelog/unreleased/share-type-filter-ocs.md b/changelog/unreleased/share-type-filter-ocs.md new file mode 100644 index 0000000000..0583a6095a --- /dev/null +++ b/changelog/unreleased/share-type-filter-ocs.md @@ -0,0 +1,3 @@ +Enhancement: Filter created shares based on type in OCS + +https://github.com/cs3org/reva/pull/1683 diff --git a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go index 1e25a9e0a5..8cc1dd79fe 100644 --- a/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go +++ b/internal/http/services/owncloud/ocs/handlers/apps/sharing/shares/shares.go @@ -749,28 +749,40 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { func (h *Handler) listSharesWithOthers(w http.ResponseWriter, r *http.Request) { shares := make([]*conversions.ShareData, 0) + filters := []*collaboration.ListSharesRequest_Filter{} linkFilters := []*link.ListPublicSharesRequest_Filter{} - var err error + var e error // shared with others p := r.URL.Query().Get("path") if p != "" { // prefix the path with the owners home, because ocs share requests are relative to the home dir - filters, linkFilters, err = h.addFilters(w, r, h.homeNamespace) - if err != nil { + filters, linkFilters, e = h.addFilters(w, r, h.homeNamespace) + if e != nil { // result has been written as part of addFilters return } } - userShares, status, err := h.listUserShares(r, filters) - h.logProblems(status, err, "could not listUserShares") - - publicShares, status, err := h.listPublicShares(r, linkFilters) - h.logProblems(status, err, "could not listPublicShares") - - shares = append(shares, append(userShares, publicShares...)...) + shareTypes := strings.Split(r.URL.Query().Get("share_types"), ",") + for _, s := range shareTypes { + shareType, err := strconv.Atoi(strings.TrimSpace(s)) + if err != nil && s != "" { + response.WriteOCSError(w, r, response.MetaBadRequest.StatusCode, "invalid share type", err) + return + } + if s == "" || shareType == int(conversions.ShareTypeUser) || shareType == int(conversions.ShareTypeGroup) { + userShares, status, err := h.listUserShares(r, filters) + h.logProblems(status, err, "could not listUserShares") + shares = append(shares, userShares...) + } + if s == "" || shareType == int(conversions.ShareTypePublicLink) { + publicShares, status, err := h.listPublicShares(r, linkFilters) + h.logProblems(status, err, "could not listPublicShares") + shares = append(shares, publicShares...) + } + } response.WriteOCSSuccess(w, r, shares) } diff --git a/pkg/storage/utils/eosfs/eosfs.go b/pkg/storage/utils/eosfs/eosfs.go index 30854a6dae..ba6c8de598 100644 --- a/pkg/storage/utils/eosfs/eosfs.go +++ b/pkg/storage/utils/eosfs/eosfs.go @@ -1388,21 +1388,48 @@ func (fs *eosfs) permissionSet(ctx context.Context, eosFileInfo *eosclient.FileI } } - uid, gid, err := fs.getUserUIDAndGID(ctx, u) + uid, _, err := fs.getUserUIDAndGID(ctx, u) if err != nil { return &provider.ResourcePermissions{ // no permissions } } - var perm string + var perm provider.ResourcePermissions for _, e := range eosFileInfo.SysACL.Entries { - if e.Qualifier == uid || e.Qualifier == gid { - perm = e.Permissions + var userInGroup bool + for _, g := range u.Groups { + if e.Qualifier == g { + userInGroup = true + } + } + if e.Qualifier == uid || userInGroup { + mergePermissions(&perm, grants.GetGrantPermissionSet(e.Permissions, eosFileInfo.IsDir)) } } - return grants.GetGrantPermissionSet(perm, eosFileInfo.IsDir) + return &perm +} + +func mergePermissions(l *provider.ResourcePermissions, r *provider.ResourcePermissions) { + l.AddGrant = l.AddGrant || r.AddGrant + l.CreateContainer = l.CreateContainer || r.CreateContainer + l.Delete = l.Delete || r.Delete + l.GetPath = l.GetPath || r.GetPath + l.GetQuota = l.GetQuota || r.GetQuota + l.InitiateFileDownload = l.InitiateFileDownload || r.InitiateFileDownload + l.InitiateFileUpload = l.InitiateFileUpload || r.InitiateFileUpload + l.ListContainer = l.ListContainer || r.ListContainer + l.ListFileVersions = l.ListFileVersions || r.ListFileVersions + l.ListGrants = l.ListGrants || r.ListGrants + l.ListRecycle = l.ListRecycle || r.ListRecycle + l.Move = l.Move || r.Move + l.PurgeRecycle = l.PurgeRecycle || r.PurgeRecycle + l.RemoveGrant = l.RemoveGrant || r.RemoveGrant + l.RestoreFileVersion = l.RestoreFileVersion || r.RestoreFileVersion + l.RestoreRecycleItem = l.RestoreRecycleItem || r.RestoreRecycleItem + l.Stat = l.Stat || r.Stat + l.UpdateGrant = l.UpdateGrant || r.UpdateGrant } func (fs *eosfs) convert(ctx context.Context, eosFileInfo *eosclient.FileInfo, virtualView bool) (*provider.ResourceInfo, error) {