diff --git a/changelog/unreleased/sharetype-filter.md b/changelog/unreleased/sharetype-filter.md new file mode 100644 index 00000000000..fc140d04fac --- /dev/null +++ b/changelog/unreleased/sharetype-filter.md @@ -0,0 +1,5 @@ +Enhancement: Add a share types filter to the OCS API + +Added a filter to the OCS API to filter the received shares by type. + +https://github.com/cs3org/reva/pull/2050 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 dd5ca8c6820..0827932d9c0 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 @@ -545,7 +545,36 @@ func (h *Handler) listSharesWithMe(w http.ResponseWriter, r *http.Request) { } } - lrsRes, err := client.ListReceivedShares(ctx, &collaboration.ListReceivedSharesRequest{}) + filters := []*collaboration.Filter{} + var shareTypes []string + shareTypesParam := r.URL.Query().Get("share_types") + if shareTypesParam != "" { + shareTypes = strings.Split(shareTypesParam, ",") + } + for _, s := range shareTypes { + if s == "" { + continue + } + shareType, err := strconv.Atoi(strings.TrimSpace(s)) + if err != nil { + response.WriteOCSError(w, r, response.MetaBadRequest.StatusCode, "invalid share type", err) + return + } + switch shareType { + case int(conversions.ShareTypeUser): + filters = append(filters, share.UserGranteeFilter()) + case int(conversions.ShareTypeGroup): + filters = append(filters, share.GroupGranteeFilter()) + } + } + + if len(shareTypes) != 0 && len(filters) == 0 { + // If a share_types filter was set for anything other than user or group shares just return an empty response + response.WriteOCSSuccess(w, r, []*conversions.ShareData{}) + return + } + + lrsRes, err := client.ListReceivedShares(ctx, &collaboration.ListReceivedSharesRequest{Filters: filters}) if err != nil { response.WriteOCSError(w, r, response.MetaServerError.StatusCode, "error sending a grpc ListReceivedShares request", err) return @@ -628,25 +657,47 @@ func (h *Handler) listSharesWithOthers(w http.ResponseWriter, r *http.Request) { } } - shareTypes := strings.Split(r.URL.Query().Get("share_types"), ",") + var shareTypes []string + shareTypesParam := r.URL.Query().Get("share_types") + if shareTypesParam != "" { + shareTypes = strings.Split(shareTypesParam, ",") + } + + listPublicShares := len(shareTypes) == 0 // if no share_types filter was set we want to list all share by default + listUserShares := len(shareTypes) == 0 // if no share_types filter was set we want to list all share by default for _, s := range shareTypes { + if s == "" { + continue + } shareType, err := strconv.Atoi(strings.TrimSpace(s)) - if err != nil && s != "" { + if err != nil { 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...) + + switch shareType { + case int(conversions.ShareTypeUser): + listUserShares = true + filters = append(filters, share.UserGranteeFilter()) + case int(conversions.ShareTypeGroup): + listUserShares = true + filters = append(filters, share.GroupGranteeFilter()) + case int(conversions.ShareTypePublicLink): + listPublicShares = true } } + if listPublicShares { + publicShares, status, err := h.listPublicShares(r, linkFilters) + h.logProblems(status, err, "could not listPublicShares") + shares = append(shares, publicShares...) + } + if listUserShares { + userShares, status, err := h.listUserShares(r, filters) + h.logProblems(status, err, "could not listUserShares") + shares = append(shares, userShares...) + } + response.WriteOCSSuccess(w, r, shares) } diff --git a/pkg/share/manager/json/json.go b/pkg/share/manager/json/json.go index fe47803f94b..b547b71f0f2 100644 --- a/pkg/share/manager/json/json.go +++ b/pkg/share/manager/json/json.go @@ -268,21 +268,15 @@ func (m *mgr) get(ctx context.Context, ref *collaboration.ShareReference) (s *co // check if we are the owner user := ctxpkg.ContextMustGetUser(ctx) - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { + if share.IsCreatedByUser(s, user) { return s, nil } // or the grantee - if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER && utils.UserEqual(user.Id, s.Grantee.GetUserId()) { + if share.IsGrantedToUser(s, user) { return s, nil - } else if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_GROUP { - // check if all user groups match this share; TODO(labkode): filter shares created by us. - for _, g := range user.Groups { - if g == s.Grantee.GetGroupId().OpaqueId { - return s, nil - } - } } + // we return not found to not disclose information return nil, errtypes.NotFound(ref.String()) } @@ -302,7 +296,7 @@ func (m *mgr) Unshare(ctx context.Context, ref *collaboration.ShareReference) er user := ctxpkg.ContextMustGetUser(ctx) for i, s := range m.model.Shares { if sharesEqual(ref, s) { - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { + if share.IsCreatedByUser(s, user) { m.model.Shares[len(m.model.Shares)-1], m.model.Shares[i] = m.model.Shares[i], m.model.Shares[len(m.model.Shares)-1] m.model.Shares = m.model.Shares[:len(m.model.Shares)-1] if err := m.model.Save(); err != nil { @@ -336,7 +330,7 @@ func (m *mgr) UpdateShare(ctx context.Context, ref *collaboration.ShareReference user := ctxpkg.ContextMustGetUser(ctx) for i, s := range m.model.Shares { if sharesEqual(ref, s) { - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { + if share.IsCreatedByUser(s, user) { now := time.Now().UnixNano() m.model.Shares[i].Permissions = p m.model.Shares[i].Mtime = &typespb.Timestamp{ @@ -360,7 +354,7 @@ func (m *mgr) ListShares(ctx context.Context, filters []*collaboration.Filter) ( defer m.Unlock() user := ctxpkg.ContextMustGetUser(ctx) for _, s := range m.model.Shares { - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { + if share.IsCreatedByUser(s, user) { // no filter we return earlier if len(filters) == 0 { ss = append(ss, s) @@ -368,10 +362,8 @@ func (m *mgr) ListShares(ctx context.Context, filters []*collaboration.Filter) ( // check filters // TODO(labkode): add the rest of filters. for _, f := range filters { - if f.Type == collaboration.Filter_TYPE_RESOURCE_ID { - if utils.ResourceIDEqual(s.ResourceId, f.GetResourceId()) { - ss = append(ss, s) - } + if share.MatchesFilter(s, f) { + ss = append(ss, s) } } } @@ -387,20 +379,20 @@ func (m *mgr) ListReceivedShares(ctx context.Context, filters []*collaboration.F defer m.Unlock() user := ctxpkg.ContextMustGetUser(ctx) for _, s := range m.model.Shares { - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { - // omit shares created by me + if share.IsCreatedByUser(s, user) || !share.IsGrantedToUser(s, user) { + // omit shares created by the user or shares the user can't access continue } - if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER && utils.UserEqual(user.Id, s.Grantee.GetUserId()) { + + if len(filters) == 0 { rs := m.convert(ctx, s) rss = append(rss, rs) - } else if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_GROUP { - // check if all user groups match this share; TODO(labkode): filter shares created by us. - for _, g := range user.Groups { - if g == s.Grantee.GetGroupId().OpaqueId { - rs := m.convert(ctx, s) - rss = append(rss, rs) - } + } + + for _, f := range filters { + if share.MatchesFilter(s, f) { + rs := m.convert(ctx, s) + rss = append(rss, rs) } } } @@ -432,16 +424,9 @@ func (m *mgr) getReceived(ctx context.Context, ref *collaboration.ShareReference user := ctxpkg.ContextMustGetUser(ctx) for _, s := range m.model.Shares { if sharesEqual(ref, s) { - if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER && utils.UserEqual(user.Id, s.Grantee.GetUserId()) { + if share.IsGrantedToUser(s, user) { rs := m.convert(ctx, s) return rs, nil - } else if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_GROUP { - for _, g := range user.Groups { - if s.Grantee.GetGroupId().OpaqueId == g { - rs := m.convert(ctx, s) - return rs, nil - } - } } } } diff --git a/pkg/share/manager/memory/memory.go b/pkg/share/manager/memory/memory.go index 8f84c77d9b2..0383af6549b 100644 --- a/pkg/share/manager/memory/memory.go +++ b/pkg/share/manager/memory/memory.go @@ -148,7 +148,7 @@ func (m *manager) get(ctx context.Context, ref *collaboration.ShareReference) (s // check if we are the owner user := ctxpkg.ContextMustGetUser(ctx) - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { + if share.IsCreatedByUser(s, user) { return s, nil } @@ -171,7 +171,7 @@ func (m *manager) Unshare(ctx context.Context, ref *collaboration.ShareReference user := ctxpkg.ContextMustGetUser(ctx) for i, s := range m.shares { if sharesEqual(ref, s) { - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { + if share.IsCreatedByUser(s, user) { m.shares[len(m.shares)-1], m.shares[i] = m.shares[i], m.shares[len(m.shares)-1] m.shares = m.shares[:len(m.shares)-1] return nil @@ -201,7 +201,7 @@ func (m *manager) UpdateShare(ctx context.Context, ref *collaboration.ShareRefer user := ctxpkg.ContextMustGetUser(ctx) for i, s := range m.shares { if sharesEqual(ref, s) { - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { + if share.IsCreatedByUser(s, user) { now := time.Now().UnixNano() m.shares[i].Permissions = p m.shares[i].Mtime = &typespb.Timestamp{ @@ -221,19 +221,16 @@ func (m *manager) ListShares(ctx context.Context, filters []*collaboration.Filte defer m.lock.Unlock() user := ctxpkg.ContextMustGetUser(ctx) for _, s := range m.shares { - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { + if share.IsCreatedByUser(s, user) { // no filter we return earlier if len(filters) == 0 { ss = append(ss, s) - } else { - // check filters - // TODO(labkode): add the rest of filters. - for _, f := range filters { - if f.Type == collaboration.Filter_TYPE_RESOURCE_ID { - if utils.ResourceIDEqual(s.ResourceId, f.GetResourceId()) { - ss = append(ss, s) - } - } + } + // check filters + // TODO(labkode): add the rest of filters. + for _, f := range filters { + if share.MatchesFilter(s, f) { + ss = append(ss, s) } } } @@ -248,20 +245,20 @@ func (m *manager) ListReceivedShares(ctx context.Context, filters []*collaborati defer m.lock.Unlock() user := ctxpkg.ContextMustGetUser(ctx) for _, s := range m.shares { - if utils.UserEqual(user.Id, s.Owner) || utils.UserEqual(user.Id, s.Creator) { - // omit shares created by me + if share.IsCreatedByUser(s, user) || !share.IsGrantedToUser(s, user) { + // omit shares created by the user or shares the user can't access continue } - if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER && utils.UserEqual(user.Id, s.Grantee.GetUserId()) { + + if len(filters) == 0 { rs := m.convert(ctx, s) rss = append(rss, rs) - } else if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_GROUP { - // check if all user groups match this share; TODO(labkode): filter shares created by us. - for _, g := range user.Groups { - if g == s.Grantee.GetGroupId().OpaqueId { - rs := m.convert(ctx, s) - rss = append(rss, rs) - } + } + + for _, f := range filters { + if share.MatchesFilter(s, f) { + rs := m.convert(ctx, s) + rss = append(rss, rs) } } } @@ -293,16 +290,9 @@ func (m *manager) getReceived(ctx context.Context, ref *collaboration.ShareRefer user := ctxpkg.ContextMustGetUser(ctx) for _, s := range m.shares { if sharesEqual(ref, s) { - if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER && utils.UserEqual(user.Id, s.Grantee.GetUserId()) { + if share.IsGrantedToUser(s, user) { rs := m.convert(ctx, s) return rs, nil - } else if s.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_GROUP { - for _, g := range user.Groups { - if s.Grantee.GetGroupId().OpaqueId == g { - rs := m.convert(ctx, s) - return rs, nil - } - } } } } diff --git a/pkg/share/share.go b/pkg/share/share.go index 9184e0d93c5..53eb398e76b 100644 --- a/pkg/share/share.go +++ b/pkg/share/share.go @@ -21,8 +21,10 @@ package share import ( "context" + userv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/cs3org/reva/pkg/utils" ) // Manager is the interface that manipulates shares. @@ -82,3 +84,36 @@ func ResourceIDFilter(id *provider.ResourceId) *collaboration.Filter { }, } } + +// IsCreatedByUser checks if the user is the owner or creator of the share. +func IsCreatedByUser(share *collaboration.Share, user *userv1beta1.User) bool { + return utils.UserEqual(user.Id, share.Owner) || utils.UserEqual(user.Id, share.Creator) +} + +// IsGrantedToUser checks if the user is a grantee of the share. Either by a user grant or by a group grant. +func IsGrantedToUser(share *collaboration.Share, user *userv1beta1.User) bool { + if share.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_USER && utils.UserEqual(user.Id, share.Grantee.GetUserId()) { + return true + } + if share.Grantee.Type == provider.GranteeType_GRANTEE_TYPE_GROUP { + // check if any of the user's group is the grantee of the share + for _, g := range user.Groups { + if g == share.Grantee.GetGroupId().OpaqueId { + return true + } + } + } + return false +} + +// MatchesFilter tests if the share passes the filter. +func MatchesFilter(share *collaboration.Share, filter *collaboration.Filter) bool { + switch filter.Type { + case collaboration.Filter_TYPE_RESOURCE_ID: + return utils.ResourceIDEqual(share.ResourceId, filter.GetResourceId()) + case collaboration.Filter_TYPE_GRANTEE_TYPE: + return share.Grantee.Type == filter.GetGranteeType() + default: + return false + } +} diff --git a/pkg/share/share_test.go b/pkg/share/share_test.go new file mode 100644 index 00000000000..a88b96abbd3 --- /dev/null +++ b/pkg/share/share_test.go @@ -0,0 +1,119 @@ +// Copyright 2018-2021 CERN +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// In applying this license, CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +package share + +import ( + "testing" + + groupv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" + userv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + collaborationv1beta1 "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" + providerv1beta1 "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" +) + +func TestIsCreatedByUser(t *testing.T) { + user := userv1beta1.User{ + Id: &userv1beta1.UserId{ + Idp: "sampleidp", + OpaqueId: "user", + }, + } + + s1 := collaborationv1beta1.Share{ + Owner: &userv1beta1.UserId{ + Idp: "sampleidp", + OpaqueId: "user", + }, + } + + s2 := collaborationv1beta1.Share{ + Creator: &userv1beta1.UserId{ + Idp: "sampleidp", + OpaqueId: "user", + }, + } + + s3 := collaborationv1beta1.Share{ + Owner: &userv1beta1.UserId{ + Idp: "sampleidp", + OpaqueId: "user", + }, + Creator: &userv1beta1.UserId{ + Idp: "sampleidp", + OpaqueId: "user", + }, + } + + if !IsCreatedByUser(&s1, &user) || !IsCreatedByUser(&s2, &user) || !IsCreatedByUser(&s3, &user) { + t.Error("Expected share to be created by user") + } + + anotherUser := userv1beta1.User{ + Id: &userv1beta1.UserId{ + Idp: "sampleidp", + OpaqueId: "another", + }, + } + + if IsCreatedByUser(&s1, &anotherUser) { + t.Error("Expected share not to be created by user") + } +} + +func TestIsGrantedToUser(t *testing.T) { + user := userv1beta1.User{ + Id: &userv1beta1.UserId{ + Idp: "sampleidp", + OpaqueId: "another", + }, + Groups: []string{"groupid"}, + } + + s1 := collaborationv1beta1.Share{ + Grantee: &providerv1beta1.Grantee{ + Type: providerv1beta1.GranteeType_GRANTEE_TYPE_USER, + Id: &providerv1beta1.Grantee_UserId{ + UserId: &userv1beta1.UserId{ + Idp: "sampleidp", + OpaqueId: "another", + }, + }, + }, + } + + s2 := collaborationv1beta1.Share{ + Grantee: &providerv1beta1.Grantee{ + Type: providerv1beta1.GranteeType_GRANTEE_TYPE_GROUP, + Id: &providerv1beta1.Grantee_GroupId{ + GroupId: &groupv1beta1.GroupId{OpaqueId: "groupid"}}, + }, + } + + if !IsGrantedToUser(&s1, &user) || !IsGrantedToUser(&s2, &user) { + t.Error("Expected the share to be granted to user") + } + + s3 := collaborationv1beta1.Share{ + Grantee: &providerv1beta1.Grantee{}, + } + + if IsGrantedToUser(&s3, &user) { + t.Error("Expecte the share not to be granted to user") + } +} diff --git a/tests/acceptance/expected-failures-on-OCIS-storage.md b/tests/acceptance/expected-failures-on-OCIS-storage.md index 844697ad18a..813eb82a6c2 100644 --- a/tests/acceptance/expected-failures-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-on-OCIS-storage.md @@ -387,33 +387,6 @@ The first two tests work against ocis. There must be something wrong in the CI s - [apiShareOperationsToShares1/gettingShares.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingShares.feature#L220) - [apiShareOperationsToShares1/gettingShares.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingShares.feature#L221) -#### [Allow getting the share list filtered by share type via API](https://github.com/owncloud/ocis/issues/774) - -- [apiShareOperationsToShares1/gettingSharesPendingFiltered.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L44) -- [apiShareOperationsToShares1/gettingSharesPendingFiltered.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L45) -- [apiShareOperationsToShares1/gettingSharesPendingFiltered.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L56) -- [apiShareOperationsToShares1/gettingSharesPendingFiltered.feature:57](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L57) -- [apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L47) -- [apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L48) -- [apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L60) -- [apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L61) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:41](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L41) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L42) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L62) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L63) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L90) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L91) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L48) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L49) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L62) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L63) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L92) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L93) -- [apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L39) -- [apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L40) -- [apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L60) -- [apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L61) - #### [Public link enforce permissions](https://github.com/owncloud/ocis/issues/1269) - [apiSharePublicLink1/accessToPublicLinkShare.feature:10](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/accessToPublicLinkShare.feature#L10) diff --git a/tests/acceptance/expected-failures-on-S3NG-storage.md b/tests/acceptance/expected-failures-on-S3NG-storage.md index cbd5ac6dde2..e710f7417bf 100644 --- a/tests/acceptance/expected-failures-on-S3NG-storage.md +++ b/tests/acceptance/expected-failures-on-S3NG-storage.md @@ -399,33 +399,6 @@ File and sync features in a shared scenario - [apiShareOperationsToShares1/gettingShares.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingShares.feature#L220) - [apiShareOperationsToShares1/gettingShares.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingShares.feature#L221) -#### [Allow getting the share list filtered by share type via API](https://github.com/owncloud/ocis/issues/774) - -- [apiShareOperationsToShares1/gettingSharesPendingFiltered.feature:44](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L44) -- [apiShareOperationsToShares1/gettingSharesPendingFiltered.feature:45](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L45) -- [apiShareOperationsToShares1/gettingSharesPendingFiltered.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L56) -- [apiShareOperationsToShares1/gettingSharesPendingFiltered.feature:57](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L57) -- [apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:47](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L47) -- [apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L48) -- [apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L60) -- [apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L61) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:41](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L41) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L42) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L62) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L63) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L90) -- [apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L91) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L48) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:49](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L49) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L62) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L63) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:92](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L92) -- [apiShareOperationsToShares1/gettingSharesSharedFiltered.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L93) -- [apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L39) -- [apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L40) -- [apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L60) -- [apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:61](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L61) - #### [Public link enforce permissions](https://github.com/owncloud/ocis/issues/1269) - [apiSharePublicLink1/accessToPublicLinkShare.feature:10](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharePublicLink1/accessToPublicLinkShare.feature#L10)