diff --git a/.drone.env b/.drone.env index 2a78bada76..b8f76e8769 100644 --- a/.drone.env +++ b/.drone.env @@ -1,3 +1,3 @@ # The test runner source for API tests -CORE_COMMITID=e47056ad0081656abddb1e5ac4b60bc34f073028 +CORE_COMMITID=1c59ed8d17317b04b9f525a74696b5fd756525ae CORE_BRANCH=master diff --git a/.drone.star b/.drone.star index ac89022b02..e6780b8f30 100644 --- a/.drone.star +++ b/.drone.star @@ -174,7 +174,7 @@ def buildAndPublishDocker(): "settings": { "repo": "cs3org/reva", "tags": "latest", - "dockerfile": "Dockerfile.revad", + "dockerfile": "Dockerfile.reva", "username":{ "from_secret": "dockerhub_username", }, diff --git a/Dockerfile.reva b/Dockerfile.reva index 9269c2a33e..97ebb664a5 100644 --- a/Dockerfile.reva +++ b/Dockerfile.reva @@ -16,7 +16,7 @@ # granted to it by virtue of its status as an Intergovernmental Organization # or submit itself to any jurisdiction. -FROM golang:alpine as builder +FROM golang:alpine3.13 as builder RUN apk --no-cache add \ ca-certificates \ diff --git a/Dockerfile.revad b/Dockerfile.revad index 7d6dbc5d3c..0455e04542 100644 --- a/Dockerfile.revad +++ b/Dockerfile.revad @@ -16,7 +16,7 @@ # granted to it by virtue of its status as an Intergovernmental Organization # or submit itself to any jurisdiction. -FROM golang:alpine as builder +FROM golang:alpine3.13 as builder RUN apk --no-cache add \ ca-certificates \ @@ -36,7 +36,7 @@ RUN make build-revad-docker && \ RUN mkdir -p /etc/revad/ && echo "" > /etc/revad/revad.toml -FROM golang:alpine +FROM golang:alpine3.13 RUN apk --no-cache add \ mailcap diff --git a/Dockerfile.revad-eos b/Dockerfile.revad-eos index 0a214b2992..b60c928b30 100644 --- a/Dockerfile.revad-eos +++ b/Dockerfile.revad-eos @@ -16,7 +16,7 @@ # granted to it by virtue of its status as an Intergovernmental Organization # or submit itself to any jurisdiction. -FROM golang:alpine as builder +FROM golang:alpine3.13 as builder RUN apk --no-cache add \ ca-certificates \ diff --git a/README.md b/README.md index 716a570a85..fada57a9b8 100644 --- a/README.md +++ b/README.md @@ -36,14 +36,49 @@ You can also read the [build from sources guide](https://reva.link/docs/getting- ## Run tests -### unit tests / GRPC tests -`make test` +Reva's codebase continuously undergoes testing at various levels. + +To understand which tests exist, you can have a look at the [Makefile](https://github.com/cs3org/reva/blob/master/Makefile) and the [Drone run logs](https://drone.cernbox.cern.ch/cs3org/reva/). + +The tests run by CERN's instance of [Drone CI/CD](https://docs.drone.io/) are defined in the [.drone.star](https://github.com/cs3org/reva/blob/master/.drone.star) file. + +NB: The [tests/oc-integration-tests/drone](https://github.com/cs3org/reva/tree/master/tests/oc-integration-tests/drone) and [tests/oc-integration-tests/local](https://github.com/cs3org/reva/tree/master/tests/oc-integration-tests/local) folders contain the configuration fixtures that are used to start up the Reva instance to test (on drone CI/CD or on your local system, respectively), for both these acceptance tests ("ownCloud legacy integration tests") and the Litmus tests. + +### Unit tests + +This runs the `_test.go` files that appear next to some of the `.go` files in the code tree. + +For instance `pkg/utils/utils_test.go` contains unit tests for `pkg/utils/utils.go`. + +To run all of them you can do `make test`. If you see `TestGetManagerWithInvalidUser/Nil_in_user` fail, [try removing](https://github.com/cs3org/reva/issues/1736) `/etc/revad/users.json` on your system. -### litmus tests +To run a single one of them you can do: +```sh +$ go test `go list ./pkg/utils/...` +ok github.com/cs3org/reva/pkg/utils 0.374s +``` + +### Integration tests (GRPC) +See [tests/integration](https://github.com/cs3org/reva/tree/master/tests/integration). +This requires Redis. + +```sh +export REDIS_ADDRESS=127.0.0.1:6379 +make test-integration +``` + +You can get more verbose output with `ginkgo -v -r tests/integration/`. + +NB: This will work better on Linux than on MacOS because of issues with static linking (`library not found for -lcrt0.o`). + +### Litmus tests (WebDAV) +[Litmus](http://www.webdav.org/neon/litmus/) is a webdav test suite. The litmus tests for Reva's WebDAV interface are run using the [ownCloud's litmus Docker image](https://github.com/owncloud-docker/litmus). The '-old' and '-new' refer to which `LITMUS_URL` environment variable is passed to that Docker image, in other words, which path on the Reva server the litmus tests are run against. + 1. start the needed services ``` + mkdir -p /var/tmp/reva/einstein cd tests/oc-integration-tests/local ../../../cmd/revad/revad -c frontend.toml & ../../../cmd/revad/revad -c gateway.toml & @@ -65,7 +100,11 @@ If you see `TestGetManagerWithInvalidUser/Nil_in_user` fail, [try removing](http - change `LITMUS_URL` for other tests e.g. `-e LITMUS_URL=http://localhost:20080/remote.php/dav/files/einstein` or to a public-share link - if on MacOS you see `FAIL (connection refused by '127.0.0.1' port 20080: Connection refused)`, it may be necessary to replace 'localhost' with your host IP address (e.g. `ipconfig getifaddr en0` or `sudo ifconfig | grep 192`) -### ownCloud legacy integration tests +### Acceptance tests (ownCloud legacy) +See [tests/acceptance](https://github.com/cs3org/reva/tree/master/tests/acceptance). + +This will require some PHP-related tools to run, for instance on Ubuntu you will need `apt install -y php-xml php-curl composer`. + 1. start an LDAP server ``` docker run --rm --hostname ldap.my-company.com \ diff --git a/changelog/unreleased/add-gocdb-apikey.md b/changelog/unreleased/add-gocdb-apikey.md new file mode 100644 index 0000000000..a6570246b3 --- /dev/null +++ b/changelog/unreleased/add-gocdb-apikey.md @@ -0,0 +1,5 @@ +Enhancement: Add API key to Mentix GOCDB connector + +The PI (programmatic interface) of the GOCDB will soon require an API key; this PR adds the ability to configure this key in Mentix. + +https://github.com/cs3org/reva/pull/1834 diff --git a/changelog/unreleased/ci-fix-reva-dockerfile-path.md b/changelog/unreleased/ci-fix-reva-dockerfile-path.md new file mode 100644 index 0000000000..79b4099a97 --- /dev/null +++ b/changelog/unreleased/ci-fix-reva-dockerfile-path.md @@ -0,0 +1,12 @@ +Bugfix: correct Dockerfile path for the reva CLI and alpine3.13 as builder + +This was introduced on https://github.com/cs3org/reva/commit/117adad while +porting the configuration on .drone.yml to starlark. + +Force golang:alpine3.13 as base image to prevent errors from Make when +running on Docker <20.10 as it happens on Drone + ref.https://gitlab.alpinelinux.org/alpine/aports/-/issues/12396 + +https://github.com/cs3org/reva/pull/1843 +https://github.com/cs3org/reva/pull/1844 +https://github.com/cs3org/reva/pull/1847 diff --git a/changelog/unreleased/deny-acls.md b/changelog/unreleased/deny-acls.md new file mode 100644 index 0000000000..d0c5e165b0 --- /dev/null +++ b/changelog/unreleased/deny-acls.md @@ -0,0 +1,4 @@ +Enhancement: add support for a deny-all permission on references +and implement it on the EOS storage + +http://github.com/cs3org/reva/pull/1798 diff --git a/changelog/unreleased/ldap-nobody-fallback.md b/changelog/unreleased/ldap-nobody-fallback.md new file mode 100644 index 0000000000..0e517294e3 --- /dev/null +++ b/changelog/unreleased/ldap-nobody-fallback.md @@ -0,0 +1,5 @@ +Bugfix: Fill in missing gid/uid number with nobody + +When an LDAP server does not provide numeric uid or gid properties for a user we now fall back to a configurable `nobody` id (default 99). + +https://github.com/cs3org/reva/pull/1848 diff --git a/cmd/reva/common.go b/cmd/reva/common.go index 585607ba95..ed630c1128 100644 --- a/cmd/reva/common.go +++ b/cmd/reva/common.go @@ -31,7 +31,10 @@ import ( const ( viewerPermission string = "viewer" + readerPermission string = "reader" editorPermission string = "editor" + collabPermission string = "collab" + denyPermission string = "denied" ) type config struct { diff --git a/cmd/reva/share-create.go b/cmd/reva/share-create.go index 1513569cef..9911c4884b 100644 --- a/cmd/reva/share-create.go +++ b/cmd/reva/share-create.go @@ -153,7 +153,14 @@ func getGrantType(t string) provider.GranteeType { } func getSharePerm(p string) (*provider.ResourcePermissions, error) { - if p == viewerPermission { + switch p { + case viewerPermission: + return &provider.ResourcePermissions{ + GetPath: true, + ListContainer: true, + Stat: true, + }, nil + case readerPermission: return &provider.ResourcePermissions{ GetPath: true, InitiateFileDownload: true, @@ -161,7 +168,7 @@ func getSharePerm(p string) (*provider.ResourcePermissions, error) { ListContainer: true, Stat: true, }, nil - } else if p == editorPermission { + case editorPermission: return &provider.ResourcePermissions{ GetPath: true, InitiateFileDownload: true, @@ -174,6 +181,25 @@ func getSharePerm(p string) (*provider.ResourcePermissions, error) { RestoreFileVersion: true, Move: true, }, nil + case collabPermission: + return &provider.ResourcePermissions{ + GetPath: true, + InitiateFileDownload: true, + ListFileVersions: true, + ListContainer: true, + Stat: true, + CreateContainer: true, + Delete: true, + InitiateFileUpload: true, + RestoreFileVersion: true, + Move: true, + AddGrant: true, + UpdateGrant: true, + RemoveGrant: true, + }, nil + case denyPermission: + return &provider.ResourcePermissions{}, nil + default: + return nil, errors.New("invalid rol: " + p) } - return nil, errors.New("invalid rol: " + p) } diff --git a/docs/content/en/docs/config/grpc/services/storageprovider/_index.md b/docs/content/en/docs/config/grpc/services/storageprovider/_index.md index 6e6b36f4c3..2d7287515a 100644 --- a/docs/content/en/docs/config/grpc/services/storageprovider/_index.md +++ b/docs/content/en/docs/config/grpc/services/storageprovider/_index.md @@ -9,7 +9,7 @@ description: > # _struct: config_ {{% dir name="mount_path" type="string" default="/" %}} -The path where the file system would be mounted. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L52) +The path where the file system would be mounted. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L59) {{< highlight toml >}} [grpc.services.storageprovider] mount_path = "/" @@ -17,7 +17,7 @@ mount_path = "/" {{% /dir %}} {{% dir name="mount_id" type="string" default="-" %}} -The ID of the mounted file system. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L53) +The ID of the mounted file system. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L60) {{< highlight toml >}} [grpc.services.storageprovider] mount_id = "-" @@ -25,7 +25,7 @@ mount_id = "-" {{% /dir %}} {{% dir name="driver" type="string" default="localhome" %}} -The storage driver to be used. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L54) +The storage driver to be used. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L61) {{< highlight toml >}} [grpc.services.storageprovider] driver = "localhome" @@ -33,7 +33,7 @@ driver = "localhome" {{% /dir %}} {{% dir name="drivers" type="map[string]map[string]interface{}" default="localhome" %}} - [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L55) + [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L62) {{< highlight toml >}} [grpc.services.storageprovider.drivers.localhome] root = "/var/tmp/reva/" @@ -44,7 +44,7 @@ user_layout = "{{.Username}}" {{% /dir %}} {{% dir name="tmp_folder" type="string" default="/var/tmp" %}} -Path to temporary folder. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L56) +Path to temporary folder. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L63) {{< highlight toml >}} [grpc.services.storageprovider] tmp_folder = "/var/tmp" @@ -52,7 +52,7 @@ tmp_folder = "/var/tmp" {{% /dir %}} {{% dir name="data_server_url" type="string" default="http://localhost/data" %}} -The URL for the data server. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L57) +The URL for the data server. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L64) {{< highlight toml >}} [grpc.services.storageprovider] data_server_url = "http://localhost/data" @@ -60,7 +60,7 @@ data_server_url = "http://localhost/data" {{% /dir %}} {{% dir name="expose_data_server" type="bool" default=false %}} -Whether to expose data server. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L58) +Whether to expose data server. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L65) {{< highlight toml >}} [grpc.services.storageprovider] expose_data_server = false @@ -68,7 +68,7 @@ expose_data_server = false {{% /dir %}} {{% dir name="available_checksums" type="map[string]uint32" default=nil %}} -List of available checksums. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L59) +List of available checksums. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L66) {{< highlight toml >}} [grpc.services.storageprovider] available_checksums = nil @@ -76,10 +76,18 @@ available_checksums = nil {{% /dir %}} {{% dir name="mimetypes" type="map[string]string" default=nil %}} -List of supported mime types and corresponding file extensions. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L60) +List of supported mime types and corresponding file extensions. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L67) {{< highlight toml >}} [grpc.services.storageprovider] mimetypes = nil {{< /highlight >}} {{% /dir %}} +{{% dir name="gatewaysvc" type="string" default="/" %}} +Stores the endpoint at which the GRPC gateway is exposed. [[Ref]](https://github.com/cs3org/reva/tree/master/internal/grpc/services/storageprovider/storageprovider.go#L68) +{{< highlight toml >}} +[grpc.services.storageprovider] +gatewaysvc = "/" +{{< /highlight >}} +{{% /dir %}} + diff --git a/docs/content/en/docs/config/http/services/mentix/gocdb/_index.md b/docs/content/en/docs/config/http/services/mentix/gocdb/_index.md index f84a3ae415..e2a51d185b 100644 --- a/docs/content/en/docs/config/http/services/mentix/gocdb/_index.md +++ b/docs/content/en/docs/config/http/services/mentix/gocdb/_index.md @@ -25,3 +25,11 @@ The scope to use for filtering sites and services. scope = "SM" {{< /highlight >}} {{% /dir %}} + +{{% dir name="apikey" type="string" default="" %}} +The API key to use for the GOCDB PI. +{{< highlight toml >}} +[http.services.mentix.connectors.gocdb] +apikey = "abc123" +{{< /highlight >}} +{{% /dir %}} diff --git a/examples/mentix/mentix.toml b/examples/mentix/mentix.toml index 6e3e149ea6..1da40b784f 100644 --- a/examples/mentix/mentix.toml +++ b/examples/mentix/mentix.toml @@ -6,6 +6,7 @@ update_interval = "15m" [http.services.mentix.connectors.gocdb] address = "http://sciencemesh-test.uni-muenster.de" +apikey = "abc123" # Sites can also be stored in a local file [http.services.mentix.connectors.localfile] diff --git a/go.mod b/go.mod index a98c730972..a5bc83f68e 100644 --- a/go.mod +++ b/go.mod @@ -23,6 +23,7 @@ require ( github.com/go-sql-driver/mysql v1.6.0 github.com/golang/protobuf v1.5.2 github.com/gomodule/redigo v1.8.5 + github.com/google/go-cmp v0.5.5 github.com/google/go-github v17.0.0+incompatible github.com/google/go-querystring v1.0.0 // indirect github.com/google/uuid v1.2.0 @@ -31,29 +32,31 @@ require ( github.com/imdario/mergo v0.3.8 // indirect github.com/jedib0t/go-pretty v4.3.0+incompatible github.com/mattn/go-sqlite3 v2.0.3+incompatible - github.com/minio/minio-go/v7 v7.0.11 + github.com/minio/minio-go/v7 v7.0.12 github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/mapstructure v1.4.1 + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 github.com/onsi/ginkgo v1.16.4 github.com/onsi/gomega v1.13.0 github.com/ory/fosite v0.40.2 github.com/pkg/errors v0.9.1 github.com/pkg/xattr v0.4.3 github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 // indirect - github.com/rs/cors v1.7.0 + github.com/rs/cors v1.8.0 github.com/rs/zerolog v1.23.0 github.com/sciencemesh/meshdirectory-web v1.0.4 github.com/sethvargo/go-password v0.2.0 github.com/stretchr/testify v1.7.0 github.com/studio-b12/gowebdav v0.0.0-20200303150724-9380631c29a1 + github.com/thanhpk/randstr v1.0.4 github.com/tus/tusd v1.1.1-0.20200416115059-9deabf9d80c2 go.opencensus.io v0.23.0 - golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c + golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/sys v0.0.0-20210423082822-04245dca01da golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 - google.golang.org/grpc v1.38.0 - google.golang.org/protobuf v1.27.0 + google.golang.org/grpc v1.39.0 + google.golang.org/protobuf v1.27.1 gotest.tools v2.2.0+incompatible ) diff --git a/go.sum b/go.sum index d833364426..1a21306697 100644 --- a/go.sum +++ b/go.sum @@ -199,6 +199,8 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/gdexlab/go-render v1.0.1 h1:rxqB3vo5s4n1kF0ySmoNeSPRYkEsyHgln4jFIQY7v0U= github.com/gdexlab/go-render v1.0.1/go.mod h1:wRi5nW2qfjiGj4mPukH4UV0IknS1cHD4VgFTmJX5JzM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= @@ -272,6 +274,8 @@ github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -771,6 +775,7 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= github.com/lib/pq v0.0.0-20180327071824-d34b9ff171c2/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -850,8 +855,8 @@ github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/le github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= -github.com/minio/minio-go/v7 v7.0.11 h1:7utSkCtMQPYYB1UB8FR3d0QSiOWE6F/JYXon29imYek= -github.com/minio/minio-go/v7 v7.0.11/go.mod h1:WoyW+ySKAKjY98B9+7ZbI8z8S3jaxaisdcvj9TGlazA= +github.com/minio/minio-go/v7 v7.0.12 h1:/4pxUdwn9w0QEryNkrrWaodIESPRX+NxpO0Q6hVdaAA= +github.com/minio/minio-go/v7 v7.0.12/go.mod h1:S23iSP5/gbMwtxeY5FM71R+TkAYyzEdoNEDDwpt8yWs= github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -1054,8 +1059,8 @@ github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= +github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= @@ -1171,6 +1176,8 @@ github.com/subosito/gotenv v1.1.1/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/thanhpk/randstr v1.0.4 h1:IN78qu/bR+My+gHCvMEXhR/i5oriVHcTB/BJJIRTsNo= +github.com/thanhpk/randstr v1.0.4/go.mod h1:M/H2P1eNLZzlDwAzpkkkUvoyNNMbzRGhESZuEQk3r0U= github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/gjson v1.6.8/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI= github.com/tidwall/gjson v1.7.1/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk= @@ -1196,7 +1203,9 @@ github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMW github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/unrolled/secure v0.0.0-20180918153822-f340ee86eb8b/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= github.com/unrolled/secure v0.0.0-20181005190816-ff9db2ff917f/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -1288,9 +1297,9 @@ golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c h1:9HhBz5L/UjnK9XLtiZhYAdue5BVKep3PMmS2LuPDt8k= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f h1:aZp0e2vLN4MToVqnjNEYEtrEA8RH8U8FN1CU7JgqsPU= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1646,8 +1655,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.0 h1:KhgSLlr/moiqjv0qUsSnLvdUL7NH7PHW8aZGn7Jpjko= -google.golang.org/protobuf v1.27.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/Acconut/lockfile.v1 v1.1.0/go.mod h1:6UCz3wJ8tSFUsPR6uP/j8uegEtDuEEqFxlpi0JI4Umw= gopkg.in/DataDog/dd-trace-go.v1 v1.27.0/go.mod h1:Sp1lku8WJMvNV0kjDI4Ni/T7J/U3BO5ct5kEaoVU8+I= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= @@ -1666,6 +1675,7 @@ gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/mold.v2 v2.2.0/go.mod h1:XMyyRsGtakkDPbxXbrA5VODo6bUXyvoDjLd5l3T0XoA= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/h2non/gock.v1 v1.0.14/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= diff --git a/internal/grpc/services/storageprovider/storageprovider.go b/internal/grpc/services/storageprovider/storageprovider.go index cc2f296c55..eabb3c78e2 100644 --- a/internal/grpc/services/storageprovider/storageprovider.go +++ b/internal/grpc/services/storageprovider/storageprovider.go @@ -28,16 +28,23 @@ import ( "strconv" "strings" + groupv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" + // link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" + grouputils "github.com/cs3org/reva/pkg/group/utils" "github.com/cs3org/reva/pkg/mime" "github.com/cs3org/reva/pkg/rgrpc" "github.com/cs3org/reva/pkg/rgrpc/status" + "github.com/cs3org/reva/pkg/rgrpc/todo/pool" + "github.com/cs3org/reva/pkg/sharedconf" "github.com/cs3org/reva/pkg/storage" "github.com/cs3org/reva/pkg/storage/fs/registry" + "github.com/cs3org/reva/pkg/storage/utils/grants" + "github.com/cs3org/reva/pkg/user" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" "go.opencensus.io/trace" @@ -58,6 +65,7 @@ type config struct { ExposeDataServer bool `mapstructure:"expose_data_server" docs:"false;Whether to expose data server."` // if true the client will be able to upload/download directly to it AvailableXS map[string]uint32 `mapstructure:"available_checksums" docs:"nil;List of available checksums."` MimeTypes map[string]string `mapstructure:"mimetypes" docs:"nil;List of supported mime types and corresponding file extensions."` + GatewaySvc string `mapstructure:"gatewaysvc" docs:"/;Stores the endpoint at which the GRPC gateway is exposed."` } func (c *config) init() { @@ -90,6 +98,9 @@ func (c *config) init() { if len(c.AvailableXS) == 0 { c.AvailableXS = map[string]uint32{"md5": 100, "unset": 1000} } + + // get default GatewaySVC value if not set + c.GatewaySvc = sharedconf.GetGatewaySVC(c.GatewaySvc) } type service struct { @@ -922,6 +933,43 @@ func (s *service) AddGrant(ctx context.Context, req *provider.AddGrantRequest) ( }, nil } + // if the grant is a denial, check if the current user is an owner of the reference + if grants.IsDenial(req.Grant) { + user, ok := user.ContextGetUser(ctx) + if !ok { + return nil, errtypes.InternalError("user not found in context") + } + + client, err := pool.GetGatewayServiceClient(s.conf.GatewaySvc) + if err != nil { + return nil, err + } + + // get owner of the reference + owners, err := s.storage.GetOwners(ctx, req.Ref) + if err != nil { + return nil, err + } + + // check if the group is empty + if grouputils.IsEmptyGroup(owners) { + return nil, errtypes.PermissionDenied("user is not an owner") + } + + // check if the user is in the owner list + hasMemberResp, err := client.HasMember(ctx, &groupv1beta1.HasMemberRequest{ + GroupId: owners.Id, + UserId: user.Id, + }) + if err != nil { + return nil, err + } + + if !hasMemberResp.Ok { + return nil, errtypes.PermissionDenied("user is not an owner") + } + } + err = s.storage.AddGrant(ctx, newRef, req.Grant) if err != nil { var st *rpc.Status diff --git a/internal/http/services/owncloud/ocs/conversions/permissions.go b/internal/http/services/owncloud/ocs/conversions/permissions.go index 4d860fb694..4c11fea844 100644 --- a/internal/http/services/owncloud/ocs/conversions/permissions.go +++ b/internal/http/services/owncloud/ocs/conversions/permissions.go @@ -26,7 +26,7 @@ import ( type Permissions uint const ( - // PermissionInvalid grants no permissions on a resource + // PermissionInvalid represents an invalid permission PermissionInvalid Permissions = 0 // PermissionRead grants read permissions on a resource PermissionRead Permissions = 1 << (iota - 1) @@ -38,21 +38,27 @@ const ( PermissionDelete // PermissionShare grants share permissions on a resource PermissionShare + // PermissionNone grants no permissions on a resource + PermissionNone + // PermissionMax is to be used within value range checks + PermissionMax Permissions = (1 << (iota - 1)) - 1 // PermissionAll grants all permissions on a resource - PermissionAll Permissions = (1 << (iota - 1)) - 1 + PermissionAll = PermissionMax - PermissionNone + // PermissionMin is to be used within value range checks + PermissionMin = PermissionRead ) var ( // ErrPermissionNotInRange defines a permission specific error. - ErrPermissionNotInRange = fmt.Errorf("The provided permission is not between %d and %d", PermissionInvalid, PermissionAll) + ErrPermissionNotInRange = fmt.Errorf("The provided permission is not between %d and %d", PermissionMin, PermissionMax) ) // NewPermissions creates a new Permissions instance. // The value must be in the valid range. func NewPermissions(val int) (Permissions, error) { if val == int(PermissionInvalid) { - return PermissionInvalid, fmt.Errorf("permissions %d out of range %d - %d", val, PermissionRead, PermissionAll) - } else if val < int(PermissionInvalid) || int(PermissionAll) < val { + return PermissionInvalid, fmt.Errorf("permissions %d out of range %d - %d", val, PermissionMin, PermissionMax) + } else if val < int(PermissionInvalid) || int(PermissionMax) < val { return PermissionInvalid, ErrPermissionNotInRange } return Permissions(val), nil diff --git a/internal/http/services/owncloud/ocs/conversions/permissions_test.go b/internal/http/services/owncloud/ocs/conversions/permissions_test.go index 6604b8deb9..719025e388 100644 --- a/internal/http/services/owncloud/ocs/conversions/permissions_test.go +++ b/internal/http/services/owncloud/ocs/conversions/permissions_test.go @@ -23,7 +23,7 @@ import ( ) func TestNewPermissions(t *testing.T) { - for val := int(PermissionRead); val <= int(PermissionAll); val++ { + for val := int(PermissionMin); val <= int(PermissionMax); val++ { _, err := NewPermissions(val) if err != nil { t.Errorf("value %d should be a valid permissions", val) @@ -35,7 +35,7 @@ func TestNewPermissionsWithInvalidValueShouldFail(t *testing.T) { vals := []int{ int(PermissionInvalid), -1, - int(PermissionAll) + 1, + int(PermissionMax) + 1, } for _, v := range vals { _, err := NewPermissions(v) @@ -145,10 +145,11 @@ func TestPermissions2Role(t *testing.T) { table := map[Permissions]string{ PermissionRead: RoleViewer, PermissionRead | PermissionWrite | PermissionCreate | PermissionDelete: RoleEditor, - PermissionAll: RoleCoowner, + PermissionAll: RoleCollaborator, PermissionWrite: RoleLegacy, PermissionShare: RoleLegacy, PermissionWrite | PermissionShare: RoleLegacy, + PermissionNone: RoleDenied, } for permissions, role := range table { diff --git a/internal/http/services/owncloud/ocs/conversions/role.go b/internal/http/services/owncloud/ocs/conversions/role.go index c479df6c38..404fb6f7aa 100644 --- a/internal/http/services/owncloud/ocs/conversions/role.go +++ b/internal/http/services/owncloud/ocs/conversions/role.go @@ -38,14 +38,18 @@ const ( RoleUnknown string = "unknown" // RoleLegacy provides backwards compatibility RoleLegacy string = "legacy" - // RoleViewer grants non-editor role on a resource + // RoleDenied grants no permission at all on a resource + RoleDenied string = "denied" + // RoleViewer grants a view-only role (no download) on a resource RoleViewer string = "viewer" + // RoleReader grants non-editor role on a resource + RoleReader string = "reader" // RoleEditor grants editor permission on a resource, including folders RoleEditor string = "editor" // RoleFileEditor grants editor permission on a single file RoleFileEditor string = "file-editor" - // RoleCoowner grants owner permissions on a resource - RoleCoowner string = "coowner" + // RoleCollaborator rgrants editor+resharing permissions on a resource + RoleCollaborator string = "collaborator" // RoleUploader FIXME: uploader role with only write permission can use InitiateFileUpload, not anything else RoleUploader string = "uploader" ) @@ -119,14 +123,18 @@ func (r *Role) WebDAVPermissions(isDir, isShared, isMountpoint, isPublic bool) s // RoleFromName creates a role from the name func RoleFromName(name string) *Role { switch name { + case RoleDenied: + return NewDeniedRole() case RoleViewer: return NewViewerRole() + case RoleReader: + return NewReaderRole() case RoleEditor: return NewEditorRole() case RoleFileEditor: return NewFileEditorRole() - case RoleCoowner: - return NewCoownerRole() + case RoleCollaborator: + return NewCollaboratorRole() case RoleUploader: return NewUploaderRole() } @@ -142,6 +150,15 @@ func NewUnknownRole() *Role { } } +// NewDeniedRole creates a fully denied role +func NewDeniedRole() *Role { + return &Role{ + Name: RoleDenied, + cS3ResourcePermissions: &provider.ResourcePermissions{}, + ocsPermissions: PermissionNone, + } +} + // NewViewerRole creates a viewer role func NewViewerRole() *Role { return &Role{ @@ -161,6 +178,25 @@ func NewViewerRole() *Role { } } +// NewReaderRole creates a reader role +func NewReaderRole() *Role { + return &Role{ + Name: RoleViewer, + cS3ResourcePermissions: &provider.ResourcePermissions{ + // read + GetPath: true, + GetQuota: true, + InitiateFileDownload: true, + ListGrants: true, + ListContainer: true, + ListFileVersions: true, + ListRecycle: true, + Stat: true, + }, + ocsPermissions: PermissionRead, + } +} + // NewEditorRole creates an editor role func NewEditorRole() *Role { return &Role{ @@ -219,10 +255,10 @@ func NewFileEditorRole() *Role { } } -// NewCoownerRole creates a coowner role -func NewCoownerRole() *Role { +// NewCollaboratorRole creates a collaborator role +func NewCollaboratorRole() *Role { return &Role{ - Name: RoleCoowner, + Name: RoleCollaborator, cS3ResourcePermissions: &provider.ResourcePermissions{ // read GetPath: true, @@ -283,7 +319,7 @@ func RoleFromOCSPermissions(p Permissions) *Role { if p.Contain(PermissionRead) { if p.Contain(PermissionWrite) && p.Contain(PermissionCreate) && p.Contain(PermissionDelete) { if p.Contain(PermissionShare) { - return NewCoownerRole() + return NewCollaboratorRole() } return NewEditorRole() } @@ -294,6 +330,9 @@ func RoleFromOCSPermissions(p Permissions) *Role { if p == PermissionCreate { return NewUploaderRole() } + if p == PermissionNone { + return NewDeniedRole() + } // legacy return NewLegacyRoleFromOCSPermissions(p) } @@ -388,9 +427,9 @@ func RoleFromResourcePermissions(rp *provider.ResourcePermissions) *Role { if r.ocsPermissions.Contain(PermissionWrite) && r.ocsPermissions.Contain(PermissionCreate) && r.ocsPermissions.Contain(PermissionDelete) { r.Name = RoleEditor if r.ocsPermissions.Contain(PermissionShare) { - r.Name = RoleCoowner + r.Name = RoleCollaborator } - return r // editor or coowner + return r // editor or collaborator } if r.ocsPermissions == PermissionRead { r.Name = RoleViewer @@ -401,6 +440,10 @@ func RoleFromResourcePermissions(rp *provider.ResourcePermissions) *Role { r.Name = RoleUploader return r } + if r.ocsPermissions == PermissionNone { + r.Name = RoleDenied + return r + } r.Name = RoleLegacy // at this point other ocs permissions may have been mapped. // TODO what about even more granular cs3 permissions?, eg. only stat 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 624df6bcf9..37a7e56637 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 @@ -243,23 +243,23 @@ func (h *Handler) createShare(w http.ResponseWriter, r *http.Request) { switch shareType { case int(conversions.ShareTypeUser): - // user collaborations default to coowner - if role, val, err := h.extractPermissions(w, r, statRes.Info, conversions.NewCoownerRole()); err == nil { + // user collaborations default to collab + if role, val, err := h.extractPermissions(w, r, statRes.Info, conversions.NewCollaboratorRole()); err == nil { h.createUserShare(w, r, statRes.Info, role, val) } case int(conversions.ShareTypeGroup): - // group collaborations default to coowner - if role, val, err := h.extractPermissions(w, r, statRes.Info, conversions.NewCoownerRole()); err == nil { + // group collaborations default to collab + if role, val, err := h.extractPermissions(w, r, statRes.Info, conversions.NewCollaboratorRole()); err == nil { h.createGroupShare(w, r, statRes.Info, role, val) } case int(conversions.ShareTypePublicLink): // public links default to read only - if _, _, err := h.extractPermissions(w, r, statRes.Info, conversions.NewViewerRole()); err == nil { + if _, _, err := h.extractPermissions(w, r, statRes.Info, conversions.NewReaderRole()); err == nil { h.createPublicLinkShare(w, r, statRes.Info) } case int(conversions.ShareTypeFederatedCloudShare): // federated shares default to read only - if role, val, err := h.extractPermissions(w, r, statRes.Info, conversions.NewViewerRole()); err == nil { + if role, val, err := h.extractPermissions(w, r, statRes.Info, conversions.NewReaderRole()); err == nil { h.createFederatedCloudShare(w, r, statRes.Info, role, val) } default: diff --git a/pkg/auth/manager/ldap/ldap.go b/pkg/auth/manager/ldap/ldap.go index b7dbfd306c..32e31cf5d7 100644 --- a/pkg/auth/manager/ldap/ldap.go +++ b/pkg/auth/manager/ldap/ldap.go @@ -60,6 +60,7 @@ type config struct { Idp string `mapstructure:"idp"` GatewaySvc string `mapstructure:"gatewaysvc"` Schema attributes `mapstructure:"schema"` + Nobody int64 `mapstructure:"nobody"` } type attributes struct { @@ -116,6 +117,9 @@ func New(m map[string]interface{}) (auth.Manager, error) { c.LoginFilter = c.UserFilter c.LoginFilter = strings.ReplaceAll(c.LoginFilter, "%s", "{{login}}") } + if c.Nobody == 0 { + c.Nobody = 99 + } c.GatewaySvc = sharedconf.GetGatewaySVC(c.GatewaySvc) @@ -184,13 +188,21 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) if getGroupsResp.Status.Code != rpc.Code_CODE_OK { return nil, nil, errors.Wrap(err, "ldap: grpc getting user groups failed") } - gidNumber, err := strconv.ParseInt(sr.Entries[0].GetEqualFoldAttributeValue(am.c.Schema.GIDNumber), 10, 64) - if err != nil { - return nil, nil, err - } - uidNumber, err := strconv.ParseInt(sr.Entries[0].GetEqualFoldAttributeValue(am.c.Schema.UIDNumber), 10, 64) - if err != nil { - return nil, nil, err + gidNumber := am.c.Nobody + gidValue := sr.Entries[0].GetEqualFoldAttributeValue(am.c.Schema.GIDNumber) + if gidValue != "" { + gidNumber, err = strconv.ParseInt(gidValue, 10, 64) + if err != nil { + return nil, nil, err + } + } + uidNumber := am.c.Nobody + uidValue := sr.Entries[0].GetEqualFoldAttributeValue(am.c.Schema.UIDNumber) + if uidValue != "" { + uidNumber, err = strconv.ParseInt(uidValue, 10, 64) + if err != nil { + return nil, nil, err + } } u := &user.User{ Id: userID, diff --git a/pkg/eosclient/eosbinary/eosbinary.go b/pkg/eosclient/eosbinary/eosbinary.go index 8d5207f896..e5d43f3579 100644 --- a/pkg/eosclient/eosbinary/eosbinary.go +++ b/pkg/eosclient/eosbinary/eosbinary.go @@ -67,6 +67,17 @@ func attrTypeToString(at eosclient.AttrType) string { } } +func attrStringToType(t string) (eosclient.AttrType, error) { + switch t { + case "sys": + return SystemAttr, nil + case "user": + return UserAttr, nil + default: + return 0, errtypes.InternalError("attr type not existing") + } +} + func isValidAttribute(a *eosclient.Attribute) bool { // validate that an attribute is correct. if (a.Type != SystemAttr && a.Type != UserAttr) || a.Key == "" { @@ -259,7 +270,7 @@ func (c *Client) executeEOS(ctx context.Context, cmd *exec.Cmd) (string, string, } // AddACL adds an new acl to EOS with the given aclType. -func (c *Client) AddACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, a *acl.Entry) error { +func (c *Client) AddACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, pos uint, a *acl.Entry) error { finfo, err := c.GetFileInfoByPath(ctx, uid, gid, path) if err != nil { return err @@ -276,10 +287,17 @@ func (c *Client) AddACL(ctx context.Context, uid, gid, rootUID, rootGID, path st Key: "eval.useracl", Val: "1", } - if err = c.SetAttr(ctx, uid, gid, userACLAttr, false, path); err != nil { + if err = c.SetAttr(ctx, rootUID, rootGID, userACLAttr, false, path); err != nil { return err } } + + // set position of ACLs to add. The default is to append to the end, so no arguments will be added in this case + // the first position starts at 1 = eosclient.StartPosition + if pos != eosclient.EndPosition { + args = append(args, "--position", fmt.Sprint(pos)) + } + args = append(args, sysACL, path) cmd := exec.CommandContext(ctx, c.opt.EosBinary, args...) @@ -318,7 +336,7 @@ func (c *Client) RemoveACL(ctx context.Context, uid, gid, rootUID, rootGID, path // UpdateACL updates the EOS acl. func (c *Client) UpdateACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, a *acl.Entry) error { - return c.AddACL(ctx, uid, gid, rootUID, rootGID, path, a) + return c.AddACL(ctx, uid, gid, rootUID, rootGID, path, eosclient.EndPosition, a) } // GetACL for a file @@ -421,9 +439,9 @@ func (c *Client) SetAttr(ctx context.Context, uid, gid string, attr *eosclient.A } var cmd *exec.Cmd if recursive { - cmd = exec.CommandContext(ctx, "/usr/bin/eos", "-r", uid, gid, "attr", "-r", "set", serializeAttribute(attr), path) + cmd = exec.CommandContext(ctx, c.opt.EosBinary, "-r", uid, gid, "attr", "-r", "set", serializeAttribute(attr), path) } else { - cmd = exec.CommandContext(ctx, "/usr/bin/eos", "-r", uid, gid, "attr", "set", serializeAttribute(attr), path) + cmd = exec.CommandContext(ctx, c.opt.EosBinary, "-r", uid, gid, "attr", "set", serializeAttribute(attr), path) } _, _, err := c.executeEOS(ctx, cmd) @@ -438,7 +456,7 @@ func (c *Client) UnsetAttr(ctx context.Context, uid, gid string, attr *eosclient if !isValidAttribute(attr) { return errors.New("eos: attr is invalid: " + serializeAttribute(attr)) } - cmd := exec.CommandContext(ctx, "/usr/bin/eos", "-r", uid, gid, "attr", "-r", "rm", fmt.Sprintf("%d.%s", attr.Type, attr.Key), path) + cmd := exec.CommandContext(ctx, c.opt.EosBinary, "-r", uid, gid, "attr", "-r", "rm", fmt.Sprintf("%d.%s", attr.Type, attr.Key), path) _, _, err := c.executeEOS(ctx, cmd) if err != nil { return err @@ -446,6 +464,39 @@ func (c *Client) UnsetAttr(ctx context.Context, uid, gid string, attr *eosclient return nil } +// GetAttr returns the attribute specified by key +func (c *Client) GetAttr(ctx context.Context, uid, gid, key, path string) (*eosclient.Attribute, error) { + cmd := exec.CommandContext(ctx, c.opt.EosBinary, "attr", "get", key, path) + attrOut, _, err := c.executeEOS(ctx, cmd) + if err != nil { + return nil, err + } + attr, err := deserializeAttribute(attrOut) + if err != nil { + return nil, err + } + return attr, nil +} + +func deserializeAttribute(attrStr string) (*eosclient.Attribute, error) { + // the string is in the form sys.forced.checksum="adler" + keyValue := strings.Split(strings.TrimSpace(attrStr), "=") // keyValue = ["sys.forced.checksum", "\"adler\""] + if len(keyValue) != 2 { + return nil, errtypes.InternalError("wrong attr format to deserialize") + } + type2key := strings.SplitN(keyValue[0], ".", 2) // type2key = ["sys", "forced.checksum"] + if len(type2key) != 2 { + return nil, errtypes.InternalError("wrong attr format to deserialize") + } + t, err := attrStringToType(type2key[0]) + if err != nil { + return nil, err + } + // trim \" from value + value := strings.Trim(keyValue[1], "\"") + return &eosclient.Attribute{Type: t, Key: type2key[1], Val: value}, nil +} + // GetQuota gets the quota of a user on the quota node defined by path func (c *Client) GetQuota(ctx context.Context, username, rootUID, rootGID, path string) (*eosclient.QuotaInfo, error) { cmd := exec.CommandContext(ctx, c.opt.EosBinary, "-r", rootUID, rootGID, "quota", "ls", "-u", username, "-m") @@ -470,7 +521,7 @@ func (c *Client) SetQuota(ctx context.Context, rootUID, rootGID string, info *eo // Touch creates a 0-size,0-replica file in the EOS namespace. func (c *Client) Touch(ctx context.Context, uid, gid, path string) error { - cmd := exec.CommandContext(ctx, "/usr/bin/eos", "-r", uid, gid, "file", "touch", path) + cmd := exec.CommandContext(ctx, c.opt.EosBinary, "-r", uid, gid, "file", "touch", path) _, _, err := c.executeEOS(ctx, cmd) return err } diff --git a/pkg/eosclient/eosclient.go b/pkg/eosclient/eosclient.go index 1f4b03313c..d4b4b05143 100644 --- a/pkg/eosclient/eosclient.go +++ b/pkg/eosclient/eosclient.go @@ -27,7 +27,7 @@ import ( // EOSClient is the interface which enables access to EOS instances through various interfaces. type EOSClient interface { - AddACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, a *acl.Entry) error + AddACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, position uint, a *acl.Entry) error RemoveACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, a *acl.Entry) error UpdateACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, a *acl.Entry) error GetACL(ctx context.Context, uid, gid, path, aclType, target string) (*acl.Entry, error) @@ -37,6 +37,7 @@ type EOSClient interface { GetFileInfoByPath(ctx context.Context, uid, gid, path string) (*FileInfo, error) SetAttr(ctx context.Context, uid, gid string, attr *Attribute, recursive bool, path string) error UnsetAttr(ctx context.Context, uid, gid string, attr *Attribute, path string) error + GetAttr(ctx context.Context, uid, gid, name, path string) (*Attribute, error) GetQuota(ctx context.Context, username, rootUID, rootGID, path string) (*QuotaInfo, error) SetQuota(ctx context.Context, rootUID, rootGID string, info *SetQuotaInfo) error Touch(ctx context.Context, uid, gid, path string) error @@ -119,3 +120,9 @@ type SetQuotaInfo struct { MaxBytes uint64 MaxFiles uint64 } + +// Constants for ACL position +const ( + EndPosition uint = 0 + StartPosition uint = 1 +) diff --git a/pkg/eosclient/eosgrpc/eosgrpc.go b/pkg/eosclient/eosgrpc/eosgrpc.go index e23a300026..4fcdf6eba0 100644 --- a/pkg/eosclient/eosgrpc/eosgrpc.go +++ b/pkg/eosclient/eosgrpc/eosgrpc.go @@ -270,8 +270,8 @@ func (c *Client) initMDRequest(ctx context.Context, uid, gid string) (*erpc.MDRe } // AddACL adds an new acl to EOS with the given aclType. -func (c *Client) AddACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, a *acl.Entry) error { - +func (c *Client) AddACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, pos uint, a *acl.Entry) error { + // TODO(gmgigi96): set position log := appctx.GetLogger(ctx) log.Info().Str("func", "AddACL").Str("uid,gid", uid+","+gid).Str("rootuid,rootgid", rootUID+","+rootGID).Str("path", path).Msg("") @@ -372,7 +372,7 @@ func (c *Client) RemoveACL(ctx context.Context, uid, gid, rootUID, rootGID, path // UpdateACL updates the EOS acl. func (c *Client) UpdateACL(ctx context.Context, uid, gid, rootUID, rootGID, path string, a *acl.Entry) error { - return c.AddACL(ctx, uid, gid, path, rootUID, rootGID, a) + return c.AddACL(ctx, uid, gid, path, rootUID, rootGID, eosclient.EndPosition, a) } // GetACL for a file @@ -594,6 +594,11 @@ func (c *Client) UnsetAttr(ctx context.Context, uid, gid string, attr *eosclient } +// GetAttr returns the attribute specified by key +func (c *Client) GetAttr(ctx context.Context, uid, gid, name, path string) (*eosclient.Attribute, error) { + return nil, errtypes.NotSupported("GetAttr function not yet implemented") +} + // GetFileInfoByPath returns the FilInfo at the given path func (c *Client) GetFileInfoByPath(ctx context.Context, uid, gid, path string) (*eosclient.FileInfo, error) { log := appctx.GetLogger(ctx) diff --git a/pkg/group/manager/ldap/ldap.go b/pkg/group/manager/ldap/ldap.go index 5e99d2ef5a..9905a1a74f 100644 --- a/pkg/group/manager/ldap/ldap.go +++ b/pkg/group/manager/ldap/ldap.go @@ -61,6 +61,7 @@ type config struct { BindPassword string `mapstructure:"bind_password"` Idp string `mapstructure:"idp"` Schema attributes `mapstructure:"schema"` + Nobody int64 `mapstructure:"nobody"` } type attributes struct { @@ -173,9 +174,13 @@ func (m *manager) GetGroup(ctx context.Context, gid *grouppb.GroupId) (*grouppb. if err != nil { return nil, err } - gidNumber, err := strconv.ParseInt(sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.GIDNumber), 10, 64) - if err != nil { - return nil, err + gidNumber := m.c.Nobody + gidValue := sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.GIDNumber) + if gidValue != "" { + gidNumber, err = strconv.ParseInt(gidValue, 10, 64) + if err != nil { + return nil, err + } } g := &grouppb.Group{ diff --git a/pkg/group/utils/utils.go b/pkg/group/utils/utils.go new file mode 100644 index 0000000000..02e2e974c7 --- /dev/null +++ b/pkg/group/utils/utils.go @@ -0,0 +1,34 @@ +// 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 utils + +import ( + grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" + "github.com/google/go-cmp/cmp" +) + +// NewEmptyGroup creates an empty group +func NewEmptyGroup() *grouppb.Group { + return &grouppb.Group{} +} + +// IsEmptyGroup returns true if the group is empty +func IsEmptyGroup(group *grouppb.Group) bool { + return cmp.Equal(group, NewEmptyGroup()) +} diff --git a/pkg/mentix/config/config.go b/pkg/mentix/config/config.go index 6e90c8d8db..975591cff8 100644 --- a/pkg/mentix/config/config.go +++ b/pkg/mentix/config/config.go @@ -26,6 +26,7 @@ type Configuration struct { GOCDB struct { Address string `mapstructure:"address"` Scope string `mapstructure:"scope"` + APIKey string `mapstructure:"apikey"` } `mapstructure:"gocdb"` LocalFile struct { diff --git a/pkg/mentix/connectors/gocdb.go b/pkg/mentix/connectors/gocdb.go index 81fc73479b..a6e9f27145 100755 --- a/pkg/mentix/connectors/gocdb.go +++ b/pkg/mentix/connectors/gocdb.go @@ -92,7 +92,7 @@ func (connector *GOCDBConnector) query(v interface{}, method string, isPrivate b } // Get the data from GOCDB - data, err := gocdb.QueryGOCDB(connector.gocdbAddress, method, isPrivate, scope, params) + data, err := gocdb.QueryGOCDB(connector.gocdbAddress, method, isPrivate, scope, connector.conf.Connectors.GOCDB.APIKey, params) if err != nil { return err } diff --git a/pkg/mentix/connectors/gocdb/query.go b/pkg/mentix/connectors/gocdb/query.go index a586e38cb7..9e597d5576 100755 --- a/pkg/mentix/connectors/gocdb/query.go +++ b/pkg/mentix/connectors/gocdb/query.go @@ -25,15 +25,19 @@ import ( ) // QueryGOCDB retrieves data from one of GOCDB's endpoints. -func QueryGOCDB(address string, method string, isPrivate bool, scope string, params network.URLParams) ([]byte, error) { +func QueryGOCDB(address string, method string, isPrivate bool, scope string, apiKey string, params network.URLParams) ([]byte, error) { // The method must always be specified params["method"] = method - // If a scope was specified, pass it to the endpoint as well + // If a scope or an API key were specified, pass them to the endpoint as well if len(scope) > 0 { params["scope"] = scope } + if len(apiKey) > 0 { + params["apikey"] = apiKey + } + // GOCDB's public API is located at /gocdbpi/public, the private one at /gocdbpi/private var path string if isPrivate { @@ -48,6 +52,7 @@ func QueryGOCDB(address string, method string, isPrivate bool, scope string, par return nil, fmt.Errorf("unable to generate the GOCDB URL: %v", err) } + fmt.Println(endpointURL.String()) data, err := network.ReadEndpoint(endpointURL, nil, true) if err != nil { return nil, fmt.Errorf("unable to read GOCDB endpoint: %v", err) diff --git a/pkg/storage/fs/owncloud/owncloud.go b/pkg/storage/fs/owncloud/owncloud.go index 1e59ecb1e0..5b317af4c4 100644 --- a/pkg/storage/fs/owncloud/owncloud.go +++ b/pkg/storage/fs/owncloud/owncloud.go @@ -32,6 +32,7 @@ import ( "syscall" "time" + grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" @@ -39,6 +40,7 @@ import ( "github.com/cs3org/reva/internal/grpc/services/storageprovider" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" + grouputils "github.com/cs3org/reva/pkg/group/utils" "github.com/cs3org/reva/pkg/logger" "github.com/cs3org/reva/pkg/mime" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" @@ -792,6 +794,10 @@ func (fs *ocfs) GetPathByID(ctx context.Context, id *provider.ResourceId) (strin return fs.toStoragePath(ctx, ip), nil } +func (fs *ocfs) GetOwners(ctx context.Context, ref *provider.Reference) (*grouppb.Group, error) { + return grouputils.NewEmptyGroup(), nil +} + // resolve takes in a request path or request id and converts it to an internal path. func (fs *ocfs) resolve(ctx context.Context, ref *provider.Reference) (string, error) { diff --git a/pkg/storage/fs/owncloudsql/owncloudsql.go b/pkg/storage/fs/owncloudsql/owncloudsql.go index 030d079ce5..2e3ed146fe 100644 --- a/pkg/storage/fs/owncloudsql/owncloudsql.go +++ b/pkg/storage/fs/owncloudsql/owncloudsql.go @@ -35,6 +35,7 @@ import ( "syscall" "time" + grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" @@ -42,6 +43,7 @@ import ( "github.com/cs3org/reva/internal/grpc/services/storageprovider" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" + grouputils "github.com/cs3org/reva/pkg/group/utils" "github.com/cs3org/reva/pkg/logger" "github.com/cs3org/reva/pkg/mime" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" @@ -649,6 +651,10 @@ func (fs *ocfs) GetPathByID(ctx context.Context, id *provider.ResourceId) (strin return fs.toStoragePath(ctx, ip), nil } +func (fs *ocfs) GetOwners(ctx context.Context, ref *provider.Reference) (*grouppb.Group, error) { + return grouputils.NewEmptyGroup(), nil +} + // resolve takes in a request path or request id and converts it to an internal path. func (fs *ocfs) resolve(ctx context.Context, ref *provider.Reference) (string, error) { diff --git a/pkg/storage/fs/s3/s3.go b/pkg/storage/fs/s3/s3.go index 83c1fe1db8..fac06533a2 100644 --- a/pkg/storage/fs/s3/s3.go +++ b/pkg/storage/fs/s3/s3.go @@ -34,10 +34,12 @@ import ( "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3manager" + grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" + grouputils "github.com/cs3org/reva/pkg/group/utils" "github.com/cs3org/reva/pkg/mime" "github.com/cs3org/reva/pkg/storage" "github.com/cs3org/reva/pkg/storage/fs/registry" @@ -248,6 +250,10 @@ func (fs *s3FS) GetPathByID(ctx context.Context, id *provider.ResourceId) (strin return path.Join("/", strings.TrimPrefix(id.OpaqueId, "fileid-")), nil } +func (fs *s3FS) GetOwners(ctx context.Context, ref *provider.Reference) (*grouppb.Group, error) { + return grouputils.NewEmptyGroup(), nil +} + func (fs *s3FS) AddGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error { return errtypes.NotSupported("s3: operation not supported") } diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index 8481c45a98..a63781ed06 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -23,6 +23,7 @@ import ( "io" "net/url" + grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" registry "github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1" ) @@ -47,6 +48,7 @@ type FS interface { PurgeRecycleItem(ctx context.Context, key string) error EmptyRecycle(ctx context.Context) error GetPathByID(ctx context.Context, id *provider.ResourceId) (string, error) + GetOwners(ctx context.Context, ref *provider.Reference) (*grouppb.Group, error) AddGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error RemoveGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error UpdateGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error diff --git a/pkg/storage/utils/decomposedfs/decomposedfs.go b/pkg/storage/utils/decomposedfs/decomposedfs.go index 3d55a99a19..0f739d64e6 100644 --- a/pkg/storage/utils/decomposedfs/decomposedfs.go +++ b/pkg/storage/utils/decomposedfs/decomposedfs.go @@ -30,9 +30,11 @@ import ( "strconv" "strings" + grouppb "github.com/cs3org/go-cs3apis/cs3/identity/group/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" + grouputils "github.com/cs3org/reva/pkg/group/utils" "github.com/cs3org/reva/pkg/logger" "github.com/cs3org/reva/pkg/storage" "github.com/cs3org/reva/pkg/storage/utils/chunking" @@ -234,6 +236,10 @@ func (fs *Decomposedfs) GetPathByID(ctx context.Context, id *provider.ResourceId return fs.lu.Path(ctx, node) } +func (fs *Decomposedfs) GetOwners(ctx context.Context, ref *provider.Reference) (*grouppb.Group, error) { + return grouputils.NewEmptyGroup(), nil +} + // CreateDir creates the specified directory func (fs *Decomposedfs) CreateDir(ctx context.Context, fn string) (err error) { var n *node.Node diff --git a/pkg/storage/utils/eosfs/eosfs.go b/pkg/storage/utils/eosfs/eosfs.go index f5888a48f6..63774bc179 100644 --- a/pkg/storage/utils/eosfs/eosfs.go +++ b/pkg/storage/utils/eosfs/eosfs.go @@ -41,6 +41,7 @@ import ( "github.com/cs3org/reva/pkg/eosclient/eosbinary" "github.com/cs3org/reva/pkg/eosclient/eosgrpc" "github.com/cs3org/reva/pkg/errtypes" + grouputils "github.com/cs3org/reva/pkg/group/utils" "github.com/cs3org/reva/pkg/mime" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" "github.com/cs3org/reva/pkg/sharedconf" @@ -493,6 +494,11 @@ func (fs *eosfs) AddGrant(ctx context.Context, ref *provider.Reference, g *provi return errors.Wrap(err, "eosfs: no user in ctx") } + uid, gid, err := fs.getUserUIDAndGID(ctx, u) + if err != nil { + return err + } + p, err := fs.resolve(ctx, u, ref) if err != nil { return errors.Wrap(err, "eosfs: error resolving reference") @@ -500,27 +506,31 @@ func (fs *eosfs) AddGrant(ctx context.Context, ref *provider.Reference, g *provi fn := fs.wrap(ctx, p) - eosACL, err := fs.getEosACL(ctx, g) - if err != nil { - return err + // position where put the ACL + position := eosclient.StartPosition + + // is the permission is a denial, put always at the end + if grants.IsDenial(g) { + position = eosclient.EndPosition } - uid, gid, err := fs.getUserUIDAndGID(ctx, u) + rootUID, rootGID, err := fs.getRootUIDAndGID(ctx) if err != nil { return err } - rootUID, rootGID, err := fs.getRootUIDAndGID(ctx) + eosACL, err := fs.getEosACL(ctx, g) if err != nil { return err } - err = fs.c.AddACL(ctx, uid, gid, rootUID, rootGID, fn, eosACL) + err = fs.c.AddACL(ctx, uid, gid, rootUID, rootGID, fn, position, eosACL) if err != nil { return errors.Wrap(err, "eosfs: error adding acl") } return nil + } func (fs *eosfs) getEosACL(ctx context.Context, g *provider.Grant) (*acl.Entry, error) { @@ -1425,6 +1435,53 @@ func (fs *eosfs) RestoreRecycleItem(ctx context.Context, key string, restoreRef return fs.c.RestoreDeletedEntry(ctx, uid, gid, key) } +func (fs *eosfs) GetOwners(ctx context.Context, ref *provider.Reference) (*grouppb.Group, error) { + u, err := getUser(ctx) + if err != nil { + return nil, errors.Wrap(err, "eos: no user in ctx") + } + + uid, gid, err := fs.getUserUIDAndGID(ctx, u) + if err != nil { + return nil, err + } + + p, err := fs.resolve(ctx, u, ref) + if err != nil { + return nil, errors.Wrap(err, "eos: error resolving reference") + } + + fn := fs.wrap(ctx, p) + + ownerEOS, err := fs.c.GetAttr(ctx, uid, gid, "sys.auth.owner", fn) + if err != nil { + return nil, errors.Wrap(err, "eos: error getting owner") + } + + // attribute's val is in the form "egroup:" + if !strings.Contains(ownerEOS.Val, "egroup:") { + return grouputils.NewEmptyGroup(), nil + } + egroup := strings.Replace(ownerEOS.Val, "egroup:", "", 1) + + // request the group object that corresponds to the egroup name + client, err := pool.GetGatewayServiceClient(fs.conf.GatewaySvc) + if err != nil { + return nil, err + } + + groupResp, err := client.GetGroupByClaim(ctx, &grouppb.GetGroupByClaimRequest{Claim: "group_name", Value: egroup}) + if err != nil { + return nil, err + } + + if groupResp.Status.Code != rpc.Code_CODE_OK { + return nil, errtypes.InternalError("eos GetOwners: " + groupResp.Status.Message) + } + + return groupResp.Group, nil +} + func (fs *eosfs) convertToRecycleItem(ctx context.Context, eosDeletedItem *eosclient.DeletedEntry) (*provider.RecycleItem, error) { path, err := fs.unwrap(ctx, eosDeletedItem.RestorePath) if err != nil { diff --git a/pkg/storage/utils/eosfs/eosfs_test.go b/pkg/storage/utils/eosfs/eosfs_test.go new file mode 100644 index 0000000000..19c41c6a85 --- /dev/null +++ b/pkg/storage/utils/eosfs/eosfs_test.go @@ -0,0 +1,324 @@ +// 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. + +// +build eos + +package eosfs + +import ( + "context" + "os/exec" + "path" + "reflect" + "testing" + + userv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/cs3org/reva/pkg/eosclient" + "github.com/cs3org/reva/pkg/user" + "github.com/gdexlab/go-render/render" + "github.com/thanhpk/randstr" +) + +const ( + uid string = "0" + gid string = "0" + rootDir string = "/eos/homecanary/opstest/testacl/grants" +) + +func createTempDirectory(ctx context.Context, t *testing.T, eos *eosfs, rootDir string) (string, func()) { + path := path.Join(rootDir, randstr.String(8)) + err := eos.c.CreateDir(ctx, uid, gid, path) + if err != nil { + t.Fatalf("error creating temp folder %s: %v", path, err) + } + cleanup := func() { + err := eos.c.Remove(ctx, uid, gid, path) + if err != nil { + t.Fatalf("error deleting folder %s: %v", path, err) + } + } + return path, cleanup +} + +func createTempFile(ctx context.Context, t *testing.T, eos *eosfs, dir string) (string, func()) { + path := path.Join(dir, randstr.String(8)) + err := eos.c.Touch(ctx, uid, gid, path) + if err != nil { + t.Fatalf("error creating new file %s: %v", path, err) + } + cleanup := func() { + err := eos.c.Remove(ctx, uid, gid, path) + if err != nil { + t.Fatalf("error deleting folder %s: %v", path, err) + } + } + return path, cleanup +} + +// return true if the command exist +func commandExists(path string) bool { + _, err := exec.LookPath(path) + return err == nil +} + +func TestAddGrant(t *testing.T) { + + if !commandExists("/usr/bin/eos") { + t.Skip("/usr/bin/eos does not exist") + } + + fs, err := NewEOSFS(&Config{ + MasterURL: "root://eoshomecanary.cern.ch", + UseGRPC: false, + ForceSingleUserMode: true, + }) + + if err != nil { + t.Fatal("error creating a new EOS client:", err) + } + + eos, ok := fs.(*eosfs) + if !ok { + t.Fatal("error creating a new EOS client:", err) + } + + testCases := []struct { + description string + initial string + grant *provider.Grant + expected []*provider.Grant + }{ + { + description: "all-positive", + initial: "u:1:r,u:2:w,u:3:rw", + grant: &provider.Grant{ + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "2"}}}, + Permissions: &provider.ResourcePermissions{CreateContainer: true, InitiateFileUpload: true, Delete: true, Move: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "3"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true, CreateContainer: true, InitiateFileUpload: true, Delete: true, Move: true}, + }, + }, + }, + { + description: "all-negative", + initial: "u:1:!r!w!x!m!u!d!c,u:2:!r!w!x!m!u!d!c,u:3:!r!w!x!m!u!d!c", + grant: &provider.Grant{ + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "2"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "3"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "user-not-in-grant-list-add-positive", + initial: "u:1:rw,u:2:r,u:3:!r!w!x!m!u!d!c", + grant: &provider.Grant{ + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true, CreateContainer: true, InitiateFileUpload: true, Delete: true, Move: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "2"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "3"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "user-not-in-grant-list-add-negative", + initial: "u:1:rw,u:2:r,u:3:!r!w!x!m!u!d!c", + grant: &provider.Grant{ + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true, CreateContainer: true, InitiateFileUpload: true, Delete: true, Move: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "2"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "3"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "user-in-grant-list-add-positive", + initial: "u:1:r,u:2:r,u:3:!r!w!x!m!u!d!c", + grant: &provider.Grant{ + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "2"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true, CreateContainer: true, InitiateFileUpload: true, Delete: true, Move: true}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "2"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true, CreateContainer: true, InitiateFileUpload: true, Delete: true, Move: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "3"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "user-in-grant-list-add-negative", + initial: "u:1:r,u:2:r,u:3:!r!w!x!m!u!d!c", + grant: &provider.Grant{ + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "2"}}}, + Permissions: &provider.ResourcePermissions{Stat: true, InitiateFileDownload: true}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "3"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1"}}}, + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + } + + for _, test := range testCases { + + t.Run(test.description, func(t *testing.T) { + ctx := user.ContextSetUser(context.TODO(), &userv1beta1.User{ + UidNumber: 138406, + GidNumber: 2763, + }) + + // test grants for a folder + dir, cleanupDir := createTempDirectory(ctx, t, eos, rootDir) + defer cleanupDir() + + // set initial acls + err := eos.c.SetAttr(ctx, uid, gid, &eosclient.Attribute{Type: SystemAttr, Key: "acl", Val: test.initial}, true, dir) + if err != nil { + t.Fatal("error setting initial attributes:", err) + } + + dirRef := &provider.Reference{Path: dir} + + // set new grant + err = eos.AddGrant(ctx, dirRef, test.grant) + if err != nil { + t.Fatal("error adding grant:", err) + } + + // check that the new grants list corresponds to expected result + grants, err := eos.ListGrants(ctx, dirRef) + if err != nil { + t.Fatal("error getting grants:", err) + } + + if !reflect.DeepEqual(grants, test.expected) { + t.Fatalf("grants do not correspond in folder %s: got=%v expected=%v", dir, render.AsCode(grants), render.AsCode(test.expected)) + } + + // test grants for a file + file, cleanupFile := createTempFile(ctx, t, eos, rootDir) + defer cleanupFile() + + // set initial acls + err = eos.c.SetAttr(ctx, uid, gid, &eosclient.Attribute{Type: UserAttr, Key: "acl", Val: test.initial}, true, dir) + if err != nil { + t.Fatal("error setting initial attributes:", err) + } + + fileRef := &provider.Reference{Path: file} + + // set new grant + err = eos.AddGrant(ctx, fileRef, test.grant) + if err != nil { + t.Fatal("error adding grant:", err) + } + + // check that the new grants list corresponds to expected result + grants, err = eos.ListGrants(ctx, fileRef) + if err != nil { + t.Fatal("error getting grants:", err) + } + + if !reflect.DeepEqual(grants, test.expected) { + t.Fatalf("grants do not correspond in file %s: got=%v expected=%v", file, render.AsCode(grants), render.AsCode(test.expected)) + } + }) + + } + +} diff --git a/pkg/storage/utils/grants/grants.go b/pkg/storage/utils/grants/grants.go index edcfb321d3..ad209dbbac 100644 --- a/pkg/storage/utils/grants/grants.go +++ b/pkg/storage/utils/grants/grants.go @@ -24,11 +24,17 @@ import ( provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" "github.com/cs3org/reva/pkg/storage/utils/acl" + "github.com/google/go-cmp/cmp" ) // GetACLPerm generates a string representation of CS3APIs' ResourcePermissions // TODO(labkode): fine grained permission controls. func GetACLPerm(set *provider.ResourcePermissions) (string, error) { + // resource permission is denied + if cmp.Equal(provider.ResourcePermissions{}, *set) { + return "!r!w!x!m!u!d!c", nil + } + var b strings.Builder if set.Stat || set.InitiateFileDownload { @@ -61,7 +67,7 @@ func GetACLPerm(set *provider.ResourcePermissions) (string, error) { // EOS acls are a mix of ACLs and POSIX permissions. More details can be found in // https://github.com/cern-eos/eos/blob/master/doc/configuration/permission.rst func GetGrantPermissionSet(perm string, isDir bool) *provider.ResourcePermissions { - var rp provider.ResourcePermissions + var rp provider.ResourcePermissions // default to 0 == all denied if strings.Contains(perm, "r") && !strings.Contains(perm, "!r") { rp.GetPath = true @@ -126,3 +132,48 @@ func GetGranteeType(aclType string) provider.GranteeType { return provider.GranteeType_GRANTEE_TYPE_INVALID } } + +// PermissionsEqual returns true if the permissions are equal +func PermissionsEqual(p1, p2 *provider.ResourcePermissions) bool { + return p1 != nil && p2 != nil && cmp.Equal(*p1, *p2) +} + +// GranteeEqual returns true if the grantee are equal +func GranteeEqual(g1, g2 *provider.Grantee) bool { + return g1 != nil && g2 != nil && cmp.Equal(*g1, *g2) +} + +// IsDenial return true if the grant is a denial grant +func IsDenial(grant *provider.Grant) bool { + return PermissionsEqual(grant.Permissions, &provider.ResourcePermissions{}) +} + +// AddGrant adds the newGrant into the list of grants +func AddGrant(grants *[]*provider.Grant, newGrant *provider.Grant) { + if IsDenial(newGrant) { + // a denial is appended to the list + RemoveGrant(grants, newGrant.Grantee) + *grants = append(*grants, newGrant) + } else { + // check if the grant is already in the list + for _, g := range *grants { + if GranteeEqual(g.Grantee, newGrant.Grantee) { + // update the permissions + g.Permissions = newGrant.Permissions + return + } + } + // add the grant in head + *grants = append([]*provider.Grant{newGrant}, *grants...) + } +} + +// RemoveGrant remove the grantee's grant from the grants list +func RemoveGrant(grants *[]*provider.Grant, grantee *provider.Grantee) { + for i, grant := range *grants { + if GranteeEqual(grant.Grantee, grantee) { + *grants = append((*grants)[:i], (*grants)[i+1:]...) + return + } + } +} diff --git a/pkg/storage/utils/grants/grants_test.go b/pkg/storage/utils/grants/grants_test.go new file mode 100644 index 0000000000..3739d0d30a --- /dev/null +++ b/pkg/storage/utils/grants/grants_test.go @@ -0,0 +1,678 @@ +// 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 grants + +import ( + "reflect" + "testing" + + userv1beta1 "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/gdexlab/go-render/render" + "github.com/mohae/deepcopy" +) + +func TestAddGrant(t *testing.T) { + + testCases := []struct { + description string + initial []*provider.Grant + newGrant *provider.Grant + expected []*provider.Grant + }{ + { + description: "empty-grants-add-positive", + initial: []*provider.Grant{}, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // read permission + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // read permission + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + }, + }, + { + description: "empty-grants-add-negative", + initial: []*provider.Grant{}, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // read permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "all-positive-add-positive", + initial: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + Permissions: &provider.ResourcePermissions{ + UpdateGrant: true, + CreateContainer: true, + }, + }, + }, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + }, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + Permissions: &provider.ResourcePermissions{ + UpdateGrant: true, + CreateContainer: true, + }, + }, + }, + }, + { + description: "all-positive-add-negative", + initial: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + }, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "all-negative-add-positive", + initial: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + // read permission + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + // read permission + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "all-negative-add-negative", + initial: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "add-positive-not-in-list", + initial: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + }, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "add-negative-not-in-list", + initial: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + Permissions: &provider.ResourcePermissions{}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "9999"}}, + }, + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "add-positive-already-in-list", + initial: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + CreateContainer: true, + ListGrants: true, + }, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + CreateContainer: true, + ListGrants: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + { + description: "add-negative-was-positive-in-list", + initial: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + Permissions: &provider.ResourcePermissions{ + Stat: true, + InitiateFileDownload: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + newGrant: &provider.Grant{ + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + expected: []*provider.Grant{ + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1001"}}, + }, + Permissions: &provider.ResourcePermissions{ + Delete: true, + GetPath: true, + Move: true, + }, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1002"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + { + Grantee: &provider.Grantee{ + Type: provider.GranteeType_GRANTEE_TYPE_USER, + Id: &provider.Grantee_UserId{UserId: &userv1beta1.UserId{OpaqueId: "1000"}}, + }, + // denial permission + Permissions: &provider.ResourcePermissions{}, + }, + }, + }, + } + + for _, test := range testCases { + t.Run(test.description, func(t *testing.T) { + + grants := deepcopy.Copy(test.initial).([]*provider.Grant) + AddGrant(&grants, test.newGrant) + + if !reflect.DeepEqual(test.expected, grants) { + t.Fatalf("lists of grants do not correspond: got=%v expected=%v", render.Render(grants), render.Render(test.expected)) + } + + }) + } + +} diff --git a/pkg/storage/utils/localfs/localfs.go b/pkg/storage/utils/localfs/localfs.go index d9c7e13870..4ee41e270c 100644 --- a/pkg/storage/utils/localfs/localfs.go +++ b/pkg/storage/utils/localfs/localfs.go @@ -36,6 +36,7 @@ import ( provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" "github.com/cs3org/reva/pkg/errtypes" + grouputils "github.com/cs3org/reva/pkg/group/utils" "github.com/cs3org/reva/pkg/mime" "github.com/cs3org/reva/pkg/storage" "github.com/cs3org/reva/pkg/storage/utils/acl" @@ -434,6 +435,10 @@ func (fs *localfs) GetPathByID(ctx context.Context, ref *provider.ResourceId) (s return url.QueryUnescape(strings.TrimPrefix(ref.OpaqueId, "fileid-"+layout)) } +func (fs *localfs) GetOwners(ctx context.Context, ref *provider.Reference) (*grouppb.Group, error) { + return grouputils.NewEmptyGroup(), nil +} + func (fs *localfs) AddGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error { fn, err := fs.resolve(ctx, ref) if err != nil { diff --git a/pkg/user/manager/ldap/ldap.go b/pkg/user/manager/ldap/ldap.go index 18ec424b7f..f830b44179 100644 --- a/pkg/user/manager/ldap/ldap.go +++ b/pkg/user/manager/ldap/ldap.go @@ -60,6 +60,7 @@ type config struct { BindPassword string `mapstructure:"bind_password"` Idp string `mapstructure:"idp"` Schema attributes `mapstructure:"schema"` + Nobody int64 `mapstructure:"nobody"` } type attributes struct { @@ -116,6 +117,10 @@ func New(m map[string]interface{}) (user.Manager, error) { } c.GroupFilter = strings.ReplaceAll(c.GroupFilter, "%s", "{{.OpaqueId}}") + if c.Nobody == 0 { + c.Nobody = 99 + } + mgr := &manager{ c: c, } @@ -176,13 +181,21 @@ func (m *manager) GetUser(ctx context.Context, uid *userpb.UserId) (*userpb.User if err != nil { return nil, err } - gidNumber, err := strconv.ParseInt(sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.GIDNumber), 10, 64) - if err != nil { - return nil, err + gidNumber := m.c.Nobody + gidValue := sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.GIDNumber) + if gidValue != "" { + gidNumber, err = strconv.ParseInt(gidValue, 10, 64) + if err != nil { + return nil, err + } } - uidNumber, err := strconv.ParseInt(sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.UIDNumber), 10, 64) - if err != nil { - return nil, err + uidNumber := m.c.Nobody + uidValue := sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.UIDNumber) + if uidValue != "" { + uidNumber, err = strconv.ParseInt(uidValue, 10, 64) + if err != nil { + return nil, err + } } u := &userpb.User{ Id: id, @@ -255,13 +268,21 @@ func (m *manager) GetUserByClaim(ctx context.Context, claim, value string) (*use if err != nil { return nil, err } - gidNumber, err := strconv.ParseInt(sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.GIDNumber), 10, 64) - if err != nil { - return nil, err + gidNumber := m.c.Nobody + gidValue := sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.GIDNumber) + if gidValue != "" { + gidNumber, err = strconv.ParseInt(gidValue, 10, 64) + if err != nil { + return nil, err + } } - uidNumber, err := strconv.ParseInt(sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.UIDNumber), 10, 64) - if err != nil { - return nil, err + uidNumber := m.c.Nobody + uidValue := sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.UIDNumber) + if uidValue != "" { + uidNumber, err = strconv.ParseInt(uidValue, 10, 64) + if err != nil { + return nil, err + } } u := &userpb.User{ Id: id, @@ -315,13 +336,21 @@ func (m *manager) FindUsers(ctx context.Context, query string) ([]*userpb.User, if err != nil { return nil, err } - gidNumber, err := strconv.ParseInt(sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.GIDNumber), 10, 64) - if err != nil { - return nil, err + gidNumber := m.c.Nobody + gidValue := sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.GIDNumber) + if gidValue != "" { + gidNumber, err = strconv.ParseInt(gidValue, 10, 64) + if err != nil { + return nil, err + } } - uidNumber, err := strconv.ParseInt(sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.UIDNumber), 10, 64) - if err != nil { - return nil, err + uidNumber := m.c.Nobody + uidValue := sr.Entries[0].GetEqualFoldAttributeValue(m.c.Schema.UIDNumber) + if uidValue != "" { + uidNumber, err = strconv.ParseInt(uidValue, 10, 64) + if err != nil { + return nil, err + } } user := &userpb.User{ Id: id, diff --git a/tests/acceptance/expected-failures-on-OCIS-storage.md b/tests/acceptance/expected-failures-on-OCIS-storage.md index 2b72811e12..a678e01ecd 100644 --- a/tests/acceptance/expected-failures-on-OCIS-storage.md +++ b/tests/acceptance/expected-failures-on-OCIS-storage.md @@ -23,7 +23,7 @@ Basic file management like up and download, move, copy, properties, quota, trash - [apiTrashbin/trashbinRestore.feature:130](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L130) - [apiTrashbin/trashbinRestore.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L131) -#### [href in trashbin PROPFIND response is wrong](https://github.com/owncloud/ocis/issues/1120) +#### [PROPFIND on trashbin with Depth: infinity only shows the first level](https://github.com/owncloud/ocis/issues/1116) #### [cannot restore to a different file-name](https://github.com/owncloud/ocis/issues/1122) - [apiTrashbin/trashbinRestore.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L309) - [apiTrashbin/trashbinRestore.feature:310](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L310) @@ -45,8 +45,8 @@ Basic file management like up and download, move, copy, properties, quota, trash - [apiVersions/fileVersions.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L88) - [apiVersions/fileVersions.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L89) - [apiVersions/fileVersions.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L93) -- [apiVersions/fileVersions.feature:288](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L288) -- [apiVersions/fileVersions.feature:362](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L362) +- [apiVersions/fileVersions.feature:276](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L276) +- [apiVersions/fileVersions.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L347) - [apiWebdavUpload2/uploadFileUsingNewChunking.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileUsingNewChunking.feature#L13) - [apiWebdavUpload2/uploadFileUsingNewChunking.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileUsingNewChunking.feature#L31) - [apiWebdavUpload2/uploadFileUsingNewChunking.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileUsingNewChunking.feature#L46) @@ -158,6 +158,9 @@ _etag propagation_ _ocdav: return checksum in upload response for chunked upload_ - [apiMain/checksums.feature:144](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L144) Scenario: Upload new dav chunked file where checksum matches - [apiMain/checksums.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L153) Scenario: Upload new dav chunked file where checksum does not match +- [apiMain/checksums.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L164) Scenario: Upload new dav chunked file using async MOVE where checksum matches +- [apiMain/checksums.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L180) Scenario: Upload new dav chunked file using async MOVE where checksum does not match +- [apiMain/checksums.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L198) Scenario: Upload new dav chunked file using async MOVE where checksum does not match - retry with correct checksum - [apiMain/checksums.feature:263](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L263) Scenario: Uploading an old method chunked file with checksum should fail using new DAV path - [apiMain/checksums.feature:319](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L319) Scenario: Upload overwriting a file with new chunking and correct checksum - [apiMain/checksums.feature:331](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L331) Scenario: Upload overwriting a file with new chunking and invalid checksum @@ -609,20 +612,20 @@ File and sync features in a shared scenario #### [sharing with group not available](https://github.com/owncloud/product/issues/293) - [apiShareManagementToShares/acceptShares.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L30) - [apiShareManagementToShares/acceptShares.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L234) -- [apiShareManagementToShares/acceptShares.feature:281](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L281) -- [apiShareManagementToShares/acceptShares.feature:355](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L355) -- [apiShareManagementToShares/acceptShares.feature:393](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L393) -- [apiShareManagementToShares/acceptShares.feature:436](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L436) +- [apiShareManagementToShares/acceptShares.feature:282](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L282) +- [apiShareManagementToShares/acceptShares.feature:356](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L356) +- [apiShareManagementToShares/acceptShares.feature:394](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L394) +- [apiShareManagementToShares/acceptShares.feature:437](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L437) #### User cannot create a folder named Share -- [apiShareManagementToShares/acceptShares.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L290) -- [apiShareManagementToShares/acceptShares.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L309) +- [apiShareManagementToShares/acceptShares.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L291) +- [apiShareManagementToShares/acceptShares.feature:310](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L310) #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) - [apiShareManagementToShares/acceptShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L82) - [apiShareManagementToShares/acceptShares.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L207) -- [apiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L260) +- [apiShareManagementToShares/acceptShares.feature:261](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L261) - [apiShareManagementToShares/acceptSharesToSharesFolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L31) - [apiShareManagementToShares/acceptSharesToSharesFolder.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L52) - [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L138) @@ -910,9 +913,18 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareReshareToShares3/reShareWithExpiryDate.feature:36](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares3/reShareWithExpiryDate.feature#L36) - [apiShareReshareToShares3/reShareWithExpiryDate.feature:37](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares3/reShareWithExpiryDate.feature#L37) -#### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) +#### [cannot move/rename an accepted shared resource outside of shares folder](https://github.com/owncloud/ocis/issues/2141) - [apiShareReshareToShares2/reShareChain.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareChain.feature#L12) +- [apiShareOperationsToShares1/changingFilesShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L42) +- [apiShareOperationsToShares1/changingFilesShare.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L43) +- [apiShareOperationsToShares1/changingFilesShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L62) +- [apiShareOperationsToShares1/changingFilesShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L63) +- [apiVersions/fileVersionsSharingToShares.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L133) +- [apiVersions/fileVersionsSharingToShares.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L148) +- [apiVersions/fileVersionsSharingToShares.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L162) +- [apiVersions/fileVersionsSharingToShares.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L249) +- [apiVersions/fileVersionsSharingToShares.feature:250](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L250) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) - [apiShareReshareToShares2/reShareWhenShareWithOnlyMembershipGroups.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareWhenShareWithOnlyMembershipGroups.feature#L27) @@ -933,12 +945,12 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareReshareToShares2/reShareSubfolder.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L30) - [apiShareReshareToShares2/reShareSubfolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L31) -- [apiShareReshareToShares2/reShareSubfolder.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L108) - [apiShareReshareToShares2/reShareSubfolder.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L109) -- [apiShareReshareToShares2/reShareSubfolder.feature:130](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L130) -- [apiShareReshareToShares2/reShareSubfolder.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L131) -- [apiShareReshareToShares2/reShareSubfolder.feature:152](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L152) -- [apiShareReshareToShares2/reShareSubfolder.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L153) +- [apiShareReshareToShares2/reShareSubfolder.feature:110](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L110) +- [apiShareReshareToShares2/reShareSubfolder.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L132) +- [apiShareReshareToShares2/reShareSubfolder.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L133) +- [apiShareReshareToShares2/reShareSubfolder.feature:155](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L155) +- [apiShareReshareToShares2/reShareSubfolder.feature:156](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L156) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L46) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:536](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L536) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L554) @@ -952,14 +964,17 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt #### [invalid format of sharees response](https://github.com/owncloud/product/issues/292) #### [deleting a received share-folder moves it to trash-bin but does not unshare it](https://github.com/owncloud/ocis/issues/1123) - -- [apiShareManagementToShares/acceptShares.feature:489](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L489) - [apiShareManagementToShares/acceptShares.feature:490](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L490) +- [apiShareManagementToShares/acceptShares.feature:491](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L491) +- [apiShareManagementToShares/acceptShares.feature:494](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L494) -#### [deleting a file inside a received shared folder is moved to the trash-bin of the sharer not the receiver](https://github.com/owncloud/ocis/issues/1124) +#### [Deleting a received folder moves it to trashbin](https://github.com/owncloud/ocis/issues/2217) - [apiTrashbin/trashbinSharingToShares.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L23) - [apiTrashbin/trashbinSharingToShares.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L24) + +#### [deleting a file inside a received shared folder is moved to the trash-bin of the sharer not the receiver](https://github.com/owncloud/ocis/issues/1124) + - [apiTrashbin/trashbinSharingToShares.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L39) - [apiTrashbin/trashbinSharingToShares.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L40) - [apiTrashbin/trashbinSharingToShares.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L63) @@ -983,7 +998,6 @@ Scenario Outline: Copying a file to overwrite a file into a folder with no permi - [apiWebdavProperties1/copyFile.feature:90](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/copyFile.feature#L90) - [apiWebdavProperties1/copyFile.feature:91](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties1/copyFile.feature#L91) - #### Share jail related Scenario Outline: delete a folder when there is a default folder for received shares - [apiWebdavOperations/deleteFolder.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavOperations/deleteFolder.feature#L67) @@ -1077,12 +1091,6 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareOperationsToShares1/changingFilesShare.feature:82](https://github.com/owncloud/core/blob/master/test/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L82) - [apiShareOperationsToShares1/changingFilesShare.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L98) -#### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) -- [apiShareOperationsToShares1/changingFilesShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L42) -- [apiShareOperationsToShares1/changingFilesShare.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L43) -- [apiShareOperationsToShares1/changingFilesShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L62) -- [apiShareOperationsToShares1/changingFilesShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L63) - Scenario Outline: Moving a file into a shared folder as the sharee and as the sharer - [apiWebdavMove2/moveFile.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L99) - [apiWebdavMove2/moveFile.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L100) @@ -1119,16 +1127,9 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiVersions/fileVersionsSharingToShares.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L32) #### [restoring an older version of a shared file deletes the share](https://github.com/owncloud/ocis/issues/765) -- [apiShareManagementToShares/acceptShares.feature:493](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L493) +- [apiShareManagementToShares/acceptShares.feature:494](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L494) - [apiVersions/fileVersionsSharingToShares.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L43) -#### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) -- [apiVersions/fileVersionsSharingToShares.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L133) -- [apiVersions/fileVersionsSharingToShares.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L148) -- [apiVersions/fileVersionsSharingToShares.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L162) -- [apiVersions/fileVersionsSharingToShares.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L249) -- [apiVersions/fileVersionsSharingToShares.feature:250](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L250) - #### [not possible to move file into a received folder](https://github.com/owncloud/ocis/issues/764) - [apiVersions/fileVersionsSharingToShares.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L221) - [apiVersions/fileVersionsSharingToShares.feature:222](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L222) @@ -1284,26 +1285,25 @@ _ocs: api compatibility, return correct status code_ #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) - [apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature#L15) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L19) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L22) -- [apiShareManagementToShares/moveReceivedShare.feature:14](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L14) -- [apiShareManagementToShares/moveReceivedShare.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L28) -- [apiShareManagementToShares/moveReceivedShare.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L39) -- [apiShareManagementToShares/moveReceivedShare.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L70) -- [apiShareManagementToShares/moveReceivedShare.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L71) -- [apiShareManagementToShares/moveReceivedShare.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L73) -- [apiShareManagementToShares/moveReceivedShare.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L88) -- [apiShareManagementToShares/moveReceivedShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L120) -- [apiShareManagementToShares/moveReceivedShare.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L131) -- [apiShareManagementToShares/moveReceivedShare.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L142) -- [apiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L153) -- [apiShareManagementToShares/moveReceivedShare.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L164) -- [apiShareManagementToShares/moveReceivedShare.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L175) -- [apiShareManagementToShares/moveReceivedShare.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L205) -- [apiShareManagementToShares/moveReceivedShare.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L206) -- [apiShareManagementToShares/moveReceivedShare.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L229) -- [apiShareManagementToShares/moveReceivedShare.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L230) -- [apiShareManagementToShares/moveReceivedShare.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L232) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L20) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L23) +- [apiShareManagementToShares/moveReceivedShare.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L15) +- [apiShareManagementToShares/moveReceivedShare.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L30) +- [apiShareManagementToShares/moveReceivedShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L42) +- [apiShareManagementToShares/moveReceivedShare.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L74) +- [apiShareManagementToShares/moveReceivedShare.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L75) +- [apiShareManagementToShares/moveReceivedShare.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L78) +- [apiShareManagementToShares/moveReceivedShare.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L94) +- [apiShareManagementToShares/moveReceivedShare.feature:129](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L129) +- [apiShareManagementToShares/moveReceivedShare.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L141) +- [apiShareManagementToShares/moveReceivedShare.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L165) +- [apiShareManagementToShares/moveReceivedShare.feature:177](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L177) +- [apiShareManagementToShares/moveReceivedShare.feature:189](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L189) +- [apiShareManagementToShares/moveReceivedShare.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L220) +- [apiShareManagementToShares/moveReceivedShare.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L221) +- [apiShareManagementToShares/moveReceivedShare.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L245) +- [apiShareManagementToShares/moveReceivedShare.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L246) +- [apiShareManagementToShares/moveReceivedShare.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L249) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L59) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L60) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L94) @@ -1320,16 +1320,13 @@ _ocs: api compatibility, return correct status code_ - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L283) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:317](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L317) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:318](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L318) +- [apiShareUpdateToShares/updateShare.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L95) - [apiShareUpdateToShares/updateShare.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L96) - [apiShareUpdateToShares/updateShare.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L97) - [apiShareUpdateToShares/updateShare.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L98) - [apiShareUpdateToShares/updateShare.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L99) - [apiShareUpdateToShares/updateShare.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L100) -- [apiShareUpdateToShares/updateShare.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L101) -- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) -- [apiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L123) -- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) -- [apiShareUpdateToShares/updateShare.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L160) +- [apiShareUpdateToShares/updateShare.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L159) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:706](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L706) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:707](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L707) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:725](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L725) @@ -1345,31 +1342,34 @@ _ocs: api compatibility, return correct status code_ - [apiShareOperationsToShares1/gettingShares.feature:188](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingShares.feature#L188) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) -- [apiShareUpdateToShares/updateShare.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L298) -- [apiShareUpdateToShares/updateShare.feature:299](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L299) -- [apiShareUpdateToShares/updateShare.feature:315](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L315) -- [apiShareUpdateToShares/updateShare.feature:316](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L316) -- [apiShareUpdateToShares/updateShare.feature:344](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L344) -- [apiShareUpdateToShares/updateShare.feature:345](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L345) -- [apiShareUpdateToShares/updateShare.feature:375](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L375) -- [apiShareUpdateToShares/updateShare.feature:376](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L376) -- [apiShareUpdateToShares/updateShare.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L272) -- [apiShareUpdateToShares/updateShare.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L273) +- [apiShareUpdateToShares/updateShare.feature:296](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L296) +- [apiShareUpdateToShares/updateShare.feature:297](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L297) +- [apiShareUpdateToShares/updateShare.feature:313](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L313) +- [apiShareUpdateToShares/updateShare.feature:314](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L314) +- [apiShareUpdateToShares/updateShare.feature:342](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L342) +- [apiShareUpdateToShares/updateShare.feature:343](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L343) +- [apiShareUpdateToShares/updateShare.feature:373](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L373) +- [apiShareUpdateToShares/updateShare.feature:374](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L374) +- [apiShareUpdateToShares/updateShare.feature:270](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L270) +- [apiShareUpdateToShares/updateShare.feature:271](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L271) #### [cannot move/rename an accepted shared resource outside of shares folder](https://github.com/owncloud/ocis/issues/2141) - [apiShareUpdateToShares/updateShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L63) - [apiShareUpdateToShares/updateShare.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L64) +- [apiShareUpdateToShares/updateShare.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L64) +- [apiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L153) #### [Share permissions can be updated to any value](https://github.com/owncloud/ocis/issues/2173) -- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) +- [apiShareUpdateToShares/updateShare.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L119) +- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) - [apiShareUpdateToShares/updateShare.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L121) - [apiShareUpdateToShares/updateShare.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L122) -- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) +- [apiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L123) - [apiShareUpdateToShares/updateShare.feature:124](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L124) -- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) -- [apiShareUpdateToShares/updateShare.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L258) -- [apiShareUpdateToShares/updateShare.feature:259](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L259) +- [apiShareUpdateToShares/updateShare.feature:127](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L127) +- [apiShareUpdateToShares/updateShare.feature:256](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L256) +- [apiShareUpdateToShares/updateShare.feature:257](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L257) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L34) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L35) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:54](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L54) @@ -1378,8 +1378,8 @@ _ocs: api compatibility, return correct status code_ #### [Share additional info](https://github.com/owncloud/ocis/issues/1253) #### [Share extra attributes](https://github.com/owncloud/ocis/issues/1224) #### [Edit user share response has an "name" field](https://github.com/owncloud/ocis/issues/1225) +- [apiShareUpdateToShares/updateShare.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L234) - [apiShareUpdateToShares/updateShare.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L235) -- [apiShareUpdateToShares/updateShare.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L236) #### [user can access version metadata of a received share before accepting it](https://github.com/owncloud/ocis/issues/760) - [apiVersions/fileVersionsSharingToShares.feature:278](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L278) @@ -1389,12 +1389,9 @@ _ocs: api compatibility, return correct status code_ - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L27) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:55](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L55) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L56) - -#### [OCIS-storage reading a file that a collaborator uploaded is impossible](https://github.com/owncloud/ocis/issues/763) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L70) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L71) - #### [Share lists deleted user as 'user'](https://github.com/owncloud/ocis/issues/903) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:641](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L641) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:642](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L642) @@ -1409,9 +1406,6 @@ _ocs: api compatibility, return correct status code_ ### User Management User and group management features -#### [quota query](https://github.com/owncloud/ocis/issues/1313) -_requires a [CS3 user provisioning api that can update the quota for a user](https://github.com/cs3org/cs3apis/pull/95#issuecomment-772780683)_ - ### Other API, search, favorites, config, capabilities, not existing endpoints, CORS and others @@ -1862,12 +1856,6 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavMove1/moveFileAsync.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L246) - [apiWebdavMove1/moveFileAsync.feature:251](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L251) -#### [Checksum feature](https://github.com/owncloud/ocis/issues/1291) -_ ocdav: return checksum in upload response for chunked upload_ -- [apiMain/checksums.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L164) Scenario: Upload new dav chunked file using async MOVE where checksum matches -- [apiMain/checksums.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L180) Scenario: Upload new dav chunked file using async MOVE where checksum does not match -- [apiMain/checksums.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L198) Scenario: Upload new dav chunked file using async MOVE where checksum does not match - retry with correct checksum - #### [PATCH request for TUS upload with wrong checksum gives incorrect response](https://github.com/owncloud/ocis/issues/1755) - [apiWebdavUploadTUS/checksums.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L65) - [apiWebdavUploadTUS/checksums.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L66) @@ -1956,7 +1944,6 @@ _ocs: api compatibility, return correct status code_ - [apiShareReshareToShares3/reShareUpdate.feature:115](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares3/reShareUpdate.feature#L115) - [apiShareReshareToShares3/reShareUpdate.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares3/reShareUpdate.feature#L133) - [apiShareReshareToShares3/reShareUpdate.feature:134](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares3/reShareUpdate.feature#L134) -- [apiVersions/fileVersionsSharingToShares.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L178) #### [[OC-storage] share-types field empty for shared file folder in webdav response](https://github.com/owncloud/ocis/issues/2144) - [apiWebdavProperties2/getFileProperties.feature:156](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavProperties2/getFileProperties.feature#L156) diff --git a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md index 73ab290a4d..33feee13b8 100644 --- a/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md +++ b/tests/acceptance/expected-failures-on-OWNCLOUD-storage.md @@ -8,8 +8,7 @@ Basic file management like up and download, move, copy, properties, quota, trash - [apiTrashbin/trashbinDelete.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinDelete.feature#L122) -### [Review and fix the tests that have sharing step to work with ocis](https://github.com/owncloud/core/issues/38006) - +### [Deleting multiple files with the same name but different origin close together in time results in only one file in the trashbin](https://github.com/owncloud/ocis/issues/2219) The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiTrashbin/trashbinFilesFolders.feature:104](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinFilesFolders.feature#L104) @@ -27,7 +26,7 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiTrashbin/trashbinFilesFolders.feature:278](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinFilesFolders.feature#L278) - [apiTrashbin/trashbinFilesFolders.feature:279](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinFilesFolders.feature#L279) -#### [href in trashbin PROPFIND response is wrong](https://github.com/owncloud/ocis/issues/1120) +#### [PROPFIND on trashbin with Depth: infinity only shows the first level](https://github.com/owncloud/ocis/issues/1116) #### [cannot restore to a different file-name](https://github.com/owncloud/ocis/issues/1122) - [apiTrashbin/trashbinRestore.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L309) - [apiTrashbin/trashbinRestore.feature:310](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L310) @@ -46,8 +45,8 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiVersions/fileVersions.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L88) - [apiVersions/fileVersions.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L89) - [apiVersions/fileVersions.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L93) -- [apiVersions/fileVersions.feature:288](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L288) -- [apiVersions/fileVersions.feature:362](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L362) +- [apiVersions/fileVersions.feature:276](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L276) +- [apiVersions/fileVersions.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L347) - [apiWebdavUpload2/uploadFileUsingNewChunking.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileUsingNewChunking.feature#L13) - [apiWebdavUpload2/uploadFileUsingNewChunking.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileUsingNewChunking.feature#L31) - [apiWebdavUpload2/uploadFileUsingNewChunking.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileUsingNewChunking.feature#L46) @@ -68,10 +67,10 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiVersions/fileVersions.feature:104](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L104) #### [Version count is 1 more than on oC10](https://github.com/owncloud/ocis/issues/1633) -- [apiVersions/fileVersions.feature:409](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L409) +- [apiVersions/fileVersions.feature:393](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L393) #### [Version cannot be restored when file has been renamed](https://github.com/owncloud/ocis/issues/1633) -- [apiVersions/fileVersions.feature:400](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L400) +- [apiVersions/fileVersions.feature:384](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L384) #### [PUT request with missing parent must return status code 409](https://github.com/owncloud/ocis/issues/824) - [apiWebdavUpload1/uploadFile.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload1/uploadFile.feature#L112) @@ -176,11 +175,13 @@ Synchronization features like etag propagation, setting mtime and locking files _ocdav: return checksum in upload response for chunked upload_ - [apiMain/checksums.feature:144](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L144) Scenario: Upload new dav chunked file where checksum matches - [apiMain/checksums.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L153) Scenario: Upload new dav chunked file where checksum does not match +- [apiMain/checksums.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L164) Scenario: Upload new dav chunked file using async MOVE where checksum matches +- [apiMain/checksums.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L180) Scenario: Upload new dav chunked file using async MOVE where checksum does not match +- [apiMain/checksums.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L198) Scenario: Upload new dav chunked file using async MOVE where checksum does not match - retry with correct checksum - [apiMain/checksums.feature:263](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L263) Scenario: Uploading an old method chunked file with checksum should fail using new DAV path - [apiMain/checksums.feature:319](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L319) Scenario: Upload overwriting a file with new chunking and correct checksum - [apiMain/checksums.feature:331](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L331) Scenario: Upload overwriting a file with new chunking and invalid checksum - #### [Webdav LOCK operations](https://github.com/owncloud/ocis/issues/1284) - [apiWebdavLocks/exclusiveLocks.feature:18](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavLocks/exclusiveLocks.feature#L18) - [apiWebdavLocks/exclusiveLocks.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavLocks/exclusiveLocks.feature#L19) @@ -522,7 +523,8 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiWebdavEtagPropagation1/moveFileFolder.feature:318](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation1/moveFileFolder.feature#L318) - [apiWebdavEtagPropagation1/moveFileFolder.feature:333](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation1/moveFileFolder.feature#L333) -#### [sharing with group not available](https://github.com/owncloud/product/issues/293) +#### [Member in a group cannot see the share which has been shared with the group](https://github.com/cs3org/reva/issues/1831) +#### [Fix accepting/denying group shares](https://github.com/cs3org/reva/issues/1769) - [apiShareOperationsToShares2/uploadToShare.feature:41](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/uploadToShare.feature#L41) - [apiShareOperationsToShares2/uploadToShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/uploadToShare.feature#L42) @@ -531,7 +533,7 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareOperationsToShares2/uploadToShare.feature:145](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/uploadToShare.feature#L145) - [apiShareOperationsToShares2/uploadToShare.feature:146](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/uploadToShare.feature#L146) -#### [Checksum feature](https://github.com/owncloud/ocis/issues/1291) +#### [Uploading a file with invalid SHA1 checksum passes successfully](https://github.com/owncloud/ocis/issues/2142) The following scenarios fail on OWNCLOUD storage but not on OCIS storage: @@ -608,23 +610,25 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiSharees/sharees.feature:702](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharees/sharees.feature#L702) - [apiSharees/sharees.feature:703](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharees/sharees.feature#L703) -#### [sharing with group not available](https://github.com/owncloud/product/issues/293) +#### [Member in a group cannot see the share which has been shared with the group](https://github.com/cs3org/reva/issues/1831) +#### [Fix accepting/denying group shares](https://github.com/cs3org/reva/issues/1769) + - [apiShareManagementToShares/acceptShares.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L30) - [apiShareManagementToShares/acceptShares.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L234) -- [apiShareManagementToShares/acceptShares.feature:281](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L281) -- [apiShareManagementToShares/acceptShares.feature:355](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L355) -- [apiShareManagementToShares/acceptShares.feature:393](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L393) -- [apiShareManagementToShares/acceptShares.feature:436](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L436) +- [apiShareManagementToShares/acceptShares.feature:282](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L282) +- [apiShareManagementToShares/acceptShares.feature:356](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L356) +- [apiShareManagementToShares/acceptShares.feature:394](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L394) +- [apiShareManagementToShares/acceptShares.feature:437](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L437) #### User cannot create a folder named Share -- [apiShareManagementToShares/acceptShares.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L290) -- [apiShareManagementToShares/acceptShares.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L309) +- [apiShareManagementToShares/acceptShares.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L291) +- [apiShareManagementToShares/acceptShares.feature:310](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L310) #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) - [apiShareManagementToShares/acceptShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L82) - [apiShareManagementToShares/acceptShares.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L207) -- [apiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L260) +- [apiShareManagementToShares/acceptShares.feature:261](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L261) - [apiShareManagementToShares/acceptSharesToSharesFolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L31) - [apiShareManagementToShares/acceptSharesToSharesFolder.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L52) - [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L138) @@ -653,7 +657,9 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L101) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L102) -#### [sharing with group not available](https://github.com/owncloud/product/issues/293) +#### [Member in a group cannot see the share which has been shared with the group](https://github.com/cs3org/reva/issues/1831) +#### [Fix accepting/denying group shares](https://github.com/cs3org/reva/issues/1769) + - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:238](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L238) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:239](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L239) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L260) @@ -964,9 +970,24 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareReshareToShares2/reShareSubfolder.feature:86](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares3/apiShareReshareToShares2/reShareSubfolder.feature#L86) - [apiShareReshareToShares2/reShareSubfolder.feature:87](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares3/apiShareReshareToShares2/reShareSubfolder.feature#L87) -#### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) +#### [cannot move/rename an accepted shared resource outside of shares folder](https://github.com/owncloud/ocis/issues/2141) - [apiShareReshareToShares2/reShareChain.feature:12](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareChain.feature#L12) +- [apiShareOperationsToShares1/changingFilesShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L42) +- [apiShareOperationsToShares1/changingFilesShare.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L43) +- [apiShareOperationsToShares1/changingFilesShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L62) +- [apiShareOperationsToShares1/changingFilesShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L63) +- [apiTrashbin/trashbinSharingToShares.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L23) +- [apiTrashbin/trashbinSharingToShares.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L24) +- [apiTrashbin/trashbinSharingToShares.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L39) +- [apiTrashbin/trashbinSharingToShares.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L40) +- [apiTrashbin/trashbinSharingToShares.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L63) +- [apiTrashbin/trashbinSharingToShares.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L64) +- [apiVersions/fileVersionsSharingToShares.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L133) +- [apiVersions/fileVersionsSharingToShares.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L148) +- [apiVersions/fileVersionsSharingToShares.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L162) +- [apiVersions/fileVersionsSharingToShares.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L249) +- [apiVersions/fileVersionsSharingToShares.feature:250](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L250) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) - [apiShareReshareToShares2/reShareWhenShareWithOnlyMembershipGroups.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareWhenShareWithOnlyMembershipGroups.feature#L27) @@ -1029,12 +1050,12 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareReshareToShares2/reShareSubfolder.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L30) - [apiShareReshareToShares2/reShareSubfolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L31) -- [apiShareReshareToShares2/reShareSubfolder.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L108) - [apiShareReshareToShares2/reShareSubfolder.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L109) -- [apiShareReshareToShares2/reShareSubfolder.feature:130](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L130) -- [apiShareReshareToShares2/reShareSubfolder.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L131) -- [apiShareReshareToShares2/reShareSubfolder.feature:152](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L152) -- [apiShareReshareToShares2/reShareSubfolder.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L153) +- [apiShareReshareToShares2/reShareSubfolder.feature:110](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L110) +- [apiShareReshareToShares2/reShareSubfolder.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L132) +- [apiShareReshareToShares2/reShareSubfolder.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L133) +- [apiShareReshareToShares2/reShareSubfolder.feature:155](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L155) +- [apiShareReshareToShares2/reShareSubfolder.feature:156](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L156) - [apiShareManagementBasicToShares/deleteShareFromShares.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/deleteShareFromShares.feature#L46) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:536](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L536) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:554](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L554) @@ -1048,9 +1069,8 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: #### [invalid format of sharees response](https://github.com/owncloud/product/issues/292) #### [deleting a received share-folder moves it to trash-bin but does not unshare it](https://github.com/owncloud/ocis/issues/1123) - -- [apiShareManagementToShares/acceptShares.feature:489](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L489) - [apiShareManagementToShares/acceptShares.feature:490](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L490) +- [apiShareManagementToShares/acceptShares.feature:491](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L491) #### [Restoring a file to read-only received folder returns incorrect status code](https://github.com/owncloud/ocis/issues/2143) - [apiTrashbin/trashbinSharingToShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L82) @@ -1158,18 +1178,6 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareOperationsToShares1/changingFilesShare.feature:82](https://github.com/owncloud/core/blob/master/test/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L82) - [apiShareOperationsToShares1/changingFilesShare.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L98) -#### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) -- [apiShareOperationsToShares1/changingFilesShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L42) -- [apiShareOperationsToShares1/changingFilesShare.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L43) -- [apiShareOperationsToShares1/changingFilesShare.feature:62](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L62) -- [apiShareOperationsToShares1/changingFilesShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/changingFilesShare.feature#L63) -- [apiTrashbin/trashbinSharingToShares.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L23) -- [apiTrashbin/trashbinSharingToShares.feature:24](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L24) -- [apiTrashbin/trashbinSharingToShares.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L39) -- [apiTrashbin/trashbinSharingToShares.feature:40](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L40) -- [apiTrashbin/trashbinSharingToShares.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L63) -- [apiTrashbin/trashbinSharingToShares.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinSharingToShares.feature#L64) - Scenario Outline: Moving a file into a shared folder as the sharee and as the sharer - [apiWebdavMove2/moveFile.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L99) - [apiWebdavMove2/moveFile.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L100) @@ -1203,16 +1211,9 @@ Scenario Outline: Moving a file into a shared folder as the sharee and as the sh - [apiWebdavMove2/moveFile.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove2/moveFile.feature#L291) #### [restoring an older version of a shared file deletes the share](https://github.com/owncloud/ocis/issues/765) -- [apiShareManagementToShares/acceptShares.feature:493](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L493) +- [apiShareManagementToShares/acceptShares.feature:494](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L494) - [apiVersions/fileVersionsSharingToShares.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L43) -#### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) -- [apiVersions/fileVersionsSharingToShares.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L133) -- [apiVersions/fileVersionsSharingToShares.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L148) -- [apiVersions/fileVersionsSharingToShares.feature:162](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L162) -- [apiVersions/fileVersionsSharingToShares.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L249) -- [apiVersions/fileVersionsSharingToShares.feature:250](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L250) - #### [not possible to move file into a received folder](https://github.com/owncloud/ocis/issues/764) - [apiVersions/fileVersionsSharingToShares.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L221) - [apiVersions/fileVersionsSharingToShares.feature:222](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L222) @@ -1372,26 +1373,27 @@ _ocs: api compatibility, return correct status code_ #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) - [apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature#L15) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L19) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L22) -- [apiShareManagementToShares/moveReceivedShare.feature:14](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L14) -- [apiShareManagementToShares/moveReceivedShare.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L28) -- [apiShareManagementToShares/moveReceivedShare.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L39) -- [apiShareManagementToShares/moveReceivedShare.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L70) -- [apiShareManagementToShares/moveReceivedShare.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L71) -- [apiShareManagementToShares/moveReceivedShare.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L73) -- [apiShareManagementToShares/moveReceivedShare.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L88) -- [apiShareManagementToShares/moveReceivedShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L120) -- [apiShareManagementToShares/moveReceivedShare.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L131) -- [apiShareManagementToShares/moveReceivedShare.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L142) -- [apiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L153) -- [apiShareManagementToShares/moveReceivedShare.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L164) -- [apiShareManagementToShares/moveReceivedShare.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L175) -- [apiShareManagementToShares/moveReceivedShare.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L205) -- [apiShareManagementToShares/moveReceivedShare.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L206) -- [apiShareManagementToShares/moveReceivedShare.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L229) -- [apiShareManagementToShares/moveReceivedShare.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L230) -- [apiShareManagementToShares/moveReceivedShare.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L232) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L20) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L23) +- [apiShareManagementToShares/moveReceivedShare.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L15) +- [apiShareManagementToShares/moveReceivedShare.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L30) +- [apiShareManagementToShares/moveReceivedShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L42) +- [apiShareManagementToShares/moveReceivedShare.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L74) +- [apiShareManagementToShares/moveReceivedShare.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L75) +- [apiShareManagementToShares/moveReceivedShare.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L78) +- [apiShareManagementToShares/moveReceivedShare.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L94) +- [apiShareManagementToShares/moveReceivedShare.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L109) +- [apiShareManagementToShares/moveReceivedShare.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L119) +- [apiShareManagementToShares/moveReceivedShare.feature:129](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L129) +- [apiShareManagementToShares/moveReceivedShare.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L141) +- [apiShareManagementToShares/moveReceivedShare.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L165) +- [apiShareManagementToShares/moveReceivedShare.feature:177](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L177) +- [apiShareManagementToShares/moveReceivedShare.feature:189](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L189) +- [apiShareManagementToShares/moveReceivedShare.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L220) +- [apiShareManagementToShares/moveReceivedShare.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L221) +- [apiShareManagementToShares/moveReceivedShare.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L245) +- [apiShareManagementToShares/moveReceivedShare.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L246) +- [apiShareManagementToShares/moveReceivedShare.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L249) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L59) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L60) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L94) @@ -1408,16 +1410,13 @@ _ocs: api compatibility, return correct status code_ - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L283) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:317](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L317) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:318](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L318) +- [apiShareUpdateToShares/updateShare.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L95) - [apiShareUpdateToShares/updateShare.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L96) - [apiShareUpdateToShares/updateShare.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L97) - [apiShareUpdateToShares/updateShare.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L98) - [apiShareUpdateToShares/updateShare.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L99) - [apiShareUpdateToShares/updateShare.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L100) -- [apiShareUpdateToShares/updateShare.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L101) -- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) -- [apiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L123) -- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) -- [apiShareUpdateToShares/updateShare.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L160) +- [apiShareUpdateToShares/updateShare.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L159) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:706](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L706) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:707](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L707) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:725](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L725) @@ -1426,9 +1425,6 @@ _ocs: api compatibility, return correct status code_ - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:742](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L742) The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - -- [apiShareManagementToShares/moveReceivedShare.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L102) -- [apiShareManagementToShares/moveReceivedShare.feature:111](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L111) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L73) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L74) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L108) @@ -1453,30 +1449,32 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: - [apiShareOperationsToShares1/gettingShares.feature:188](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingShares.feature#L184) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) -- [apiShareUpdateToShares/updateShare.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L298) -- [apiShareUpdateToShares/updateShare.feature:299](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L299) -- [apiShareUpdateToShares/updateShare.feature:315](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L315) -- [apiShareUpdateToShares/updateShare.feature:316](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L316) -- [apiShareUpdateToShares/updateShare.feature:344](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L344) -- [apiShareUpdateToShares/updateShare.feature:345](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L345) -- [apiShareUpdateToShares/updateShare.feature:375](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L375) -- [apiShareUpdateToShares/updateShare.feature:376](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L376) -- [apiShareUpdateToShares/updateShare.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L272) -- [apiShareUpdateToShares/updateShare.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L273) +- [apiShareUpdateToShares/updateShare.feature:270](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L270) +- [apiShareUpdateToShares/updateShare.feature:271](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L271) +- [apiShareUpdateToShares/updateShare.feature:296](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L296) +- [apiShareUpdateToShares/updateShare.feature:297](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L297) +- [apiShareUpdateToShares/updateShare.feature:313](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L313) +- [apiShareUpdateToShares/updateShare.feature:314](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L314) +- [apiShareUpdateToShares/updateShare.feature:342](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L342) +- [apiShareUpdateToShares/updateShare.feature:343](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L343) +- [apiShareUpdateToShares/updateShare.feature:373](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L373) +- [apiShareUpdateToShares/updateShare.feature:374](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L374) #### [cannot move/rename an accepted shared resource outside of shares folder](https://github.com/owncloud/ocis/issues/2141) - [apiShareUpdateToShares/updateShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L63) - [apiShareUpdateToShares/updateShare.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L64) +- [apiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L153) #### [Share permissions can be updated to any value](https://github.com/owncloud/ocis/issues/2173) -- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) +- [apiShareUpdateToShares/updateShare.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L119) +- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) - [apiShareUpdateToShares/updateShare.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L121) - [apiShareUpdateToShares/updateShare.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L122) -- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) +- [apiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L123) - [apiShareUpdateToShares/updateShare.feature:124](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L124) -- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) -- [apiShareUpdateToShares/updateShare.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L258) -- [apiShareUpdateToShares/updateShare.feature:259](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L259) +- [apiShareUpdateToShares/updateShare.feature:127](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L127) +- [apiShareUpdateToShares/updateShare.feature:256](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L256) +- [apiShareUpdateToShares/updateShare.feature:257](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L257) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L34) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L35) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:54](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L54) @@ -1485,8 +1483,8 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: #### [Share additional info](https://github.com/owncloud/ocis/issues/1253) #### [Share extra attributes](https://github.com/owncloud/ocis/issues/1224) #### [Edit user share response has an "name" field](https://github.com/owncloud/ocis/issues/1225) +- [apiShareUpdateToShares/updateShare.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L234) - [apiShareUpdateToShares/updateShare.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L235) -- [apiShareUpdateToShares/updateShare.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L236) #### [user can access version metadata of a received share before accepting it](https://github.com/owncloud/ocis/issues/760) - [apiVersions/fileVersionsSharingToShares.feature:278](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L278) @@ -1502,17 +1500,6 @@ The following scenarios fail on OWNCLOUD storage but not on OCIS storage: ### User Management User and group management features -#### [quota query](https://github.com/owncloud/ocis/issues/1313) -_requires a [CS3 user provisioning api that can update the quota for a user](https://github.com/cs3org/cs3apis/pull/95#issuecomment-772780683)_ -- [apiMain/quota.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:105) -- [apiMain/quota.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:112) -- [apiMain/quota.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:119) -- [apiMain/quota.feature:134](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:134) -- [apiMain/quota.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:148) -- [apiMain/quota.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:164) -- [apiMain/quota.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:178) -- [apiMain/quota.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:184) - ### Other API, search, favorites, config, capabilities, not existing endpoints, CORS and others @@ -1969,12 +1956,6 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavUpload1/uploadFileToBlacklistedName.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload1/uploadFileToBlacklistedName.feature#L66) - [apiWebdavUpload1/uploadFileToBlacklistedName.feature:67](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload1/uploadFileToBlacklistedName.feature#L67) -#### [Checksum feature](https://github.com/owncloud/ocis/issues/1291) -_ocdav: return checksum in upload response for chunked upload_ -- [apiMain/checksums.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L164) Scenario: Upload new dav chunked file using async MOVE where checksum matches -- [apiMain/checksums.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L180) Scenario: Upload new dav chunked file using async MOVE where checksum does not match -- [apiMain/checksums.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L198) Scenario: Upload new dav chunked file using async MOVE where checksum does not match - retry with correct checksum - #### [PATCH request for TUS upload with wrong checksum gives incorrect response](https://github.com/owncloud/ocis/issues/1755) - [apiWebdavUploadTUS/checksums.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L65) - [apiWebdavUploadTUS/checksums.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L66) diff --git a/tests/acceptance/expected-failures-on-S3NG-storage.md b/tests/acceptance/expected-failures-on-S3NG-storage.md index 6051a779e6..0d6420778f 100644 --- a/tests/acceptance/expected-failures-on-S3NG-storage.md +++ b/tests/acceptance/expected-failures-on-S3NG-storage.md @@ -23,7 +23,7 @@ Basic file management like up and download, move, copy, properties, quota, trash - [apiTrashbin/trashbinRestore.feature:130](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L130) - [apiTrashbin/trashbinRestore.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L131) -#### [href in trashbin PROPFIND response is wrong](https://github.com/owncloud/ocis/issues/1120) +#### [PROPFIND on trashbin with Depth: infinity only shows the first level](https://github.com/owncloud/ocis/issues/1116) #### [cannot restore to a different file-name](https://github.com/owncloud/ocis/issues/1122) - [apiTrashbin/trashbinRestore.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L309) - [apiTrashbin/trashbinRestore.feature:310](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiTrashbin/trashbinRestore.feature#L310) @@ -45,8 +45,8 @@ Basic file management like up and download, move, copy, properties, quota, trash - [apiVersions/fileVersions.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L88) - [apiVersions/fileVersions.feature:89](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L89) - [apiVersions/fileVersions.feature:93](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L93) -- [apiVersions/fileVersions.feature:288](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L288) -- [apiVersions/fileVersions.feature:362](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L362) +- [apiVersions/fileVersions.feature:276](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L276) +- [apiVersions/fileVersions.feature:347](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersions.feature#L347) - [apiWebdavUpload2/uploadFileUsingNewChunking.feature:13](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileUsingNewChunking.feature#L13) - [apiWebdavUpload2/uploadFileUsingNewChunking.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileUsingNewChunking.feature#L31) - [apiWebdavUpload2/uploadFileUsingNewChunking.feature:46](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload2/uploadFileUsingNewChunking.feature#L46) @@ -153,16 +153,17 @@ _etag propagation_ - [apiWebdavEtagPropagation1/deleteFileFolder.feature:193](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation1/deleteFileFolder.feature#L193) - [apiWebdavEtagPropagation1/deleteFileFolder.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation1/deleteFileFolder.feature#L207) - #### [Remote.php/dav/uploads endpoint does not exist](https://github.com/owncloud/ocis/issues/1321) _ocdav: return checksum in upload response for chunked upload_ - [apiMain/checksums.feature:144](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L144) Scenario: Upload new dav chunked file where checksum matches - [apiMain/checksums.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L153) Scenario: Upload new dav chunked file where checksum does not match +- [apiMain/checksums.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L164) Scenario: Upload new dav chunked file using async MOVE where checksum matches +- [apiMain/checksums.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L180) Scenario: Upload new dav chunked file using async MOVE where checksum does not match +- [apiMain/checksums.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L198) Scenario: Upload new dav chunked file using async MOVE where checksum does not match - retry with correct checksum - [apiMain/checksums.feature:263](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L263) Scenario: Uploading an old method chunked file with checksum should fail using new DAV path - [apiMain/checksums.feature:319](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L319) Scenario: Upload overwriting a file with new chunking and correct checksum - [apiMain/checksums.feature:331](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L331) Scenario: Upload overwriting a file with new chunking and invalid checksum - #### [Preserve mtime after TUS upload](https://github.com/owncloud/ocis-reva/issues/174) Scenario Outline: upload file with mtime `expected -'1565237893', actual +'1611153591'` - [apiWebdavUpload1/uploadFile.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUpload1/uploadFile.feature#L160) @@ -530,7 +531,8 @@ File and sync features in a shared scenario - [apiWebdavEtagPropagation1/moveFileFolder.feature:315](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavEtagPropagation1/moveFileFolder.feature#L315) -#### [sharing with group not available](https://github.com/owncloud/product/issues/293) +#### [Member in a group cannot see the share which has been shared with the group](https://github.com/cs3org/reva/issues/1831) +#### [Fix accepting/denying group shares](https://github.com/cs3org/reva/issues/1769) - [apiShareOperationsToShares2/uploadToShare.feature:41](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/uploadToShare.feature#L41) - [apiShareOperationsToShares2/uploadToShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/uploadToShare.feature#L42) @@ -607,23 +609,25 @@ File and sync features in a shared scenario - [apiSharees/sharees.feature:702](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharees/sharees.feature#L702) - [apiSharees/sharees.feature:703](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiSharees/sharees.feature#L703) -#### [sharing with group not available](https://github.com/owncloud/product/issues/293) +#### [Member in a group cannot see the share which has been shared with the group](https://github.com/cs3org/reva/issues/1831) +#### [Fix accepting/denying group shares](https://github.com/cs3org/reva/issues/1769) + - [apiShareManagementToShares/acceptShares.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L30) - [apiShareManagementToShares/acceptShares.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L234) -- [apiShareManagementToShares/acceptShares.feature:281](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L281) -- [apiShareManagementToShares/acceptShares.feature:355](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L355) -- [apiShareManagementToShares/acceptShares.feature:393](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L393) -- [apiShareManagementToShares/acceptShares.feature:436](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L436) +- [apiShareManagementToShares/acceptShares.feature:282](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L282) +- [apiShareManagementToShares/acceptShares.feature:356](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L356) +- [apiShareManagementToShares/acceptShares.feature:394](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L394) +- [apiShareManagementToShares/acceptShares.feature:437](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L437) #### User cannot create a folder named Share -- [apiShareManagementToShares/acceptShares.feature:290](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L290) -- [apiShareManagementToShares/acceptShares.feature:309](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L309) +- [apiShareManagementToShares/acceptShares.feature:291](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L291) +- [apiShareManagementToShares/acceptShares.feature:310](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L310) #### [Response is empty when accepting a share](https://github.com/owncloud/product/issues/207) - [apiShareManagementToShares/acceptShares.feature:82](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L82) - [apiShareManagementToShares/acceptShares.feature:207](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L207) -- [apiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L260) +- [apiShareManagementToShares/acceptShares.feature:261](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L261) - [apiShareManagementToShares/acceptSharesToSharesFolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L31) - [apiShareManagementToShares/acceptSharesToSharesFolder.feature:52](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptSharesToSharesFolder.feature#L52) - [apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature:138](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareReceivedInMultipleWays.feature#L138) @@ -656,7 +660,9 @@ File and sync features in a shared scenario - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L101) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:102](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L102) -#### TODO +#### [Member in a group cannot see the share which has been shared with the group](https://github.com/cs3org/reva/issues/1831) +#### [Fix accepting/denying group shares](https://github.com/cs3org/reva/issues/1769) + - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:238](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L238) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:239](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L239) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:260](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L260) @@ -942,19 +948,19 @@ _requires a [CS3 user provisioning api that can update the quota for a user](htt - [apiShareReshareToShares2/reShareSubfolder.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L30) - [apiShareReshareToShares2/reShareSubfolder.feature:31](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L31) -- [apiShareReshareToShares2/reShareSubfolder.feature:108](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L108) - [apiShareReshareToShares2/reShareSubfolder.feature:109](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L109) -- [apiShareReshareToShares2/reShareSubfolder.feature:130](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L130) -- [apiShareReshareToShares2/reShareSubfolder.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L131) -- [apiShareReshareToShares2/reShareSubfolder.feature:152](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L152) -- [apiShareReshareToShares2/reShareSubfolder.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L153) +- [apiShareReshareToShares2/reShareSubfolder.feature:110](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L110) +- [apiShareReshareToShares2/reShareSubfolder.feature:132](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L132) +- [apiShareReshareToShares2/reShareSubfolder.feature:133](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L133) +- [apiShareReshareToShares2/reShareSubfolder.feature:155](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L155) +- [apiShareReshareToShares2/reShareSubfolder.feature:156](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareReshareToShares2/reShareSubfolder.feature#L156) #### [invalid format of sharees response](https://github.com/owncloud/product/issues/292) #### [deleting a received share-folder moves it to trash-bin but does not unshare it](https://github.com/owncloud/ocis/issues/1123) -- [apiShareManagementToShares/acceptShares.feature:489](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L489) - [apiShareManagementToShares/acceptShares.feature:490](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L490) +- [apiShareManagementToShares/acceptShares.feature:491](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L491) #### [deleting a file inside a received shared folder is moved to the trash-bin of the sharer not the receiver](https://github.com/owncloud/ocis/issues/1124) @@ -1007,6 +1013,7 @@ _getting and setting quota_ - [apiMain/quota.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L28) Scenario: Overwriting a file as owner having insufficient quota _requires a [CS3 user provisioning api that can update the quota for a user](https://github.com/cs3org/cs3apis/pull/95#issuecomment-772780683)_ +- [apiMain/quota.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L38) Scenario: Overwriting a file as owner having insufficient quota - [apiMain/quota.feature:48](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L48) Scenario: Uploading a file in received folder having enough quota - [apiMain/quota.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L59) Scenario: Uploading a file in received folder having insufficient quota - [apiMain/quota.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L70) Scenario: Overwriting a file in received folder having enough quota @@ -1112,7 +1119,7 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiVersions/fileVersionsSharingToShares.feature:32](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L32) #### [restoring an older version of a shared file deletes the share](https://github.com/owncloud/ocis/issues/765) -- [apiShareManagementToShares/acceptShares.feature:493](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L493) +- [apiShareManagementToShares/acceptShares.feature:494](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/acceptShares.feature#L494) - [apiVersions/fileVersionsSharingToShares.feature:43](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L43) #### [cannot move from Shares folder](https://github.com/owncloud/ocis/issues/560) @@ -1122,7 +1129,7 @@ Scenario Outline: Renaming a file to a path with extension .part should not be p - [apiVersions/fileVersionsSharingToShares.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L249) - [apiVersions/fileVersionsSharingToShares.feature:250](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L250) -#### [sharing with group not available](https://github.com/owncloud/product/issues/293) +#### [Version count is 1 more than on oC10](https://github.com/owncloud/ocis/issues/1633) - [apiVersions/fileVersionsSharingToShares.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L178) ####[not possible to move file into a received folder](https://github.com/owncloud/ocis/issues/764) @@ -1280,26 +1287,25 @@ _ocs: api compatibility, return correct status code_ #### [Sharing seems to work but does not work](https://github.com/owncloud/ocis/issues/1303) - [apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature#L15) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:19](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L19) -- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:22](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L22) -- [apiShareManagementToShares/moveReceivedShare.feature:14](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L14) -- [apiShareManagementToShares/moveReceivedShare.feature:28](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L28) -- [apiShareManagementToShares/moveReceivedShare.feature:39](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L39) -- [apiShareManagementToShares/moveReceivedShare.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L70) -- [apiShareManagementToShares/moveReceivedShare.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L71) -- [apiShareManagementToShares/moveReceivedShare.feature:73](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L73) -- [apiShareManagementToShares/moveReceivedShare.feature:88](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L88) -- [apiShareManagementToShares/moveReceivedShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L120) -- [apiShareManagementToShares/moveReceivedShare.feature:131](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L131) -- [apiShareManagementToShares/moveReceivedShare.feature:142](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L142) -- [apiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L153) -- [apiShareManagementToShares/moveReceivedShare.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L164) -- [apiShareManagementToShares/moveReceivedShare.feature:175](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L175) -- [apiShareManagementToShares/moveReceivedShare.feature:205](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L205) -- [apiShareManagementToShares/moveReceivedShare.feature:206](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L206) -- [apiShareManagementToShares/moveReceivedShare.feature:229](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L229) -- [apiShareManagementToShares/moveReceivedShare.feature:230](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L230) -- [apiShareManagementToShares/moveReceivedShare.feature:232](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L232) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:20](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L20) +- [apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:23](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L23) +- [apiShareManagementToShares/moveReceivedShare.feature:15](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L15) +- [apiShareManagementToShares/moveReceivedShare.feature:30](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L30) +- [apiShareManagementToShares/moveReceivedShare.feature:42](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L42) +- [apiShareManagementToShares/moveReceivedShare.feature:74](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L74) +- [apiShareManagementToShares/moveReceivedShare.feature:75](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L75) +- [apiShareManagementToShares/moveReceivedShare.feature:78](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L78) +- [apiShareManagementToShares/moveReceivedShare.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L94) +- [apiShareManagementToShares/moveReceivedShare.feature:129](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L129) +- [apiShareManagementToShares/moveReceivedShare.feature:141](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L141) +- [apiShareManagementToShares/moveReceivedShare.feature:165](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L165) +- [apiShareManagementToShares/moveReceivedShare.feature:177](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L177) +- [apiShareManagementToShares/moveReceivedShare.feature:189](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L189) +- [apiShareManagementToShares/moveReceivedShare.feature:220](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L220) +- [apiShareManagementToShares/moveReceivedShare.feature:221](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L221) +- [apiShareManagementToShares/moveReceivedShare.feature:245](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L245) +- [apiShareManagementToShares/moveReceivedShare.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L246) +- [apiShareManagementToShares/moveReceivedShare.feature:249](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L249) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:59](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L59) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:60](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L60) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:94](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L94) @@ -1316,16 +1322,13 @@ _ocs: api compatibility, return correct status code_ - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:283](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L283) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:317](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L317) - [apiShareOperationsToShares2/getWebDAVSharePermissions.feature:318](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares2/getWebDAVSharePermissions.feature#L318) +- [apiShareUpdateToShares/updateShare.feature:95](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L95) - [apiShareUpdateToShares/updateShare.feature:96](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L96) - [apiShareUpdateToShares/updateShare.feature:97](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L97) - [apiShareUpdateToShares/updateShare.feature:98](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L98) - [apiShareUpdateToShares/updateShare.feature:99](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L99) - [apiShareUpdateToShares/updateShare.feature:100](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L100) -- [apiShareUpdateToShares/updateShare.feature:101](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L101) -- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) -- [apiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L123) -- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) -- [apiShareUpdateToShares/updateShare.feature:160](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L160) +- [apiShareUpdateToShares/updateShare.feature:159](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L159) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:706](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L706) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:707](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L707) - [apiShareManagementBasicToShares/createShareToSharesFolder.feature:725](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementBasicToShares/createShareToSharesFolder.feature#L725) @@ -1341,31 +1344,33 @@ _ocs: api compatibility, return correct status code_ - [apiShareOperationsToShares1/gettingShares.feature:188](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareOperationsToShares1/gettingShares.feature#L188) #### [various sharing settings cannot be set](https://github.com/owncloud/ocis/issues/1328) -- [apiShareUpdateToShares/updateShare.feature:298](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L298) -- [apiShareUpdateToShares/updateShare.feature:299](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L299) -- [apiShareUpdateToShares/updateShare.feature:315](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L315) -- [apiShareUpdateToShares/updateShare.feature:316](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L316) -- [apiShareUpdateToShares/updateShare.feature:344](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L344) -- [apiShareUpdateToShares/updateShare.feature:345](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L345) -- [apiShareUpdateToShares/updateShare.feature:375](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L375) -- [apiShareUpdateToShares/updateShare.feature:376](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L376) -- [apiShareUpdateToShares/updateShare.feature:272](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L272) -- [apiShareUpdateToShares/updateShare.feature:273](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L273) +- [apiShareUpdateToShares/updateShare.feature:270](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L270) +- [apiShareUpdateToShares/updateShare.feature:271](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L271) +- [apiShareUpdateToShares/updateShare.feature:296](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L296) +- [apiShareUpdateToShares/updateShare.feature:297](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L297) +- [apiShareUpdateToShares/updateShare.feature:313](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L313) +- [apiShareUpdateToShares/updateShare.feature:314](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L314) +- [apiShareUpdateToShares/updateShare.feature:342](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L342) +- [apiShareUpdateToShares/updateShare.feature:343](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L343) +- [apiShareUpdateToShares/updateShare.feature:373](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L373) +- [apiShareUpdateToShares/updateShare.feature:374](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L374) #### [cannot move/rename an accepted shared resource outside of shares folder](https://github.com/owncloud/ocis/issues/2141) - [apiShareUpdateToShares/updateShare.feature:63](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L63) - [apiShareUpdateToShares/updateShare.feature:64](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L64) +- [apiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareManagementToShares/moveReceivedShare.feature#L153) #### [Share permissions can be updated to any value](https://github.com/owncloud/ocis/issues/2173) -- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) +- [apiShareUpdateToShares/updateShare.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L119) +- [apiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L120) - [apiShareUpdateToShares/updateShare.feature:121](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L121) - [apiShareUpdateToShares/updateShare.feature:122](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L122) -- [apiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L128) +- [apiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L123) - [apiShareUpdateToShares/updateShare.feature:124](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L124) -- [apiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L125) -- [apiShareUpdateToShares/updateShare.feature:258](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L258) -- [apiShareUpdateToShares/updateShare.feature:259](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L259) +- [apiShareUpdateToShares/updateShare.feature:127](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L127) +- [apiShareUpdateToShares/updateShare.feature:256](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L256) +- [apiShareUpdateToShares/updateShare.feature:257](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L257) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:34](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L34) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:35](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L35) - [apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:54](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L54) @@ -1374,8 +1379,8 @@ _ocs: api compatibility, return correct status code_ #### [Share additional info](https://github.com/owncloud/ocis/issues/1253) #### [Share extra attributes](https://github.com/owncloud/ocis/issues/1224) #### [Edit user share response has an "name" field](https://github.com/owncloud/ocis/issues/1225) +- [apiShareUpdateToShares/updateShare.feature:234](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L234) - [apiShareUpdateToShares/updateShare.feature:235](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L235) -- [apiShareUpdateToShares/updateShare.feature:236](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiShareUpdateToShares/updateShare.feature#L236) #### [user can access version metadata of a received share before accepting it](https://github.com/owncloud/ocis/issues/760) - [apiVersions/fileVersionsSharingToShares.feature:278](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiVersions/fileVersionsSharingToShares.feature#L278) @@ -1385,8 +1390,6 @@ _ocs: api compatibility, return correct status code_ - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:27](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L27) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:55](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L55) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:56](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L56) - -#### [OCIS-storage reading a file that a collaborator uploaded is impossible](https://github.com/owncloud/ocis/issues/763) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:70](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L70) - [apiWebdavUploadTUS/uploadFileMtimeShares.feature:71](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/uploadFileMtimeShares.feature#L71) @@ -1404,19 +1407,6 @@ _ocs: api compatibility, return correct status code_ ### User Management User and group management features -#### [quota query](https://github.com/owncloud/ocis/issues/1313) -_requires a [CS3 user provisioning api that can update the quota for a user](https://github.com/cs3org/cs3apis/pull/95#issuecomment-772780683)_ -- [apiMain/quota.feature:105](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:105) -- [apiMain/quota.feature:112](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:112) -- [apiMain/quota.feature:119](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:119) -- [apiMain/quota.feature:134](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:134) -- [apiMain/quota.feature:148](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:148) -- [apiMain/quota.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:164) -- [apiMain/quota.feature:178](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:178) -- [apiMain/quota.feature:184](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature:184) - -- [apiMain/quota.feature:38](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/quota.feature#L38) Scenario: Overwriting a file as owner having insufficient quota - ### Other API, search, favorites, config, capabilities, not existing endpoints, CORS and others @@ -1869,12 +1859,6 @@ Not everything needs to be implemented for ocis. While the oc10 testsuite covers - [apiWebdavMove1/moveFileAsync.feature:246](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L246) - [apiWebdavMove1/moveFileAsync.feature:251](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavMove1/moveFileAsync.feature#L251) -#### [Checksum feature](https://github.com/owncloud/ocis/issues/1291) -_ocdav: return checksum in upload response for chunked upload_ -- [apiMain/checksums.feature:164](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L164) Scenario: Upload new dav chunked file using async MOVE where checksum matches -- [apiMain/checksums.feature:180](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L180) Scenario: Upload new dav chunked file using async MOVE where checksum does not match -- [apiMain/checksums.feature:198](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiMain/checksums.feature#L198) Scenario: Upload new dav chunked file using async MOVE where checksum does not match - retry with correct checksum - #### [PATCH request for TUS upload with wrong checksum gives incorrect response](https://github.com/owncloud/ocis/issues/1755) - [apiWebdavUploadTUS/checksums.feature:65](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L65) - [apiWebdavUploadTUS/checksums.feature:66](https://github.com/owncloud/core/blob/master/tests/acceptance/features/apiWebdavUploadTUS/checksums.feature#L66)