diff --git a/.github/workflows/test-docker.yml b/.github/workflows/test-docker.yml new file mode 100644 index 0000000000..7808d94693 --- /dev/null +++ b/.github/workflows/test-docker.yml @@ -0,0 +1,29 @@ +name: Test +on: + pull_request: + push: + branches: + - "*" + workflow_dispatch: + +jobs: + docker: + strategy: + fail-fast: false + matrix: + file: [docker/Dockerfile.reva, docker/Dockerfile.revad-eos, docker/Dockerfile.revad-ceph] + uses: ./.github/workflows/docker.yml + with: + file: ${{ matrix.file }} + docker-revad: + name: docker (docker/Dockerfile.revad) + uses: ./.github/workflows/docker.yml + with: + file: docker/Dockerfile.revad + load: true + docker-revad-eos: + name: docker (docker/Dockerfile.revad-eos) + uses: ./.github/workflows/docker.yml + with: + file: docker/Dockerfile.revad-eos + load: false diff --git a/.github/workflows/test-integration.yml b/.github/workflows/test-integration.yml new file mode 100644 index 0000000000..534b28a5de --- /dev/null +++ b/.github/workflows/test-integration.yml @@ -0,0 +1,37 @@ +name: Test +on: + pull_request: + push: + branches: + - "*" + workflow_dispatch: + +jobs: + integration: + runs-on: self-hosted + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Go environment + uses: actions/setup-go@v4 + with: + go-version-file: go.mod + cache: false + - name: Test integration + run: make test-integration + env: + REDIS_ADDRESS: redis:6379 + SQL_USERNAME: root + SQL_PASSWORD: my-secret-pw + SQL_ADDRESS: localhost:3306 + SQL_DBNAME: reva + services: + redis: + image: registry.cern.ch/docker.io/webhippie/redis + mysql: + image: mysql + ports: + - 3306:3306 + env: + MYSQL_ROOT_PASSWORD: my-secret-pw + MYSQL_DATABASE: reva diff --git a/.github/workflows/test-litmus.yml b/.github/workflows/test-litmus.yml new file mode 100644 index 0000000000..e0ca065eb5 --- /dev/null +++ b/.github/workflows/test-litmus.yml @@ -0,0 +1,19 @@ +name: Test +on: + pull_request: + push: + branches: + - "*" + workflow_dispatch: + +jobs: + litmus: + needs: + - docker-revad-eos + strategy: + fail-fast: false + matrix: + test: [litmus-1, litmus-2] + uses: ./.github/workflows/compose.yml + with: + test: ${{ matrix.test }} diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml new file mode 100644 index 0000000000..6f85f416d5 --- /dev/null +++ b/.github/workflows/test-unit.yml @@ -0,0 +1,30 @@ +name: Test +on: + pull_request: + push: + branches: + - "*" + workflow_dispatch: + +jobs: + unit-tests: + runs-on: self-hosted + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Go environment + uses: actions/setup-go@v4 + with: + go-version-file: go.mod + cache: false + - name: Test + run: make test-go + env: + COVER_PROFILE: ${{ github.event_name == 'push' && 'coverage.out' || '' }} + - name: Run codacy-coverage-reporter + uses: codacy/codacy-coverage-reporter-action@v1 + if: github.event_name == 'push' + with: + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} + coverage-reports: coverage.out + force-coverage-parser: go diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 71f486522b..0000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,108 +0,0 @@ -name: Test -on: - pull_request: - push: - branches: - - "*" - workflow_dispatch: - -jobs: - integration: - runs-on: self-hosted - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Go environment - uses: actions/setup-go@v4 - with: - go-version-file: go.mod - cache: false - - name: Test integration - run: make test-integration - env: - REDIS_ADDRESS: redis:6379 - SQL_USERNAME: root - SQL_PASSWORD: my-secret-pw - SQL_ADDRESS: localhost:3306 - SQL_DBNAME: reva - services: - redis: - image: registry.cern.ch/docker.io/webhippie/redis - mysql: - image: mysql - ports: - - 3306:3306 - env: - MYSQL_ROOT_PASSWORD: my-secret-pw - MYSQL_DATABASE: reva - go: - runs-on: self-hosted - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Go environment - uses: actions/setup-go@v4 - with: - go-version-file: go.mod - cache: false - - name: Test - run: make test-go - env: - COVER_PROFILE: ${{ github.event_name == 'push' && 'coverage.out' || '' }} - - name: Run codacy-coverage-reporter - uses: codacy/codacy-coverage-reporter-action@v1 - if: github.event_name == 'push' - with: - project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} - coverage-reports: coverage.out - force-coverage-parser: go - docker: - strategy: - fail-fast: false - matrix: - file: [docker/Dockerfile.reva, docker/Dockerfile.revad-eos, docker/Dockerfile.revad-ceph] - uses: ./.github/workflows/docker.yml - with: - file: ${{ matrix.file }} - docker-revad: - name: docker (docker/Dockerfile.revad) - uses: ./.github/workflows/docker.yml - with: - file: docker/Dockerfile.revad - load: true - docker-revad-eos: - name: docker (docker/Dockerfile.revad-eos) - uses: ./.github/workflows/docker.yml - with: - file: docker/Dockerfile.revad-eos - load: false - litmus: - needs: - - docker-revad-eos - strategy: - fail-fast: false - matrix: - test: [litmus-1, litmus-2] - uses: ./.github/workflows/compose.yml - with: - test: ${{ matrix.test }} - acceptance-1: - needs: - - docker-revad-eos - uses: ./.github/workflows/compose.yml - with: - test: acceptance-1 - submodules: true - acceptance-2: - needs: - - docker-revad-eos - strategy: - fail-fast: false - matrix: - part: [1, 2, 3, 4, 5, 6] - uses: ./.github/workflows/compose.yml - with: - test: acceptance-2 - submodules: true - parts: 6 - part: ${{ matrix.part }} diff --git a/.golangci.yaml b/.golangci.yaml index 5ec02ab851..192fde39d7 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -2,74 +2,9 @@ run: timeout: 20m linters: - enable-all: true - disable: - - exhaustive # TODO: consider enabling the 'exhaustive' linter to check the exhaustiveness of enum switch statements and map literals. - - wrapcheck # TODO: consider enabling the 'wrapcheck' linter to check that errors from external packages are wrapped during return to help identify the error source during debugging. - - cyclop # TODO: consider enabling the 'cyclop' linter to calculate the cyclomatic complexities of functions/packages. - - varnamelen # TODO: consider enabling the 'varnamelen' linter to check that the length of a variable's name matches its usage scope. - - testpackage # TODO: consider enabling the 'testpackage' linter to make sure that separate _test packages are used. - - gosec # TODO: consider enabling the 'gosec' linter to inspect source code for security problems. - - tagliatelle # TODO: consider enabling the 'tagliatelle' linter to check the struct tags. - - thelper # TODO: consider enabling the 'thelper' linter to detect golang test helpers without t.Helper() call and check the consistency of test helpers. - - predeclared # TODO: consider enabling the 'predeclared' linter to find code that shadows one of Go's predeclared identifiers. - - paralleltest # TODO: consider enabling the 'paralleltest' linter to detect missing usage of t.Parallel() method in Go test. - - ireturn # TODO: consider enabling the 'ireturn' linter to accept interfaces and return concrete types. - - nosprintfhostport # TODO: consider enabling the 'nosprintfhostport' linter to check for misuse of Sprintf to construct a host with port in a URL. - - nonamedreturns # TODO: consider enabling the 'nonamedreturns' linter to reports all named returns. - - gomnd # TODO: consider enabling the 'gomnd' linter to detect magic numbers. - - noctx # TODO: consider enabling the 'noctx' linter to find sending http request without context.Context. - - nlreturn # TODO: consider enabling the 'nlreturn' linter to check for a new line before return and branch statements to increase code clarity. - - nilnil # TODO: consider enabling the 'nilnil' linter to check that there is no simultaneous return of nil error and an invalid value. - - nilerr # TODO: consider enabling the 'nilerr' linter to find the code that returns nil even if it checks that the error is not nil. - - interfacebloat # TODO: consider enabling the 'interfacebloat' linter to check the number of methods inside an interface. - - goerr113 # TODO: consider enabling the 'goerr113' linter to check the errors handling expressions. - - gochecknoglobals # TODO: consider enabling the 'gochecknoglobals' linter to check that no global variables exist. - - forcetypeassert # TODO: consider enabling the 'forcetypeassert' linter to find forced type assertions. - - exhaustruct # TODO: consider enabling the 'exhaustruct' linter to check if all structure fields are initialized. - - execinquery # TODO: consider enabling the 'execinquery' linter to check query strings. - - errorlint # TODO: consider enabling the 'errorlint' linter to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. - - errname # TODO: consider enabling the 'errname' linter to check that sentinel errors are prefixed with the Err and error types are suffixed with the Error. - - wsl # TODO: consider enabling the 'wsl' linter to force the use of empty lines. - - nestif # TODO: consider enabling the 'nestif' linter to report deeply nested if statements. - - errchkjson # TODO: consider enabling the 'errchkjson' linter to checks types passed to the json encoding functions. - - contextcheck # TODO: consider enabling the 'contextcheck' linter to check whether the function uses a non-inherited context. - - asasalint # TODO: consider enabling the 'asasalint' linter to check for pass []any as any in variadic func(...any). - - containedctx # TODO: consider enabling the 'containedctx' linter to detect struct contained context.Context field. - - unparam # TODO: consider enabling the 'unparam' linter to report unused function parameters. - - nakedret # TODO: consider enabling the 'nakedret' linter to find naked returns in functions greater than a specified function length. - - makezero # TODO: consider enabling the 'makezero' linter to find slice declarations with non-zero initial length. - - lll # TODO: consider enabling the 'lll' linter to report long lines. - - gomoddirectives # TODO: consider enabling the 'gomoddirectives' linter to manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. - - gofumpt # TODO: consider enabling the 'gofumpt' linter to check whether code was gofumpt-ed. - - godox # TODO: consider enabling the 'godox' linter to detect FIXME, TODO and other comment keywords. - - goconst # TODO: consider enabling the 'goconst' linter to find repeated strings that could be replaced by a constant. - - gocognit # TODO: consider enabling the 'gocognit' linter to compute and check the cognitive complexity of functions. - - gochecknoinits # TODO: consider enabling the 'gochecknoinits' linter to check that no init functions are present in Go code. - - gci # TODO: consider enabling the 'gci' linter to control golang package import order and make it always deterministic. - - funlen # TODO: consider enabling the 'funlen' linter to detect long functions. - - maintidx # TODO: consider enabling the 'maintidx' linter to measure the maintainability index of each function. - - gocyclo # TODO: consider enabling the 'gocyclo' linter to compute and check the cyclomatic complexity of functions. - - forbidigo # TODO: consider enabling the 'forbidigo' linter to forbid identifiers. - - dupl # TODO: consider enabling the 'dupl' linter to detect code cloning. - - musttag - - ginkgolinter - - depguard - - revive - - nolintlint - - golint # deprecated since v1.41.0 - replaced by 'revive'. - - ifshort # deprecated since v1.48.0 - - structcheck # deprecated since v1.49.0 - replaced by 'unused'. - - exhaustivestruct # deprecated since v1.46.0 - replaced by 'exhaustruct'. - - deadcode # deprecated since v1.49.0 - replaced by 'unused'. - - interfacer # deprecated since v1.38.0 - - nosnakecase # deprecated since v1.48.1 - replaced by 'revive'(var-naming). - - varcheck # deprecated since v1.49.0 - replaced by 'unused'. - - maligned # deprecated since v1.38.0 - replaced by 'govet' 'fieldalignment'. - - scopelint # deprecated since v1.39.0 - replaced by 'exportloopref'. - - rowserrcheck # disabled because of generics - https://github.com/golangci/golangci-lint/issues/2649. - - sqlclosecheck # disabled because of generics - https://github.com/golangci/golangci-lint/issues/2649. - - wastedassign # disabled because of generics - https://github.com/golangci/golangci-lint/issues/2649. + disable-all: true + enable: + - govet linters-settings: goheader: @@ -90,4 +25,9 @@ linters-settings: 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. \ No newline at end of file + or submit itself to any jurisdiction. +issues: + exclude-rules: + - linters: + - govet + text: ".*lock.*" diff --git a/Makefile b/Makefile index 92165ad613..e8d9e63fe2 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ toolchain: $(GOLANGCI_LINT) $(CALENS) $(GOLANGCI_LINT): @mkdir -p $(@D) - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | BINDIR=$(@D) sh -s v1.54.2 + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | BINDIR=$(@D) sh -s v1.60.3 CALENS_DIR := $(shell mktemp -d) $(CALENS): @@ -87,7 +87,7 @@ docker-eos-full-tests: # Test ################################################################################ -TEST = litmus-1 litmus-2 acceptance-1 acceptance-2 +TEST = litmus-1 litmus-2 export REVAD_IMAGE ?= revad-eos export EOS_FULL_IMAGE ?= eos-full export PARTS ?= 1 diff --git a/changelog/unreleased/enhance-ceph.md b/changelog/unreleased/enhance-ceph.md new file mode 100644 index 0000000000..b4fc855ff7 --- /dev/null +++ b/changelog/unreleased/enhance-ceph.md @@ -0,0 +1,3 @@ +Enhancement: Refactor Ceph code + +https://github.com/cs3org/reva/pull/4824 diff --git a/changelog/unreleased/enhance-ci.md b/changelog/unreleased/enhance-ci.md new file mode 100644 index 0000000000..2f6c8d24d3 --- /dev/null +++ b/changelog/unreleased/enhance-ci.md @@ -0,0 +1,3 @@ +Enhancement: Refactor CI jobs and bump to latest deps + +https://github.com/cs3org/reva/pull/4797 diff --git a/changelog/unreleased/locks-uploads.md b/changelog/unreleased/locks-uploads.md new file mode 100644 index 0000000000..0c66fca473 --- /dev/null +++ b/changelog/unreleased/locks-uploads.md @@ -0,0 +1,6 @@ +Enhancement: Pass lock holder metadata on uploads + +We now pass relevant metadata (lock id and lock holder) downstream +on uploads, and handle the case of conflicts due to lock mismatch. + +https://github.com/cs3org/reva/pull/4514 diff --git a/cmd/reva/grpc.go b/cmd/reva/grpc.go index e7852b35f5..6ef7b66b46 100644 --- a/cmd/reva/grpc.go +++ b/cmd/reva/grpc.go @@ -57,14 +57,14 @@ func getClient() (gateway.GatewayAPIClient, error) { func getConn() (*grpc.ClientConn, error) { if insecure { - return grpc.Dial(conf.Host, grpc.WithTransportCredentials(ins.NewCredentials())) + return grpc.NewClient(conf.Host, grpc.WithTransportCredentials(ins.NewCredentials())) } // TODO(labkode): if in the future we want client-side certificate validation, // we need to load the client cert here tlsconf := &tls.Config{InsecureSkipVerify: skipverify} creds := credentials.NewTLS(tlsconf) - return grpc.Dial(conf.Host, grpc.WithTransportCredentials(creds)) + return grpc.NewClient(conf.Host, grpc.WithTransportCredentials(creds)) } func formatError(status *rpc.Status) error { diff --git a/cmd/reva/ls.go b/cmd/reva/ls.go index a6b81f7602..bc6c0b7fef 100644 --- a/cmd/reva/ls.go +++ b/cmd/reva/ls.go @@ -72,7 +72,7 @@ func lsCommand() *command { } if len(w) == 0 { if *longFlag { - fmt.Printf("%s %d %d %v %s\n", info.Type, info.Mtime, info.Size, info.Id, p) + fmt.Printf("%s %s %d %v %s\n", info.Type, info.Mtime, info.Size, info.Id, p) } else { fmt.Println(p) } diff --git a/go.mod b/go.mod index 4a26493062..43860145f6 100644 --- a/go.mod +++ b/go.mod @@ -9,11 +9,12 @@ require ( github.com/bluele/gcache v0.0.2 github.com/c-bata/go-prompt v0.2.6 github.com/ceph/go-ceph v0.26.0 + github.com/cern-eos/go-eosgrpc v0.0.0-20240812132646-f105d2304f38 github.com/cheggaaa/pb v1.0.29 github.com/coreos/go-oidc/v3 v3.9.0 github.com/creasty/defaults v1.7.0 github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e - github.com/cs3org/go-cs3apis v0.0.0-20230727093620-0f4399be4543 + github.com/cs3org/go-cs3apis v0.0.0-20240802083356-d617314e1795 github.com/dgraph-io/ristretto v0.1.1 github.com/dolthub/go-mysql-server v0.14.0 github.com/gdexlab/go-render v1.0.1 @@ -33,6 +34,7 @@ require ( github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0 github.com/jedib0t/go-pretty v4.3.0+incompatible + github.com/jt-nti/gproto v0.0.0-20210304092907-23e645af1351 github.com/juliangruber/go-intersect v1.1.0 github.com/mattn/go-sqlite3 v1.14.22 github.com/maxymania/go-system v0.0.0-20170110133659-647cc364bf0b @@ -53,14 +55,14 @@ require ( github.com/wk8/go-ordered-map v1.0.0 go.opencensus.io v0.24.0 go.step.sm/crypto v0.43.1 - golang.org/x/crypto v0.21.0 - golang.org/x/oauth2 v0.18.0 - golang.org/x/sync v0.6.0 - golang.org/x/sys v0.18.0 - golang.org/x/term v0.18.0 + golang.org/x/crypto v0.23.0 + golang.org/x/oauth2 v0.20.0 + golang.org/x/sync v0.7.0 + golang.org/x/sys v0.20.0 + golang.org/x/term v0.20.0 google.golang.org/genproto v0.0.0-20240314234333-6e1732d8331c - google.golang.org/grpc v1.62.1 - google.golang.org/protobuf v1.33.0 + google.golang.org/grpc v1.65.0 + google.golang.org/protobuf v1.34.1 gotest.tools v2.2.0+incompatible ) @@ -73,7 +75,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bmizerany/pat v0.0.0-20210406213842-e4b6760bdd6f // indirect github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dolthub/vitess v0.0.0-20221031111135-9aad77e7b39f // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -86,7 +88,7 @@ require ( github.com/go-openapi/errors v0.22.0 // indirect github.com/go-openapi/strfmt v0.23.0 // indirect github.com/gocraft/dbr/v2 v2.7.2 // indirect - github.com/golang/glog v1.2.0 // indirect + github.com/golang/glog v1.2.1 // indirect github.com/google/flatbuffers v2.0.8+incompatible // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect @@ -121,11 +123,10 @@ require ( go.opentelemetry.io/otel v1.23.1 // indirect go.opentelemetry.io/otel/trace v1.23.1 // indirect golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.23.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/text v0.15.0 // indirect golang.org/x/tools v0.14.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect gopkg.in/src-d/go-errors.v1 v1.0.0 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 78ba809f8d..6927c6794d 100644 --- a/go.sum +++ b/go.sum @@ -848,12 +848,15 @@ github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/ceph/go-ceph v0.26.0 h1:LZoATo25ZH5aeL5t85BwIbrNLKCDfcDM+e0qV0cmwHY= github.com/ceph/go-ceph v0.26.0/go.mod h1:ISxb295GszZwtLPkeWi+L2uLYBVsqbsh0M104jZMOX4= +github.com/cern-eos/go-eosgrpc v0.0.0-20240812132646-f105d2304f38 h1:+81ss4Vut1khzEhl7ximWF/V+EadspY47V4JrQkwlI4= +github.com/cern-eos/go-eosgrpc v0.0.0-20240812132646-f105d2304f38/go.mod h1:ZiIzbg4sDO2MwYlspcnauUR2dfwZHUzxker+HP9k+20= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.29 h1:FckUN5ngEk2LpvuG0fw1GEFx6LtyY2pWI/Z2QgCnEYo= github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= @@ -890,8 +893,8 @@ github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdB github.com/creasty/defaults v1.7.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e h1:tqSPWQeueWTKnJVMJffz4pz0o1WuQxJ28+5x5JgaHD8= github.com/cs3org/cato v0.0.0-20200828125504-e418fc54dd5e/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= -github.com/cs3org/go-cs3apis v0.0.0-20230727093620-0f4399be4543 h1:IFo6dj0XEOIA6i2baRWMC3vd+fAmuIUAVfSf77ZhoQg= -github.com/cs3org/go-cs3apis v0.0.0-20230727093620-0f4399be4543/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= +github.com/cs3org/go-cs3apis v0.0.0-20240802083356-d617314e1795 h1:8WkweBxMQ1W6IhcK0X3eWY+aQCjEktGwVt/4KLrtOZ8= +github.com/cs3org/go-cs3apis v0.0.0-20240802083356-d617314e1795/go.mod h1:yyP8PRo0EZou3nSH7H4qjlzQwaydPeIRNgX50npQHpE= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -1025,8 +1028,8 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -1216,6 +1219,8 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jt-nti/gproto v0.0.0-20210304092907-23e645af1351 h1:jYsiD6zdBzctjZ4sDB+gGJJPB3NROHrUuCp/wUj5p9Y= +github.com/jt-nti/gproto v0.0.0-20210304092907-23e645af1351/go.mod h1:yfoLDf8VFUCWSxFJsPuQT5BlqdDbGkDl5m6hzABroMI= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/juliangruber/go-intersect v1.1.0 h1:sc+y5dCjMMx0pAdYk/N6KBm00tD/f3tq+Iox7dYDUrY= github.com/juliangruber/go-intersect v1.1.0/go.mod h1:WMau+1kAmnlQnKiikekNJbtGtfmILU/mMU6H7AgKbWQ= @@ -1360,6 +1365,7 @@ github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xl github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= @@ -1589,8 +1595,8 @@ golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIi golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= 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= @@ -1691,6 +1697,7 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -1725,8 +1732,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1759,8 +1766,8 @@ golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4 golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= -golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= +golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1779,8 +1786,8 @@ golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1793,7 +1800,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190415081028-16da32be82c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1896,8 +1902,8 @@ golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1913,8 +1919,8 @@ golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1935,8 +1941,9 @@ golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2109,11 +2116,8 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -2276,8 +2280,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c h1:lfpJ/2rWPa/kJgxyyXM8PrNnfCzcmxJ265mADgwmvLI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240314234333-6e1732d8331c/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -2328,8 +2332,8 @@ google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGO google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= -google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -2349,8 +2353,8 @@ google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/Acconut/lockfile.v1 v1.1.0/go.mod h1:6UCz3wJ8tSFUsPR6uP/j8uegEtDuEEqFxlpi0JI4Umw= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/grpc/services/gateway/appprovider.go b/internal/grpc/services/gateway/appprovider.go index 8a345ba1dc..60c6b33443 100644 --- a/internal/grpc/services/gateway/appprovider.go +++ b/internal/grpc/services/gateway/appprovider.go @@ -308,12 +308,12 @@ func getGRPCConfig(opaque *typespb.Opaque) (bool, bool) { func getConn(host string, ins, skipverify bool) (*grpc.ClientConn, error) { if ins { - return grpc.Dial(host, grpc.WithTransportCredentials(insecure.NewCredentials())) + return grpc.NewClient(host, grpc.WithTransportCredentials(insecure.NewCredentials())) } // TODO(labkode): if in the future we want client-side certificate validation, // we need to load the client cert here tlsconf := &tls.Config{InsecureSkipVerify: skipverify} creds := credentials.NewTLS(tlsconf) - return grpc.Dial(host, grpc.WithTransportCredentials(creds)) + return grpc.NewClient(host, grpc.WithTransportCredentials(creds)) } diff --git a/internal/grpc/services/gateway/gateway.go b/internal/grpc/services/gateway/gateway.go index 20bea533e9..ebaf168985 100644 --- a/internal/grpc/services/gateway/gateway.go +++ b/internal/grpc/services/gateway/gateway.go @@ -71,6 +71,7 @@ type config struct { EtagCacheTTL int `mapstructure:"etag_cache_ttl"` AllowedUserAgents map[string][]string `mapstructure:"allowed_user_agents"` // map[path][]user-agent CreateHomeCacheTTL int `mapstructure:"create_home_cache_ttl"` + HomeLayout string `mapstructure:"home_layout"` } // sets defaults. @@ -111,6 +112,11 @@ func (c *config) ApplyDefaults() { if c.TransferExpires == 0 { c.TransferExpires = 100 * 60 // seconds } + + // default to /home + if c.HomeLayout == "" { + c.HomeLayout = "/home" + } } type svc struct { diff --git a/internal/grpc/services/gateway/publicshareprovider.go b/internal/grpc/services/gateway/publicshareprovider.go index c6e4142ae8..8111de49ad 100644 --- a/internal/grpc/services/gateway/publicshareprovider.go +++ b/internal/grpc/services/gateway/publicshareprovider.go @@ -21,7 +21,9 @@ package gateway import ( "context" + gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" + collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" link "github.com/cs3org/go-cs3apis/cs3/sharing/link/v1beta1" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" @@ -99,6 +101,16 @@ func (s *svc) GetPublicShare(ctx context.Context, req *link.GetPublicShareReques return pClient.GetPublicShare(ctx, req) } +func (s *svc) ListExistingPublicShares(ctx context.Context, req *link.ListPublicSharesRequest) (*gateway.ListExistingPublicSharesResponse, error) { + return nil, nil +} +func (s *svc) ListExistingReceivedShares(ctx context.Context, req *collaboration.ListReceivedSharesRequest) (*gateway.ListExistingReceivedSharesResponse, error) { + return nil, nil +} +func (s *svc) ListExistingShares(ctx context.Context, req *collaboration.ListSharesRequest) (*gateway.ListExistingSharesResponse, error) { + return nil, nil +} + func (s *svc) ListPublicShares(ctx context.Context, req *link.ListPublicSharesRequest) (*link.ListPublicSharesResponse, error) { log := appctx.GetLogger(ctx) log.Info().Msg("listing public shares") diff --git a/internal/grpc/services/gateway/spaces.go b/internal/grpc/services/gateway/spaces.go new file mode 100644 index 0000000000..5a157694c4 --- /dev/null +++ b/internal/grpc/services/gateway/spaces.go @@ -0,0 +1,41 @@ +// Copyright 2018-2024 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 gateway + +import ( + "context" + + provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" +) + +func (s *svc) CreateStorageSpace(ctx context.Context, req *provider.CreateStorageSpaceRequest) (*provider.CreateStorageSpaceResponse, error) { + return nil, nil +} + +func (s *svc) ListStorageSpaces(ctx context.Context, req *provider.ListStorageSpacesRequest) (*provider.ListStorageSpacesResponse, error) { + return nil, nil +} + +func (s *svc) UpdateStorageSpace(ctx context.Context, req *provider.UpdateStorageSpaceRequest) (*provider.UpdateStorageSpaceResponse, error) { + return nil, nil +} + +func (s *svc) DeleteStorageSpace(ctx context.Context, req *provider.DeleteStorageSpaceRequest) (*provider.DeleteStorageSpaceResponse, error) { + return nil, nil +} diff --git a/internal/grpc/services/gateway/storageprovider.go b/internal/grpc/services/gateway/storageprovider.go index 086f3f95df..40fb72a4ab 100644 --- a/internal/grpc/services/gateway/storageprovider.go +++ b/internal/grpc/services/gateway/storageprovider.go @@ -24,12 +24,10 @@ import ( "net/url" "path" "strings" - "sync" "time" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" - collaboration "github.com/cs3org/go-cs3apis/cs3/sharing/collaboration/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" registry "github.com/cs3org/go-cs3apis/cs3/storage/registry/v1beta1" types "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" @@ -38,14 +36,13 @@ import ( "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rgrpc/status" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" - "github.com/cs3org/reva/pkg/storage/utils/etag" + "github.com/cs3org/reva/pkg/storage/utils/templates" "github.com/cs3org/reva/pkg/utils" "github.com/golang-jwt/jwt" "github.com/google/uuid" "github.com/pkg/errors" "google.golang.org/grpc/codes" gstatus "google.golang.org/grpc/status" - "google.golang.org/protobuf/types/known/fieldmaskpb" ) // transferClaims are custom claims for a JWT token to be used between the metadata and data gateways. @@ -81,7 +78,6 @@ func (s *svc) sign(_ context.Context, target, versionKey string) (string, error) func (s *svc) CreateHome(ctx context.Context, req *provider.CreateHomeRequest) (*provider.CreateHomeResponse, error) { log := appctx.GetLogger(ctx) - home := s.getHome(ctx) c, err := s.findByPath(ctx, home) if err != nil { @@ -100,203 +96,6 @@ func (s *svc) CreateHome(ctx context.Context, req *provider.CreateHomeRequest) ( return res, nil } -func (s *svc) CreateStorageSpace(ctx context.Context, req *provider.CreateStorageSpaceRequest) (*provider.CreateStorageSpaceResponse, error) { - log := appctx.GetLogger(ctx) - // TODO: needs to be fixed - c, err := s.findByPath(ctx, "/users") - if err != nil { - return &provider.CreateStorageSpaceResponse{ - Status: status.NewStatusFromErrType(ctx, "error finding path", err), - }, nil - } - - res, err := c.CreateStorageSpace(ctx, req) - if err != nil { - log.Err(err).Msg("gateway: error creating storage space on storage provider") - return &provider.CreateStorageSpaceResponse{ - Status: status.NewInternal(ctx, err, "error calling CreateStorageSpace"), - }, nil - } - return res, nil -} - -func (s *svc) ListStorageSpaces(ctx context.Context, req *provider.ListStorageSpacesRequest) (*provider.ListStorageSpacesResponse, error) { - log := appctx.GetLogger(ctx) - var id *provider.StorageSpaceId - for _, f := range req.Filters { - if f.Type == provider.ListStorageSpacesRequest_Filter_TYPE_ID { - id = f.GetId() - } - } - - var ( - providers []*registry.ProviderInfo - err error - ) - c, err := pool.GetStorageRegistryClient(pool.Endpoint(s.c.StorageRegistryEndpoint)) - if err != nil { - return nil, errors.Wrap(err, "gateway: error getting storage registry client") - } - - if id != nil { - // query that specific storage provider - storageid, opaqeid, err := utils.SplitStorageSpaceID(id.OpaqueId) - if err != nil { - return &provider.ListStorageSpacesResponse{ - Status: status.NewInvalidArg(ctx, "space id must be separated by !"), - }, nil - } - res, err := c.GetStorageProviders(ctx, ®istry.GetStorageProvidersRequest{ - Ref: &provider.Reference{ResourceId: &provider.ResourceId{ - StorageId: storageid, - OpaqueId: opaqeid, - }}, - }) - if err != nil { - return &provider.ListStorageSpacesResponse{ - Status: status.NewStatusFromErrType(ctx, "ListStorageSpaces filters: req "+req.String(), err), - }, nil - } - if res.Status.Code != rpc.Code_CODE_OK { - return &provider.ListStorageSpacesResponse{ - Status: res.Status, - }, nil - } - providers = res.Providers - } else { - // get list of all storage providers - res, err := c.ListStorageProviders(ctx, ®istry.ListStorageProvidersRequest{}) - - if err != nil { - return &provider.ListStorageSpacesResponse{ - Status: status.NewStatusFromErrType(ctx, "error listing providers", err), - }, nil - } - if res.Status.Code != rpc.Code_CODE_OK { - return &provider.ListStorageSpacesResponse{ - Status: res.Status, - }, nil - } - - providers = make([]*registry.ProviderInfo, 0, len(res.Providers)) - // FIXME filter only providers that have an id set ... currently none have? - // bug? only ProviderPath is set - for i := range res.Providers { - // use only providers whose path does not start with a /? - if strings.HasPrefix(res.Providers[i].ProviderPath, "/") { - continue - } - providers = append(providers, res.Providers[i]) - } - } - - spacesFromProviders := make([][]*provider.StorageSpace, len(providers)) - errors := make([]error, len(providers)) - - var wg sync.WaitGroup - for i, p := range providers { - wg.Add(1) - go s.listStorageSpacesOnProvider(ctx, req, &spacesFromProviders[i], p, &errors[i], &wg) - } - wg.Wait() - - uniqueSpaces := map[string]*provider.StorageSpace{} - for i := range providers { - if errors[i] != nil { - if len(providers) > 1 { - log.Debug().Err(errors[i]).Msg("skipping provider") - continue - } - return &provider.ListStorageSpacesResponse{ - Status: status.NewStatusFromErrType(ctx, "error listing space", errors[i]), - }, nil - } - for j := range spacesFromProviders[i] { - uniqueSpaces[spacesFromProviders[i][j].Id.OpaqueId] = spacesFromProviders[i][j] - } - } - spaces := make([]*provider.StorageSpace, 0, len(uniqueSpaces)) - for spaceID := range uniqueSpaces { - spaces = append(spaces, uniqueSpaces[spaceID]) - } - if len(spaces) == 0 { - return &provider.ListStorageSpacesResponse{ - Status: status.NewNotFound(ctx, "space not found"), - }, nil - } - - return &provider.ListStorageSpacesResponse{ - Status: status.NewOK(ctx), - StorageSpaces: spaces, - }, nil -} - -func (s *svc) listStorageSpacesOnProvider(ctx context.Context, req *provider.ListStorageSpacesRequest, res *[]*provider.StorageSpace, p *registry.ProviderInfo, e *error, wg *sync.WaitGroup) { - defer wg.Done() - c, err := s.getStorageProviderClient(ctx, p) - if err != nil { - *e = errors.Wrap(err, "error connecting to storage provider="+p.Address) - return - } - - r, err := c.ListStorageSpaces(ctx, req) - if err != nil { - *e = errors.Wrap(err, "gateway: error calling ListStorageSpaces") - return - } - - *res = r.StorageSpaces -} - -func (s *svc) UpdateStorageSpace(ctx context.Context, req *provider.UpdateStorageSpaceRequest) (*provider.UpdateStorageSpaceResponse, error) { - log := appctx.GetLogger(ctx) - // TODO: needs to be fixed - c, err := s.find(ctx, &provider.Reference{ResourceId: req.StorageSpace.Root}) - if err != nil { - return &provider.UpdateStorageSpaceResponse{ - Status: status.NewStatusFromErrType(ctx, "error finding ID", err), - }, nil - } - - res, err := c.UpdateStorageSpace(ctx, req) - if err != nil { - log.Err(err).Msg("gateway: error creating update space on storage provider") - return &provider.UpdateStorageSpaceResponse{ - Status: status.NewInternal(ctx, err, "error calling UpdateStorageSpace"), - }, nil - } - return res, nil -} - -func (s *svc) DeleteStorageSpace(ctx context.Context, req *provider.DeleteStorageSpaceRequest) (*provider.DeleteStorageSpaceResponse, error) { - log := appctx.GetLogger(ctx) - // TODO: needs to be fixed - storageid, opaqeid, err := utils.SplitStorageSpaceID(req.Id.OpaqueId) - if err != nil { - return &provider.DeleteStorageSpaceResponse{ - Status: status.NewInvalidArg(ctx, "space id must be separated by !"), - }, nil - } - c, err := s.find(ctx, &provider.Reference{ResourceId: &provider.ResourceId{ - StorageId: storageid, - OpaqueId: opaqeid, - }}) - if err != nil { - return &provider.DeleteStorageSpaceResponse{ - Status: status.NewStatusFromErrType(ctx, "error finding path", err), - }, nil - } - - res, err := c.DeleteStorageSpace(ctx, req) - if err != nil { - log.Err(err).Msg("gateway: error deleting storage space on storage provider") - return &provider.DeleteStorageSpaceResponse{ - Status: status.NewInternal(ctx, err, "error calling DeleteStorageSpace"), - }, nil - } - return res, nil -} - func (s *svc) GetHome(ctx context.Context, _ *provider.GetHomeRequest) (*provider.GetHomeResponse, error) { return &provider.GetHomeResponse{ Path: s.getHome(ctx), @@ -304,171 +103,30 @@ func (s *svc) GetHome(ctx context.Context, _ *provider.GetHomeRequest) (*provide }, nil } -func (s *svc) getHome(_ context.Context) string { - // TODO(labkode): issue #601, /home will be hardcoded. - return "/home" +func (s *svc) getHome(ctx context.Context) string { + u := appctx.ContextMustGetUser(ctx) + return templates.WithUser(u, s.c.HomeLayout) } func (s *svc) InitiateFileDownload(ctx context.Context, req *provider.InitiateFileDownloadRequest) (*gateway.InitiateFileDownloadResponse, error) { - log := appctx.GetLogger(ctx) - if utils.IsRelativeReference(req.Ref) { return s.initiateFileDownload(ctx, req) } - p, st := s.getPath(ctx, req.Ref) - if st.Code != rpc.Code_CODE_OK { - return &gateway.InitiateFileDownloadResponse{ - Status: st, - }, nil - } - - if !s.inSharedFolder(ctx, p) { - statReq := &provider.StatRequest{Ref: req.Ref} - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+statReq.Ref.String()), - }, nil - } - if statRes.Status.Code != rpc.Code_CODE_OK { - return &gateway.InitiateFileDownloadResponse{ - Status: statRes.Status, - }, nil - } - return s.initiateFileDownload(ctx, req) - } - - if s.isSharedFolder(ctx, p) { - log.Debug().Str("path", p).Msg("path points to shared folder") - err := errtypes.PermissionDenied("gateway: cannot download share folder: path=" + p) - log.Err(err).Msg("gateway: error downloading") + statReq := &provider.StatRequest{Ref: req.Ref} + statRes, err := s.stat(ctx, statReq) + if err != nil { return &gateway.InitiateFileDownloadResponse{ - Status: status.NewInvalidArg(ctx, "path points to share folder"), + Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+statReq.Ref.String()), }, nil } - - if s.isShareName(ctx, p) { - statReq := &provider.StatRequest{Ref: req.Ref} - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+statReq.Ref.String()), - }, nil - } - if statRes.Status.Code != rpc.Code_CODE_OK { - return &gateway.InitiateFileDownloadResponse{ - Status: statRes.Status, - }, nil - } - - if statRes.Info.Type != provider.ResourceType_RESOURCE_TYPE_REFERENCE { - err := errtypes.BadRequest(fmt.Sprintf("gateway: expected reference: got:%+v", statRes.Info)) - log.Err(err).Msg("gateway: error stating share name") - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error initiating download"), - }, nil - } - - ri, protocol, err := s.checkRef(ctx, statRes.Info) - if err != nil { - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+statRes.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - // TODO(ishank011): pass this through the datagateway service - // For now, we just expose the file server to the user - ep, opaque, err := s.webdavRefTransferEndpoint(ctx, statRes.Info.Target) - if err != nil { - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error downloading from webdav host: "+p), - }, nil - } - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewOK(ctx), - Protocols: []*gateway.FileDownloadProtocol{ - { - Opaque: opaque, - Protocol: "simple", - DownloadEndpoint: ep, - }, - }, - }, nil - } - - // if it is a file allow download - if ri.Type == provider.ResourceType_RESOURCE_TYPE_FILE { - log.Debug().Str("path", p).Interface("ri", ri).Msg("path points to share name file") - req.Ref.Path = ri.Path - log.Debug().Str("path", ri.Path).Msg("download") - return s.initiateFileDownload(ctx, req) - } - - log.Debug().Str("path", p).Interface("statRes", statRes).Msg("path:%s points to share name") - err = errtypes.PermissionDenied("gateway: cannot download share name: path=" + p) - log.Err(err).Str("path", p).Msg("gateway: error downloading") + if statRes.Status.Code != rpc.Code_CODE_OK { return &gateway.InitiateFileDownloadResponse{ - Status: status.NewInvalidArg(ctx, "path points to share name"), + Status: statRes.Status, }, nil } + return s.initiateFileDownload(ctx, req) - if s.isShareChild(ctx, p) { - log.Debug().Msgf("shared child: %s", p) - shareName, shareChild := s.splitShare(ctx, p) - - statReq := &provider.StatRequest{ - Ref: &provider.Reference{Path: shareName}, - } - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+statReq.Ref.String()), - }, nil - } - - if statRes.Status.Code != rpc.Code_CODE_OK { - return &gateway.InitiateFileDownloadResponse{ - Status: statRes.Status, - }, nil - } - - ri, protocol, err := s.checkRef(ctx, statRes.Info) - if err != nil { - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+statRes.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - // TODO(ishank011): pass this through the datagateway service - // For now, we just expose the file server to the user - ep, opaque, err := s.webdavRefTransferEndpoint(ctx, statRes.Info.Target, shareChild) - if err != nil { - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error downloading from webdav host: "+p), - }, nil - } - return &gateway.InitiateFileDownloadResponse{ - Status: status.NewOK(ctx), - Protocols: []*gateway.FileDownloadProtocol{ - { - Opaque: opaque, - Protocol: "simple", - DownloadEndpoint: ep, - }, - }, - }, nil - } - - // append child to target - req.Ref.Path = path.Join(ri.Path, shareChild) - log.Debug().Str("path", req.Ref.Path).Msg("download") - return s.initiateFileDownload(ctx, req) - } - - panic("gateway: download: unknown path:" + p) } func versionKey(req *provider.InitiateFileDownloadRequest) string { @@ -538,148 +196,7 @@ func (s *svc) initiateFileDownload(ctx context.Context, req *provider.InitiateFi } func (s *svc) InitiateFileUpload(ctx context.Context, req *provider.InitiateFileUploadRequest) (*gateway.InitiateFileUploadResponse, error) { - log := appctx.GetLogger(ctx) - if utils.IsRelativeReference(req.Ref) { - return s.initiateFileUpload(ctx, req) - } - p, st := s.getPath(ctx, req.Ref) - if st.Code != rpc.Code_CODE_OK { - return &gateway.InitiateFileUploadResponse{ - Status: st, - }, nil - } - - if !s.inSharedFolder(ctx, p) { - return s.initiateFileUpload(ctx, req) - } - - if s.isSharedFolder(ctx, p) { - log.Debug().Str("path", p).Msg("path points to shared folder") - err := errtypes.PermissionDenied("gateway: cannot upload to share folder: path=" + p) - log.Err(err).Msg("gateway: error downloading") - return &gateway.InitiateFileUploadResponse{ - Status: status.NewInvalidArg(ctx, "path points to share folder"), - }, nil - } - - if s.isShareName(ctx, p) { - log.Debug().Str("path", p).Msg("path points to share name") - statReq := &provider.StatRequest{Ref: req.Ref} - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &gateway.InitiateFileUploadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+statReq.Ref.String()), - }, nil - } - if statRes.Status.Code != rpc.Code_CODE_OK { - return &gateway.InitiateFileUploadResponse{ - Status: statRes.Status, - }, nil - } - - if statRes.Info.Type != provider.ResourceType_RESOURCE_TYPE_REFERENCE { - err := errtypes.BadRequest(fmt.Sprintf("gateway: expected reference: got:%+v", statRes.Info)) - log.Err(err).Msg("gateway: error stating share name") - return &gateway.InitiateFileUploadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error initiating upload"), - }, nil - } - - ri, protocol, err := s.checkRef(ctx, statRes.Info) - if err != nil { - return &gateway.InitiateFileUploadResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+statRes.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - // TODO(ishank011): pass this through the datagateway service - // For now, we just expose the file server to the user - ep, opaque, err := s.webdavRefTransferEndpoint(ctx, statRes.Info.Target) - if err != nil { - return &gateway.InitiateFileUploadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error downloading from webdav host: "+p), - }, nil - } - return &gateway.InitiateFileUploadResponse{ - Status: status.NewOK(ctx), - Protocols: []*gateway.FileUploadProtocol{ - { - Opaque: opaque, - Protocol: "simple", - UploadEndpoint: ep, - }, - }, - }, nil - } - - // if it is a file allow upload - if ri.Type == provider.ResourceType_RESOURCE_TYPE_FILE { - log.Debug().Str("path", p).Interface("ri", ri).Msg("path points to share name file") - req.Ref.Path = ri.Path - log.Debug().Str("path", ri.Path).Msg("upload") - return s.initiateFileUpload(ctx, req) - } - - err = errtypes.PermissionDenied("gateway: cannot upload to share name: path=" + p) - log.Err(err).Msg("gateway: error uploading") - return &gateway.InitiateFileUploadResponse{ - Status: status.NewInvalidArg(ctx, "path points to share name"), - }, nil - } - - if s.isShareChild(ctx, p) { - log.Debug().Msgf("shared child: %s", p) - shareName, shareChild := s.splitShare(ctx, p) - - statReq := &provider.StatRequest{Ref: &provider.Reference{Path: shareName}} - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &gateway.InitiateFileUploadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+statReq.Ref.String()), - }, nil - } - - if statRes.Status.Code != rpc.Code_CODE_OK { - return &gateway.InitiateFileUploadResponse{ - Status: statRes.Status, - }, nil - } - - ri, protocol, err := s.checkRef(ctx, statRes.Info) - if err != nil { - return &gateway.InitiateFileUploadResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+statRes.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - // TODO(ishank011): pass this through the datagateway service - // For now, we just expose the file server to the user - ep, opaque, err := s.webdavRefTransferEndpoint(ctx, statRes.Info.Target, shareChild) - if err != nil { - return &gateway.InitiateFileUploadResponse{ - Status: status.NewInternal(ctx, err, "gateway: error uploading to webdav host: "+p), - }, nil - } - return &gateway.InitiateFileUploadResponse{ - Status: status.NewOK(ctx), - Protocols: []*gateway.FileUploadProtocol{ - { - Opaque: opaque, - Protocol: "simple", - UploadEndpoint: ep, - }, - }, - }, nil - } - - // append child to target - req.Ref.Path = path.Join(ri.Path, shareChild) - return s.initiateFileUpload(ctx, req) - } - - panic("gateway: upload: unknown path:" + p) + return s.initiateFileUpload(ctx, req) } func (s *svc) initiateFileUpload(ctx context.Context, req *provider.InitiateFileUploadRequest) (*gateway.InitiateFileUploadResponse, error) { @@ -704,6 +221,8 @@ func (s *svc) initiateFileUpload(ctx context.Context, req *provider.InitiateFile }, nil } + fmt.Println("debugging initiatefileupload response", storageRes) + protocols := make([]*gateway.FileUploadProtocol, len(storageRes.Protocols)) for p := range storageRes.Protocols { protocols[p] = &gateway.FileUploadProtocol{ @@ -764,75 +283,11 @@ func (s *svc) GetPath(ctx context.Context, req *provider.GetPathRequest) (*provi } func (s *svc) CreateContainer(ctx context.Context, req *provider.CreateContainerRequest) (*provider.CreateContainerResponse, error) { - log := appctx.GetLogger(ctx) - if utils.IsRelativeReference(req.Ref) { return s.createContainer(ctx, req) } - p, st := s.getPath(ctx, req.Ref) - if st.Code != rpc.Code_CODE_OK { - return &provider.CreateContainerResponse{ - Status: st, - }, nil - } - - if !s.inSharedFolder(ctx, p) { - return s.createContainer(ctx, req) - } - - if s.isSharedFolder(ctx, p) || s.isShareName(ctx, p) { - log.Debug().Msgf("path:%s points to shared folder or share name", p) - err := errtypes.PermissionDenied("gateway: cannot create container on share folder or share name: path=" + p) - log.Err(err).Msg("gateway: error creating container") - return &provider.CreateContainerResponse{ - Status: status.NewInvalidArg(ctx, "path points to share folder or share name"), - }, nil - } - - if s.isShareChild(ctx, p) { - log.Debug().Msgf("shared child: %s", p) - shareName, shareChild := s.splitShare(ctx, p) - - statReq := &provider.StatRequest{Ref: &provider.Reference{Path: shareName}} - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &provider.CreateContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+statReq.Ref.String()), - }, nil - } - - if statRes.Status.Code != rpc.Code_CODE_OK { - return &provider.CreateContainerResponse{ - Status: statRes.Status, - }, nil - } - - ri, protocol, err := s.checkRef(ctx, statRes.Info) - if err != nil { - return &provider.CreateContainerResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+statRes.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - err = s.webdavRefMkdir(ctx, statRes.Info.Target, shareChild) - if err != nil { - return &provider.CreateContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error creating container on webdav host: "+p), - }, nil - } - return &provider.CreateContainerResponse{ - Status: status.NewOK(ctx), - }, nil - } - - // append child to target - req.Ref.Path = path.Join(ri.Path, shareChild) - return s.createContainer(ctx, req) - } - - panic("gateway: create container on unknown path:" + p) + return s.createContainer(ctx, req) } func (s *svc) createContainer(ctx context.Context, req *provider.CreateContainerRequest) (*provider.CreateContainerResponse, error) { @@ -873,137 +328,8 @@ func (s *svc) TouchFile(ctx context.Context, req *provider.TouchFileRequest) (*p return res, nil } -// check if the path contains the prefix of the shared folder. -func (s *svc) inSharedFolder(ctx context.Context, p string) bool { - sharedFolder := s.getSharedFolder(ctx) - return strings.HasPrefix(p, sharedFolder) -} - func (s *svc) Delete(ctx context.Context, req *provider.DeleteRequest) (*provider.DeleteResponse, error) { - log := appctx.GetLogger(ctx) - p, st := s.getPath(ctx, req.Ref) - if st.Code != rpc.Code_CODE_OK { - return &provider.DeleteResponse{ - Status: st, - }, nil - } - - if !s.inSharedFolder(ctx, p) { - return s.delete(ctx, req) - } - - if s.isSharedFolder(ctx, p) { - // TODO(labkode): deleting share names should be allowed, means unmounting. - return &provider.DeleteResponse{ - Status: status.NewInvalidArg(ctx, "path points to share folder or share name"), - }, nil - } - - if s.isShareName(ctx, p) { - log.Debug().Msgf("path:%s points to share name", p) - - sRes, err := s.ListReceivedShares(ctx, &collaboration.ListReceivedSharesRequest{}) - if err != nil { - return nil, err - } - - statRes, err := s.Stat(ctx, &provider.StatRequest{ - Ref: &provider.Reference{ - Path: p, - }, - }) - if err != nil { - return nil, err - } - - // the following will check that: - // - the resource to delete is a share the current user received - // - signal the storage the delete must not land in the trashbin - // - delete the resource and update the share status to "rejected" - for _, share := range sRes.Shares { - if statRes != nil && (share.Share.ResourceId.OpaqueId == statRes.Info.Id.OpaqueId) && (share.Share.ResourceId.StorageId == statRes.Info.Id.StorageId) { - // this opaque needs explanation. It signals the storage the resource we're about to delete does not - // belong to the current user because it was share to her, thus delete the "node" and don't send it to - // the trash bin, since the share can be mounted as many times as desired. - req.Opaque = &types.Opaque{ - Map: map[string]*types.OpaqueEntry{ - "deleting_shared_resource": { - Value: []byte("true"), - Decoder: "plain", - }, - }, - } - - // the following block takes care of updating the state of the share to "rejected". This will ensure the user - // can "Accept" the share once again. - // TODO should this be pending? If so, update the two comments above as well. If not, get rid of this comment. - share.State = collaboration.ShareState_SHARE_STATE_REJECTED - r := &collaboration.UpdateReceivedShareRequest{ - Share: share, - UpdateMask: &fieldmaskpb.FieldMask{Paths: []string{"state"}}, - } - - _, err := s.UpdateReceivedShare(ctx, r) - if err != nil { - return nil, err - } - - return &provider.DeleteResponse{ - Status: status.NewOK(ctx), - }, nil - } - } - - return &provider.DeleteResponse{ - Status: status.NewNotFound(ctx, "could not find share"), - }, nil - } - - if s.isShareChild(ctx, p) { - shareName, shareChild := s.splitShare(ctx, p) - log.Debug().Msgf("path:%s sharename:%s sharechild: %s", p, shareName, shareChild) - - ref := &provider.Reference{Path: shareName} - - statReq := &provider.StatRequest{Ref: ref} - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &provider.DeleteResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+statReq.Ref.String()), - }, nil - } - - if statRes.Status.Code != rpc.Code_CODE_OK { - return &provider.DeleteResponse{ - Status: statRes.Status, - }, nil - } - - ri, protocol, err := s.checkRef(ctx, statRes.Info) - if err != nil { - return &provider.DeleteResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+statRes.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - err = s.webdavRefDelete(ctx, statRes.Info.Target, shareChild) - if err != nil { - return &provider.DeleteResponse{ - Status: status.NewInternal(ctx, err, "gateway: error deleting resource on webdav host: "+p), - }, nil - } - return &provider.DeleteResponse{ - Status: status.NewOK(ctx), - }, nil - } - - // append child to target - req.Ref.Path = path.Join(ri.Path, shareChild) - return s.delete(ctx, req) - } - - panic("gateway: delete called on unknown path:" + p) + return s.delete(ctx, req) } func (s *svc) delete(ctx context.Context, req *provider.DeleteRequest) (*provider.DeleteResponse, error) { @@ -1027,118 +353,7 @@ func (s *svc) delete(ctx context.Context, req *provider.DeleteRequest) (*provide } func (s *svc) Move(ctx context.Context, req *provider.MoveRequest) (*provider.MoveResponse, error) { - log := appctx.GetLogger(ctx) - p, st := s.getPath(ctx, req.Source) - if st.Code != rpc.Code_CODE_OK { - return &provider.MoveResponse{ - Status: st, - }, nil - } - - dp, st := s.getPath(ctx, req.Destination) - if st.Code != rpc.Code_CODE_OK && st.Code != rpc.Code_CODE_NOT_FOUND { - return &provider.MoveResponse{ - Status: st, - }, nil - } - - if !s.inSharedFolder(ctx, p) && !s.inSharedFolder(ctx, dp) { - return s.move(ctx, req) - } - - // allow renaming the share folder, the mount point, not the target. - if s.isShareName(ctx, p) && s.isShareName(ctx, dp) { - log.Info().Msgf("gateway: move: renaming share mountpoint: from:%s to:%s", p, dp) - return s.move(ctx, req) - } - - // resolve references and check the ref points to the same base path, paranoia check. - if s.isShareChild(ctx, p) && s.isShareChild(ctx, dp) { - shareName, shareChild := s.splitShare(ctx, p) - dshareName, dshareChild := s.splitShare(ctx, dp) - log.Debug().Msgf("srcpath:%s dstpath:%s srcsharename:%s srcsharechild: %s dstsharename:%s dstsharechild:%s ", p, dp, shareName, shareChild, dshareName, dshareChild) - - srcStatReq := &provider.StatRequest{Ref: &provider.Reference{Path: shareName}} - srcStatRes, err := s.stat(ctx, srcStatReq) - if err != nil { - return &provider.MoveResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+srcStatReq.Ref.String()), - }, nil - } - - if srcStatRes.Status.Code != rpc.Code_CODE_OK { - return &provider.MoveResponse{ - Status: srcStatRes.Status, - }, nil - } - - dstStatReq := &provider.StatRequest{Ref: &provider.Reference{Path: dshareName}} - dstStatRes, err := s.stat(ctx, dstStatReq) - if err != nil { - return &provider.MoveResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+srcStatReq.Ref.String()), - }, nil - } - - if dstStatRes.Status.Code != rpc.Code_CODE_OK { - return &provider.MoveResponse{ - Status: srcStatRes.Status, - }, nil - } - - srcRi, srcProtocol, err := s.checkRef(ctx, srcStatRes.Info) - if err != nil { - return &provider.MoveResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+srcStatRes.Info.Target, err), - }, nil - } - - if srcProtocol == "webdav" { - err = s.webdavRefMove(ctx, dstStatRes.Info.Target, shareChild, dshareChild) - if err != nil { - return &provider.MoveResponse{ - Status: status.NewInternal(ctx, err, "gateway: error moving resource on webdav host: "+p), - }, nil - } - return &provider.MoveResponse{ - Status: status.NewOK(ctx), - }, nil - } - dstRi, dstProtocol, err := s.checkRef(ctx, dstStatRes.Info) - if err != nil { - return &provider.MoveResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+srcStatRes.Info.Target, err), - }, nil - } - - if dstProtocol == "webdav" { - err = s.webdavRefMove(ctx, dstStatRes.Info.Target, shareChild, dshareChild) - if err != nil { - return &provider.MoveResponse{ - Status: status.NewInternal(ctx, err, "gateway: error moving resource on webdav host: "+p), - }, nil - } - return &provider.MoveResponse{ - Status: status.NewOK(ctx), - }, nil - } - - src := &provider.Reference{ - Path: path.Join(srcRi.Path, shareChild), - } - dst := &provider.Reference{ - Path: path.Join(dstRi.Path, dshareChild), - } - - req.Source = src - req.Destination = dst - - return s.move(ctx, req) - } - - return &provider.MoveResponse{ - Status: status.NewStatusFromErrType(ctx, "move", errtypes.BadRequest("gateway: move called on unknown path: "+p)), - }, nil + return s.move(ctx, req) } func (s *svc) move(ctx context.Context, req *provider.MoveRequest) (*provider.MoveResponse, error) { @@ -1248,151 +463,60 @@ func (s *svc) SetLock(ctx context.Context, req *provider.SetLockRequest) (*provi func (s *svc) GetLock(ctx context.Context, req *provider.GetLockRequest) (*provider.GetLockResponse, error) { c, err := s.find(ctx, req.Ref) if err != nil { - return &provider.GetLockResponse{ - Status: status.NewStatusFromErrType(ctx, "GetLock ref="+req.Ref.String(), err), - }, nil - } - - res, err := c.GetLock(ctx, req) - if err != nil { - if gstatus.Code(err) == codes.PermissionDenied { - return &provider.GetLockResponse{Status: &rpc.Status{Code: rpc.Code_CODE_PERMISSION_DENIED}}, nil - } - return nil, errors.Wrap(err, "gateway: error calling GetLock") - } - - return res, nil -} - -// RefreshLock refreshes an existing lock on the given reference. -func (s *svc) RefreshLock(ctx context.Context, req *provider.RefreshLockRequest) (*provider.RefreshLockResponse, error) { - c, err := s.find(ctx, req.Ref) - if err != nil { - return &provider.RefreshLockResponse{ - Status: status.NewStatusFromErrType(ctx, "RefreshLock ref="+req.Ref.String(), err), - }, nil - } - - res, err := c.RefreshLock(ctx, req) - if err != nil { - if gstatus.Code(err) == codes.PermissionDenied { - return &provider.RefreshLockResponse{Status: &rpc.Status{Code: rpc.Code_CODE_PERMISSION_DENIED}}, nil - } - return nil, errors.Wrap(err, "gateway: error calling RefreshLock") - } - - return res, nil -} - -// Unlock removes an existing lock from the given reference. -func (s *svc) Unlock(ctx context.Context, req *provider.UnlockRequest) (*provider.UnlockResponse, error) { - c, err := s.find(ctx, req.Ref) - if err != nil { - return &provider.UnlockResponse{ - Status: status.NewStatusFromErrType(ctx, "Unlock ref="+req.Ref.String(), err), - }, nil - } - - res, err := c.Unlock(ctx, req) - if err != nil { - if gstatus.Code(err) == codes.PermissionDenied { - return &provider.UnlockResponse{Status: &rpc.Status{Code: rpc.Code_CODE_PERMISSION_DENIED}}, nil - } - return nil, errors.Wrap(err, "gateway: error calling Unlock") - } - - return res, nil -} - -func (s *svc) statHome(ctx context.Context) (*provider.StatResponse, error) { - statRes, err := s.stat(ctx, &provider.StatRequest{Ref: &provider.Reference{Path: s.getHome(ctx)}}) - if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating home"), - }, nil - } - - if statRes.Status.Code != rpc.Code_CODE_OK { - return &provider.StatResponse{ - Status: statRes.Status, - }, nil - } - - statSharedFolder, err := s.statSharesFolder(ctx) - if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating shares folder"), - }, nil - } - if statSharedFolder.Status.Code != rpc.Code_CODE_OK { - // If shares folder is not found, skip updating the etag - if statSharedFolder.Status.Code == rpc.Code_CODE_NOT_FOUND { - return statRes, nil - } - // otherwise return stat of share folder - return &provider.StatResponse{ - Status: statSharedFolder.Status, + return &provider.GetLockResponse{ + Status: status.NewStatusFromErrType(ctx, "GetLock ref="+req.Ref.String(), err), }, nil } - if etagIface, err := s.etagCache.Get(statRes.Info.Owner.OpaqueId + ":" + statRes.Info.Path); err == nil { - resMtime := utils.TSToTime(statRes.Info.Mtime) - resEtag := etagIface.(etagWithTS) - // Use the updated etag if the home folder has been modified - if resMtime.Before(resEtag.Timestamp) { - statRes.Info.Etag = resEtag.Etag - } - } else { - statRes.Info.Etag = etag.GenerateEtagFromResources(statRes.Info, []*provider.ResourceInfo{statSharedFolder.Info}) - if s.c.EtagCacheTTL > 0 { - _ = s.etagCache.Set(statRes.Info.Owner.OpaqueId+":"+statRes.Info.Path, etagWithTS{statRes.Info.Etag, time.Now()}) + res, err := c.GetLock(ctx, req) + if err != nil { + if gstatus.Code(err) == codes.PermissionDenied { + return &provider.GetLockResponse{Status: &rpc.Status{Code: rpc.Code_CODE_PERMISSION_DENIED}}, nil } + return nil, errors.Wrap(err, "gateway: error calling GetLock") } - return statRes, nil + return res, nil } -func (s *svc) statSharesFolder(ctx context.Context) (*provider.StatResponse, error) { - statRes, err := s.stat(ctx, &provider.StatRequest{Ref: &provider.Reference{Path: s.getSharedFolder(ctx)}}) +// RefreshLock refreshes an existing lock on the given reference. +func (s *svc) RefreshLock(ctx context.Context, req *provider.RefreshLockRequest) (*provider.RefreshLockResponse, error) { + c, err := s.find(ctx, req.Ref) if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating shares folder"), + return &provider.RefreshLockResponse{ + Status: status.NewStatusFromErrType(ctx, "RefreshLock ref="+req.Ref.String(), err), }, nil } - if statRes.Status.Code != rpc.Code_CODE_OK { - return &provider.StatResponse{ - Status: statRes.Status, - }, nil + res, err := c.RefreshLock(ctx, req) + if err != nil { + if gstatus.Code(err) == codes.PermissionDenied { + return &provider.RefreshLockResponse{Status: &rpc.Status{Code: rpc.Code_CODE_PERMISSION_DENIED}}, nil + } + return nil, errors.Wrap(err, "gateway: error calling RefreshLock") } - lsRes, err := s.listSharesFolder(ctx) + return res, nil +} + +// Unlock removes an existing lock from the given reference. +func (s *svc) Unlock(ctx context.Context, req *provider.UnlockRequest) (*provider.UnlockResponse, error) { + c, err := s.find(ctx, req.Ref) if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error listing shares folder"), - }, nil - } - if lsRes.Status.Code != rpc.Code_CODE_OK { - return &provider.StatResponse{ - Status: lsRes.Status, + return &provider.UnlockResponse{ + Status: status.NewStatusFromErrType(ctx, "Unlock ref="+req.Ref.String(), err), }, nil } - if etagIface, err := s.etagCache.Get(statRes.Info.Owner.OpaqueId + ":" + statRes.Info.Path); err == nil { - resMtime := utils.TSToTime(statRes.Info.Mtime) - resEtag := etagIface.(etagWithTS) - // Use the updated etag if the shares folder has been modified, i.e., a new - // reference has been created. - if resMtime.Before(resEtag.Timestamp) { - statRes.Info.Etag = resEtag.Etag - } - } else { - statRes.Info.Etag = etag.GenerateEtagFromResources(statRes.Info, lsRes.Infos) - if s.c.EtagCacheTTL > 0 { - _ = s.etagCache.Set(statRes.Info.Owner.OpaqueId+":"+statRes.Info.Path, etagWithTS{statRes.Info.Etag, time.Now()}) + res, err := c.Unlock(ctx, req) + if err != nil { + if gstatus.Code(err) == codes.PermissionDenied { + return &provider.UnlockResponse{Status: &rpc.Status{Code: rpc.Code_CODE_PERMISSION_DENIED}}, nil } + return nil, errors.Wrap(err, "gateway: error calling Unlock") } - return statRes, nil + + return res, nil } func (s *svc) stat(ctx context.Context, req *provider.StatRequest) (*provider.StatResponse, error) { @@ -1443,147 +567,7 @@ func (s *svc) Stat(ctx context.Context, req *provider.StatRequest) (*provider.St if utils.IsRelativeReference(req.Ref) { return s.stat(ctx, req) } - - p := "" - var res *provider.StatResponse - var err error - if utils.IsAbsolutePathReference(req.Ref) { - p = req.Ref.Path - } else { - // Reference by just resource ID - // Stat it and store for future use - res, err = s.stat(ctx, req) - if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+req.Ref.String()), - }, nil - } - if res != nil && res.Status.Code != rpc.Code_CODE_OK { - return res, nil - } - p = res.Info.Path - } - - if path.Clean(p) == s.getHome(ctx) { - return s.statHome(ctx) - } - - if s.isSharedFolder(ctx, p) { - return s.statSharesFolder(ctx) - } - - if !s.inSharedFolder(ctx, p) { - if res != nil { - return res, nil - } - return s.stat(ctx, req) - } - - // we need to provide the info of the target, not the reference. - if s.isShareName(ctx, p) { - // If we haven't returned an error by now and res is nil, it means that - // req is an absolute path based ref, so we didn't stat it previously. - // So stat it now - if res == nil { - res, err = s.stat(ctx, req) - if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+req.Ref.String()), - }, nil - } - - if res.Status.Code != rpc.Code_CODE_OK { - return &provider.StatResponse{ - Status: res.Status, - }, nil - } - } - - ri, protocol, err := s.checkRef(ctx, res.Info) - if err != nil { - return &provider.StatResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+res.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - ri, err = s.webdavRefStat(ctx, res.Info.Target) - if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error resolving webdav reference: "+p), - }, nil - } - } - - // we need to make sure we don't expose the reference target in the resource - // information. For example, if requests comes to: /home/MyShares/photos and photos - // is reference to /user/peter/Holidays/photos, we need to still return to the user - // /home/MyShares/photos - orgPath := res.Info.Path - res.Info = ri - res.Info.Path = orgPath - return res, nil - } - - if s.isShareChild(ctx, p) { - shareName, shareChild := s.splitShare(ctx, p) - - statReq := &provider.StatRequest{Ref: &provider.Reference{Path: shareName}} - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+statReq.Ref.String()), - }, nil - } - - if statRes.Status.Code != rpc.Code_CODE_OK { - return &provider.StatResponse{ - Status: statRes.Status, - }, nil - } - - ri, protocol, err := s.checkRef(ctx, statRes.Info) - if err != nil { - return &provider.StatResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+statRes.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - ri, err = s.webdavRefStat(ctx, statRes.Info.Target, shareChild) - if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error resolving webdav reference: "+p), - }, nil - } - ri.Path = p - return &provider.StatResponse{ - Status: status.NewOK(ctx), - Info: ri, - }, nil - } - - // append child to target - req.Ref.Path = path.Join(ri.Path, shareChild) - res, err := s.stat(ctx, req) - if err != nil { - return &provider.StatResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating ref:"+req.Ref.String()), - }, nil - } - if res.Status.Code != rpc.Code_CODE_OK { - return &provider.StatResponse{ - Status: res.Status, - }, nil - } - - // we need to make sure we don't expose the reference target in the resource - // information. - res.Info.Path = p - return res, nil - } - - panic("gateway: stating an unknown path:" + p) + return s.stat(ctx, req) } func (s *svc) checkRef(ctx context.Context, ri *provider.ResourceInfo) (*provider.ResourceInfo, string, error) { @@ -1665,83 +649,6 @@ func (s *svc) ListContainerStream(_ *provider.ListContainerStreamRequest, _ gate return errtypes.NotSupported("Unimplemented") } -func (s *svc) listHome(ctx context.Context, req *provider.ListContainerRequest) (*provider.ListContainerResponse, error) { - lcr, err := s.listContainer(ctx, &provider.ListContainerRequest{ - Ref: &provider.Reference{Path: s.getHome(ctx)}, - ArbitraryMetadataKeys: req.ArbitraryMetadataKeys, - }) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error listing home"), - }, nil - } - if lcr.Status.Code != rpc.Code_CODE_OK { - return &provider.ListContainerResponse{ - Status: lcr.Status, - }, nil - } - - for i := range lcr.Infos { - if s.isSharedFolder(ctx, lcr.Infos[i].GetPath()) { - statSharedFolder, err := s.statSharesFolder(ctx) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating shares folder"), - }, nil - } - if statSharedFolder.Status.Code != rpc.Code_CODE_OK { - return &provider.ListContainerResponse{ - Status: statSharedFolder.Status, - }, nil - } - lcr.Infos[i] = statSharedFolder.Info - break - } - } - - return lcr, nil -} - -func (s *svc) listSharesFolder(ctx context.Context) (*provider.ListContainerResponse, error) { - lcr, err := s.listContainer(ctx, &provider.ListContainerRequest{Ref: &provider.Reference{Path: s.getSharedFolder(ctx)}}) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error listing shared folder"), - }, nil - } - if lcr.Status.Code != rpc.Code_CODE_OK { - return &provider.ListContainerResponse{ - Status: lcr.Status, - }, nil - } - checkedInfos := make([]*provider.ResourceInfo, 0) - for i := range lcr.Infos { - info, protocol, err := s.checkRef(ctx, lcr.Infos[i]) - if err != nil { - // create status to log the proper messages - // this might arise when the shared resource has been moved to the recycle bin - // this might arise when the resource was unshared, but the share reference was not removed - status.NewStatusFromErrType(ctx, "error resolving reference "+lcr.Infos[i].Target, err) - // continue on errors so the user can see a list of the working shares - continue - } - - if protocol == "webdav" { - info, err = s.webdavRefStat(ctx, lcr.Infos[i].Target) - if err != nil { - // Might be the case that the webdav token has expired - continue - } - } - - info.Path = lcr.Infos[i].Path - checkedInfos = append(checkedInfos, info) - } - lcr.Infos = checkedInfos - - return lcr, nil -} - func (s *svc) filterProvidersByUserAgent(ctx context.Context, providers []*registry.ProviderInfo) []*registry.ProviderInfo { cat, ok := appctx.ContextGetUserAgentCategory(ctx) if !ok { @@ -1858,183 +765,7 @@ func (s *svc) listContainerAcrossProviders(ctx context.Context, req *provider.Li } func (s *svc) ListContainer(ctx context.Context, req *provider.ListContainerRequest) (*provider.ListContainerResponse, error) { - log := appctx.GetLogger(ctx) - - if utils.IsRelativeReference(req.Ref) { - return s.listContainer(ctx, req) - } - - p, st := s.getPath(ctx, req.Ref, req.ArbitraryMetadataKeys...) - if st.Code != rpc.Code_CODE_OK { - return &provider.ListContainerResponse{ - Status: st, - }, nil - } - - if path.Clean(p) == s.getHome(ctx) { - return s.listHome(ctx, req) - } - - if s.isSharedFolder(ctx, p) { - return s.listSharesFolder(ctx) - } - - if !s.inSharedFolder(ctx, p) { - return s.listContainer(ctx, req) - } - - // we need to provide the info of the target, not the reference. - if s.isShareName(ctx, p) { - statReq := &provider.StatRequest{Ref: &provider.Reference{Path: p}} - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating share:"+statReq.Ref.String()), - }, nil - } - - if statRes.Status.Code != rpc.Code_CODE_OK { - return &provider.ListContainerResponse{ - Status: statRes.Status, - }, nil - } - - ri, protocol, err := s.checkRef(ctx, statRes.Info) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+statRes.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - infos, err := s.webdavRefLs(ctx, statRes.Info.Target) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error listing webdav reference: "+p), - }, nil - } - - for _, info := range infos { - base := path.Base(info.Path) - info.Path = path.Join(p, base) - } - return &provider.ListContainerResponse{ - Status: status.NewOK(ctx), - Infos: infos, - }, nil - } - - if ri.Type != provider.ResourceType_RESOURCE_TYPE_CONTAINER { - err := errtypes.NotSupported("gateway: list container: cannot list non-container type:" + ri.Path) - log.Err(err).Msg("gateway: error listing") - return &provider.ListContainerResponse{ - Status: status.NewInvalidArg(ctx, "resource is not a container"), - }, nil - } - - newReq := &provider.ListContainerRequest{ - Ref: &provider.Reference{Path: ri.Path}, - ArbitraryMetadataKeys: req.ArbitraryMetadataKeys, - } - newRes, err := s.listContainer(ctx, newReq) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error listing "+newReq.Ref.String()), - }, nil - } - - if newRes.Status.Code != rpc.Code_CODE_OK { - return &provider.ListContainerResponse{ - Status: newRes.Status, - }, nil - } - - // paths needs to be converted - for _, info := range newRes.Infos { - base := path.Base(info.Path) - info.Path = path.Join(p, base) - } - - return newRes, nil - } - - if s.isShareChild(ctx, p) { - shareName, shareChild := s.splitShare(ctx, p) - - statReq := &provider.StatRequest{Ref: &provider.Reference{Path: shareName}} - statRes, err := s.stat(ctx, statReq) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error stating share child "+statReq.Ref.String()), - }, nil - } - - if statRes.Status.Code != rpc.Code_CODE_OK { - return &provider.ListContainerResponse{ - Status: statRes.Status, - }, nil - } - - ri, protocol, err := s.checkRef(ctx, statRes.Info) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewStatusFromErrType(ctx, "error resolving reference "+statRes.Info.Target, err), - }, nil - } - - if protocol == "webdav" { - infos, err := s.webdavRefLs(ctx, statRes.Info.Target, shareChild) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error listing webdav reference: "+p), - }, nil - } - - for _, info := range infos { - base := path.Base(info.Path) - info.Path = path.Join(shareName, shareChild, base) - } - return &provider.ListContainerResponse{ - Status: status.NewOK(ctx), - Infos: infos, - }, nil - } - - if ri.Type != provider.ResourceType_RESOURCE_TYPE_CONTAINER { - err := errtypes.NotSupported("gateway: list container: cannot list non-container type:" + ri.Path) - log.Err(err).Msg("gateway: error listing") - return &provider.ListContainerResponse{ - Status: status.NewInvalidArg(ctx, "resource is not a container"), - }, nil - } - - newReq := &provider.ListContainerRequest{ - Ref: &provider.Reference{Path: path.Join(ri.Path, shareChild)}, - ArbitraryMetadataKeys: req.ArbitraryMetadataKeys, - } - newRes, err := s.listContainer(ctx, newReq) - if err != nil { - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "gateway: error listing "+newReq.Ref.String()), - }, nil - } - - if newRes.Status.Code != rpc.Code_CODE_OK { - return &provider.ListContainerResponse{ - Status: newRes.Status, - }, nil - } - - // paths needs to be converted - for _, info := range newRes.Infos { - base := path.Base(info.Path) - info.Path = path.Join(shareName, shareChild, base) - } - - return newRes, nil - } - - panic("gateway: stating an unknown path:" + p) + return s.listContainer(ctx, req) } func (s *svc) getPath(ctx context.Context, ref *provider.Reference, keys ...string) (string, *rpc.Status) { @@ -2121,12 +852,6 @@ func (s *svc) splitPath(_ context.Context, p string) []string { return strings.SplitN(p, "/", 4) // ["home", "MyShares", "photos", "Ibiza/beach.png"] } -func (s *svc) getSharedFolder(ctx context.Context) string { - home := s.getHome(ctx) - shareFolder := path.Join(home, s.c.ShareFolder) - return shareFolder -} - func (s *svc) CreateSymlink(ctx context.Context, req *provider.CreateSymlinkRequest) (*provider.CreateSymlinkResponse, error) { return &provider.CreateSymlinkResponse{ Status: status.NewUnimplemented(ctx, errtypes.NotSupported("CreateSymlink not implemented"), "CreateSymlink not implemented"), diff --git a/internal/grpc/services/storageprovider/storageprovider.go b/internal/grpc/services/storageprovider/storageprovider.go index bad19304f1..a4bd157ea6 100644 --- a/internal/grpc/services/storageprovider/storageprovider.go +++ b/internal/grpc/services/storageprovider/storageprovider.go @@ -175,6 +175,10 @@ func New(ctx context.Context, m map[string]interface{}) (rgrpc.Service, error) { return nil, err } + if fs == nil { + return nil, errors.New("error creating fs driver") + } + // parse data server url u, err := url.Parse(c.DataServerURL) if err != nil { @@ -284,10 +288,10 @@ func (s *service) SetLock(ctx context.Context, req *provider.SetLockRequest) (*p var st *rpc.Status switch err.(type) { case errtypes.IsNotFound: - st = status.NewNotFound(ctx, "path not found when setting lock") + st = status.NewNotFound(ctx, "resource not found when setting lock") case errtypes.PermissionDenied: st = status.NewPermissionDenied(ctx, err, "permission denied") - case errtypes.BadRequest: + case errtypes.Conflict: st = status.NewFailedPrecondition(ctx, err, "reference already locked") default: st = status.NewInternal(ctx, err, "error setting lock: "+req.Ref.String()) @@ -924,17 +928,7 @@ func (s *service) ListContainerStream(req *provider.ListContainerStreamRequest, func (s *service) ListContainer(ctx context.Context, req *provider.ListContainerRequest) (*provider.ListContainerResponse, error) { newRef, err := s.unwrap(ctx, req.Ref) - if err != nil { - // The path might be a virtual view; handle that case - if utils.IsAbsolutePathReference(req.Ref) && strings.HasPrefix(s.mountPath, req.Ref.Path) { - return s.listVirtualView(ctx, req.Ref) - } - - return &provider.ListContainerResponse{ - Status: status.NewInternal(ctx, err, "error unwrapping path"), - }, nil - } - + fmt.Println("debugging: storageprovider: ", req, newRef) mds, err := s.storage.ListFolder(ctx, newRef, req.ArbitraryMetadataKeys) if err != nil { var st *rpc.Status @@ -1544,14 +1538,18 @@ func (s *service) unwrap(ctx context.Context, ref *provider.Reference) (*provide // TODO move mount path trimming to the gateway fn, err := s.trimMountPrefix(ref.GetPath()) if err != nil { + fmt.Println("debugging: problem found", fn, err) return nil, err } return &provider.Reference{Path: fn}, nil } func (s *service) trimMountPrefix(fn string) (string, error) { + fmt.Println("debugging trimMountPrefix", fn, s.mountPath, len(fn), len(s.mountPath)) if strings.HasPrefix(fn, s.mountPath) { - return path.Join("/", strings.TrimPrefix(fn, s.mountPath)), nil + p := path.Join("/", strings.TrimPrefix(fn, s.mountPath)) + fmt.Println("debugging we are here", p) + return p, nil } return "", errtypes.BadRequest(fmt.Sprintf("path=%q does not belong to this storage provider mount path=%q", fn, s.mountPath)) } diff --git a/internal/http/services/datagateway/datagateway.go b/internal/http/services/datagateway/datagateway.go index 605cd5cc88..3c30677849 100644 --- a/internal/http/services/datagateway/datagateway.go +++ b/internal/http/services/datagateway/datagateway.go @@ -21,6 +21,7 @@ package datagateway import ( "context" "crypto/tls" + "fmt" "io" "net/http" "net/url" @@ -322,7 +323,7 @@ func (s *svc) doPut(w http.ResponseWriter, r *http.Request) { return } httpReq.Header = r.Header - + fmt.Println("debugging PUT", httpReq, claims, target) httpRes, err := httpClient.Do(httpReq) if err != nil { log.Err(err).Msg("error doing PUT request to data service") diff --git a/internal/http/services/owncloud/ocdav/ocdav.go b/internal/http/services/owncloud/ocdav/ocdav.go index 4e996c1ee4..0b14453dfb 100644 --- a/internal/http/services/owncloud/ocdav/ocdav.go +++ b/internal/http/services/owncloud/ocdav/ocdav.go @@ -30,7 +30,6 @@ import ( "time" gateway "github.com/cs3org/go-cs3apis/cs3/gateway/v1beta1" - userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" @@ -42,7 +41,6 @@ import ( "github.com/cs3org/reva/pkg/sharedconf" "github.com/cs3org/reva/pkg/storage/favorite" "github.com/cs3org/reva/pkg/storage/favorite/registry" - "github.com/cs3org/reva/pkg/storage/utils/templates" "github.com/cs3org/reva/pkg/utils/cfg" "github.com/pkg/errors" ) @@ -291,19 +289,22 @@ func (s *svc) getClient() (gateway.GatewayAPIClient, error) { } func applyLayout(ctx context.Context, ns string, useLoggedInUserNS bool, requestPath string) string { + return ns // If useLoggedInUserNS is false, that implies that the request is coming from // the FilesHandler method invoked by a /dav/files/fileOwner where fileOwner // is not the same as the logged in user. In that case, we'll treat fileOwner // as the username whose files are to be accessed and use that in the // namespace template. - u, ok := appctx.ContextGetUser(ctx) - if !ok || !useLoggedInUserNS { - requestUserID, _ := router.ShiftPath(requestPath) - u = &userpb.User{ - Username: requestUserID, + /* + u, ok := appctx.ContextGetUser(ctx) + if !ok || !useLoggedInUserNS { + requestUserID, _ := router.ShiftPath(requestPath) + u = &userpb.User{ + Username: requestUserID, + } } - } - return templates.WithUser(u, ns) + return templates.WithUser(u, ns) + */ } func addAccessHeaders(w http.ResponseWriter, r *http.Request) { diff --git a/internal/http/services/owncloud/ocdav/propfind.go b/internal/http/services/owncloud/ocdav/propfind.go index d762f63edf..8fb457cb3f 100644 --- a/internal/http/services/owncloud/ocdav/propfind.go +++ b/internal/http/services/owncloud/ocdav/propfind.go @@ -70,6 +70,7 @@ const ( func (s *svc) handlePathPropfind(w http.ResponseWriter, r *http.Request, ns string) { ctx := r.Context() fn := path.Join(ns, r.URL.Path) + fmt.Println("debugging fn", fn) sublog := appctx.GetLogger(ctx).With().Str("path", fn).Logger() @@ -81,6 +82,7 @@ func (s *svc) handlePathPropfind(w http.ResponseWriter, r *http.Request, ns stri } ref := &provider.Reference{Path: fn} + fmt.Println("debugging reference inside webdav", fn) parentInfo, resourceInfos, ok := s.getResourceInfos(ctx, w, r, pf, ref, false, sublog) if !ok { @@ -260,6 +262,8 @@ func (s *svc) getResourceInfos(ctx context.Context, w http.ResponseWriter, r *ht Ref: ref, ArbitraryMetadataKeys: metadataKeys, } + + fmt.Println("debugging request for", req) res, err := client.Stat(ctx, req) if err != nil { log.Error().Err(err).Interface("req", req).Msg("error sending a grpc stat request") @@ -279,6 +283,7 @@ func (s *svc) getResourceInfos(ctx context.Context, w http.ResponseWriter, r *ht HandleErrorStatus(&log, w, res.Status) return nil, nil, false } + fmt.Println("debugging after client.stat", res) if spacesPropfind { res.Info.Path = ref.Path @@ -326,6 +331,7 @@ func (s *svc) getResourceInfos(ctx context.Context, w http.ResponseWriter, r *ht Ref: ref, ArbitraryMetadataKeys: metadataKeys, } + fmt.Println("debugging: ListContainer: ", req) res, err := client.ListContainer(ctx, req) if err != nil { log.Error().Err(err).Msg("error sending list container grpc request") @@ -337,6 +343,7 @@ func (s *svc) getResourceInfos(ctx context.Context, w http.ResponseWriter, r *ht HandleErrorStatus(&log, w, res.Status) return nil, nil, false } + fmt.Println("debugging: ListContainer: ", res) resourceInfos = append(resourceInfos, res.Infos...) case depth == "infinity": diff --git a/internal/http/services/owncloud/ocdav/put.go b/internal/http/services/owncloud/ocdav/put.go index b813244fb0..e9a000b1bf 100644 --- a/internal/http/services/owncloud/ocdav/put.go +++ b/internal/http/services/owncloud/ocdav/put.go @@ -271,6 +271,12 @@ func (s *svc) handlePut(ctx context.Context, w http.ResponseWriter, r *http.Requ return } httpReq.Header.Set(datagateway.TokenTransportHeader, token) + if lockid := r.Header.Get(HeaderLockID); lockid != "" { + httpReq.Header.Set(HeaderLockID, lockid) + } + if lockholder := r.Header.Get(HeaderLockHolder); lockholder != "" { + httpReq.Header.Set(HeaderLockHolder, lockholder) + } httpRes, err := s.client.Do(httpReq) if err != nil { diff --git a/internal/http/services/owncloud/ocdav/webdav.go b/internal/http/services/owncloud/ocdav/webdav.go index 60ad87fdbf..1a5f0f89d1 100644 --- a/internal/http/services/owncloud/ocdav/webdav.go +++ b/internal/http/services/owncloud/ocdav/webdav.go @@ -19,6 +19,7 @@ package ocdav import ( + "fmt" "net/http" "path" ) @@ -76,6 +77,8 @@ const ( HeaderOCMtime = "X-OC-Mtime" HeaderExpectedEntityLength = "X-Expected-Entity-Length" HeaderTransferAuth = "TransferHeaderAuthorization" + HeaderLockID = "X-Lock-Id" + HeaderLockHolder = "X-Lock-Holder" ) // WebDavHandler implements a dav endpoint. @@ -94,6 +97,7 @@ func (h *WebDavHandler) init(ns string, useLoggedInUserNS bool) error { func (h *WebDavHandler) Handler(s *svc) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ns := applyLayout(r.Context(), h.namespace, h.useLoggedInUserNS, r.URL.Path) + fmt.Println("debugging webdav layout: ", ns, r.Context(), h.namespace, h.useLoggedInUserNS, r.URL.Path) switch r.Method { case MethodPropfind: s.handlePathPropfind(w, r, ns) diff --git a/internal/http/services/owncloud/ocs/data/capabilities.go b/internal/http/services/owncloud/ocs/data/capabilities.go index 7fc6dcaedf..18a93c8676 100644 --- a/internal/http/services/owncloud/ocs/data/capabilities.go +++ b/internal/http/services/owncloud/ocs/data/capabilities.go @@ -53,7 +53,7 @@ type Capabilities struct { Core *CapabilitiesCore `json:"core" xml:"core"` Checksums *CapabilitiesChecksums `json:"checksums" xml:"checksums"` Files *CapabilitiesFiles `json:"files" mapstructure:"files" xml:"files"` - Dav *CapabilitiesDav `json:"dav" xml:"dav"` + Dav *CapabilitiesDav `json:"dav" mapstructure:"dav" xml:"dav"` FilesSharing *CapabilitiesFilesSharing `json:"files_sharing" mapstructure:"files_sharing" xml:"files_sharing"` Spaces *Spaces `json:"spaces,omitempty" mapstructure:"spaces" xml:"spaces,omitempty"` diff --git a/internal/http/services/owncloud/ocs/handlers/cloud/capabilities/uploads.go b/internal/http/services/owncloud/ocs/handlers/cloud/capabilities/uploads.go index 26d3ddfb6c..014575a92d 100644 --- a/internal/http/services/owncloud/ocs/handlers/cloud/capabilities/uploads.go +++ b/internal/http/services/owncloud/ocs/handlers/cloud/capabilities/uploads.go @@ -49,32 +49,41 @@ func (h *Handler) getCapabilitiesForUserAgent(_ context.Context, userAgent strin } func setCapabilitiesForChunkProtocol(cp chunkProtocol, c *data.Capabilities) { - switch cp { - case chunkV1: - // 2.7+ will use Chunking V1 if "capabilities > files > bigfilechunking" is "true" AND "capabilities > dav > chunking" is not there - c.Files.BigFileChunking = true - c.Dav = nil - c.Files.TusSupport = nil + // 2.7+ will use Chunking V1 if "capabilities > files > bigfilechunking" is "true" AND "capabilities > dav > chunking" is not there + c.Files.BigFileChunking = true + c.Dav = nil + c.Files.TusSupport = nil + /* + switch cp { + case chunkV1: - case chunkNG: - // 2.7+ will use Chunking NG if "capabilities > files > bigfilechunking" is "true" AND "capabilities > dav > chunking" = 1.0 - c.Files.BigFileChunking = true - c.Dav.Chunking = "1.0" - c.Files.TusSupport = nil + // 2.7+ will use Chunking V1 if "capabilities > files > bigfilechunking" is "true" AND "capabilities > dav > chunking" is not there + c.Files.BigFileChunking = true + c.Dav = nil + c.Files.TusSupport = nil - case chunkTUS: - // 2.7+ will use TUS if "capabilities > files > bigfilechunking" is "false" AND "capabilities > dav > chunking" = "" AND "capabilities > files > tus_support" has proper entries. - c.Files.BigFileChunking = false - c.Dav.Chunking = "" + case chunkNG: - // TODO: infer from various TUS handlers from all known storages - // until now we take the manually configured tus options - // c.Capabilities.Files.TusSupport = &data.CapabilitiesFilesTusSupport{ - // Version: "1.0.0", - // Resumable: "1.0.0", - // Extension: "creation,creation-with-upload", - // MaxChunkSize: 0, - // HTTPMethodOverride: "", - // } - } + // 2.7+ will use Chunking NG if "capabilities > files > bigfilechunking" is "true" AND "capabilities > dav > chunking" = 1.0 + c.Files.BigFileChunking = true + c.Dav.Chunking = "1.0" + c.Files.TusSupport = nil + + case chunkTUS: + + // 2.7+ will use TUS if "capabilities > files > bigfilechunking" is "false" AND "capabilities > dav > chunking" = "" AND "capabilities > files > tus_support" has proper entries. + c.Files.BigFileChunking = false + c.Dav.Chunking = "" + + // TODO: infer from various TUS handlers from all known storages + // until now we take the manually configured tus options + // c.Capabilities.Files.TusSupport = &data.CapabilitiesFilesTusSupport{ + // Version: "1.0.0", + // Resumable: "1.0.0", + // Extension: "creation,creation-with-upload", + // MaxChunkSize: 0, + // HTTPMethodOverride: "", + // } + } + */ } diff --git a/internal/http/services/pingpong/pingpong.go b/internal/http/services/pingpong/pingpong.go index cb896e37dc..22b85cd726 100644 --- a/internal/http/services/pingpong/pingpong.go +++ b/internal/http/services/pingpong/pingpong.go @@ -97,7 +97,7 @@ func (s *svc) Handler() http.Handler { } func (s *svc) getClient() (proto.PingPongServiceClient, error) { - conn, err := grpc.Dial( + conn, err := grpc.NewClient( s.conf.Endpoint, grpc.WithTransportCredentials(insecure.NewCredentials()), ) diff --git a/pkg/appauth/manager/json/json_test.go b/pkg/appauth/manager/json/json_test.go.disabled similarity index 100% rename from pkg/appauth/manager/json/json_test.go rename to pkg/appauth/manager/json/json_test.go.disabled diff --git a/pkg/auth/manager/ldap/ldap.go b/pkg/auth/manager/ldap/ldap.go index 16374226e0..7bfe436564 100644 --- a/pkg/auth/manager/ldap/ldap.go +++ b/pkg/auth/manager/ldap/ldap.go @@ -124,7 +124,7 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) log := appctx.GetLogger(ctx) l, err := utils.GetLDAPConnection(&am.c.LDAPConn) if err != nil { - return nil, nil, err + return nil, nil, errors.Wrap(err, "error creating ldap connection") } defer l.Close() @@ -139,10 +139,10 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) sr, err := l.Search(searchRequest) if err != nil { - return nil, nil, err + return nil, nil, errors.Wrapf(err, "error searching. seachrequest = %+v", searchRequest) } - log.Trace().Interface("entries", sr.Entries).Send() + log.Debug().Interface("entries", sr.Entries).Send() if len(sr.Entries) != 1 { return nil, nil, errtypes.NotFound(clientID) } @@ -153,7 +153,7 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) err = l.Bind(userdn, clientSecret) if err != nil { log.Debug().Err(err).Interface("userdn", userdn).Msg("bind with user credentials failed") - return nil, nil, err + return nil, nil, errors.Wrapf(err, "error binding with user credentials for user %s", userdn) } userID := &user.UserId{ @@ -193,7 +193,7 @@ func (am *mgr) Authenticate(ctx context.Context, clientID, clientSecret string) u := &user.User{ Id: userID, // TODO add more claims from the StandardClaims, eg EmailVerified - Username: sr.Entries[0].GetEqualFoldAttributeValue(am.c.Schema.CN), + Username: sr.Entries[0].GetEqualFoldAttributeValue(am.c.Schema.UID), // TODO groups Groups: getGroupsResp.Groups, Mail: sr.Entries[0].GetEqualFoldAttributeValue(am.c.Schema.Mail), diff --git a/pkg/auth/manager/nextcloud/nextcloud.go b/pkg/auth/manager/nextcloud/nextcloud.go index 29ecb77c0f..65c408fec3 100644 --- a/pkg/auth/manager/nextcloud/nextcloud.go +++ b/pkg/auth/manager/nextcloud/nextcloud.go @@ -132,7 +132,7 @@ func (am *Manager) do(ctx context.Context, a Action) (int, []byte, error) { log.Info().Msgf("am.do response %d %s", resp.StatusCode, body) if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { - return 0, nil, fmt.Errorf("Unexpected response code from EFSS API: " + strconv.Itoa(resp.StatusCode)) + return 0, nil, fmt.Errorf("Unexpected response code from EFSS API: %s", strconv.Itoa(resp.StatusCode)) } return resp.StatusCode, body, nil } diff --git a/pkg/datatx/manager/rclone/rclone.go b/pkg/datatx/manager/rclone/rclone.go index de14886f5c..f5a313ccb4 100644 --- a/pkg/datatx/manager/rclone/rclone.go +++ b/pkg/datatx/manager/rclone/rclone.go @@ -631,7 +631,7 @@ func (driver *rclone) CancelTransfer(ctx context.Context, transferID string) (*d _, endStatusFound := txEndStatuses[job.TransferStatus.String()] if endStatusFound { - err := errors.Wrapf(errors.New("rclone driver: job already in end state"), transferRemovedMessage) + err := errors.Wrap(errors.New("rclone driver: job already in end state"), transferRemovedMessage) return &datatx.TxInfo{ Id: &datatx.TxId{OpaqueId: transferID}, Status: datatx.Status_STATUS_INVALID, @@ -649,7 +649,7 @@ func (driver *rclone) CancelTransfer(ctx context.Context, transferID string) (*d data, err := json.Marshal(rcloneCancelTransferReq) if err != nil { - err := errors.Wrapf(errors.New("rclone driver: error marshalling rclone job/stop req data"), transferRemovedMessage) + err := errors.Wrap(errors.New("rclone driver: error marshalling rclone job/stop req data"), transferRemovedMessage) return &datatx.TxInfo{ Id: &datatx.TxId{OpaqueId: transferID}, Status: datatx.Status_STATUS_INVALID, @@ -661,7 +661,7 @@ func (driver *rclone) CancelTransfer(ctx context.Context, transferID string) (*d u, err := url.Parse(driver.config.Endpoint) if err != nil { - err := errors.Wrapf(errors.New("rclone driver: error parsing driver endpoint"), transferRemovedMessage) + err := errors.Wrap(errors.New("rclone driver: error parsing driver endpoint"), transferRemovedMessage) return &datatx.TxInfo{ Id: &datatx.TxId{OpaqueId: transferID}, Status: datatx.Status_STATUS_INVALID, @@ -673,7 +673,7 @@ func (driver *rclone) CancelTransfer(ctx context.Context, transferID string) (*d req, err := http.NewRequest(http.MethodPost, requestURL, bytes.NewReader(data)) if err != nil { - err := errors.Wrapf(errors.New("rclone driver: error framing post request"), transferRemovedMessage) + err := errors.Wrap(errors.New("rclone driver: error framing post request"), transferRemovedMessage) return &datatx.TxInfo{ Id: &datatx.TxId{OpaqueId: transferID}, Status: datatx.Status_STATUS_INVALID, @@ -686,7 +686,7 @@ func (driver *rclone) CancelTransfer(ctx context.Context, transferID string) (*d res, err := driver.client.Do(req) if err != nil { - err := errors.Wrapf(errors.New("rclone driver: error sending post request"), transferRemovedMessage) + err := errors.Wrap(errors.New("rclone driver: error sending post request"), transferRemovedMessage) return &datatx.TxInfo{ Id: &datatx.TxId{OpaqueId: transferID}, Status: datatx.Status_STATUS_INVALID, @@ -699,7 +699,7 @@ func (driver *rclone) CancelTransfer(ctx context.Context, transferID string) (*d if res.StatusCode != http.StatusOK { var errorResData rcloneHTTPErrorRes if err = json.NewDecoder(res.Body).Decode(&errorResData); err != nil { - err := errors.Wrapf(errors.New("rclone driver: error decoding response data"), transferRemovedMessage) + err := errors.Wrap(errors.New("rclone driver: error decoding response data"), transferRemovedMessage) return &datatx.TxInfo{ Id: &datatx.TxId{OpaqueId: transferID}, Status: datatx.Status_STATUS_INVALID, @@ -728,7 +728,7 @@ func (driver *rclone) CancelTransfer(ctx context.Context, transferID string) (*d } var resData rcloneCancelTransferResJSON if err = json.NewDecoder(res.Body).Decode(&resData); err != nil { - err := errors.Wrapf(errors.New("rclone driver: error decoding response data"), transferRemovedMessage) + err := errors.Wrap(errors.New("rclone driver: error decoding response data"), transferRemovedMessage) return &datatx.TxInfo{ Id: &datatx.TxId{OpaqueId: transferID}, Status: datatx.Status_STATUS_INVALID, diff --git a/pkg/eosclient/eosbinary/eosbinary.go b/pkg/eosclient/eosbinary/eosbinary.go index ecdf8f4f51..10189b7daf 100644 --- a/pkg/eosclient/eosbinary/eosbinary.go +++ b/pkg/eosclient/eosbinary/eosbinary.go @@ -203,6 +203,11 @@ func (c *Client) executeXRDCopy(ctx context.Context, cmdArgs []string) (string, err = errtypes.InvalidCredentials("eosclient: no sufficient permissions for the operation") } + // check for lock mismatch error + if strings.Contains(errBuf.String(), "file has a valid extended attribute lock") { + err = errtypes.Conflict("eosclient: lock mismatch") + } + args := fmt.Sprintf("%s", cmd.Args) env := fmt.Sprintf("%s", cmd.Env) log.Info().Str("args", args).Str("env", env).Int("exit", exitStatus).Msg("eos cmd") @@ -455,7 +460,7 @@ func (c *Client) mergeACLsAndAttrsForFiles(ctx context.Context, auth eosclient.A } // SetAttr sets an extended attributes on a path. -func (c *Client) SetAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, errorIfExists, recursive bool, path string) error { +func (c *Client) SetAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, errorIfExists, recursive bool, path, app string) error { if !isValidAttribute(attr) { return errors.New("eos: attr is invalid: " + serializeAttribute(attr)) } @@ -468,11 +473,15 @@ func (c *Client) SetAttr(ctx context.Context, auth eosclient.Authorization, attr } return c.handleFavAttr(ctx, auth, attr, recursive, path, info, true) } - return c.setEOSAttr(ctx, auth, attr, errorIfExists, recursive, path) + return c.setEOSAttr(ctx, auth, attr, errorIfExists, recursive, path, app) } -func (c *Client) setEOSAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, errorIfExists, recursive bool, path string) error { - args := []string{"attr"} +func (c *Client) setEOSAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, errorIfExists, recursive bool, path, app string) error { + args := []string{} + if app != "" { + args = append(args, "-a", app) + } + args = append(args, "attr") if recursive { args = append(args, "-r") } @@ -485,9 +494,12 @@ func (c *Client) setEOSAttr(ctx context.Context, auth eosclient.Authorization, a _, _, err := c.executeEOS(ctx, args, auth) if err != nil { var exErr *exec.ExitError - if errors.As(err, &exErr) && exErr.ExitCode() == 17 { + if errors.As(err, &exErr) && exErr.ExitCode() == 17 { // EEXIST return eosclient.AttrAlreadyExistsError } + if errors.As(err, &exErr) && exErr.ExitCode() == 16 { // EBUSY -> Locked + return eosclient.FileIsLockedError + } return err } return nil @@ -516,11 +528,11 @@ func (c *Client) handleFavAttr(ctx context.Context, auth eosclient.Authorization favs.DeleteEntry(acl.TypeUser, u.Id.OpaqueId) } attr.Val = favs.Serialize() - return c.setEOSAttr(ctx, auth, attr, false, recursive, path) + return c.setEOSAttr(ctx, auth, attr, false, recursive, path, "") } // UnsetAttr unsets an extended attribute on a path. -func (c *Client) UnsetAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, recursive bool, path string) error { +func (c *Client) UnsetAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, recursive bool, path, app string) error { if !isValidAttribute(attr) { return errors.New("eos: attr is invalid: " + serializeAttribute(attr)) } @@ -536,11 +548,15 @@ func (c *Client) UnsetAttr(ctx context.Context, auth eosclient.Authorization, at } var args []string + if app != "" { + args = append(args, "-a", app) + } + args = append(args, "attr") if recursive { - args = []string{"attr", "-r", "rm", fmt.Sprintf("%s.%s", attrTypeToString(attr.Type), attr.Key), path} - } else { - args = []string{"attr", "rm", fmt.Sprintf("%s.%s", attrTypeToString(attr.Type), attr.Key), path} + args = append(args, "-r") } + args = append(args, "rm", fmt.Sprintf("%s.%s", attrTypeToString(attr.Type), attr.Key), path) + _, _, err = c.executeEOS(ctx, args, auth) if err != nil { var exErr *exec.ExitError @@ -707,7 +723,7 @@ func (c *Client) Read(ctx context.Context, auth eosclient.Authorization, path st } // Write writes a stream to the mgm. -func (c *Client) Write(ctx context.Context, auth eosclient.Authorization, path string, stream io.ReadCloser) error { +func (c *Client) Write(ctx context.Context, auth eosclient.Authorization, path string, stream io.ReadCloser, app string) error { fd, err := os.CreateTemp(c.opt.CacheDirectory, "eoswrite-") if err != nil { return err @@ -720,19 +736,18 @@ func (c *Client) Write(ctx context.Context, auth eosclient.Authorization, path s if err != nil { return err } - - return c.WriteFile(ctx, auth, path, fd.Name()) + return c.writeFile(ctx, auth, path, fd.Name(), app) } // WriteFile writes an existing file to the mgm. -func (c *Client) WriteFile(ctx context.Context, auth eosclient.Authorization, path, source string) error { +func (c *Client) writeFile(ctx context.Context, auth eosclient.Authorization, path, source, app string) error { xrdPath := fmt.Sprintf("%s//%s", c.opt.URL, path) args := []string{"--nopbar", "--silent", "-f", source, xrdPath} if auth.Token != "" { args[4] += "?authz=" + auth.Token } else if auth.Role.UID != "" && auth.Role.GID != "" { - args = append(args, fmt.Sprintf("-ODeos.ruid=%s&eos.rgid=%s&eos.app=reva_eosclient::write", auth.Role.UID, auth.Role.GID)) + args = append(args, fmt.Sprintf("-ODeos.ruid=%s&eos.rgid=%s&eos.app=%s", auth.Role.UID, auth.Role.GID, app)) } _, _, err := c.executeXRDCopy(ctx, args) diff --git a/pkg/eosclient/eosclient.go b/pkg/eosclient/eosclient.go index 0cc28d5705..bbbf31a428 100644 --- a/pkg/eosclient/eosclient.go +++ b/pkg/eosclient/eosclient.go @@ -37,8 +37,8 @@ type EOSClient interface { GetFileInfoByInode(ctx context.Context, auth Authorization, inode uint64) (*FileInfo, error) GetFileInfoByFXID(ctx context.Context, auth Authorization, fxid string) (*FileInfo, error) GetFileInfoByPath(ctx context.Context, auth Authorization, path string) (*FileInfo, error) - SetAttr(ctx context.Context, auth Authorization, attr *Attribute, errorIfExists, recursive bool, path string) error - UnsetAttr(ctx context.Context, auth Authorization, attr *Attribute, recursive bool, path string) error + SetAttr(ctx context.Context, auth Authorization, attr *Attribute, errorIfExists, recursive bool, path, app string) error + UnsetAttr(ctx context.Context, auth Authorization, attr *Attribute, recursive bool, path, app string) error GetAttr(ctx context.Context, auth Authorization, key, path string) (*Attribute, error) GetAttrs(ctx context.Context, auth Authorization, path string) ([]*Attribute, error) GetQuota(ctx context.Context, username string, rootAuth Authorization, path string) (*QuotaInfo, error) @@ -51,8 +51,7 @@ type EOSClient interface { Rename(ctx context.Context, auth Authorization, oldPath, newPath string) error List(ctx context.Context, auth Authorization, path string) ([]*FileInfo, error) Read(ctx context.Context, auth Authorization, path string) (io.ReadCloser, error) - Write(ctx context.Context, auth Authorization, path string, stream io.ReadCloser) error - WriteFile(ctx context.Context, auth Authorization, path, source string) error + Write(ctx context.Context, auth Authorization, path string, stream io.ReadCloser, app string) error ListDeletedEntries(ctx context.Context, auth Authorization, maxentries int, from, to time.Time) ([]*DeletedEntry, error) RestoreDeletedEntry(ctx context.Context, auth Authorization, key string) error PurgeDeletedEntries(ctx context.Context, auth Authorization) error @@ -154,3 +153,7 @@ const AttrAlreadyExistsError = errtypes.BadRequest("attr already exists") // AttrNotExistsError is the error raised when removing // an attribute that does not exist. const AttrNotExistsError = errtypes.BadRequest("attr not exists") + +// FileIsLockedError is the error raised when attempting to set a lock +// attribute to an already locked file with a mismatched lock. +const FileIsLockedError = errtypes.BadRequest("file is locked") diff --git a/pkg/eosclient/eosgrpc/eos_grpc/README.protoc b/pkg/eosclient/eosgrpc/eos_grpc/README.protoc deleted file mode 100644 index daaaa67ef7..0000000000 --- a/pkg/eosclient/eosgrpc/eos_grpc/README.protoc +++ /dev/null @@ -1,10 +0,0 @@ -To compile the eos binding into go code: - -protoc --go_out=. ./Rpc.proto -protoc ./Rpc.proto --go_out=plugins=grpc:. - - -NOTE: we have to do this here in order to be sure that a compatible protoc compiler is used. -Having a CI somewhere compiling this does NOT guarantee that the same golang and protoc will be used, -and this has created lots of problems in the past - diff --git a/pkg/eosclient/eosgrpc/eos_grpc/Rpc.pb.go b/pkg/eosclient/eosgrpc/eos_grpc/Rpc.pb.go deleted file mode 100644 index d57d0b2bbd..0000000000 --- a/pkg/eosclient/eosgrpc/eos_grpc/Rpc.pb.go +++ /dev/null @@ -1,5281 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: Rpc.proto - -package eos_grpc - -import ( - context "context" - fmt "fmt" - proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - math "math" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package - -type TYPE int32 - -const ( - TYPE_FILE TYPE = 0 - TYPE_CONTAINER TYPE = 1 - TYPE_LISTING TYPE = 2 - TYPE_STAT TYPE = 3 -) - -var TYPE_name = map[int32]string{ - 0: "FILE", - 1: "CONTAINER", - 2: "LISTING", - 3: "STAT", -} - -var TYPE_value = map[string]int32{ - "FILE": 0, - "CONTAINER": 1, - "LISTING": 2, - "STAT": 3, -} - -func (x TYPE) String() string { - return proto.EnumName(TYPE_name, int32(x)) -} - -func (TYPE) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{0} -} - -type QUOTATYPE int32 - -const ( - QUOTATYPE_USER QUOTATYPE = 0 - QUOTATYPE_GROUP QUOTATYPE = 2 - QUOTATYPE_PROJECT QUOTATYPE = 3 -) - -var QUOTATYPE_name = map[int32]string{ - 0: "USER", - 2: "GROUP", - 3: "PROJECT", -} - -var QUOTATYPE_value = map[string]int32{ - "USER": 0, - "GROUP": 2, - "PROJECT": 3, -} - -func (x QUOTATYPE) String() string { - return proto.EnumName(QUOTATYPE_name, int32(x)) -} - -func (QUOTATYPE) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{1} -} - -type QUOTAOP int32 - -const ( - QUOTAOP_GET QUOTAOP = 0 - QUOTAOP_SET QUOTAOP = 1 - QUOTAOP_RM QUOTAOP = 2 - QUOTAOP_RMNODE QUOTAOP = 3 -) - -var QUOTAOP_name = map[int32]string{ - 0: "GET", - 1: "SET", - 2: "RM", - 3: "RMNODE", -} - -var QUOTAOP_value = map[string]int32{ - "GET": 0, - "SET": 1, - "RM": 2, - "RMNODE": 3, -} - -func (x QUOTAOP) String() string { - return proto.EnumName(QUOTAOP_name, int32(x)) -} - -func (QUOTAOP) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{2} -} - -type QUOTAENTRY int32 - -const ( - QUOTAENTRY_NONE QUOTAENTRY = 0 - QUOTAENTRY_VOLUME QUOTAENTRY = 1 - QUOTAENTRY_INODE QUOTAENTRY = 2 -) - -var QUOTAENTRY_name = map[int32]string{ - 0: "NONE", - 1: "VOLUME", - 2: "INODE", -} - -var QUOTAENTRY_value = map[string]int32{ - "NONE": 0, - "VOLUME": 1, - "INODE": 2, -} - -func (x QUOTAENTRY) String() string { - return proto.EnumName(QUOTAENTRY_name, int32(x)) -} - -func (QUOTAENTRY) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{3} -} - -type MANILA_REQUEST_TYPE int32 - -const ( - MANILA_REQUEST_TYPE_CREATE_SHARE MANILA_REQUEST_TYPE = 0 - MANILA_REQUEST_TYPE_DELETE_SHARE MANILA_REQUEST_TYPE = 1 - MANILA_REQUEST_TYPE_EXTEND_SHARE MANILA_REQUEST_TYPE = 2 - MANILA_REQUEST_TYPE_SHRINK_SHARE MANILA_REQUEST_TYPE = 3 - MANILA_REQUEST_TYPE_MANAGE_EXISTING MANILA_REQUEST_TYPE = 4 - MANILA_REQUEST_TYPE_UNMANAGE MANILA_REQUEST_TYPE = 5 - MANILA_REQUEST_TYPE_GET_CAPACITIES MANILA_REQUEST_TYPE = 6 -) - -var MANILA_REQUEST_TYPE_name = map[int32]string{ - 0: "CREATE_SHARE", - 1: "DELETE_SHARE", - 2: "EXTEND_SHARE", - 3: "SHRINK_SHARE", - 4: "MANAGE_EXISTING", - 5: "UNMANAGE", - 6: "GET_CAPACITIES", -} - -var MANILA_REQUEST_TYPE_value = map[string]int32{ - "CREATE_SHARE": 0, - "DELETE_SHARE": 1, - "EXTEND_SHARE": 2, - "SHRINK_SHARE": 3, - "MANAGE_EXISTING": 4, - "UNMANAGE": 5, - "GET_CAPACITIES": 6, -} - -func (x MANILA_REQUEST_TYPE) String() string { - return proto.EnumName(MANILA_REQUEST_TYPE_name, int32(x)) -} - -func (MANILA_REQUEST_TYPE) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{4} -} - -type NSRequest_VersionRequest_VERSION_CMD int32 - -const ( - NSRequest_VersionRequest_CREATE NSRequest_VersionRequest_VERSION_CMD = 0 - NSRequest_VersionRequest_PURGE NSRequest_VersionRequest_VERSION_CMD = 1 - NSRequest_VersionRequest_LIST NSRequest_VersionRequest_VERSION_CMD = 2 - NSRequest_VersionRequest_GRAB NSRequest_VersionRequest_VERSION_CMD = 3 -) - -var NSRequest_VersionRequest_VERSION_CMD_name = map[int32]string{ - 0: "CREATE", - 1: "PURGE", - 2: "LIST", - 3: "GRAB", -} - -var NSRequest_VersionRequest_VERSION_CMD_value = map[string]int32{ - "CREATE": 0, - "PURGE": 1, - "LIST": 2, - "GRAB": 3, -} - -func (x NSRequest_VersionRequest_VERSION_CMD) String() string { - return proto.EnumName(NSRequest_VersionRequest_VERSION_CMD_name, int32(x)) -} - -func (NSRequest_VersionRequest_VERSION_CMD) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 7, 0} -} - -type NSRequest_RecycleRequest_RECYCLE_CMD int32 - -const ( - NSRequest_RecycleRequest_RESTORE NSRequest_RecycleRequest_RECYCLE_CMD = 0 - NSRequest_RecycleRequest_PURGE NSRequest_RecycleRequest_RECYCLE_CMD = 1 - NSRequest_RecycleRequest_LIST NSRequest_RecycleRequest_RECYCLE_CMD = 2 -) - -var NSRequest_RecycleRequest_RECYCLE_CMD_name = map[int32]string{ - 0: "RESTORE", - 1: "PURGE", - 2: "LIST", -} - -var NSRequest_RecycleRequest_RECYCLE_CMD_value = map[string]int32{ - "RESTORE": 0, - "PURGE": 1, - "LIST": 2, -} - -func (x NSRequest_RecycleRequest_RECYCLE_CMD) String() string { - return proto.EnumName(NSRequest_RecycleRequest_RECYCLE_CMD_name, int32(x)) -} - -func (NSRequest_RecycleRequest_RECYCLE_CMD) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 8, 0} -} - -type NSRequest_AclRequest_ACL_COMMAND int32 - -const ( - NSRequest_AclRequest_NONE NSRequest_AclRequest_ACL_COMMAND = 0 - NSRequest_AclRequest_MODIFY NSRequest_AclRequest_ACL_COMMAND = 1 - NSRequest_AclRequest_LIST NSRequest_AclRequest_ACL_COMMAND = 2 -) - -var NSRequest_AclRequest_ACL_COMMAND_name = map[int32]string{ - 0: "NONE", - 1: "MODIFY", - 2: "LIST", -} - -var NSRequest_AclRequest_ACL_COMMAND_value = map[string]int32{ - "NONE": 0, - "MODIFY": 1, - "LIST": 2, -} - -func (x NSRequest_AclRequest_ACL_COMMAND) String() string { - return proto.EnumName(NSRequest_AclRequest_ACL_COMMAND_name, int32(x)) -} - -func (NSRequest_AclRequest_ACL_COMMAND) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 12, 0} -} - -type NSRequest_AclRequest_ACL_TYPE int32 - -const ( - NSRequest_AclRequest_USER_ACL NSRequest_AclRequest_ACL_TYPE = 0 - NSRequest_AclRequest_SYS_ACL NSRequest_AclRequest_ACL_TYPE = 1 -) - -var NSRequest_AclRequest_ACL_TYPE_name = map[int32]string{ - 0: "USER_ACL", - 1: "SYS_ACL", -} - -var NSRequest_AclRequest_ACL_TYPE_value = map[string]int32{ - "USER_ACL": 0, - "SYS_ACL": 1, -} - -func (x NSRequest_AclRequest_ACL_TYPE) String() string { - return proto.EnumName(NSRequest_AclRequest_ACL_TYPE_name, int32(x)) -} - -func (NSRequest_AclRequest_ACL_TYPE) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 12, 1} -} - -type NSRequest_ShareRequest_LsShare_OutFormat int32 - -const ( - NSRequest_ShareRequest_LsShare_NONE NSRequest_ShareRequest_LsShare_OutFormat = 0 - NSRequest_ShareRequest_LsShare_MONITORING NSRequest_ShareRequest_LsShare_OutFormat = 1 - NSRequest_ShareRequest_LsShare_LISTING NSRequest_ShareRequest_LsShare_OutFormat = 2 - NSRequest_ShareRequest_LsShare_JSON NSRequest_ShareRequest_LsShare_OutFormat = 3 -) - -var NSRequest_ShareRequest_LsShare_OutFormat_name = map[int32]string{ - 0: "NONE", - 1: "MONITORING", - 2: "LISTING", - 3: "JSON", -} - -var NSRequest_ShareRequest_LsShare_OutFormat_value = map[string]int32{ - "NONE": 0, - "MONITORING": 1, - "LISTING": 2, - "JSON": 3, -} - -func (x NSRequest_ShareRequest_LsShare_OutFormat) String() string { - return proto.EnumName(NSRequest_ShareRequest_LsShare_OutFormat_name, int32(x)) -} - -func (NSRequest_ShareRequest_LsShare_OutFormat) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 15, 0, 0} -} - -type NSRequest_ShareRequest_OperateShare_Op int32 - -const ( - NSRequest_ShareRequest_OperateShare_CREATE NSRequest_ShareRequest_OperateShare_Op = 0 - NSRequest_ShareRequest_OperateShare_REMOVE NSRequest_ShareRequest_OperateShare_Op = 1 - NSRequest_ShareRequest_OperateShare_SHARE NSRequest_ShareRequest_OperateShare_Op = 2 - NSRequest_ShareRequest_OperateShare_UNSHARE NSRequest_ShareRequest_OperateShare_Op = 3 - NSRequest_ShareRequest_OperateShare_ACCESS NSRequest_ShareRequest_OperateShare_Op = 4 - NSRequest_ShareRequest_OperateShare_MODIFY NSRequest_ShareRequest_OperateShare_Op = 5 -) - -var NSRequest_ShareRequest_OperateShare_Op_name = map[int32]string{ - 0: "CREATE", - 1: "REMOVE", - 2: "SHARE", - 3: "UNSHARE", - 4: "ACCESS", - 5: "MODIFY", -} - -var NSRequest_ShareRequest_OperateShare_Op_value = map[string]int32{ - "CREATE": 0, - "REMOVE": 1, - "SHARE": 2, - "UNSHARE": 3, - "ACCESS": 4, - "MODIFY": 5, -} - -func (x NSRequest_ShareRequest_OperateShare_Op) String() string { - return proto.EnumName(NSRequest_ShareRequest_OperateShare_Op_name, int32(x)) -} - -func (NSRequest_ShareRequest_OperateShare_Op) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 15, 1, 0} -} - -type NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE int32 - -const ( - NSResponse_RecycleResponse_RecycleInfo_FILE NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE = 0 - NSResponse_RecycleResponse_RecycleInfo_TREE NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE = 1 -) - -var NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE_name = map[int32]string{ - 0: "FILE", - 1: "TREE", -} - -var NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE_value = map[string]int32{ - "FILE": 0, - "TREE": 1, -} - -func (x NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE) String() string { - return proto.EnumName(NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE_name, int32(x)) -} - -func (NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 2, 0, 0} -} - -type PingRequest struct { - Authkey string `protobuf:"bytes,1,opt,name=authkey,proto3" json:"authkey,omitempty"` - Message []byte `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PingRequest) Reset() { *m = PingRequest{} } -func (m *PingRequest) String() string { return proto.CompactTextString(m) } -func (*PingRequest) ProtoMessage() {} -func (*PingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{0} -} - -func (m *PingRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PingRequest.Unmarshal(m, b) -} -func (m *PingRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PingRequest.Marshal(b, m, deterministic) -} -func (m *PingRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_PingRequest.Merge(m, src) -} -func (m *PingRequest) XXX_Size() int { - return xxx_messageInfo_PingRequest.Size(m) -} -func (m *PingRequest) XXX_DiscardUnknown() { - xxx_messageInfo_PingRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_PingRequest proto.InternalMessageInfo - -func (m *PingRequest) GetAuthkey() string { - if m != nil { - return m.Authkey - } - return "" -} - -func (m *PingRequest) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -type PingReply struct { - Message []byte `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *PingReply) Reset() { *m = PingReply{} } -func (m *PingReply) String() string { return proto.CompactTextString(m) } -func (*PingReply) ProtoMessage() {} -func (*PingReply) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{1} -} - -func (m *PingReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_PingReply.Unmarshal(m, b) -} -func (m *PingReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_PingReply.Marshal(b, m, deterministic) -} -func (m *PingReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_PingReply.Merge(m, src) -} -func (m *PingReply) XXX_Size() int { - return xxx_messageInfo_PingReply.Size(m) -} -func (m *PingReply) XXX_DiscardUnknown() { - xxx_messageInfo_PingReply.DiscardUnknown(m) -} - -var xxx_messageInfo_PingReply proto.InternalMessageInfo - -func (m *PingReply) GetMessage() []byte { - if m != nil { - return m.Message - } - return nil -} - -type ContainerInsertRequest struct { - Container []*ContainerMdProto `protobuf:"bytes,1,rep,name=container,proto3" json:"container,omitempty"` - Authkey string `protobuf:"bytes,2,opt,name=authkey,proto3" json:"authkey,omitempty"` - InheritMd bool `protobuf:"varint,3,opt,name=inherit_md,json=inheritMd,proto3" json:"inherit_md,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ContainerInsertRequest) Reset() { *m = ContainerInsertRequest{} } -func (m *ContainerInsertRequest) String() string { return proto.CompactTextString(m) } -func (*ContainerInsertRequest) ProtoMessage() {} -func (*ContainerInsertRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{2} -} - -func (m *ContainerInsertRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ContainerInsertRequest.Unmarshal(m, b) -} -func (m *ContainerInsertRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ContainerInsertRequest.Marshal(b, m, deterministic) -} -func (m *ContainerInsertRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ContainerInsertRequest.Merge(m, src) -} -func (m *ContainerInsertRequest) XXX_Size() int { - return xxx_messageInfo_ContainerInsertRequest.Size(m) -} -func (m *ContainerInsertRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ContainerInsertRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ContainerInsertRequest proto.InternalMessageInfo - -func (m *ContainerInsertRequest) GetContainer() []*ContainerMdProto { - if m != nil { - return m.Container - } - return nil -} - -func (m *ContainerInsertRequest) GetAuthkey() string { - if m != nil { - return m.Authkey - } - return "" -} - -func (m *ContainerInsertRequest) GetInheritMd() bool { - if m != nil { - return m.InheritMd - } - return false -} - -type FileInsertRequest struct { - Files []*FileMdProto `protobuf:"bytes,1,rep,name=files,proto3" json:"files,omitempty"` - Authkey string `protobuf:"bytes,2,opt,name=authkey,proto3" json:"authkey,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FileInsertRequest) Reset() { *m = FileInsertRequest{} } -func (m *FileInsertRequest) String() string { return proto.CompactTextString(m) } -func (*FileInsertRequest) ProtoMessage() {} -func (*FileInsertRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{3} -} - -func (m *FileInsertRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FileInsertRequest.Unmarshal(m, b) -} -func (m *FileInsertRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FileInsertRequest.Marshal(b, m, deterministic) -} -func (m *FileInsertRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_FileInsertRequest.Merge(m, src) -} -func (m *FileInsertRequest) XXX_Size() int { - return xxx_messageInfo_FileInsertRequest.Size(m) -} -func (m *FileInsertRequest) XXX_DiscardUnknown() { - xxx_messageInfo_FileInsertRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_FileInsertRequest proto.InternalMessageInfo - -func (m *FileInsertRequest) GetFiles() []*FileMdProto { - if m != nil { - return m.Files - } - return nil -} - -func (m *FileInsertRequest) GetAuthkey() string { - if m != nil { - return m.Authkey - } - return "" -} - -type InsertReply struct { - Message []string `protobuf:"bytes,1,rep,name=message,proto3" json:"message,omitempty"` - Retc []uint32 `protobuf:"varint,2,rep,packed,name=retc,proto3" json:"retc,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *InsertReply) Reset() { *m = InsertReply{} } -func (m *InsertReply) String() string { return proto.CompactTextString(m) } -func (*InsertReply) ProtoMessage() {} -func (*InsertReply) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{4} -} - -func (m *InsertReply) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_InsertReply.Unmarshal(m, b) -} -func (m *InsertReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_InsertReply.Marshal(b, m, deterministic) -} -func (m *InsertReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_InsertReply.Merge(m, src) -} -func (m *InsertReply) XXX_Size() int { - return xxx_messageInfo_InsertReply.Size(m) -} -func (m *InsertReply) XXX_DiscardUnknown() { - xxx_messageInfo_InsertReply.DiscardUnknown(m) -} - -var xxx_messageInfo_InsertReply proto.InternalMessageInfo - -func (m *InsertReply) GetMessage() []string { - if m != nil { - return m.Message - } - return nil -} - -func (m *InsertReply) GetRetc() []uint32 { - if m != nil { - return m.Retc - } - return nil -} - -type Time struct { - Sec uint64 `protobuf:"varint,1,opt,name=sec,proto3" json:"sec,omitempty"` - NSec uint64 `protobuf:"varint,2,opt,name=n_sec,json=nSec,proto3" json:"n_sec,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Time) Reset() { *m = Time{} } -func (m *Time) String() string { return proto.CompactTextString(m) } -func (*Time) ProtoMessage() {} -func (*Time) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{5} -} - -func (m *Time) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Time.Unmarshal(m, b) -} -func (m *Time) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Time.Marshal(b, m, deterministic) -} -func (m *Time) XXX_Merge(src proto.Message) { - xxx_messageInfo_Time.Merge(m, src) -} -func (m *Time) XXX_Size() int { - return xxx_messageInfo_Time.Size(m) -} -func (m *Time) XXX_DiscardUnknown() { - xxx_messageInfo_Time.DiscardUnknown(m) -} - -var xxx_messageInfo_Time proto.InternalMessageInfo - -func (m *Time) GetSec() uint64 { - if m != nil { - return m.Sec - } - return 0 -} - -func (m *Time) GetNSec() uint64 { - if m != nil { - return m.NSec - } - return 0 -} - -type Checksum struct { - Value []byte `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Checksum) Reset() { *m = Checksum{} } -func (m *Checksum) String() string { return proto.CompactTextString(m) } -func (*Checksum) ProtoMessage() {} -func (*Checksum) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{6} -} - -func (m *Checksum) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Checksum.Unmarshal(m, b) -} -func (m *Checksum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Checksum.Marshal(b, m, deterministic) -} -func (m *Checksum) XXX_Merge(src proto.Message) { - xxx_messageInfo_Checksum.Merge(m, src) -} -func (m *Checksum) XXX_Size() int { - return xxx_messageInfo_Checksum.Size(m) -} -func (m *Checksum) XXX_DiscardUnknown() { - xxx_messageInfo_Checksum.DiscardUnknown(m) -} - -var xxx_messageInfo_Checksum proto.InternalMessageInfo - -func (m *Checksum) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func (m *Checksum) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -type FileMdProto struct { - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - ContId uint64 `protobuf:"varint,2,opt,name=cont_id,json=contId,proto3" json:"cont_id,omitempty"` - Uid uint64 `protobuf:"varint,3,opt,name=uid,proto3" json:"uid,omitempty"` - Gid uint64 `protobuf:"varint,4,opt,name=gid,proto3" json:"gid,omitempty"` - Size uint64 `protobuf:"varint,5,opt,name=size,proto3" json:"size,omitempty"` - LayoutId uint32 `protobuf:"varint,6,opt,name=layout_id,json=layoutId,proto3" json:"layout_id,omitempty"` - Flags uint32 `protobuf:"varint,7,opt,name=flags,proto3" json:"flags,omitempty"` - Name []byte `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` - LinkName []byte `protobuf:"bytes,9,opt,name=link_name,json=linkName,proto3" json:"link_name,omitempty"` - Ctime *Time `protobuf:"bytes,10,opt,name=ctime,proto3" json:"ctime,omitempty"` - Mtime *Time `protobuf:"bytes,11,opt,name=mtime,proto3" json:"mtime,omitempty"` - Checksum *Checksum `protobuf:"bytes,12,opt,name=checksum,proto3" json:"checksum,omitempty"` - Locations []uint32 `protobuf:"varint,13,rep,packed,name=locations,proto3" json:"locations,omitempty"` - UnlinkLocations []uint32 `protobuf:"varint,14,rep,packed,name=unlink_locations,json=unlinkLocations,proto3" json:"unlink_locations,omitempty"` - Xattrs map[string][]byte `protobuf:"bytes,15,rep,name=xattrs,proto3" json:"xattrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Path []byte `protobuf:"bytes,16,opt,name=path,proto3" json:"path,omitempty"` - Etag string `protobuf:"bytes,17,opt,name=etag,proto3" json:"etag,omitempty"` - Inode uint64 `protobuf:"varint,18,opt,name=inode,proto3" json:"inode,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FileMdProto) Reset() { *m = FileMdProto{} } -func (m *FileMdProto) String() string { return proto.CompactTextString(m) } -func (*FileMdProto) ProtoMessage() {} -func (*FileMdProto) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{7} -} - -func (m *FileMdProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FileMdProto.Unmarshal(m, b) -} -func (m *FileMdProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FileMdProto.Marshal(b, m, deterministic) -} -func (m *FileMdProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_FileMdProto.Merge(m, src) -} -func (m *FileMdProto) XXX_Size() int { - return xxx_messageInfo_FileMdProto.Size(m) -} -func (m *FileMdProto) XXX_DiscardUnknown() { - xxx_messageInfo_FileMdProto.DiscardUnknown(m) -} - -var xxx_messageInfo_FileMdProto proto.InternalMessageInfo - -func (m *FileMdProto) GetId() uint64 { - if m != nil { - return m.Id - } - return 0 -} - -func (m *FileMdProto) GetContId() uint64 { - if m != nil { - return m.ContId - } - return 0 -} - -func (m *FileMdProto) GetUid() uint64 { - if m != nil { - return m.Uid - } - return 0 -} - -func (m *FileMdProto) GetGid() uint64 { - if m != nil { - return m.Gid - } - return 0 -} - -func (m *FileMdProto) GetSize() uint64 { - if m != nil { - return m.Size - } - return 0 -} - -func (m *FileMdProto) GetLayoutId() uint32 { - if m != nil { - return m.LayoutId - } - return 0 -} - -func (m *FileMdProto) GetFlags() uint32 { - if m != nil { - return m.Flags - } - return 0 -} - -func (m *FileMdProto) GetName() []byte { - if m != nil { - return m.Name - } - return nil -} - -func (m *FileMdProto) GetLinkName() []byte { - if m != nil { - return m.LinkName - } - return nil -} - -func (m *FileMdProto) GetCtime() *Time { - if m != nil { - return m.Ctime - } - return nil -} - -func (m *FileMdProto) GetMtime() *Time { - if m != nil { - return m.Mtime - } - return nil -} - -func (m *FileMdProto) GetChecksum() *Checksum { - if m != nil { - return m.Checksum - } - return nil -} - -func (m *FileMdProto) GetLocations() []uint32 { - if m != nil { - return m.Locations - } - return nil -} - -func (m *FileMdProto) GetUnlinkLocations() []uint32 { - if m != nil { - return m.UnlinkLocations - } - return nil -} - -func (m *FileMdProto) GetXattrs() map[string][]byte { - if m != nil { - return m.Xattrs - } - return nil -} - -func (m *FileMdProto) GetPath() []byte { - if m != nil { - return m.Path - } - return nil -} - -func (m *FileMdProto) GetEtag() string { - if m != nil { - return m.Etag - } - return "" -} - -func (m *FileMdProto) GetInode() uint64 { - if m != nil { - return m.Inode - } - return 0 -} - -type ContainerMdProto struct { - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - ParentId uint64 `protobuf:"varint,2,opt,name=parent_id,json=parentId,proto3" json:"parent_id,omitempty"` - Uid uint64 `protobuf:"varint,3,opt,name=uid,proto3" json:"uid,omitempty"` - Gid uint64 `protobuf:"varint,4,opt,name=gid,proto3" json:"gid,omitempty"` - TreeSize int64 `protobuf:"varint,6,opt,name=tree_size,json=treeSize,proto3" json:"tree_size,omitempty"` - Mode uint32 `protobuf:"varint,5,opt,name=mode,proto3" json:"mode,omitempty"` - Flags uint32 `protobuf:"varint,7,opt,name=flags,proto3" json:"flags,omitempty"` - Name []byte `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` - Ctime *Time `protobuf:"bytes,9,opt,name=ctime,proto3" json:"ctime,omitempty"` - Mtime *Time `protobuf:"bytes,10,opt,name=mtime,proto3" json:"mtime,omitempty"` - Stime *Time `protobuf:"bytes,11,opt,name=stime,proto3" json:"stime,omitempty"` - Xattrs map[string][]byte `protobuf:"bytes,12,rep,name=xattrs,proto3" json:"xattrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Path []byte `protobuf:"bytes,13,opt,name=path,proto3" json:"path,omitempty"` - Etag string `protobuf:"bytes,14,opt,name=etag,proto3" json:"etag,omitempty"` - Inode uint64 `protobuf:"varint,15,opt,name=inode,proto3" json:"inode,omitempty"` - Files uint64 `protobuf:"varint,16,opt,name=files,proto3" json:"files,omitempty"` - Containers uint64 `protobuf:"varint,17,opt,name=containers,proto3" json:"containers,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ContainerMdProto) Reset() { *m = ContainerMdProto{} } -func (m *ContainerMdProto) String() string { return proto.CompactTextString(m) } -func (*ContainerMdProto) ProtoMessage() {} -func (*ContainerMdProto) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{8} -} - -func (m *ContainerMdProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ContainerMdProto.Unmarshal(m, b) -} -func (m *ContainerMdProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ContainerMdProto.Marshal(b, m, deterministic) -} -func (m *ContainerMdProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_ContainerMdProto.Merge(m, src) -} -func (m *ContainerMdProto) XXX_Size() int { - return xxx_messageInfo_ContainerMdProto.Size(m) -} -func (m *ContainerMdProto) XXX_DiscardUnknown() { - xxx_messageInfo_ContainerMdProto.DiscardUnknown(m) -} - -var xxx_messageInfo_ContainerMdProto proto.InternalMessageInfo - -func (m *ContainerMdProto) GetId() uint64 { - if m != nil { - return m.Id - } - return 0 -} - -func (m *ContainerMdProto) GetParentId() uint64 { - if m != nil { - return m.ParentId - } - return 0 -} - -func (m *ContainerMdProto) GetUid() uint64 { - if m != nil { - return m.Uid - } - return 0 -} - -func (m *ContainerMdProto) GetGid() uint64 { - if m != nil { - return m.Gid - } - return 0 -} - -func (m *ContainerMdProto) GetTreeSize() int64 { - if m != nil { - return m.TreeSize - } - return 0 -} - -func (m *ContainerMdProto) GetMode() uint32 { - if m != nil { - return m.Mode - } - return 0 -} - -func (m *ContainerMdProto) GetFlags() uint32 { - if m != nil { - return m.Flags - } - return 0 -} - -func (m *ContainerMdProto) GetName() []byte { - if m != nil { - return m.Name - } - return nil -} - -func (m *ContainerMdProto) GetCtime() *Time { - if m != nil { - return m.Ctime - } - return nil -} - -func (m *ContainerMdProto) GetMtime() *Time { - if m != nil { - return m.Mtime - } - return nil -} - -func (m *ContainerMdProto) GetStime() *Time { - if m != nil { - return m.Stime - } - return nil -} - -func (m *ContainerMdProto) GetXattrs() map[string][]byte { - if m != nil { - return m.Xattrs - } - return nil -} - -func (m *ContainerMdProto) GetPath() []byte { - if m != nil { - return m.Path - } - return nil -} - -func (m *ContainerMdProto) GetEtag() string { - if m != nil { - return m.Etag - } - return "" -} - -func (m *ContainerMdProto) GetInode() uint64 { - if m != nil { - return m.Inode - } - return 0 -} - -func (m *ContainerMdProto) GetFiles() uint64 { - if m != nil { - return m.Files - } - return 0 -} - -func (m *ContainerMdProto) GetContainers() uint64 { - if m != nil { - return m.Containers - } - return 0 -} - -type QuotaProto struct { - Path []byte `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Type QUOTATYPE `protobuf:"varint,3,opt,name=type,proto3,enum=eos.rpc.QUOTATYPE" json:"type,omitempty"` - Usedbytes uint64 `protobuf:"varint,4,opt,name=usedbytes,proto3" json:"usedbytes,omitempty"` - Usedlogicalbytes uint64 `protobuf:"varint,5,opt,name=usedlogicalbytes,proto3" json:"usedlogicalbytes,omitempty"` - Usedfiles uint64 `protobuf:"varint,6,opt,name=usedfiles,proto3" json:"usedfiles,omitempty"` - Maxbytes uint64 `protobuf:"varint,7,opt,name=maxbytes,proto3" json:"maxbytes,omitempty"` - Maxlogicalbytes uint64 `protobuf:"varint,8,opt,name=maxlogicalbytes,proto3" json:"maxlogicalbytes,omitempty"` - Maxfiles uint64 `protobuf:"varint,9,opt,name=maxfiles,proto3" json:"maxfiles,omitempty"` - Percentageusedbytes float32 `protobuf:"fixed32,10,opt,name=percentageusedbytes,proto3" json:"percentageusedbytes,omitempty"` - Percentageusedfiles float32 `protobuf:"fixed32,11,opt,name=percentageusedfiles,proto3" json:"percentageusedfiles,omitempty"` - Statusbytes string `protobuf:"bytes,12,opt,name=statusbytes,proto3" json:"statusbytes,omitempty"` - Statusfiles string `protobuf:"bytes,13,opt,name=statusfiles,proto3" json:"statusfiles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *QuotaProto) Reset() { *m = QuotaProto{} } -func (m *QuotaProto) String() string { return proto.CompactTextString(m) } -func (*QuotaProto) ProtoMessage() {} -func (*QuotaProto) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{9} -} - -func (m *QuotaProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_QuotaProto.Unmarshal(m, b) -} -func (m *QuotaProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_QuotaProto.Marshal(b, m, deterministic) -} -func (m *QuotaProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_QuotaProto.Merge(m, src) -} -func (m *QuotaProto) XXX_Size() int { - return xxx_messageInfo_QuotaProto.Size(m) -} -func (m *QuotaProto) XXX_DiscardUnknown() { - xxx_messageInfo_QuotaProto.DiscardUnknown(m) -} - -var xxx_messageInfo_QuotaProto proto.InternalMessageInfo - -func (m *QuotaProto) GetPath() []byte { - if m != nil { - return m.Path - } - return nil -} - -func (m *QuotaProto) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *QuotaProto) GetType() QUOTATYPE { - if m != nil { - return m.Type - } - return QUOTATYPE_USER -} - -func (m *QuotaProto) GetUsedbytes() uint64 { - if m != nil { - return m.Usedbytes - } - return 0 -} - -func (m *QuotaProto) GetUsedlogicalbytes() uint64 { - if m != nil { - return m.Usedlogicalbytes - } - return 0 -} - -func (m *QuotaProto) GetUsedfiles() uint64 { - if m != nil { - return m.Usedfiles - } - return 0 -} - -func (m *QuotaProto) GetMaxbytes() uint64 { - if m != nil { - return m.Maxbytes - } - return 0 -} - -func (m *QuotaProto) GetMaxlogicalbytes() uint64 { - if m != nil { - return m.Maxlogicalbytes - } - return 0 -} - -func (m *QuotaProto) GetMaxfiles() uint64 { - if m != nil { - return m.Maxfiles - } - return 0 -} - -func (m *QuotaProto) GetPercentageusedbytes() float32 { - if m != nil { - return m.Percentageusedbytes - } - return 0 -} - -func (m *QuotaProto) GetPercentageusedfiles() float32 { - if m != nil { - return m.Percentageusedfiles - } - return 0 -} - -func (m *QuotaProto) GetStatusbytes() string { - if m != nil { - return m.Statusbytes - } - return "" -} - -func (m *QuotaProto) GetStatusfiles() string { - if m != nil { - return m.Statusfiles - } - return "" -} - -type RoleId struct { - Uid uint64 `protobuf:"varint,1,opt,name=uid,proto3" json:"uid,omitempty"` - Gid uint64 `protobuf:"varint,2,opt,name=gid,proto3" json:"gid,omitempty"` - Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` - Groupname string `protobuf:"bytes,4,opt,name=groupname,proto3" json:"groupname,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RoleId) Reset() { *m = RoleId{} } -func (m *RoleId) String() string { return proto.CompactTextString(m) } -func (*RoleId) ProtoMessage() {} -func (*RoleId) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{10} -} - -func (m *RoleId) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_RoleId.Unmarshal(m, b) -} -func (m *RoleId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_RoleId.Marshal(b, m, deterministic) -} -func (m *RoleId) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoleId.Merge(m, src) -} -func (m *RoleId) XXX_Size() int { - return xxx_messageInfo_RoleId.Size(m) -} -func (m *RoleId) XXX_DiscardUnknown() { - xxx_messageInfo_RoleId.DiscardUnknown(m) -} - -var xxx_messageInfo_RoleId proto.InternalMessageInfo - -func (m *RoleId) GetUid() uint64 { - if m != nil { - return m.Uid - } - return 0 -} - -func (m *RoleId) GetGid() uint64 { - if m != nil { - return m.Gid - } - return 0 -} - -func (m *RoleId) GetUsername() string { - if m != nil { - return m.Username - } - return "" -} - -func (m *RoleId) GetGroupname() string { - if m != nil { - return m.Groupname - } - return "" -} - -type MDId struct { - Path []byte `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - Id uint64 `protobuf:"fixed64,2,opt,name=id,proto3" json:"id,omitempty"` - Ino uint64 `protobuf:"fixed64,3,opt,name=ino,proto3" json:"ino,omitempty"` - Type TYPE `protobuf:"varint,4,opt,name=type,proto3,enum=eos.rpc.TYPE" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MDId) Reset() { *m = MDId{} } -func (m *MDId) String() string { return proto.CompactTextString(m) } -func (*MDId) ProtoMessage() {} -func (*MDId) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{11} -} - -func (m *MDId) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MDId.Unmarshal(m, b) -} -func (m *MDId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MDId.Marshal(b, m, deterministic) -} -func (m *MDId) XXX_Merge(src proto.Message) { - xxx_messageInfo_MDId.Merge(m, src) -} -func (m *MDId) XXX_Size() int { - return xxx_messageInfo_MDId.Size(m) -} -func (m *MDId) XXX_DiscardUnknown() { - xxx_messageInfo_MDId.DiscardUnknown(m) -} - -var xxx_messageInfo_MDId proto.InternalMessageInfo - -func (m *MDId) GetPath() []byte { - if m != nil { - return m.Path - } - return nil -} - -func (m *MDId) GetId() uint64 { - if m != nil { - return m.Id - } - return 0 -} - -func (m *MDId) GetIno() uint64 { - if m != nil { - return m.Ino - } - return 0 -} - -func (m *MDId) GetType() TYPE { - if m != nil { - return m.Type - } - return TYPE_FILE -} - -type Limit struct { - Zero bool `protobuf:"varint,1,opt,name=zero,proto3" json:"zero,omitempty"` - Min uint64 `protobuf:"varint,2,opt,name=min,proto3" json:"min,omitempty"` - Max uint64 `protobuf:"varint,3,opt,name=max,proto3" json:"max,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Limit) Reset() { *m = Limit{} } -func (m *Limit) String() string { return proto.CompactTextString(m) } -func (*Limit) ProtoMessage() {} -func (*Limit) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{12} -} - -func (m *Limit) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Limit.Unmarshal(m, b) -} -func (m *Limit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Limit.Marshal(b, m, deterministic) -} -func (m *Limit) XXX_Merge(src proto.Message) { - xxx_messageInfo_Limit.Merge(m, src) -} -func (m *Limit) XXX_Size() int { - return xxx_messageInfo_Limit.Size(m) -} -func (m *Limit) XXX_DiscardUnknown() { - xxx_messageInfo_Limit.DiscardUnknown(m) -} - -var xxx_messageInfo_Limit proto.InternalMessageInfo - -func (m *Limit) GetZero() bool { - if m != nil { - return m.Zero - } - return false -} - -func (m *Limit) GetMin() uint64 { - if m != nil { - return m.Min - } - return 0 -} - -func (m *Limit) GetMax() uint64 { - if m != nil { - return m.Max - } - return 0 -} - -type MDSelection struct { - Select bool `protobuf:"varint,1,opt,name=select,proto3" json:"select,omitempty"` - Ctime *Limit `protobuf:"bytes,2,opt,name=ctime,proto3" json:"ctime,omitempty"` - Mtime *Limit `protobuf:"bytes,3,opt,name=mtime,proto3" json:"mtime,omitempty"` - Stime *Limit `protobuf:"bytes,4,opt,name=stime,proto3" json:"stime,omitempty"` - Size *Limit `protobuf:"bytes,5,opt,name=size,proto3" json:"size,omitempty"` - Treesize *Limit `protobuf:"bytes,6,opt,name=treesize,proto3" json:"treesize,omitempty"` - Children *Limit `protobuf:"bytes,7,opt,name=children,proto3" json:"children,omitempty"` - Locations *Limit `protobuf:"bytes,8,opt,name=locations,proto3" json:"locations,omitempty"` - UnlinkedLocations *Limit `protobuf:"bytes,9,opt,name=unlinked_locations,json=unlinkedLocations,proto3" json:"unlinked_locations,omitempty"` - Layoutid uint64 `protobuf:"varint,10,opt,name=layoutid,proto3" json:"layoutid,omitempty"` - Flags uint64 `protobuf:"varint,11,opt,name=flags,proto3" json:"flags,omitempty"` - Symlink bool `protobuf:"varint,12,opt,name=symlink,proto3" json:"symlink,omitempty"` - Checksum *Checksum `protobuf:"bytes,13,opt,name=checksum,proto3" json:"checksum,omitempty"` - Owner uint32 `protobuf:"varint,14,opt,name=owner,proto3" json:"owner,omitempty"` - Group uint32 `protobuf:"varint,15,opt,name=group,proto3" json:"group,omitempty"` - OwnerRoot bool `protobuf:"varint,16,opt,name=owner_root,json=ownerRoot,proto3" json:"owner_root,omitempty"` - GroupRoot bool `protobuf:"varint,17,opt,name=group_root,json=groupRoot,proto3" json:"group_root,omitempty"` - RegexpFilename []byte `protobuf:"bytes,18,opt,name=regexp_filename,json=regexpFilename,proto3" json:"regexp_filename,omitempty"` - RegexpDirname []byte `protobuf:"bytes,19,opt,name=regexp_dirname,json=regexpDirname,proto3" json:"regexp_dirname,omitempty"` - Xattr map[string][]byte `protobuf:"bytes,20,rep,name=xattr,proto3" json:"xattr,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MDSelection) Reset() { *m = MDSelection{} } -func (m *MDSelection) String() string { return proto.CompactTextString(m) } -func (*MDSelection) ProtoMessage() {} -func (*MDSelection) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{13} -} - -func (m *MDSelection) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MDSelection.Unmarshal(m, b) -} -func (m *MDSelection) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MDSelection.Marshal(b, m, deterministic) -} -func (m *MDSelection) XXX_Merge(src proto.Message) { - xxx_messageInfo_MDSelection.Merge(m, src) -} -func (m *MDSelection) XXX_Size() int { - return xxx_messageInfo_MDSelection.Size(m) -} -func (m *MDSelection) XXX_DiscardUnknown() { - xxx_messageInfo_MDSelection.DiscardUnknown(m) -} - -var xxx_messageInfo_MDSelection proto.InternalMessageInfo - -func (m *MDSelection) GetSelect() bool { - if m != nil { - return m.Select - } - return false -} - -func (m *MDSelection) GetCtime() *Limit { - if m != nil { - return m.Ctime - } - return nil -} - -func (m *MDSelection) GetMtime() *Limit { - if m != nil { - return m.Mtime - } - return nil -} - -func (m *MDSelection) GetStime() *Limit { - if m != nil { - return m.Stime - } - return nil -} - -func (m *MDSelection) GetSize() *Limit { - if m != nil { - return m.Size - } - return nil -} - -func (m *MDSelection) GetTreesize() *Limit { - if m != nil { - return m.Treesize - } - return nil -} - -func (m *MDSelection) GetChildren() *Limit { - if m != nil { - return m.Children - } - return nil -} - -func (m *MDSelection) GetLocations() *Limit { - if m != nil { - return m.Locations - } - return nil -} - -func (m *MDSelection) GetUnlinkedLocations() *Limit { - if m != nil { - return m.UnlinkedLocations - } - return nil -} - -func (m *MDSelection) GetLayoutid() uint64 { - if m != nil { - return m.Layoutid - } - return 0 -} - -func (m *MDSelection) GetFlags() uint64 { - if m != nil { - return m.Flags - } - return 0 -} - -func (m *MDSelection) GetSymlink() bool { - if m != nil { - return m.Symlink - } - return false -} - -func (m *MDSelection) GetChecksum() *Checksum { - if m != nil { - return m.Checksum - } - return nil -} - -func (m *MDSelection) GetOwner() uint32 { - if m != nil { - return m.Owner - } - return 0 -} - -func (m *MDSelection) GetGroup() uint32 { - if m != nil { - return m.Group - } - return 0 -} - -func (m *MDSelection) GetOwnerRoot() bool { - if m != nil { - return m.OwnerRoot - } - return false -} - -func (m *MDSelection) GetGroupRoot() bool { - if m != nil { - return m.GroupRoot - } - return false -} - -func (m *MDSelection) GetRegexpFilename() []byte { - if m != nil { - return m.RegexpFilename - } - return nil -} - -func (m *MDSelection) GetRegexpDirname() []byte { - if m != nil { - return m.RegexpDirname - } - return nil -} - -func (m *MDSelection) GetXattr() map[string][]byte { - if m != nil { - return m.Xattr - } - return nil -} - -type MDRequest struct { - Type TYPE `protobuf:"varint,1,opt,name=type,proto3,enum=eos.rpc.TYPE" json:"type,omitempty"` - Id *MDId `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Authkey string `protobuf:"bytes,3,opt,name=authkey,proto3" json:"authkey,omitempty"` - Role *RoleId `protobuf:"bytes,4,opt,name=role,proto3" json:"role,omitempty"` - Selection *MDSelection `protobuf:"bytes,5,opt,name=selection,proto3" json:"selection,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MDRequest) Reset() { *m = MDRequest{} } -func (m *MDRequest) String() string { return proto.CompactTextString(m) } -func (*MDRequest) ProtoMessage() {} -func (*MDRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{14} -} - -func (m *MDRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MDRequest.Unmarshal(m, b) -} -func (m *MDRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MDRequest.Marshal(b, m, deterministic) -} -func (m *MDRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_MDRequest.Merge(m, src) -} -func (m *MDRequest) XXX_Size() int { - return xxx_messageInfo_MDRequest.Size(m) -} -func (m *MDRequest) XXX_DiscardUnknown() { - xxx_messageInfo_MDRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_MDRequest proto.InternalMessageInfo - -func (m *MDRequest) GetType() TYPE { - if m != nil { - return m.Type - } - return TYPE_FILE -} - -func (m *MDRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *MDRequest) GetAuthkey() string { - if m != nil { - return m.Authkey - } - return "" -} - -func (m *MDRequest) GetRole() *RoleId { - if m != nil { - return m.Role - } - return nil -} - -func (m *MDRequest) GetSelection() *MDSelection { - if m != nil { - return m.Selection - } - return nil -} - -type MDResponse struct { - Type TYPE `protobuf:"varint,1,opt,name=type,proto3,enum=eos.rpc.TYPE" json:"type,omitempty"` - Fmd *FileMdProto `protobuf:"bytes,2,opt,name=fmd,proto3" json:"fmd,omitempty"` - Cmd *ContainerMdProto `protobuf:"bytes,3,opt,name=cmd,proto3" json:"cmd,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *MDResponse) Reset() { *m = MDResponse{} } -func (m *MDResponse) String() string { return proto.CompactTextString(m) } -func (*MDResponse) ProtoMessage() {} -func (*MDResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{15} -} - -func (m *MDResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_MDResponse.Unmarshal(m, b) -} -func (m *MDResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_MDResponse.Marshal(b, m, deterministic) -} -func (m *MDResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_MDResponse.Merge(m, src) -} -func (m *MDResponse) XXX_Size() int { - return xxx_messageInfo_MDResponse.Size(m) -} -func (m *MDResponse) XXX_DiscardUnknown() { - xxx_messageInfo_MDResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_MDResponse proto.InternalMessageInfo - -func (m *MDResponse) GetType() TYPE { - if m != nil { - return m.Type - } - return TYPE_FILE -} - -func (m *MDResponse) GetFmd() *FileMdProto { - if m != nil { - return m.Fmd - } - return nil -} - -func (m *MDResponse) GetCmd() *ContainerMdProto { - if m != nil { - return m.Cmd - } - return nil -} - -type FindRequest struct { - Type TYPE `protobuf:"varint,1,opt,name=type,proto3,enum=eos.rpc.TYPE" json:"type,omitempty"` - Id *MDId `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Role *RoleId `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"` - Authkey string `protobuf:"bytes,4,opt,name=authkey,proto3" json:"authkey,omitempty"` - Maxdepth uint64 `protobuf:"varint,5,opt,name=maxdepth,proto3" json:"maxdepth,omitempty"` - Selection *MDSelection `protobuf:"bytes,6,opt,name=selection,proto3" json:"selection,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *FindRequest) Reset() { *m = FindRequest{} } -func (m *FindRequest) String() string { return proto.CompactTextString(m) } -func (*FindRequest) ProtoMessage() {} -func (*FindRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{16} -} - -func (m *FindRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_FindRequest.Unmarshal(m, b) -} -func (m *FindRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_FindRequest.Marshal(b, m, deterministic) -} -func (m *FindRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_FindRequest.Merge(m, src) -} -func (m *FindRequest) XXX_Size() int { - return xxx_messageInfo_FindRequest.Size(m) -} -func (m *FindRequest) XXX_DiscardUnknown() { - xxx_messageInfo_FindRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_FindRequest proto.InternalMessageInfo - -func (m *FindRequest) GetType() TYPE { - if m != nil { - return m.Type - } - return TYPE_FILE -} - -func (m *FindRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *FindRequest) GetRole() *RoleId { - if m != nil { - return m.Role - } - return nil -} - -func (m *FindRequest) GetAuthkey() string { - if m != nil { - return m.Authkey - } - return "" -} - -func (m *FindRequest) GetMaxdepth() uint64 { - if m != nil { - return m.Maxdepth - } - return 0 -} - -func (m *FindRequest) GetSelection() *MDSelection { - if m != nil { - return m.Selection - } - return nil -} - -type ShareAuth struct { - Prot string `protobuf:"bytes,1,opt,name=prot,proto3" json:"prot,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Host string `protobuf:"bytes,3,opt,name=host,proto3" json:"host,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShareAuth) Reset() { *m = ShareAuth{} } -func (m *ShareAuth) String() string { return proto.CompactTextString(m) } -func (*ShareAuth) ProtoMessage() {} -func (*ShareAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{17} -} - -func (m *ShareAuth) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ShareAuth.Unmarshal(m, b) -} -func (m *ShareAuth) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ShareAuth.Marshal(b, m, deterministic) -} -func (m *ShareAuth) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShareAuth.Merge(m, src) -} -func (m *ShareAuth) XXX_Size() int { - return xxx_messageInfo_ShareAuth.Size(m) -} -func (m *ShareAuth) XXX_DiscardUnknown() { - xxx_messageInfo_ShareAuth.DiscardUnknown(m) -} - -var xxx_messageInfo_ShareAuth proto.InternalMessageInfo - -func (m *ShareAuth) GetProt() string { - if m != nil { - return m.Prot - } - return "" -} - -func (m *ShareAuth) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ShareAuth) GetHost() string { - if m != nil { - return m.Host - } - return "" -} - -type ShareProto struct { - Permission string `protobuf:"bytes,1,opt,name=permission,proto3" json:"permission,omitempty"` - Expires uint64 `protobuf:"varint,2,opt,name=expires,proto3" json:"expires,omitempty"` - Owner string `protobuf:"bytes,3,opt,name=owner,proto3" json:"owner,omitempty"` - Group string `protobuf:"bytes,4,opt,name=group,proto3" json:"group,omitempty"` - Generation uint64 `protobuf:"varint,5,opt,name=generation,proto3" json:"generation,omitempty"` - Path string `protobuf:"bytes,6,opt,name=path,proto3" json:"path,omitempty"` - Allowtree bool `protobuf:"varint,7,opt,name=allowtree,proto3" json:"allowtree,omitempty"` - Vtoken string `protobuf:"bytes,8,opt,name=vtoken,proto3" json:"vtoken,omitempty"` - Origins []*ShareAuth `protobuf:"bytes,9,rep,name=origins,proto3" json:"origins,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShareProto) Reset() { *m = ShareProto{} } -func (m *ShareProto) String() string { return proto.CompactTextString(m) } -func (*ShareProto) ProtoMessage() {} -func (*ShareProto) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{18} -} - -func (m *ShareProto) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ShareProto.Unmarshal(m, b) -} -func (m *ShareProto) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ShareProto.Marshal(b, m, deterministic) -} -func (m *ShareProto) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShareProto.Merge(m, src) -} -func (m *ShareProto) XXX_Size() int { - return xxx_messageInfo_ShareProto.Size(m) -} -func (m *ShareProto) XXX_DiscardUnknown() { - xxx_messageInfo_ShareProto.DiscardUnknown(m) -} - -var xxx_messageInfo_ShareProto proto.InternalMessageInfo - -func (m *ShareProto) GetPermission() string { - if m != nil { - return m.Permission - } - return "" -} - -func (m *ShareProto) GetExpires() uint64 { - if m != nil { - return m.Expires - } - return 0 -} - -func (m *ShareProto) GetOwner() string { - if m != nil { - return m.Owner - } - return "" -} - -func (m *ShareProto) GetGroup() string { - if m != nil { - return m.Group - } - return "" -} - -func (m *ShareProto) GetGeneration() uint64 { - if m != nil { - return m.Generation - } - return 0 -} - -func (m *ShareProto) GetPath() string { - if m != nil { - return m.Path - } - return "" -} - -func (m *ShareProto) GetAllowtree() bool { - if m != nil { - return m.Allowtree - } - return false -} - -func (m *ShareProto) GetVtoken() string { - if m != nil { - return m.Vtoken - } - return "" -} - -func (m *ShareProto) GetOrigins() []*ShareAuth { - if m != nil { - return m.Origins - } - return nil -} - -type ShareToken struct { - Token *ShareProto `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature,proto3" json:"signature,omitempty"` - Serialized []byte `protobuf:"bytes,3,opt,name=serialized,proto3" json:"serialized,omitempty"` - Seed int32 `protobuf:"varint,4,opt,name=seed,proto3" json:"seed,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShareToken) Reset() { *m = ShareToken{} } -func (m *ShareToken) String() string { return proto.CompactTextString(m) } -func (*ShareToken) ProtoMessage() {} -func (*ShareToken) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{19} -} - -func (m *ShareToken) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ShareToken.Unmarshal(m, b) -} -func (m *ShareToken) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ShareToken.Marshal(b, m, deterministic) -} -func (m *ShareToken) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShareToken.Merge(m, src) -} -func (m *ShareToken) XXX_Size() int { - return xxx_messageInfo_ShareToken.Size(m) -} -func (m *ShareToken) XXX_DiscardUnknown() { - xxx_messageInfo_ShareToken.DiscardUnknown(m) -} - -var xxx_messageInfo_ShareToken proto.InternalMessageInfo - -func (m *ShareToken) GetToken() *ShareProto { - if m != nil { - return m.Token - } - return nil -} - -func (m *ShareToken) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -func (m *ShareToken) GetSerialized() []byte { - if m != nil { - return m.Serialized - } - return nil -} - -func (m *ShareToken) GetSeed() int32 { - if m != nil { - return m.Seed - } - return 0 -} - -type NSRequest struct { - Authkey string `protobuf:"bytes,1,opt,name=authkey,proto3" json:"authkey,omitempty"` - Role *RoleId `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` - // Actual request data object - // - // Types that are valid to be assigned to Command: - // - // *NSRequest_Mkdir - // *NSRequest_Rmdir - // *NSRequest_Touch - // *NSRequest_Unlink - // *NSRequest_Rm - // *NSRequest_Rename - // *NSRequest_Symlink - // *NSRequest_Version - // *NSRequest_Recycle - // *NSRequest_Xattr - // *NSRequest_Chown - // *NSRequest_Chmod - // *NSRequest_Acl - // *NSRequest_Token - // *NSRequest_Quota - // *NSRequest_Share - Command isNSRequest_Command `protobuf_oneof:"command"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest) Reset() { *m = NSRequest{} } -func (m *NSRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest) ProtoMessage() {} -func (*NSRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20} -} - -func (m *NSRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest.Unmarshal(m, b) -} -func (m *NSRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest.Merge(m, src) -} -func (m *NSRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest.Size(m) -} -func (m *NSRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest proto.InternalMessageInfo - -func (m *NSRequest) GetAuthkey() string { - if m != nil { - return m.Authkey - } - return "" -} - -func (m *NSRequest) GetRole() *RoleId { - if m != nil { - return m.Role - } - return nil -} - -type isNSRequest_Command interface { - isNSRequest_Command() -} - -type NSRequest_Mkdir struct { - Mkdir *NSRequest_MkdirRequest `protobuf:"bytes,21,opt,name=mkdir,proto3,oneof"` -} - -type NSRequest_Rmdir struct { - Rmdir *NSRequest_RmdirRequest `protobuf:"bytes,22,opt,name=rmdir,proto3,oneof"` -} - -type NSRequest_Touch struct { - Touch *NSRequest_TouchRequest `protobuf:"bytes,23,opt,name=touch,proto3,oneof"` -} - -type NSRequest_Unlink struct { - Unlink *NSRequest_UnlinkRequest `protobuf:"bytes,24,opt,name=unlink,proto3,oneof"` -} - -type NSRequest_Rm struct { - Rm *NSRequest_RmRequest `protobuf:"bytes,25,opt,name=rm,proto3,oneof"` -} - -type NSRequest_Rename struct { - Rename *NSRequest_RenameRequest `protobuf:"bytes,26,opt,name=rename,proto3,oneof"` -} - -type NSRequest_Symlink struct { - Symlink *NSRequest_SymlinkRequest `protobuf:"bytes,27,opt,name=symlink,proto3,oneof"` -} - -type NSRequest_Version struct { - Version *NSRequest_VersionRequest `protobuf:"bytes,28,opt,name=version,proto3,oneof"` -} - -type NSRequest_Recycle struct { - Recycle *NSRequest_RecycleRequest `protobuf:"bytes,29,opt,name=recycle,proto3,oneof"` -} - -type NSRequest_Xattr struct { - Xattr *NSRequest_SetXAttrRequest `protobuf:"bytes,30,opt,name=xattr,proto3,oneof"` -} - -type NSRequest_Chown struct { - Chown *NSRequest_ChownRequest `protobuf:"bytes,31,opt,name=chown,proto3,oneof"` -} - -type NSRequest_Chmod struct { - Chmod *NSRequest_ChmodRequest `protobuf:"bytes,32,opt,name=chmod,proto3,oneof"` -} - -type NSRequest_Acl struct { - Acl *NSRequest_AclRequest `protobuf:"bytes,33,opt,name=acl,proto3,oneof"` -} - -type NSRequest_Token struct { - Token *NSRequest_TokenRequest `protobuf:"bytes,34,opt,name=token,proto3,oneof"` -} - -type NSRequest_Quota struct { - Quota *NSRequest_QuotaRequest `protobuf:"bytes,35,opt,name=quota,proto3,oneof"` -} - -type NSRequest_Share struct { - Share *NSRequest_ShareRequest `protobuf:"bytes,36,opt,name=share,proto3,oneof"` -} - -func (*NSRequest_Mkdir) isNSRequest_Command() {} - -func (*NSRequest_Rmdir) isNSRequest_Command() {} - -func (*NSRequest_Touch) isNSRequest_Command() {} - -func (*NSRequest_Unlink) isNSRequest_Command() {} - -func (*NSRequest_Rm) isNSRequest_Command() {} - -func (*NSRequest_Rename) isNSRequest_Command() {} - -func (*NSRequest_Symlink) isNSRequest_Command() {} - -func (*NSRequest_Version) isNSRequest_Command() {} - -func (*NSRequest_Recycle) isNSRequest_Command() {} - -func (*NSRequest_Xattr) isNSRequest_Command() {} - -func (*NSRequest_Chown) isNSRequest_Command() {} - -func (*NSRequest_Chmod) isNSRequest_Command() {} - -func (*NSRequest_Acl) isNSRequest_Command() {} - -func (*NSRequest_Token) isNSRequest_Command() {} - -func (*NSRequest_Quota) isNSRequest_Command() {} - -func (*NSRequest_Share) isNSRequest_Command() {} - -func (m *NSRequest) GetCommand() isNSRequest_Command { - if m != nil { - return m.Command - } - return nil -} - -func (m *NSRequest) GetMkdir() *NSRequest_MkdirRequest { - if x, ok := m.GetCommand().(*NSRequest_Mkdir); ok { - return x.Mkdir - } - return nil -} - -func (m *NSRequest) GetRmdir() *NSRequest_RmdirRequest { - if x, ok := m.GetCommand().(*NSRequest_Rmdir); ok { - return x.Rmdir - } - return nil -} - -func (m *NSRequest) GetTouch() *NSRequest_TouchRequest { - if x, ok := m.GetCommand().(*NSRequest_Touch); ok { - return x.Touch - } - return nil -} - -func (m *NSRequest) GetUnlink() *NSRequest_UnlinkRequest { - if x, ok := m.GetCommand().(*NSRequest_Unlink); ok { - return x.Unlink - } - return nil -} - -func (m *NSRequest) GetRm() *NSRequest_RmRequest { - if x, ok := m.GetCommand().(*NSRequest_Rm); ok { - return x.Rm - } - return nil -} - -func (m *NSRequest) GetRename() *NSRequest_RenameRequest { - if x, ok := m.GetCommand().(*NSRequest_Rename); ok { - return x.Rename - } - return nil -} - -func (m *NSRequest) GetSymlink() *NSRequest_SymlinkRequest { - if x, ok := m.GetCommand().(*NSRequest_Symlink); ok { - return x.Symlink - } - return nil -} - -func (m *NSRequest) GetVersion() *NSRequest_VersionRequest { - if x, ok := m.GetCommand().(*NSRequest_Version); ok { - return x.Version - } - return nil -} - -func (m *NSRequest) GetRecycle() *NSRequest_RecycleRequest { - if x, ok := m.GetCommand().(*NSRequest_Recycle); ok { - return x.Recycle - } - return nil -} - -func (m *NSRequest) GetXattr() *NSRequest_SetXAttrRequest { - if x, ok := m.GetCommand().(*NSRequest_Xattr); ok { - return x.Xattr - } - return nil -} - -func (m *NSRequest) GetChown() *NSRequest_ChownRequest { - if x, ok := m.GetCommand().(*NSRequest_Chown); ok { - return x.Chown - } - return nil -} - -func (m *NSRequest) GetChmod() *NSRequest_ChmodRequest { - if x, ok := m.GetCommand().(*NSRequest_Chmod); ok { - return x.Chmod - } - return nil -} - -func (m *NSRequest) GetAcl() *NSRequest_AclRequest { - if x, ok := m.GetCommand().(*NSRequest_Acl); ok { - return x.Acl - } - return nil -} - -func (m *NSRequest) GetToken() *NSRequest_TokenRequest { - if x, ok := m.GetCommand().(*NSRequest_Token); ok { - return x.Token - } - return nil -} - -func (m *NSRequest) GetQuota() *NSRequest_QuotaRequest { - if x, ok := m.GetCommand().(*NSRequest_Quota); ok { - return x.Quota - } - return nil -} - -func (m *NSRequest) GetShare() *NSRequest_ShareRequest { - if x, ok := m.GetCommand().(*NSRequest_Share); ok { - return x.Share - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*NSRequest) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*NSRequest_Mkdir)(nil), - (*NSRequest_Rmdir)(nil), - (*NSRequest_Touch)(nil), - (*NSRequest_Unlink)(nil), - (*NSRequest_Rm)(nil), - (*NSRequest_Rename)(nil), - (*NSRequest_Symlink)(nil), - (*NSRequest_Version)(nil), - (*NSRequest_Recycle)(nil), - (*NSRequest_Xattr)(nil), - (*NSRequest_Chown)(nil), - (*NSRequest_Chmod)(nil), - (*NSRequest_Acl)(nil), - (*NSRequest_Token)(nil), - (*NSRequest_Quota)(nil), - (*NSRequest_Share)(nil), - } -} - -type NSRequest_MkdirRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Recursive bool `protobuf:"varint,2,opt,name=recursive,proto3" json:"recursive,omitempty"` - Mode int64 `protobuf:"varint,3,opt,name=mode,proto3" json:"mode,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_MkdirRequest) Reset() { *m = NSRequest_MkdirRequest{} } -func (m *NSRequest_MkdirRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_MkdirRequest) ProtoMessage() {} -func (*NSRequest_MkdirRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 0} -} - -func (m *NSRequest_MkdirRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_MkdirRequest.Unmarshal(m, b) -} -func (m *NSRequest_MkdirRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_MkdirRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_MkdirRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_MkdirRequest.Merge(m, src) -} -func (m *NSRequest_MkdirRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_MkdirRequest.Size(m) -} -func (m *NSRequest_MkdirRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_MkdirRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_MkdirRequest proto.InternalMessageInfo - -func (m *NSRequest_MkdirRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_MkdirRequest) GetRecursive() bool { - if m != nil { - return m.Recursive - } - return false -} - -func (m *NSRequest_MkdirRequest) GetMode() int64 { - if m != nil { - return m.Mode - } - return 0 -} - -type NSRequest_RmdirRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_RmdirRequest) Reset() { *m = NSRequest_RmdirRequest{} } -func (m *NSRequest_RmdirRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_RmdirRequest) ProtoMessage() {} -func (*NSRequest_RmdirRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 1} -} - -func (m *NSRequest_RmdirRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_RmdirRequest.Unmarshal(m, b) -} -func (m *NSRequest_RmdirRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_RmdirRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_RmdirRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_RmdirRequest.Merge(m, src) -} -func (m *NSRequest_RmdirRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_RmdirRequest.Size(m) -} -func (m *NSRequest_RmdirRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_RmdirRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_RmdirRequest proto.InternalMessageInfo - -func (m *NSRequest_RmdirRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -type NSRequest_TouchRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_TouchRequest) Reset() { *m = NSRequest_TouchRequest{} } -func (m *NSRequest_TouchRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_TouchRequest) ProtoMessage() {} -func (*NSRequest_TouchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 2} -} - -func (m *NSRequest_TouchRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_TouchRequest.Unmarshal(m, b) -} -func (m *NSRequest_TouchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_TouchRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_TouchRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_TouchRequest.Merge(m, src) -} -func (m *NSRequest_TouchRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_TouchRequest.Size(m) -} -func (m *NSRequest_TouchRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_TouchRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_TouchRequest proto.InternalMessageInfo - -func (m *NSRequest_TouchRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -type NSRequest_UnlinkRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Norecycle bool `protobuf:"varint,3,opt,name=norecycle,proto3" json:"norecycle,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_UnlinkRequest) Reset() { *m = NSRequest_UnlinkRequest{} } -func (m *NSRequest_UnlinkRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_UnlinkRequest) ProtoMessage() {} -func (*NSRequest_UnlinkRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 3} -} - -func (m *NSRequest_UnlinkRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_UnlinkRequest.Unmarshal(m, b) -} -func (m *NSRequest_UnlinkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_UnlinkRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_UnlinkRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_UnlinkRequest.Merge(m, src) -} -func (m *NSRequest_UnlinkRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_UnlinkRequest.Size(m) -} -func (m *NSRequest_UnlinkRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_UnlinkRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_UnlinkRequest proto.InternalMessageInfo - -func (m *NSRequest_UnlinkRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_UnlinkRequest) GetNorecycle() bool { - if m != nil { - return m.Norecycle - } - return false -} - -type NSRequest_RmRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Recursive bool `protobuf:"varint,2,opt,name=recursive,proto3" json:"recursive,omitempty"` - Norecycle bool `protobuf:"varint,3,opt,name=norecycle,proto3" json:"norecycle,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_RmRequest) Reset() { *m = NSRequest_RmRequest{} } -func (m *NSRequest_RmRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_RmRequest) ProtoMessage() {} -func (*NSRequest_RmRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 4} -} - -func (m *NSRequest_RmRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_RmRequest.Unmarshal(m, b) -} -func (m *NSRequest_RmRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_RmRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_RmRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_RmRequest.Merge(m, src) -} -func (m *NSRequest_RmRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_RmRequest.Size(m) -} -func (m *NSRequest_RmRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_RmRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_RmRequest proto.InternalMessageInfo - -func (m *NSRequest_RmRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_RmRequest) GetRecursive() bool { - if m != nil { - return m.Recursive - } - return false -} - -func (m *NSRequest_RmRequest) GetNorecycle() bool { - if m != nil { - return m.Norecycle - } - return false -} - -type NSRequest_RenameRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Target []byte `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_RenameRequest) Reset() { *m = NSRequest_RenameRequest{} } -func (m *NSRequest_RenameRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_RenameRequest) ProtoMessage() {} -func (*NSRequest_RenameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 5} -} - -func (m *NSRequest_RenameRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_RenameRequest.Unmarshal(m, b) -} -func (m *NSRequest_RenameRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_RenameRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_RenameRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_RenameRequest.Merge(m, src) -} -func (m *NSRequest_RenameRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_RenameRequest.Size(m) -} -func (m *NSRequest_RenameRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_RenameRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_RenameRequest proto.InternalMessageInfo - -func (m *NSRequest_RenameRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_RenameRequest) GetTarget() []byte { - if m != nil { - return m.Target - } - return nil -} - -type NSRequest_SymlinkRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Target []byte `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_SymlinkRequest) Reset() { *m = NSRequest_SymlinkRequest{} } -func (m *NSRequest_SymlinkRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_SymlinkRequest) ProtoMessage() {} -func (*NSRequest_SymlinkRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 6} -} - -func (m *NSRequest_SymlinkRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_SymlinkRequest.Unmarshal(m, b) -} -func (m *NSRequest_SymlinkRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_SymlinkRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_SymlinkRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_SymlinkRequest.Merge(m, src) -} -func (m *NSRequest_SymlinkRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_SymlinkRequest.Size(m) -} -func (m *NSRequest_SymlinkRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_SymlinkRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_SymlinkRequest proto.InternalMessageInfo - -func (m *NSRequest_SymlinkRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_SymlinkRequest) GetTarget() []byte { - if m != nil { - return m.Target - } - return nil -} - -type NSRequest_VersionRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Cmd NSRequest_VersionRequest_VERSION_CMD `protobuf:"varint,2,opt,name=cmd,proto3,enum=eos.rpc.NSRequest_VersionRequest_VERSION_CMD" json:"cmd,omitempty"` - Maxversion int32 `protobuf:"varint,3,opt,name=maxversion,proto3" json:"maxversion,omitempty"` - Grabversion string `protobuf:"bytes,4,opt,name=grabversion,proto3" json:"grabversion,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_VersionRequest) Reset() { *m = NSRequest_VersionRequest{} } -func (m *NSRequest_VersionRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_VersionRequest) ProtoMessage() {} -func (*NSRequest_VersionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 7} -} - -func (m *NSRequest_VersionRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_VersionRequest.Unmarshal(m, b) -} -func (m *NSRequest_VersionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_VersionRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_VersionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_VersionRequest.Merge(m, src) -} -func (m *NSRequest_VersionRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_VersionRequest.Size(m) -} -func (m *NSRequest_VersionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_VersionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_VersionRequest proto.InternalMessageInfo - -func (m *NSRequest_VersionRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_VersionRequest) GetCmd() NSRequest_VersionRequest_VERSION_CMD { - if m != nil { - return m.Cmd - } - return NSRequest_VersionRequest_CREATE -} - -func (m *NSRequest_VersionRequest) GetMaxversion() int32 { - if m != nil { - return m.Maxversion - } - return 0 -} - -func (m *NSRequest_VersionRequest) GetGrabversion() string { - if m != nil { - return m.Grabversion - } - return "" -} - -type NSRequest_RecycleRequest struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Cmd NSRequest_RecycleRequest_RECYCLE_CMD `protobuf:"varint,2,opt,name=cmd,proto3,enum=eos.rpc.NSRequest_RecycleRequest_RECYCLE_CMD" json:"cmd,omitempty"` - Restoreflag *NSRequest_RecycleRequest_RestoreFlags `protobuf:"bytes,3,opt,name=restoreflag,proto3" json:"restoreflag,omitempty"` - Purgedate *NSRequest_RecycleRequest_PurgeDate `protobuf:"bytes,4,opt,name=purgedate,proto3" json:"purgedate,omitempty"` - Listflag *NSRequest_RecycleRequest_ListFlags `protobuf:"bytes,5,opt,name=listflag,proto3" json:"listflag,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_RecycleRequest) Reset() { *m = NSRequest_RecycleRequest{} } -func (m *NSRequest_RecycleRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_RecycleRequest) ProtoMessage() {} -func (*NSRequest_RecycleRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 8} -} - -func (m *NSRequest_RecycleRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_RecycleRequest.Unmarshal(m, b) -} -func (m *NSRequest_RecycleRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_RecycleRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_RecycleRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_RecycleRequest.Merge(m, src) -} -func (m *NSRequest_RecycleRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_RecycleRequest.Size(m) -} -func (m *NSRequest_RecycleRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_RecycleRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_RecycleRequest proto.InternalMessageInfo - -func (m *NSRequest_RecycleRequest) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - -func (m *NSRequest_RecycleRequest) GetCmd() NSRequest_RecycleRequest_RECYCLE_CMD { - if m != nil { - return m.Cmd - } - return NSRequest_RecycleRequest_RESTORE -} - -func (m *NSRequest_RecycleRequest) GetRestoreflag() *NSRequest_RecycleRequest_RestoreFlags { - if m != nil { - return m.Restoreflag - } - return nil -} - -func (m *NSRequest_RecycleRequest) GetPurgedate() *NSRequest_RecycleRequest_PurgeDate { - if m != nil { - return m.Purgedate - } - return nil -} - -func (m *NSRequest_RecycleRequest) GetListflag() *NSRequest_RecycleRequest_ListFlags { - if m != nil { - return m.Listflag - } - return nil -} - -type NSRequest_RecycleRequest_RestoreFlags struct { - Force bool `protobuf:"varint,1,opt,name=force,proto3" json:"force,omitempty"` - Mkpath bool `protobuf:"varint,2,opt,name=mkpath,proto3" json:"mkpath,omitempty"` - Versions bool `protobuf:"varint,3,opt,name=versions,proto3" json:"versions,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_RecycleRequest_RestoreFlags) Reset() { *m = NSRequest_RecycleRequest_RestoreFlags{} } -func (m *NSRequest_RecycleRequest_RestoreFlags) String() string { return proto.CompactTextString(m) } -func (*NSRequest_RecycleRequest_RestoreFlags) ProtoMessage() {} -func (*NSRequest_RecycleRequest_RestoreFlags) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 8, 0} -} - -func (m *NSRequest_RecycleRequest_RestoreFlags) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_RecycleRequest_RestoreFlags.Unmarshal(m, b) -} -func (m *NSRequest_RecycleRequest_RestoreFlags) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_RecycleRequest_RestoreFlags.Marshal(b, m, deterministic) -} -func (m *NSRequest_RecycleRequest_RestoreFlags) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_RecycleRequest_RestoreFlags.Merge(m, src) -} -func (m *NSRequest_RecycleRequest_RestoreFlags) XXX_Size() int { - return xxx_messageInfo_NSRequest_RecycleRequest_RestoreFlags.Size(m) -} -func (m *NSRequest_RecycleRequest_RestoreFlags) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_RecycleRequest_RestoreFlags.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_RecycleRequest_RestoreFlags proto.InternalMessageInfo - -func (m *NSRequest_RecycleRequest_RestoreFlags) GetForce() bool { - if m != nil { - return m.Force - } - return false -} - -func (m *NSRequest_RecycleRequest_RestoreFlags) GetMkpath() bool { - if m != nil { - return m.Mkpath - } - return false -} - -func (m *NSRequest_RecycleRequest_RestoreFlags) GetVersions() bool { - if m != nil { - return m.Versions - } - return false -} - -type NSRequest_RecycleRequest_PurgeDate struct { - Year int32 `protobuf:"varint,1,opt,name=year,proto3" json:"year,omitempty"` - Month int32 `protobuf:"varint,2,opt,name=month,proto3" json:"month,omitempty"` - Day int32 `protobuf:"varint,3,opt,name=day,proto3" json:"day,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_RecycleRequest_PurgeDate) Reset() { *m = NSRequest_RecycleRequest_PurgeDate{} } -func (m *NSRequest_RecycleRequest_PurgeDate) String() string { return proto.CompactTextString(m) } -func (*NSRequest_RecycleRequest_PurgeDate) ProtoMessage() {} -func (*NSRequest_RecycleRequest_PurgeDate) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 8, 1} -} - -func (m *NSRequest_RecycleRequest_PurgeDate) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_RecycleRequest_PurgeDate.Unmarshal(m, b) -} -func (m *NSRequest_RecycleRequest_PurgeDate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_RecycleRequest_PurgeDate.Marshal(b, m, deterministic) -} -func (m *NSRequest_RecycleRequest_PurgeDate) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_RecycleRequest_PurgeDate.Merge(m, src) -} -func (m *NSRequest_RecycleRequest_PurgeDate) XXX_Size() int { - return xxx_messageInfo_NSRequest_RecycleRequest_PurgeDate.Size(m) -} -func (m *NSRequest_RecycleRequest_PurgeDate) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_RecycleRequest_PurgeDate.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_RecycleRequest_PurgeDate proto.InternalMessageInfo - -func (m *NSRequest_RecycleRequest_PurgeDate) GetYear() int32 { - if m != nil { - return m.Year - } - return 0 -} - -func (m *NSRequest_RecycleRequest_PurgeDate) GetMonth() int32 { - if m != nil { - return m.Month - } - return 0 -} - -func (m *NSRequest_RecycleRequest_PurgeDate) GetDay() int32 { - if m != nil { - return m.Day - } - return 0 -} - -type NSRequest_RecycleRequest_ListFlags struct { - Maxentries int32 `protobuf:"varint,1,opt,name=maxentries,proto3" json:"maxentries,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_RecycleRequest_ListFlags) Reset() { *m = NSRequest_RecycleRequest_ListFlags{} } -func (m *NSRequest_RecycleRequest_ListFlags) String() string { return proto.CompactTextString(m) } -func (*NSRequest_RecycleRequest_ListFlags) ProtoMessage() {} -func (*NSRequest_RecycleRequest_ListFlags) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 8, 2} -} - -func (m *NSRequest_RecycleRequest_ListFlags) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_RecycleRequest_ListFlags.Unmarshal(m, b) -} -func (m *NSRequest_RecycleRequest_ListFlags) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_RecycleRequest_ListFlags.Marshal(b, m, deterministic) -} -func (m *NSRequest_RecycleRequest_ListFlags) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_RecycleRequest_ListFlags.Merge(m, src) -} -func (m *NSRequest_RecycleRequest_ListFlags) XXX_Size() int { - return xxx_messageInfo_NSRequest_RecycleRequest_ListFlags.Size(m) -} -func (m *NSRequest_RecycleRequest_ListFlags) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_RecycleRequest_ListFlags.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_RecycleRequest_ListFlags proto.InternalMessageInfo - -func (m *NSRequest_RecycleRequest_ListFlags) GetMaxentries() int32 { - if m != nil { - return m.Maxentries - } - return 0 -} - -type NSRequest_SetXAttrRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Xattrs map[string][]byte `protobuf:"bytes,2,rep,name=xattrs,proto3" json:"xattrs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Recursive bool `protobuf:"varint,3,opt,name=recursive,proto3" json:"recursive,omitempty"` - Keystodelete []string `protobuf:"bytes,4,rep,name=keystodelete,proto3" json:"keystodelete,omitempty"` - Create bool `protobuf:"varint,5,opt,name=create,proto3" json:"create,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_SetXAttrRequest) Reset() { *m = NSRequest_SetXAttrRequest{} } -func (m *NSRequest_SetXAttrRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_SetXAttrRequest) ProtoMessage() {} -func (*NSRequest_SetXAttrRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 9} -} - -func (m *NSRequest_SetXAttrRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_SetXAttrRequest.Unmarshal(m, b) -} -func (m *NSRequest_SetXAttrRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_SetXAttrRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_SetXAttrRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_SetXAttrRequest.Merge(m, src) -} -func (m *NSRequest_SetXAttrRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_SetXAttrRequest.Size(m) -} -func (m *NSRequest_SetXAttrRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_SetXAttrRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_SetXAttrRequest proto.InternalMessageInfo - -func (m *NSRequest_SetXAttrRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_SetXAttrRequest) GetXattrs() map[string][]byte { - if m != nil { - return m.Xattrs - } - return nil -} - -func (m *NSRequest_SetXAttrRequest) GetRecursive() bool { - if m != nil { - return m.Recursive - } - return false -} - -func (m *NSRequest_SetXAttrRequest) GetKeystodelete() []string { - if m != nil { - return m.Keystodelete - } - return nil -} - -func (m *NSRequest_SetXAttrRequest) GetCreate() bool { - if m != nil { - return m.Create - } - return false -} - -type NSRequest_ChownRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Owner *RoleId `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_ChownRequest) Reset() { *m = NSRequest_ChownRequest{} } -func (m *NSRequest_ChownRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_ChownRequest) ProtoMessage() {} -func (*NSRequest_ChownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 10} -} - -func (m *NSRequest_ChownRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_ChownRequest.Unmarshal(m, b) -} -func (m *NSRequest_ChownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_ChownRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_ChownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_ChownRequest.Merge(m, src) -} -func (m *NSRequest_ChownRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_ChownRequest.Size(m) -} -func (m *NSRequest_ChownRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_ChownRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_ChownRequest proto.InternalMessageInfo - -func (m *NSRequest_ChownRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_ChownRequest) GetOwner() *RoleId { - if m != nil { - return m.Owner - } - return nil -} - -type NSRequest_ChmodRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Mode int64 `protobuf:"varint,2,opt,name=mode,proto3" json:"mode,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_ChmodRequest) Reset() { *m = NSRequest_ChmodRequest{} } -func (m *NSRequest_ChmodRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_ChmodRequest) ProtoMessage() {} -func (*NSRequest_ChmodRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 11} -} - -func (m *NSRequest_ChmodRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_ChmodRequest.Unmarshal(m, b) -} -func (m *NSRequest_ChmodRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_ChmodRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_ChmodRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_ChmodRequest.Merge(m, src) -} -func (m *NSRequest_ChmodRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_ChmodRequest.Size(m) -} -func (m *NSRequest_ChmodRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_ChmodRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_ChmodRequest proto.InternalMessageInfo - -func (m *NSRequest_ChmodRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_ChmodRequest) GetMode() int64 { - if m != nil { - return m.Mode - } - return 0 -} - -type NSRequest_AclRequest struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Cmd NSRequest_AclRequest_ACL_COMMAND `protobuf:"varint,2,opt,name=cmd,proto3,enum=eos.rpc.NSRequest_AclRequest_ACL_COMMAND" json:"cmd,omitempty"` - Recursive bool `protobuf:"varint,3,opt,name=recursive,proto3" json:"recursive,omitempty"` - Type NSRequest_AclRequest_ACL_TYPE `protobuf:"varint,4,opt,name=type,proto3,enum=eos.rpc.NSRequest_AclRequest_ACL_TYPE" json:"type,omitempty"` - Rule string `protobuf:"bytes,5,opt,name=rule,proto3" json:"rule,omitempty"` - Position uint32 `protobuf:"varint,6,opt,name=position,proto3" json:"position,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_AclRequest) Reset() { *m = NSRequest_AclRequest{} } -func (m *NSRequest_AclRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_AclRequest) ProtoMessage() {} -func (*NSRequest_AclRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 12} -} - -func (m *NSRequest_AclRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_AclRequest.Unmarshal(m, b) -} -func (m *NSRequest_AclRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_AclRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_AclRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_AclRequest.Merge(m, src) -} -func (m *NSRequest_AclRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_AclRequest.Size(m) -} -func (m *NSRequest_AclRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_AclRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_AclRequest proto.InternalMessageInfo - -func (m *NSRequest_AclRequest) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_AclRequest) GetCmd() NSRequest_AclRequest_ACL_COMMAND { - if m != nil { - return m.Cmd - } - return NSRequest_AclRequest_NONE -} - -func (m *NSRequest_AclRequest) GetRecursive() bool { - if m != nil { - return m.Recursive - } - return false -} - -func (m *NSRequest_AclRequest) GetType() NSRequest_AclRequest_ACL_TYPE { - if m != nil { - return m.Type - } - return NSRequest_AclRequest_USER_ACL -} - -func (m *NSRequest_AclRequest) GetRule() string { - if m != nil { - return m.Rule - } - return "" -} - -func (m *NSRequest_AclRequest) GetPosition() uint32 { - if m != nil { - return m.Position - } - return 0 -} - -type NSRequest_TokenRequest struct { - Token *ShareToken `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_TokenRequest) Reset() { *m = NSRequest_TokenRequest{} } -func (m *NSRequest_TokenRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_TokenRequest) ProtoMessage() {} -func (*NSRequest_TokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 13} -} - -func (m *NSRequest_TokenRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_TokenRequest.Unmarshal(m, b) -} -func (m *NSRequest_TokenRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_TokenRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_TokenRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_TokenRequest.Merge(m, src) -} -func (m *NSRequest_TokenRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_TokenRequest.Size(m) -} -func (m *NSRequest_TokenRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_TokenRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_TokenRequest proto.InternalMessageInfo - -func (m *NSRequest_TokenRequest) GetToken() *ShareToken { - if m != nil { - return m.Token - } - return nil -} - -type NSRequest_QuotaRequest struct { - Path []byte `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - Id *RoleId `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - Op QUOTAOP `protobuf:"varint,3,opt,name=op,proto3,enum=eos.rpc.QUOTAOP" json:"op,omitempty"` - Maxfiles uint64 `protobuf:"varint,4,opt,name=maxfiles,proto3" json:"maxfiles,omitempty"` - Maxbytes uint64 `protobuf:"varint,5,opt,name=maxbytes,proto3" json:"maxbytes,omitempty"` - Entry QUOTAENTRY `protobuf:"varint,6,opt,name=entry,proto3,enum=eos.rpc.QUOTAENTRY" json:"entry,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_QuotaRequest) Reset() { *m = NSRequest_QuotaRequest{} } -func (m *NSRequest_QuotaRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_QuotaRequest) ProtoMessage() {} -func (*NSRequest_QuotaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 14} -} - -func (m *NSRequest_QuotaRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_QuotaRequest.Unmarshal(m, b) -} -func (m *NSRequest_QuotaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_QuotaRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_QuotaRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_QuotaRequest.Merge(m, src) -} -func (m *NSRequest_QuotaRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_QuotaRequest.Size(m) -} -func (m *NSRequest_QuotaRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_QuotaRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_QuotaRequest proto.InternalMessageInfo - -func (m *NSRequest_QuotaRequest) GetPath() []byte { - if m != nil { - return m.Path - } - return nil -} - -func (m *NSRequest_QuotaRequest) GetId() *RoleId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSRequest_QuotaRequest) GetOp() QUOTAOP { - if m != nil { - return m.Op - } - return QUOTAOP_GET -} - -func (m *NSRequest_QuotaRequest) GetMaxfiles() uint64 { - if m != nil { - return m.Maxfiles - } - return 0 -} - -func (m *NSRequest_QuotaRequest) GetMaxbytes() uint64 { - if m != nil { - return m.Maxbytes - } - return 0 -} - -func (m *NSRequest_QuotaRequest) GetEntry() QUOTAENTRY { - if m != nil { - return m.Entry - } - return QUOTAENTRY_NONE -} - -type NSRequest_ShareRequest struct { - // Types that are valid to be assigned to Subcmd: - // - // *NSRequest_ShareRequest_Ls - // *NSRequest_ShareRequest_Op - Subcmd isNSRequest_ShareRequest_Subcmd `protobuf_oneof:"subcmd"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_ShareRequest) Reset() { *m = NSRequest_ShareRequest{} } -func (m *NSRequest_ShareRequest) String() string { return proto.CompactTextString(m) } -func (*NSRequest_ShareRequest) ProtoMessage() {} -func (*NSRequest_ShareRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 15} -} - -func (m *NSRequest_ShareRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_ShareRequest.Unmarshal(m, b) -} -func (m *NSRequest_ShareRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_ShareRequest.Marshal(b, m, deterministic) -} -func (m *NSRequest_ShareRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_ShareRequest.Merge(m, src) -} -func (m *NSRequest_ShareRequest) XXX_Size() int { - return xxx_messageInfo_NSRequest_ShareRequest.Size(m) -} -func (m *NSRequest_ShareRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_ShareRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_ShareRequest proto.InternalMessageInfo - -type isNSRequest_ShareRequest_Subcmd interface { - isNSRequest_ShareRequest_Subcmd() -} - -type NSRequest_ShareRequest_Ls struct { - Ls *NSRequest_ShareRequest_LsShare `protobuf:"bytes,1,opt,name=ls,proto3,oneof"` -} - -type NSRequest_ShareRequest_Op struct { - Op *NSRequest_ShareRequest_OperateShare `protobuf:"bytes,2,opt,name=op,proto3,oneof"` -} - -func (*NSRequest_ShareRequest_Ls) isNSRequest_ShareRequest_Subcmd() {} - -func (*NSRequest_ShareRequest_Op) isNSRequest_ShareRequest_Subcmd() {} - -func (m *NSRequest_ShareRequest) GetSubcmd() isNSRequest_ShareRequest_Subcmd { - if m != nil { - return m.Subcmd - } - return nil -} - -func (m *NSRequest_ShareRequest) GetLs() *NSRequest_ShareRequest_LsShare { - if x, ok := m.GetSubcmd().(*NSRequest_ShareRequest_Ls); ok { - return x.Ls - } - return nil -} - -func (m *NSRequest_ShareRequest) GetOp() *NSRequest_ShareRequest_OperateShare { - if x, ok := m.GetSubcmd().(*NSRequest_ShareRequest_Op); ok { - return x.Op - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*NSRequest_ShareRequest) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*NSRequest_ShareRequest_Ls)(nil), - (*NSRequest_ShareRequest_Op)(nil), - } -} - -type NSRequest_ShareRequest_LsShare struct { - Outformat NSRequest_ShareRequest_LsShare_OutFormat `protobuf:"varint,1,opt,name=outformat,proto3,enum=eos.rpc.NSRequest_ShareRequest_LsShare_OutFormat" json:"outformat,omitempty"` - Selection string `protobuf:"bytes,2,opt,name=selection,proto3" json:"selection,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_ShareRequest_LsShare) Reset() { *m = NSRequest_ShareRequest_LsShare{} } -func (m *NSRequest_ShareRequest_LsShare) String() string { return proto.CompactTextString(m) } -func (*NSRequest_ShareRequest_LsShare) ProtoMessage() {} -func (*NSRequest_ShareRequest_LsShare) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 15, 0} -} - -func (m *NSRequest_ShareRequest_LsShare) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_ShareRequest_LsShare.Unmarshal(m, b) -} -func (m *NSRequest_ShareRequest_LsShare) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_ShareRequest_LsShare.Marshal(b, m, deterministic) -} -func (m *NSRequest_ShareRequest_LsShare) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_ShareRequest_LsShare.Merge(m, src) -} -func (m *NSRequest_ShareRequest_LsShare) XXX_Size() int { - return xxx_messageInfo_NSRequest_ShareRequest_LsShare.Size(m) -} -func (m *NSRequest_ShareRequest_LsShare) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_ShareRequest_LsShare.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_ShareRequest_LsShare proto.InternalMessageInfo - -func (m *NSRequest_ShareRequest_LsShare) GetOutformat() NSRequest_ShareRequest_LsShare_OutFormat { - if m != nil { - return m.Outformat - } - return NSRequest_ShareRequest_LsShare_NONE -} - -func (m *NSRequest_ShareRequest_LsShare) GetSelection() string { - if m != nil { - return m.Selection - } - return "" -} - -type NSRequest_ShareRequest_OperateShare struct { - Op NSRequest_ShareRequest_OperateShare_Op `protobuf:"varint,1,opt,name=op,proto3,enum=eos.rpc.NSRequest_ShareRequest_OperateShare_Op" json:"op,omitempty"` - Share string `protobuf:"bytes,2,opt,name=share,proto3" json:"share,omitempty"` - Acl string `protobuf:"bytes,3,opt,name=acl,proto3" json:"acl,omitempty"` - Path string `protobuf:"bytes,4,opt,name=path,proto3" json:"path,omitempty"` - User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` - Group string `protobuf:"bytes,6,opt,name=group,proto3" json:"group,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSRequest_ShareRequest_OperateShare) Reset() { *m = NSRequest_ShareRequest_OperateShare{} } -func (m *NSRequest_ShareRequest_OperateShare) String() string { return proto.CompactTextString(m) } -func (*NSRequest_ShareRequest_OperateShare) ProtoMessage() {} -func (*NSRequest_ShareRequest_OperateShare) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{20, 15, 1} -} - -func (m *NSRequest_ShareRequest_OperateShare) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSRequest_ShareRequest_OperateShare.Unmarshal(m, b) -} -func (m *NSRequest_ShareRequest_OperateShare) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSRequest_ShareRequest_OperateShare.Marshal(b, m, deterministic) -} -func (m *NSRequest_ShareRequest_OperateShare) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSRequest_ShareRequest_OperateShare.Merge(m, src) -} -func (m *NSRequest_ShareRequest_OperateShare) XXX_Size() int { - return xxx_messageInfo_NSRequest_ShareRequest_OperateShare.Size(m) -} -func (m *NSRequest_ShareRequest_OperateShare) XXX_DiscardUnknown() { - xxx_messageInfo_NSRequest_ShareRequest_OperateShare.DiscardUnknown(m) -} - -var xxx_messageInfo_NSRequest_ShareRequest_OperateShare proto.InternalMessageInfo - -func (m *NSRequest_ShareRequest_OperateShare) GetOp() NSRequest_ShareRequest_OperateShare_Op { - if m != nil { - return m.Op - } - return NSRequest_ShareRequest_OperateShare_CREATE -} - -func (m *NSRequest_ShareRequest_OperateShare) GetShare() string { - if m != nil { - return m.Share - } - return "" -} - -func (m *NSRequest_ShareRequest_OperateShare) GetAcl() string { - if m != nil { - return m.Acl - } - return "" -} - -func (m *NSRequest_ShareRequest_OperateShare) GetPath() string { - if m != nil { - return m.Path - } - return "" -} - -func (m *NSRequest_ShareRequest_OperateShare) GetUser() string { - if m != nil { - return m.User - } - return "" -} - -func (m *NSRequest_ShareRequest_OperateShare) GetGroup() string { - if m != nil { - return m.Group - } - return "" -} - -type NSResponse struct { - Error *NSResponse_ErrorResponse `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Version *NSResponse_VersionResponse `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` - Recycle *NSResponse_RecycleResponse `protobuf:"bytes,3,opt,name=recycle,proto3" json:"recycle,omitempty"` - Acl *NSResponse_AclResponse `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,omitempty"` - Quota *NSResponse_QuotaResponse `protobuf:"bytes,5,opt,name=quota,proto3" json:"quota,omitempty"` - Share *NSResponse_ShareResponse `protobuf:"bytes,6,opt,name=share,proto3" json:"share,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse) Reset() { *m = NSResponse{} } -func (m *NSResponse) String() string { return proto.CompactTextString(m) } -func (*NSResponse) ProtoMessage() {} -func (*NSResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21} -} - -func (m *NSResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse.Unmarshal(m, b) -} -func (m *NSResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse.Marshal(b, m, deterministic) -} -func (m *NSResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse.Merge(m, src) -} -func (m *NSResponse) XXX_Size() int { - return xxx_messageInfo_NSResponse.Size(m) -} -func (m *NSResponse) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse proto.InternalMessageInfo - -func (m *NSResponse) GetError() *NSResponse_ErrorResponse { - if m != nil { - return m.Error - } - return nil -} - -func (m *NSResponse) GetVersion() *NSResponse_VersionResponse { - if m != nil { - return m.Version - } - return nil -} - -func (m *NSResponse) GetRecycle() *NSResponse_RecycleResponse { - if m != nil { - return m.Recycle - } - return nil -} - -func (m *NSResponse) GetAcl() *NSResponse_AclResponse { - if m != nil { - return m.Acl - } - return nil -} - -func (m *NSResponse) GetQuota() *NSResponse_QuotaResponse { - if m != nil { - return m.Quota - } - return nil -} - -func (m *NSResponse) GetShare() *NSResponse_ShareResponse { - if m != nil { - return m.Share - } - return nil -} - -type NSResponse_ErrorResponse struct { - Code int64 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_ErrorResponse) Reset() { *m = NSResponse_ErrorResponse{} } -func (m *NSResponse_ErrorResponse) String() string { return proto.CompactTextString(m) } -func (*NSResponse_ErrorResponse) ProtoMessage() {} -func (*NSResponse_ErrorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 0} -} - -func (m *NSResponse_ErrorResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_ErrorResponse.Unmarshal(m, b) -} -func (m *NSResponse_ErrorResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_ErrorResponse.Marshal(b, m, deterministic) -} -func (m *NSResponse_ErrorResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_ErrorResponse.Merge(m, src) -} -func (m *NSResponse_ErrorResponse) XXX_Size() int { - return xxx_messageInfo_NSResponse_ErrorResponse.Size(m) -} -func (m *NSResponse_ErrorResponse) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_ErrorResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_ErrorResponse proto.InternalMessageInfo - -func (m *NSResponse_ErrorResponse) GetCode() int64 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *NSResponse_ErrorResponse) GetMsg() string { - if m != nil { - return m.Msg - } - return "" -} - -type NSResponse_VersionResponse struct { - Code int64 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` - Versions []*NSResponse_VersionResponse_VersionInfo `protobuf:"bytes,3,rep,name=versions,proto3" json:"versions,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_VersionResponse) Reset() { *m = NSResponse_VersionResponse{} } -func (m *NSResponse_VersionResponse) String() string { return proto.CompactTextString(m) } -func (*NSResponse_VersionResponse) ProtoMessage() {} -func (*NSResponse_VersionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 1} -} - -func (m *NSResponse_VersionResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_VersionResponse.Unmarshal(m, b) -} -func (m *NSResponse_VersionResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_VersionResponse.Marshal(b, m, deterministic) -} -func (m *NSResponse_VersionResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_VersionResponse.Merge(m, src) -} -func (m *NSResponse_VersionResponse) XXX_Size() int { - return xxx_messageInfo_NSResponse_VersionResponse.Size(m) -} -func (m *NSResponse_VersionResponse) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_VersionResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_VersionResponse proto.InternalMessageInfo - -func (m *NSResponse_VersionResponse) GetCode() int64 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *NSResponse_VersionResponse) GetMsg() string { - if m != nil { - return m.Msg - } - return "" -} - -func (m *NSResponse_VersionResponse) GetVersions() []*NSResponse_VersionResponse_VersionInfo { - if m != nil { - return m.Versions - } - return nil -} - -type NSResponse_VersionResponse_VersionInfo struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Mtime *Time `protobuf:"bytes,2,opt,name=mtime,proto3" json:"mtime,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_VersionResponse_VersionInfo) Reset() { - *m = NSResponse_VersionResponse_VersionInfo{} -} -func (m *NSResponse_VersionResponse_VersionInfo) String() string { return proto.CompactTextString(m) } -func (*NSResponse_VersionResponse_VersionInfo) ProtoMessage() {} -func (*NSResponse_VersionResponse_VersionInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 1, 0} -} - -func (m *NSResponse_VersionResponse_VersionInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_VersionResponse_VersionInfo.Unmarshal(m, b) -} -func (m *NSResponse_VersionResponse_VersionInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_VersionResponse_VersionInfo.Marshal(b, m, deterministic) -} -func (m *NSResponse_VersionResponse_VersionInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_VersionResponse_VersionInfo.Merge(m, src) -} -func (m *NSResponse_VersionResponse_VersionInfo) XXX_Size() int { - return xxx_messageInfo_NSResponse_VersionResponse_VersionInfo.Size(m) -} -func (m *NSResponse_VersionResponse_VersionInfo) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_VersionResponse_VersionInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_VersionResponse_VersionInfo proto.InternalMessageInfo - -func (m *NSResponse_VersionResponse_VersionInfo) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSResponse_VersionResponse_VersionInfo) GetMtime() *Time { - if m != nil { - return m.Mtime - } - return nil -} - -type NSResponse_RecycleResponse struct { - Code int64 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` - Recycles []*NSResponse_RecycleResponse_RecycleInfo `protobuf:"bytes,3,rep,name=recycles,proto3" json:"recycles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_RecycleResponse) Reset() { *m = NSResponse_RecycleResponse{} } -func (m *NSResponse_RecycleResponse) String() string { return proto.CompactTextString(m) } -func (*NSResponse_RecycleResponse) ProtoMessage() {} -func (*NSResponse_RecycleResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 2} -} - -func (m *NSResponse_RecycleResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_RecycleResponse.Unmarshal(m, b) -} -func (m *NSResponse_RecycleResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_RecycleResponse.Marshal(b, m, deterministic) -} -func (m *NSResponse_RecycleResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_RecycleResponse.Merge(m, src) -} -func (m *NSResponse_RecycleResponse) XXX_Size() int { - return xxx_messageInfo_NSResponse_RecycleResponse.Size(m) -} -func (m *NSResponse_RecycleResponse) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_RecycleResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_RecycleResponse proto.InternalMessageInfo - -func (m *NSResponse_RecycleResponse) GetCode() int64 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *NSResponse_RecycleResponse) GetMsg() string { - if m != nil { - return m.Msg - } - return "" -} - -func (m *NSResponse_RecycleResponse) GetRecycles() []*NSResponse_RecycleResponse_RecycleInfo { - if m != nil { - return m.Recycles - } - return nil -} - -type NSResponse_RecycleResponse_RecycleInfo struct { - Id *MDId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Owner *RoleId `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` - Dtime *Time `protobuf:"bytes,3,opt,name=dtime,proto3" json:"dtime,omitempty"` - Size uint64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` - Type NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE `protobuf:"varint,5,opt,name=type,proto3,enum=eos.rpc.NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE" json:"type,omitempty"` - Key string `protobuf:"bytes,6,opt,name=key,proto3" json:"key,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_RecycleResponse_RecycleInfo) Reset() { - *m = NSResponse_RecycleResponse_RecycleInfo{} -} -func (m *NSResponse_RecycleResponse_RecycleInfo) String() string { return proto.CompactTextString(m) } -func (*NSResponse_RecycleResponse_RecycleInfo) ProtoMessage() {} -func (*NSResponse_RecycleResponse_RecycleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 2, 0} -} - -func (m *NSResponse_RecycleResponse_RecycleInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_RecycleResponse_RecycleInfo.Unmarshal(m, b) -} -func (m *NSResponse_RecycleResponse_RecycleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_RecycleResponse_RecycleInfo.Marshal(b, m, deterministic) -} -func (m *NSResponse_RecycleResponse_RecycleInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_RecycleResponse_RecycleInfo.Merge(m, src) -} -func (m *NSResponse_RecycleResponse_RecycleInfo) XXX_Size() int { - return xxx_messageInfo_NSResponse_RecycleResponse_RecycleInfo.Size(m) -} -func (m *NSResponse_RecycleResponse_RecycleInfo) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_RecycleResponse_RecycleInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_RecycleResponse_RecycleInfo proto.InternalMessageInfo - -func (m *NSResponse_RecycleResponse_RecycleInfo) GetId() *MDId { - if m != nil { - return m.Id - } - return nil -} - -func (m *NSResponse_RecycleResponse_RecycleInfo) GetOwner() *RoleId { - if m != nil { - return m.Owner - } - return nil -} - -func (m *NSResponse_RecycleResponse_RecycleInfo) GetDtime() *Time { - if m != nil { - return m.Dtime - } - return nil -} - -func (m *NSResponse_RecycleResponse_RecycleInfo) GetSize() uint64 { - if m != nil { - return m.Size - } - return 0 -} - -func (m *NSResponse_RecycleResponse_RecycleInfo) GetType() NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE { - if m != nil { - return m.Type - } - return NSResponse_RecycleResponse_RecycleInfo_FILE -} - -func (m *NSResponse_RecycleResponse_RecycleInfo) GetKey() string { - if m != nil { - return m.Key - } - return "" -} - -type NSResponse_AclResponse struct { - Code int64 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` - Rule string `protobuf:"bytes,3,opt,name=rule,proto3" json:"rule,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_AclResponse) Reset() { *m = NSResponse_AclResponse{} } -func (m *NSResponse_AclResponse) String() string { return proto.CompactTextString(m) } -func (*NSResponse_AclResponse) ProtoMessage() {} -func (*NSResponse_AclResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 3} -} - -func (m *NSResponse_AclResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_AclResponse.Unmarshal(m, b) -} -func (m *NSResponse_AclResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_AclResponse.Marshal(b, m, deterministic) -} -func (m *NSResponse_AclResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_AclResponse.Merge(m, src) -} -func (m *NSResponse_AclResponse) XXX_Size() int { - return xxx_messageInfo_NSResponse_AclResponse.Size(m) -} -func (m *NSResponse_AclResponse) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_AclResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_AclResponse proto.InternalMessageInfo - -func (m *NSResponse_AclResponse) GetCode() int64 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *NSResponse_AclResponse) GetMsg() string { - if m != nil { - return m.Msg - } - return "" -} - -func (m *NSResponse_AclResponse) GetRule() string { - if m != nil { - return m.Rule - } - return "" -} - -type NSResponse_QuotaResponse struct { - Code int64 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` - Quotanode []*QuotaProto `protobuf:"bytes,3,rep,name=quotanode,proto3" json:"quotanode,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_QuotaResponse) Reset() { *m = NSResponse_QuotaResponse{} } -func (m *NSResponse_QuotaResponse) String() string { return proto.CompactTextString(m) } -func (*NSResponse_QuotaResponse) ProtoMessage() {} -func (*NSResponse_QuotaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 4} -} - -func (m *NSResponse_QuotaResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_QuotaResponse.Unmarshal(m, b) -} -func (m *NSResponse_QuotaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_QuotaResponse.Marshal(b, m, deterministic) -} -func (m *NSResponse_QuotaResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_QuotaResponse.Merge(m, src) -} -func (m *NSResponse_QuotaResponse) XXX_Size() int { - return xxx_messageInfo_NSResponse_QuotaResponse.Size(m) -} -func (m *NSResponse_QuotaResponse) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_QuotaResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_QuotaResponse proto.InternalMessageInfo - -func (m *NSResponse_QuotaResponse) GetCode() int64 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *NSResponse_QuotaResponse) GetMsg() string { - if m != nil { - return m.Msg - } - return "" -} - -func (m *NSResponse_QuotaResponse) GetQuotanode() []*QuotaProto { - if m != nil { - return m.Quotanode - } - return nil -} - -type NSResponse_ShareInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Root string `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"` - Rule string `protobuf:"bytes,3,opt,name=rule,proto3" json:"rule,omitempty"` - Uid uint64 `protobuf:"varint,4,opt,name=uid,proto3" json:"uid,omitempty"` - Nshared uint64 `protobuf:"varint,5,opt,name=nshared,proto3" json:"nshared,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_ShareInfo) Reset() { *m = NSResponse_ShareInfo{} } -func (m *NSResponse_ShareInfo) String() string { return proto.CompactTextString(m) } -func (*NSResponse_ShareInfo) ProtoMessage() {} -func (*NSResponse_ShareInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 5} -} - -func (m *NSResponse_ShareInfo) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_ShareInfo.Unmarshal(m, b) -} -func (m *NSResponse_ShareInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_ShareInfo.Marshal(b, m, deterministic) -} -func (m *NSResponse_ShareInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_ShareInfo.Merge(m, src) -} -func (m *NSResponse_ShareInfo) XXX_Size() int { - return xxx_messageInfo_NSResponse_ShareInfo.Size(m) -} -func (m *NSResponse_ShareInfo) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_ShareInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_ShareInfo proto.InternalMessageInfo - -func (m *NSResponse_ShareInfo) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NSResponse_ShareInfo) GetRoot() string { - if m != nil { - return m.Root - } - return "" -} - -func (m *NSResponse_ShareInfo) GetRule() string { - if m != nil { - return m.Rule - } - return "" -} - -func (m *NSResponse_ShareInfo) GetUid() uint64 { - if m != nil { - return m.Uid - } - return 0 -} - -func (m *NSResponse_ShareInfo) GetNshared() uint64 { - if m != nil { - return m.Nshared - } - return 0 -} - -type NSResponse_ShareAccess struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Granted bool `protobuf:"varint,2,opt,name=granted,proto3" json:"granted,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_ShareAccess) Reset() { *m = NSResponse_ShareAccess{} } -func (m *NSResponse_ShareAccess) String() string { return proto.CompactTextString(m) } -func (*NSResponse_ShareAccess) ProtoMessage() {} -func (*NSResponse_ShareAccess) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 6} -} - -func (m *NSResponse_ShareAccess) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_ShareAccess.Unmarshal(m, b) -} -func (m *NSResponse_ShareAccess) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_ShareAccess.Marshal(b, m, deterministic) -} -func (m *NSResponse_ShareAccess) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_ShareAccess.Merge(m, src) -} -func (m *NSResponse_ShareAccess) XXX_Size() int { - return xxx_messageInfo_NSResponse_ShareAccess.Size(m) -} -func (m *NSResponse_ShareAccess) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_ShareAccess.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_ShareAccess proto.InternalMessageInfo - -func (m *NSResponse_ShareAccess) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NSResponse_ShareAccess) GetGranted() bool { - if m != nil { - return m.Granted - } - return false -} - -type NSResponse_ShareResponse struct { - Code int64 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` - Shares []*NSResponse_ShareInfo `protobuf:"bytes,3,rep,name=shares,proto3" json:"shares,omitempty"` - Access []*NSResponse_ShareAccess `protobuf:"bytes,4,rep,name=access,proto3" json:"access,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NSResponse_ShareResponse) Reset() { *m = NSResponse_ShareResponse{} } -func (m *NSResponse_ShareResponse) String() string { return proto.CompactTextString(m) } -func (*NSResponse_ShareResponse) ProtoMessage() {} -func (*NSResponse_ShareResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{21, 7} -} - -func (m *NSResponse_ShareResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NSResponse_ShareResponse.Unmarshal(m, b) -} -func (m *NSResponse_ShareResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NSResponse_ShareResponse.Marshal(b, m, deterministic) -} -func (m *NSResponse_ShareResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_NSResponse_ShareResponse.Merge(m, src) -} -func (m *NSResponse_ShareResponse) XXX_Size() int { - return xxx_messageInfo_NSResponse_ShareResponse.Size(m) -} -func (m *NSResponse_ShareResponse) XXX_DiscardUnknown() { - xxx_messageInfo_NSResponse_ShareResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_NSResponse_ShareResponse proto.InternalMessageInfo - -func (m *NSResponse_ShareResponse) GetCode() int64 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *NSResponse_ShareResponse) GetMsg() string { - if m != nil { - return m.Msg - } - return "" -} - -func (m *NSResponse_ShareResponse) GetShares() []*NSResponse_ShareInfo { - if m != nil { - return m.Shares - } - return nil -} - -func (m *NSResponse_ShareResponse) GetAccess() []*NSResponse_ShareAccess { - if m != nil { - return m.Access - } - return nil -} - -type NsStatRequest struct { - Authkey string `protobuf:"bytes,1,opt,name=authkey,proto3" json:"authkey,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NsStatRequest) Reset() { *m = NsStatRequest{} } -func (m *NsStatRequest) String() string { return proto.CompactTextString(m) } -func (*NsStatRequest) ProtoMessage() {} -func (*NsStatRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{22} -} - -func (m *NsStatRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NsStatRequest.Unmarshal(m, b) -} -func (m *NsStatRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NsStatRequest.Marshal(b, m, deterministic) -} -func (m *NsStatRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NsStatRequest.Merge(m, src) -} -func (m *NsStatRequest) XXX_Size() int { - return xxx_messageInfo_NsStatRequest.Size(m) -} -func (m *NsStatRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NsStatRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_NsStatRequest proto.InternalMessageInfo - -func (m *NsStatRequest) GetAuthkey() string { - if m != nil { - return m.Authkey - } - return "" -} - -type NsStatResponse struct { - Code int64 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Emsg string `protobuf:"bytes,2,opt,name=emsg,proto3" json:"emsg,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Nfiles uint64 `protobuf:"varint,4,opt,name=nfiles,proto3" json:"nfiles,omitempty"` - Ncontainers uint64 `protobuf:"varint,5,opt,name=ncontainers,proto3" json:"ncontainers,omitempty"` - BootTime uint64 `protobuf:"varint,6,opt,name=boot_time,json=bootTime,proto3" json:"boot_time,omitempty"` - CurrentFid uint64 `protobuf:"varint,7,opt,name=current_fid,json=currentFid,proto3" json:"current_fid,omitempty"` - CurrentCid uint64 `protobuf:"varint,8,opt,name=current_cid,json=currentCid,proto3" json:"current_cid,omitempty"` - MemVirtual uint64 `protobuf:"varint,9,opt,name=mem_virtual,json=memVirtual,proto3" json:"mem_virtual,omitempty"` - MemResident uint64 `protobuf:"varint,10,opt,name=mem_resident,json=memResident,proto3" json:"mem_resident,omitempty"` - MemShare uint64 `protobuf:"varint,11,opt,name=mem_share,json=memShare,proto3" json:"mem_share,omitempty"` - MemGrowth uint64 `protobuf:"varint,12,opt,name=mem_growth,json=memGrowth,proto3" json:"mem_growth,omitempty"` - Threads uint64 `protobuf:"varint,13,opt,name=threads,proto3" json:"threads,omitempty"` - Fds uint64 `protobuf:"varint,14,opt,name=fds,proto3" json:"fds,omitempty"` - Uptime uint64 `protobuf:"varint,15,opt,name=uptime,proto3" json:"uptime,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NsStatResponse) Reset() { *m = NsStatResponse{} } -func (m *NsStatResponse) String() string { return proto.CompactTextString(m) } -func (*NsStatResponse) ProtoMessage() {} -func (*NsStatResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{23} -} - -func (m *NsStatResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_NsStatResponse.Unmarshal(m, b) -} -func (m *NsStatResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_NsStatResponse.Marshal(b, m, deterministic) -} -func (m *NsStatResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_NsStatResponse.Merge(m, src) -} -func (m *NsStatResponse) XXX_Size() int { - return xxx_messageInfo_NsStatResponse.Size(m) -} -func (m *NsStatResponse) XXX_DiscardUnknown() { - xxx_messageInfo_NsStatResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_NsStatResponse proto.InternalMessageInfo - -func (m *NsStatResponse) GetCode() int64 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *NsStatResponse) GetEmsg() string { - if m != nil { - return m.Emsg - } - return "" -} - -func (m *NsStatResponse) GetState() string { - if m != nil { - return m.State - } - return "" -} - -func (m *NsStatResponse) GetNfiles() uint64 { - if m != nil { - return m.Nfiles - } - return 0 -} - -func (m *NsStatResponse) GetNcontainers() uint64 { - if m != nil { - return m.Ncontainers - } - return 0 -} - -func (m *NsStatResponse) GetBootTime() uint64 { - if m != nil { - return m.BootTime - } - return 0 -} - -func (m *NsStatResponse) GetCurrentFid() uint64 { - if m != nil { - return m.CurrentFid - } - return 0 -} - -func (m *NsStatResponse) GetCurrentCid() uint64 { - if m != nil { - return m.CurrentCid - } - return 0 -} - -func (m *NsStatResponse) GetMemVirtual() uint64 { - if m != nil { - return m.MemVirtual - } - return 0 -} - -func (m *NsStatResponse) GetMemResident() uint64 { - if m != nil { - return m.MemResident - } - return 0 -} - -func (m *NsStatResponse) GetMemShare() uint64 { - if m != nil { - return m.MemShare - } - return 0 -} - -func (m *NsStatResponse) GetMemGrowth() uint64 { - if m != nil { - return m.MemGrowth - } - return 0 -} - -func (m *NsStatResponse) GetThreads() uint64 { - if m != nil { - return m.Threads - } - return 0 -} - -func (m *NsStatResponse) GetFds() uint64 { - if m != nil { - return m.Fds - } - return 0 -} - -func (m *NsStatResponse) GetUptime() uint64 { - if m != nil { - return m.Uptime - } - return 0 -} - -type ManilaRequest struct { - RequestType MANILA_REQUEST_TYPE `protobuf:"varint,1,opt,name=request_type,json=requestType,proto3,enum=eos.rpc.MANILA_REQUEST_TYPE" json:"request_type,omitempty"` - AuthKey string `protobuf:"bytes,2,opt,name=auth_key,json=authKey,proto3" json:"auth_key,omitempty"` - Protocol string `protobuf:"bytes,3,opt,name=protocol,proto3" json:"protocol,omitempty"` - ShareName string `protobuf:"bytes,4,opt,name=share_name,json=shareName,proto3" json:"share_name,omitempty"` - Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` - ShareId string `protobuf:"bytes,6,opt,name=share_id,json=shareId,proto3" json:"share_id,omitempty"` - ShareGroupId string `protobuf:"bytes,7,opt,name=share_group_id,json=shareGroupId,proto3" json:"share_group_id,omitempty"` - Quota int32 `protobuf:"varint,8,opt,name=quota,proto3" json:"quota,omitempty"` - Creator string `protobuf:"bytes,9,opt,name=creator,proto3" json:"creator,omitempty"` - Egroup string `protobuf:"bytes,10,opt,name=egroup,proto3" json:"egroup,omitempty"` - AdminEgroup string `protobuf:"bytes,11,opt,name=admin_egroup,json=adminEgroup,proto3" json:"admin_egroup,omitempty"` - ShareHost string `protobuf:"bytes,12,opt,name=share_host,json=shareHost,proto3" json:"share_host,omitempty"` - ShareLocation string `protobuf:"bytes,13,opt,name=share_location,json=shareLocation,proto3" json:"share_location,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ManilaRequest) Reset() { *m = ManilaRequest{} } -func (m *ManilaRequest) String() string { return proto.CompactTextString(m) } -func (*ManilaRequest) ProtoMessage() {} -func (*ManilaRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{24} -} - -func (m *ManilaRequest) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ManilaRequest.Unmarshal(m, b) -} -func (m *ManilaRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ManilaRequest.Marshal(b, m, deterministic) -} -func (m *ManilaRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ManilaRequest.Merge(m, src) -} -func (m *ManilaRequest) XXX_Size() int { - return xxx_messageInfo_ManilaRequest.Size(m) -} -func (m *ManilaRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ManilaRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_ManilaRequest proto.InternalMessageInfo - -func (m *ManilaRequest) GetRequestType() MANILA_REQUEST_TYPE { - if m != nil { - return m.RequestType - } - return MANILA_REQUEST_TYPE_CREATE_SHARE -} - -func (m *ManilaRequest) GetAuthKey() string { - if m != nil { - return m.AuthKey - } - return "" -} - -func (m *ManilaRequest) GetProtocol() string { - if m != nil { - return m.Protocol - } - return "" -} - -func (m *ManilaRequest) GetShareName() string { - if m != nil { - return m.ShareName - } - return "" -} - -func (m *ManilaRequest) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *ManilaRequest) GetShareId() string { - if m != nil { - return m.ShareId - } - return "" -} - -func (m *ManilaRequest) GetShareGroupId() string { - if m != nil { - return m.ShareGroupId - } - return "" -} - -func (m *ManilaRequest) GetQuota() int32 { - if m != nil { - return m.Quota - } - return 0 -} - -func (m *ManilaRequest) GetCreator() string { - if m != nil { - return m.Creator - } - return "" -} - -func (m *ManilaRequest) GetEgroup() string { - if m != nil { - return m.Egroup - } - return "" -} - -func (m *ManilaRequest) GetAdminEgroup() string { - if m != nil { - return m.AdminEgroup - } - return "" -} - -func (m *ManilaRequest) GetShareHost() string { - if m != nil { - return m.ShareHost - } - return "" -} - -func (m *ManilaRequest) GetShareLocation() string { - if m != nil { - return m.ShareLocation - } - return "" -} - -type ManilaResponse struct { - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` - TotalUsed int64 `protobuf:"varint,3,opt,name=total_used,json=totalUsed,proto3" json:"total_used,omitempty"` - TotalCapacity int64 `protobuf:"varint,4,opt,name=total_capacity,json=totalCapacity,proto3" json:"total_capacity,omitempty"` - NewShareQuota int64 `protobuf:"varint,5,opt,name=new_share_quota,json=newShareQuota,proto3" json:"new_share_quota,omitempty"` - NewSharePath string `protobuf:"bytes,6,opt,name=new_share_path,json=newSharePath,proto3" json:"new_share_path,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ManilaResponse) Reset() { *m = ManilaResponse{} } -func (m *ManilaResponse) String() string { return proto.CompactTextString(m) } -func (*ManilaResponse) ProtoMessage() {} -func (*ManilaResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_979aee4989bceb08, []int{25} -} - -func (m *ManilaResponse) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ManilaResponse.Unmarshal(m, b) -} -func (m *ManilaResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ManilaResponse.Marshal(b, m, deterministic) -} -func (m *ManilaResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_ManilaResponse.Merge(m, src) -} -func (m *ManilaResponse) XXX_Size() int { - return xxx_messageInfo_ManilaResponse.Size(m) -} -func (m *ManilaResponse) XXX_DiscardUnknown() { - xxx_messageInfo_ManilaResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_ManilaResponse proto.InternalMessageInfo - -func (m *ManilaResponse) GetMsg() string { - if m != nil { - return m.Msg - } - return "" -} - -func (m *ManilaResponse) GetCode() int32 { - if m != nil { - return m.Code - } - return 0 -} - -func (m *ManilaResponse) GetTotalUsed() int64 { - if m != nil { - return m.TotalUsed - } - return 0 -} - -func (m *ManilaResponse) GetTotalCapacity() int64 { - if m != nil { - return m.TotalCapacity - } - return 0 -} - -func (m *ManilaResponse) GetNewShareQuota() int64 { - if m != nil { - return m.NewShareQuota - } - return 0 -} - -func (m *ManilaResponse) GetNewSharePath() string { - if m != nil { - return m.NewSharePath - } - return "" -} - -func init() { - proto.RegisterEnum("eos.rpc.TYPE", TYPE_name, TYPE_value) - proto.RegisterEnum("eos.rpc.QUOTATYPE", QUOTATYPE_name, QUOTATYPE_value) - proto.RegisterEnum("eos.rpc.QUOTAOP", QUOTAOP_name, QUOTAOP_value) - proto.RegisterEnum("eos.rpc.QUOTAENTRY", QUOTAENTRY_name, QUOTAENTRY_value) - proto.RegisterEnum("eos.rpc.MANILA_REQUEST_TYPE", MANILA_REQUEST_TYPE_name, MANILA_REQUEST_TYPE_value) - proto.RegisterEnum("eos.rpc.NSRequest_VersionRequest_VERSION_CMD", NSRequest_VersionRequest_VERSION_CMD_name, NSRequest_VersionRequest_VERSION_CMD_value) - proto.RegisterEnum("eos.rpc.NSRequest_RecycleRequest_RECYCLE_CMD", NSRequest_RecycleRequest_RECYCLE_CMD_name, NSRequest_RecycleRequest_RECYCLE_CMD_value) - proto.RegisterEnum("eos.rpc.NSRequest_AclRequest_ACL_COMMAND", NSRequest_AclRequest_ACL_COMMAND_name, NSRequest_AclRequest_ACL_COMMAND_value) - proto.RegisterEnum("eos.rpc.NSRequest_AclRequest_ACL_TYPE", NSRequest_AclRequest_ACL_TYPE_name, NSRequest_AclRequest_ACL_TYPE_value) - proto.RegisterEnum("eos.rpc.NSRequest_ShareRequest_LsShare_OutFormat", NSRequest_ShareRequest_LsShare_OutFormat_name, NSRequest_ShareRequest_LsShare_OutFormat_value) - proto.RegisterEnum("eos.rpc.NSRequest_ShareRequest_OperateShare_Op", NSRequest_ShareRequest_OperateShare_Op_name, NSRequest_ShareRequest_OperateShare_Op_value) - proto.RegisterEnum("eos.rpc.NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE", NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE_name, NSResponse_RecycleResponse_RecycleInfo_DELETIONTYPE_value) - proto.RegisterType((*PingRequest)(nil), "eos.rpc.PingRequest") - proto.RegisterType((*PingReply)(nil), "eos.rpc.PingReply") - proto.RegisterType((*ContainerInsertRequest)(nil), "eos.rpc.ContainerInsertRequest") - proto.RegisterType((*FileInsertRequest)(nil), "eos.rpc.FileInsertRequest") - proto.RegisterType((*InsertReply)(nil), "eos.rpc.InsertReply") - proto.RegisterType((*Time)(nil), "eos.rpc.Time") - proto.RegisterType((*Checksum)(nil), "eos.rpc.Checksum") - proto.RegisterType((*FileMdProto)(nil), "eos.rpc.FileMdProto") - proto.RegisterMapType((map[string][]byte)(nil), "eos.rpc.FileMdProto.XattrsEntry") - proto.RegisterType((*ContainerMdProto)(nil), "eos.rpc.ContainerMdProto") - proto.RegisterMapType((map[string][]byte)(nil), "eos.rpc.ContainerMdProto.XattrsEntry") - proto.RegisterType((*QuotaProto)(nil), "eos.rpc.QuotaProto") - proto.RegisterType((*RoleId)(nil), "eos.rpc.RoleId") - proto.RegisterType((*MDId)(nil), "eos.rpc.MDId") - proto.RegisterType((*Limit)(nil), "eos.rpc.Limit") - proto.RegisterType((*MDSelection)(nil), "eos.rpc.MDSelection") - proto.RegisterMapType((map[string][]byte)(nil), "eos.rpc.MDSelection.XattrEntry") - proto.RegisterType((*MDRequest)(nil), "eos.rpc.MDRequest") - proto.RegisterType((*MDResponse)(nil), "eos.rpc.MDResponse") - proto.RegisterType((*FindRequest)(nil), "eos.rpc.FindRequest") - proto.RegisterType((*ShareAuth)(nil), "eos.rpc.ShareAuth") - proto.RegisterType((*ShareProto)(nil), "eos.rpc.ShareProto") - proto.RegisterType((*ShareToken)(nil), "eos.rpc.ShareToken") - proto.RegisterType((*NSRequest)(nil), "eos.rpc.NSRequest") - proto.RegisterType((*NSRequest_MkdirRequest)(nil), "eos.rpc.NSRequest.MkdirRequest") - proto.RegisterType((*NSRequest_RmdirRequest)(nil), "eos.rpc.NSRequest.RmdirRequest") - proto.RegisterType((*NSRequest_TouchRequest)(nil), "eos.rpc.NSRequest.TouchRequest") - proto.RegisterType((*NSRequest_UnlinkRequest)(nil), "eos.rpc.NSRequest.UnlinkRequest") - proto.RegisterType((*NSRequest_RmRequest)(nil), "eos.rpc.NSRequest.RmRequest") - proto.RegisterType((*NSRequest_RenameRequest)(nil), "eos.rpc.NSRequest.RenameRequest") - proto.RegisterType((*NSRequest_SymlinkRequest)(nil), "eos.rpc.NSRequest.SymlinkRequest") - proto.RegisterType((*NSRequest_VersionRequest)(nil), "eos.rpc.NSRequest.VersionRequest") - proto.RegisterType((*NSRequest_RecycleRequest)(nil), "eos.rpc.NSRequest.RecycleRequest") - proto.RegisterType((*NSRequest_RecycleRequest_RestoreFlags)(nil), "eos.rpc.NSRequest.RecycleRequest.RestoreFlags") - proto.RegisterType((*NSRequest_RecycleRequest_PurgeDate)(nil), "eos.rpc.NSRequest.RecycleRequest.PurgeDate") - proto.RegisterType((*NSRequest_RecycleRequest_ListFlags)(nil), "eos.rpc.NSRequest.RecycleRequest.ListFlags") - proto.RegisterType((*NSRequest_SetXAttrRequest)(nil), "eos.rpc.NSRequest.SetXAttrRequest") - proto.RegisterMapType((map[string][]byte)(nil), "eos.rpc.NSRequest.SetXAttrRequest.XattrsEntry") - proto.RegisterType((*NSRequest_ChownRequest)(nil), "eos.rpc.NSRequest.ChownRequest") - proto.RegisterType((*NSRequest_ChmodRequest)(nil), "eos.rpc.NSRequest.ChmodRequest") - proto.RegisterType((*NSRequest_AclRequest)(nil), "eos.rpc.NSRequest.AclRequest") - proto.RegisterType((*NSRequest_TokenRequest)(nil), "eos.rpc.NSRequest.TokenRequest") - proto.RegisterType((*NSRequest_QuotaRequest)(nil), "eos.rpc.NSRequest.QuotaRequest") - proto.RegisterType((*NSRequest_ShareRequest)(nil), "eos.rpc.NSRequest.ShareRequest") - proto.RegisterType((*NSRequest_ShareRequest_LsShare)(nil), "eos.rpc.NSRequest.ShareRequest.LsShare") - proto.RegisterType((*NSRequest_ShareRequest_OperateShare)(nil), "eos.rpc.NSRequest.ShareRequest.OperateShare") - proto.RegisterType((*NSResponse)(nil), "eos.rpc.NSResponse") - proto.RegisterType((*NSResponse_ErrorResponse)(nil), "eos.rpc.NSResponse.ErrorResponse") - proto.RegisterType((*NSResponse_VersionResponse)(nil), "eos.rpc.NSResponse.VersionResponse") - proto.RegisterType((*NSResponse_VersionResponse_VersionInfo)(nil), "eos.rpc.NSResponse.VersionResponse.VersionInfo") - proto.RegisterType((*NSResponse_RecycleResponse)(nil), "eos.rpc.NSResponse.RecycleResponse") - proto.RegisterType((*NSResponse_RecycleResponse_RecycleInfo)(nil), "eos.rpc.NSResponse.RecycleResponse.RecycleInfo") - proto.RegisterType((*NSResponse_AclResponse)(nil), "eos.rpc.NSResponse.AclResponse") - proto.RegisterType((*NSResponse_QuotaResponse)(nil), "eos.rpc.NSResponse.QuotaResponse") - proto.RegisterType((*NSResponse_ShareInfo)(nil), "eos.rpc.NSResponse.ShareInfo") - proto.RegisterType((*NSResponse_ShareAccess)(nil), "eos.rpc.NSResponse.ShareAccess") - proto.RegisterType((*NSResponse_ShareResponse)(nil), "eos.rpc.NSResponse.ShareResponse") - proto.RegisterType((*NsStatRequest)(nil), "eos.rpc.NsStatRequest") - proto.RegisterType((*NsStatResponse)(nil), "eos.rpc.NsStatResponse") - proto.RegisterType((*ManilaRequest)(nil), "eos.rpc.ManilaRequest") - proto.RegisterType((*ManilaResponse)(nil), "eos.rpc.ManilaResponse") -} - -func init() { - proto.RegisterFile("Rpc.proto", fileDescriptor_979aee4989bceb08) -} - -var fileDescriptor_979aee4989bceb08 = []byte{ - // 4040 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x3a, 0x4d, 0x77, 0xdb, 0xc6, - 0x76, 0x22, 0x09, 0x52, 0xc4, 0x25, 0x29, 0x31, 0xb0, 0x9b, 0x30, 0x8c, 0x1d, 0x2b, 0x74, 0x9c, - 0x67, 0x3b, 0xb1, 0x1c, 0xbb, 0x4d, 0x9d, 0xc4, 0x2f, 0x4d, 0x69, 0x89, 0x92, 0x99, 0x88, 0xa4, - 0x32, 0xa4, 0x7c, 0xec, 0x6e, 0x78, 0x60, 0x60, 0x44, 0xe1, 0x98, 0x00, 0xf8, 0x00, 0xd0, 0xb6, - 0xb2, 0x6c, 0xbb, 0xe9, 0x3b, 0xa7, 0xbb, 0xb7, 0x7b, 0xbb, 0x9e, 0xb6, 0x9b, 0xee, 0xbb, 0xe8, - 0xaa, 0xbb, 0xbe, 0xf3, 0x16, 0x5d, 0x74, 0xd3, 0x5d, 0xff, 0x40, 0xfb, 0x23, 0x7a, 0xee, 0x9d, - 0x01, 0x30, 0x90, 0x48, 0x51, 0x79, 0x79, 0x1b, 0x9c, 0x99, 0x3b, 0xf7, 0xde, 0x99, 0xb9, 0x73, - 0x3f, 0x67, 0x00, 0x3a, 0x9b, 0x59, 0xdb, 0xb3, 0xc0, 0x8f, 0x7c, 0x63, 0x9d, 0xfb, 0xe1, 0x76, - 0x30, 0xb3, 0x5a, 0x6d, 0xa8, 0x1c, 0x3a, 0xde, 0x84, 0xf1, 0x5f, 0xcd, 0x79, 0x18, 0x19, 0x0d, - 0x58, 0x37, 0xe7, 0xd1, 0xc9, 0x2b, 0x7e, 0xda, 0xc8, 0x6d, 0xe5, 0x6e, 0xeb, 0x2c, 0xee, 0xe2, - 0x88, 0xcb, 0xc3, 0xd0, 0x9c, 0xf0, 0x46, 0x7e, 0x2b, 0x77, 0xbb, 0xca, 0xe2, 0x6e, 0xeb, 0x16, - 0xe8, 0x82, 0xc5, 0x6c, 0x9a, 0x41, 0xcb, 0x65, 0xd1, 0x7e, 0x9d, 0x83, 0x77, 0x77, 0x7c, 0x2f, - 0x32, 0x1d, 0x8f, 0x07, 0x5d, 0x2f, 0xe4, 0x41, 0x14, 0xcf, 0xfa, 0x08, 0x74, 0x2b, 0x1e, 0x69, - 0xe4, 0xb6, 0x0a, 0xb7, 0x2b, 0x0f, 0xdf, 0xdf, 0x96, 0x2b, 0xdc, 0x4e, 0x68, 0x7a, 0xf6, 0x21, - 0xae, 0x9d, 0xa5, 0xb8, 0xea, 0x72, 0xf3, 0xd9, 0xe5, 0x5e, 0x07, 0x70, 0xbc, 0x13, 0x1e, 0x38, - 0xd1, 0xd8, 0xb5, 0x1b, 0x85, 0xad, 0xdc, 0xed, 0x32, 0xd3, 0x25, 0xa4, 0x67, 0xb7, 0x5e, 0xc0, - 0x3b, 0x7b, 0xce, 0x94, 0x67, 0x97, 0x71, 0x17, 0x8a, 0xc7, 0xce, 0x94, 0x87, 0x72, 0x09, 0x57, - 0x93, 0x25, 0x20, 0x6a, 0x3c, 0xbb, 0x40, 0x59, 0x3e, 0x73, 0xeb, 0x31, 0x54, 0x62, 0xb6, 0xe7, - 0x04, 0x52, 0x40, 0x44, 0xd9, 0x35, 0x0c, 0xd0, 0x02, 0x1e, 0x59, 0x8d, 0xfc, 0x56, 0xe1, 0x76, - 0x8d, 0x51, 0xbb, 0x75, 0x0f, 0xb4, 0x91, 0xe3, 0x72, 0xa3, 0x0e, 0x85, 0x90, 0x5b, 0x24, 0x42, - 0x8d, 0x61, 0xd3, 0xb8, 0x02, 0x45, 0x6f, 0x8c, 0xb0, 0x3c, 0xc1, 0x34, 0x6f, 0xc8, 0xad, 0xd6, - 0x9f, 0x41, 0x79, 0xe7, 0x84, 0x5b, 0xaf, 0xc2, 0xb9, 0x6b, 0x5c, 0x85, 0xe2, 0x6b, 0x73, 0x3a, - 0x8f, 0xe5, 0x2e, 0x3a, 0x38, 0x49, 0x74, 0x3a, 0xe3, 0x72, 0x91, 0xd4, 0x6e, 0xfd, 0x87, 0x06, - 0x15, 0x65, 0x4b, 0xc6, 0x06, 0xe4, 0x1d, 0x5b, 0xce, 0x95, 0x77, 0x6c, 0xe3, 0x3d, 0x58, 0x47, - 0x11, 0x8f, 0x1d, 0x5b, 0x4e, 0x56, 0xc2, 0x6e, 0xd7, 0xc6, 0x55, 0xcd, 0x1d, 0x21, 0x4d, 0x8d, - 0x61, 0x13, 0x21, 0x13, 0xc7, 0x6e, 0x68, 0x02, 0x32, 0x71, 0x6c, 0x9c, 0x30, 0x74, 0x7e, 0xe4, - 0x8d, 0xa2, 0x58, 0x26, 0xb6, 0x8d, 0x0f, 0x40, 0x9f, 0x9a, 0xa7, 0xfe, 0x9c, 0x58, 0x96, 0xb6, - 0x72, 0xb7, 0x6b, 0xac, 0x2c, 0x00, 0x5d, 0x1b, 0xd7, 0x7d, 0x3c, 0x35, 0x27, 0x61, 0x63, 0x9d, - 0x06, 0x44, 0x07, 0xd9, 0x78, 0xa6, 0xcb, 0x1b, 0x65, 0xda, 0x0c, 0xb5, 0x89, 0x8d, 0xe3, 0xbd, - 0x1a, 0xd3, 0x80, 0x4e, 0x03, 0x65, 0x04, 0xf4, 0x71, 0xf0, 0x26, 0x14, 0xad, 0xc8, 0x71, 0x79, - 0x03, 0xb6, 0x72, 0xb7, 0x2b, 0x0f, 0x6b, 0xc9, 0xe1, 0xa1, 0x3c, 0x99, 0x18, 0x43, 0x24, 0x97, - 0x90, 0x2a, 0x0b, 0x91, 0x68, 0xcc, 0xb8, 0x07, 0x65, 0x4b, 0x0a, 0xb5, 0x51, 0x25, 0xbc, 0x77, - 0x52, 0x65, 0x94, 0x03, 0x2c, 0x41, 0x31, 0xae, 0x81, 0x3e, 0xf5, 0x2d, 0x33, 0x72, 0x7c, 0x2f, - 0x6c, 0xd4, 0xe8, 0x2c, 0x53, 0x80, 0x71, 0x07, 0xea, 0x73, 0x8f, 0x56, 0x9d, 0x22, 0x6d, 0x10, - 0xd2, 0xa6, 0x80, 0x1f, 0x24, 0xa8, 0x5f, 0x42, 0xe9, 0xad, 0x19, 0x45, 0x41, 0xd8, 0xd8, 0x24, - 0xfd, 0xdb, 0x5a, 0xa4, 0x7f, 0xdb, 0xcf, 0x09, 0xa5, 0xe3, 0x45, 0xc1, 0x29, 0x93, 0xf8, 0x28, - 0xac, 0x99, 0x19, 0x9d, 0x34, 0xea, 0x42, 0x58, 0xd8, 0x46, 0x18, 0x8f, 0xcc, 0x49, 0xe3, 0x1d, - 0x71, 0xf0, 0xd8, 0x46, 0x51, 0x3b, 0x9e, 0x6f, 0xf3, 0x86, 0x41, 0x87, 0x23, 0x3a, 0xcd, 0xaf, - 0xa0, 0xa2, 0x30, 0xc5, 0x23, 0x4d, 0xcd, 0x1f, 0x9b, 0xa9, 0x66, 0xe5, 0x15, 0xcd, 0xfa, 0x3a, - 0xff, 0x65, 0xae, 0xf5, 0x5b, 0x0d, 0xea, 0x67, 0xed, 0xf3, 0x9c, 0x3a, 0x7d, 0x00, 0xfa, 0xcc, - 0x0c, 0xb8, 0xaa, 0x50, 0x65, 0x01, 0xb8, 0xa4, 0x4a, 0x7d, 0x00, 0x7a, 0x14, 0x70, 0x3e, 0x26, - 0xbd, 0x42, 0xf5, 0x29, 0xb0, 0x32, 0x02, 0x86, 0xa8, 0x5b, 0x06, 0x68, 0x2e, 0x6e, 0xa9, 0x48, - 0xda, 0x43, 0xed, 0x9f, 0xa0, 0x52, 0x89, 0xd6, 0xe8, 0x97, 0xd1, 0x1a, 0xb8, 0x40, 0x6b, 0x6e, - 0x42, 0x31, 0xbc, 0x40, 0xb5, 0x68, 0xcc, 0xf8, 0x26, 0x39, 0xe2, 0x2a, 0x1d, 0xf1, 0xad, 0xa5, - 0x5e, 0xee, 0xc2, 0x73, 0xae, 0x2d, 0x38, 0xe7, 0x8d, 0x45, 0xe7, 0xbc, 0xa9, 0x9c, 0x33, 0x49, - 0x85, 0xdc, 0x5b, 0x5d, 0x40, 0x85, 0x23, 0xfb, 0x10, 0x20, 0xf1, 0xa7, 0x21, 0x69, 0x8b, 0xc6, - 0x14, 0xc8, 0xcf, 0xd1, 0x8e, 0xff, 0x2c, 0x00, 0xfc, 0x30, 0xf7, 0x23, 0x53, 0xe8, 0x45, 0xbc, - 0xfa, 0x5c, 0x76, 0xf5, 0x74, 0x26, 0xd2, 0x3d, 0xd1, 0x99, 0x7c, 0x22, 0x5d, 0x16, 0xea, 0xc4, - 0xc6, 0x43, 0x23, 0x11, 0xd1, 0x0f, 0x47, 0x83, 0x51, 0x7b, 0xf4, 0xe2, 0xb0, 0x23, 0xdc, 0x18, - 0x1a, 0xde, 0x3c, 0xe4, 0xf6, 0xcb, 0xd3, 0x88, 0x87, 0x52, 0x5d, 0x52, 0x80, 0x71, 0x17, 0xea, - 0xd8, 0x99, 0xfa, 0x13, 0xc7, 0x32, 0xa7, 0x02, 0x49, 0xf8, 0xa4, 0x73, 0xf0, 0x98, 0x93, 0x90, - 0x4e, 0x29, 0xe5, 0x24, 0x24, 0xd4, 0x84, 0xb2, 0x6b, 0xbe, 0x15, 0x1c, 0xd6, 0x85, 0xfa, 0xc6, - 0x7d, 0xe3, 0x36, 0x6c, 0xba, 0xe6, 0xdb, 0xcc, 0x24, 0x65, 0x42, 0x39, 0x0b, 0x96, 0x5c, 0xc4, - 0x14, 0x7a, 0xc2, 0x45, 0xcc, 0xf0, 0x39, 0x5c, 0x99, 0xf1, 0xc0, 0xe2, 0x5e, 0x64, 0x4e, 0x78, - 0xba, 0x27, 0x54, 0xb7, 0x3c, 0x5b, 0x34, 0x74, 0x9e, 0x42, 0x30, 0xae, 0x2c, 0xa2, 0x10, 0x73, - 0x6c, 0x41, 0x25, 0x8c, 0xcc, 0x68, 0x1e, 0x0a, 0xde, 0x55, 0x12, 0xb8, 0x0a, 0x4a, 0x31, 0x04, - 0xaf, 0x9a, 0x8a, 0x41, 0xa0, 0xd6, 0x31, 0x94, 0x98, 0x3f, 0xe5, 0xa9, 0xd9, 0xe6, 0xce, 0x99, - 0x6d, 0x3e, 0x35, 0xdb, 0x26, 0x94, 0xe7, 0x21, 0x0f, 0xe8, 0x7c, 0x0b, 0xc4, 0x2c, 0xe9, 0xa3, - 0xc4, 0x27, 0x81, 0x3f, 0x9f, 0xd1, 0xa0, 0x46, 0x83, 0x29, 0xa0, 0x35, 0x06, 0xad, 0xb7, 0xdb, - 0xb5, 0x17, 0x6a, 0x8c, 0xf0, 0x2e, 0x38, 0x4d, 0x89, 0xbc, 0x4b, 0x1d, 0x0a, 0x8e, 0xe7, 0xd3, - 0x04, 0x25, 0x86, 0x4d, 0xe3, 0x23, 0xa9, 0x3f, 0x1a, 0xe9, 0x8f, 0x62, 0x88, 0x89, 0xea, 0xb4, - 0xbe, 0x85, 0xe2, 0x81, 0xe3, 0x3a, 0x11, 0xce, 0xf0, 0x23, 0x0f, 0x7c, 0x9a, 0xa1, 0xcc, 0xa8, - 0x8d, 0x1c, 0x5d, 0xc7, 0x8b, 0x77, 0xe2, 0x3a, 0x1e, 0x41, 0xcc, 0xb7, 0xb1, 0x93, 0x72, 0xcd, - 0xb7, 0xad, 0x7f, 0x2e, 0x41, 0xa5, 0xb7, 0x3b, 0xe4, 0x53, 0x6e, 0xa1, 0xf3, 0x36, 0xde, 0x85, - 0x52, 0x48, 0x1d, 0xc9, 0x49, 0xf6, 0x8c, 0x8f, 0x63, 0xff, 0x92, 0x27, 0xaf, 0xb0, 0x91, 0x2c, - 0x86, 0xa6, 0x8f, 0x1d, 0xcc, 0xc7, 0xb1, 0x83, 0x29, 0x2c, 0xc6, 0x72, 0x63, 0x2c, 0xe1, 0x61, - 0xb4, 0xc5, 0x58, 0xc2, 0xc5, 0xb4, 0x94, 0xf8, 0x7b, 0x1e, 0x49, 0xc4, 0xe3, 0xbb, 0x40, 0xfe, - 0x33, 0xf1, 0xa7, 0xe7, 0xf1, 0x92, 0x71, 0xc4, 0xb5, 0x4e, 0x9c, 0xa9, 0x1d, 0x70, 0x8f, 0xb4, - 0x7f, 0x01, 0x6e, 0x3c, 0x6e, 0x7c, 0xa6, 0x86, 0xc2, 0xf2, 0x42, 0x64, 0x25, 0x34, 0x7e, 0x03, - 0x86, 0x08, 0x81, 0xdc, 0x56, 0x82, 0xa3, 0xbe, 0x90, 0xec, 0x9d, 0x18, 0x33, 0x0d, 0x97, 0x4d, - 0x90, 0x39, 0x84, 0x63, 0x93, 0xa5, 0x68, 0x2c, 0xe9, 0xa7, 0x01, 0xa0, 0x22, 0x5d, 0x1d, 0x05, - 0x80, 0x06, 0xac, 0x87, 0xa7, 0x2e, 0xf2, 0x21, 0xf5, 0x2f, 0xb3, 0xb8, 0x9b, 0x09, 0xf9, 0xb5, - 0xd5, 0x21, 0xff, 0x2a, 0x14, 0xfd, 0x37, 0x98, 0xab, 0x6e, 0x88, 0xf8, 0x42, 0x1d, 0x84, 0x92, - 0x0a, 0x93, 0xd7, 0xad, 0x31, 0xd1, 0xc1, 0x44, 0x94, 0x86, 0xc7, 0x81, 0xef, 0x47, 0xe4, 0x7a, - 0xcb, 0x4c, 0x27, 0x08, 0xf3, 0xfd, 0x08, 0x87, 0x09, 0x4f, 0x0c, 0xbf, 0x23, 0x86, 0x09, 0x42, - 0xc3, 0xbf, 0x80, 0xcd, 0x80, 0x4f, 0xf8, 0xdb, 0xd9, 0x18, 0x2d, 0x90, 0xac, 0xc5, 0x20, 0x63, - 0xd8, 0x10, 0xe0, 0x3d, 0x09, 0x35, 0x6e, 0x81, 0x84, 0x8c, 0x6d, 0x47, 0x98, 0xdc, 0x15, 0xc2, - 0xab, 0x09, 0xe8, 0xae, 0x00, 0x1a, 0x5f, 0x40, 0x91, 0x62, 0x49, 0xe3, 0x2a, 0xc5, 0x9f, 0x1b, - 0xc9, 0x2e, 0x15, 0x65, 0x16, 0xa1, 0x47, 0x44, 0x1e, 0x81, 0xdd, 0xfc, 0x12, 0x20, 0x05, 0xfe, - 0xa4, 0x18, 0xf0, 0xef, 0x39, 0xd0, 0x7b, 0xbb, 0x71, 0x86, 0x1d, 0x9b, 0x66, 0x6e, 0xa9, 0x69, - 0x1a, 0xd7, 0x13, 0xfb, 0x56, 0x83, 0x28, 0xba, 0x03, 0x32, 0x77, 0x25, 0xef, 0x2e, 0x64, 0x33, - 0xfe, 0x9b, 0xa0, 0x05, 0xfe, 0x34, 0xb6, 0x8e, 0xcd, 0x84, 0x54, 0x78, 0x2c, 0x46, 0x83, 0xc6, - 0x43, 0xd0, 0xc3, 0x78, 0x9f, 0xd2, 0x44, 0xae, 0x2e, 0x92, 0x01, 0x4b, 0xd1, 0x5a, 0x7f, 0x9b, - 0x03, 0xc0, 0x2d, 0x84, 0x33, 0xdf, 0x0b, 0xf9, 0x65, 0xf6, 0xf0, 0x09, 0x14, 0x8e, 0xdd, 0x78, - 0x13, 0x8b, 0xcb, 0x08, 0x44, 0x30, 0x3e, 0x85, 0x82, 0x25, 0xab, 0x93, 0x0b, 0x2b, 0x1e, 0xc4, - 0x6a, 0xfd, 0x4f, 0x0e, 0xb3, 0x76, 0xcf, 0xfe, 0xe3, 0xc9, 0x32, 0x96, 0x58, 0xe1, 0x22, 0x89, - 0x29, 0x02, 0xd7, 0xb2, 0x02, 0x17, 0x11, 0xcd, 0xe6, 0xb3, 0xe8, 0x44, 0x46, 0xd6, 0xa4, 0x9f, - 0x95, 0x73, 0xe9, 0x72, 0x72, 0xde, 0x07, 0x7d, 0x78, 0x62, 0x06, 0xbc, 0x3d, 0x17, 0x89, 0x01, - 0x56, 0xaa, 0x52, 0xc9, 0xa8, 0xbd, 0x30, 0x59, 0x30, 0x40, 0x3b, 0xf1, 0xc3, 0x48, 0x2a, 0x03, - 0xb5, 0x5b, 0xbf, 0xce, 0x03, 0x10, 0x27, 0x91, 0x77, 0x7c, 0x08, 0x30, 0xe3, 0x81, 0xeb, 0x84, - 0x21, 0x2e, 0x46, 0x30, 0x54, 0x20, 0xb8, 0x43, 0xfe, 0x76, 0xe6, 0x04, 0x3c, 0x94, 0x3e, 0x3f, - 0xee, 0xa6, 0x76, 0x2e, 0xb8, 0x9f, 0xb5, 0x73, 0x21, 0x0f, 0x69, 0xe7, 0x1f, 0x02, 0x4c, 0xb8, - 0xc7, 0x03, 0x33, 0x51, 0x2d, 0x8d, 0x29, 0x90, 0x24, 0x96, 0x95, 0xe4, 0x86, 0x30, 0x96, 0x5d, - 0x03, 0xdd, 0x9c, 0x4e, 0xfd, 0x37, 0xe8, 0x6c, 0xc9, 0xb9, 0x96, 0x59, 0x0a, 0xc0, 0x98, 0xf2, - 0x3a, 0xf2, 0x5f, 0x71, 0x8f, 0x5c, 0xa9, 0xce, 0x64, 0xcf, 0xf8, 0x0c, 0xd6, 0xfd, 0xc0, 0x99, - 0x38, 0xe4, 0x2c, 0xd1, 0x8a, 0xd3, 0x14, 0x29, 0x91, 0x1f, 0x8b, 0x51, 0x5a, 0x7f, 0x97, 0x93, - 0xc2, 0x18, 0x11, 0xf1, 0x1d, 0x28, 0x0a, 0x9e, 0x39, 0x3a, 0x94, 0x2b, 0x59, 0x52, 0x59, 0xe2, - 0x8a, 0x79, 0xae, 0x81, 0x1e, 0x3a, 0x13, 0xcf, 0x8c, 0xe6, 0x41, 0x6c, 0xd8, 0x29, 0x00, 0xf7, - 0x1b, 0xf2, 0xc0, 0x31, 0xa7, 0xce, 0x8f, 0x5c, 0xa8, 0x70, 0x95, 0x29, 0x10, 0xaa, 0x03, 0x39, - 0x17, 0x79, 0x7c, 0x91, 0x51, 0xbb, 0xf5, 0xd7, 0x37, 0x40, 0xef, 0x0f, 0x57, 0xdf, 0x35, 0xc4, - 0x8a, 0x99, 0xbf, 0x48, 0x31, 0x1f, 0x41, 0xd1, 0x7d, 0x65, 0x3b, 0x41, 0xe3, 0x4f, 0x08, 0x2b, - 0x75, 0x65, 0xc9, 0x0c, 0xdb, 0x3d, 0x1c, 0x97, 0x9d, 0xa7, 0x6b, 0x4c, 0xe0, 0x23, 0x61, 0xe0, - 0x22, 0xe1, 0xbb, 0x4b, 0x09, 0x99, 0x9b, 0x25, 0x24, 0x7c, 0x24, 0x8c, 0xfc, 0xb9, 0x75, 0xd2, - 0x78, 0x6f, 0x29, 0xe1, 0x08, 0xc7, 0x15, 0x42, 0xc2, 0x37, 0xbe, 0x86, 0x92, 0x88, 0x5f, 0x8d, - 0x06, 0x51, 0x6e, 0x2d, 0xa0, 0x3c, 0x22, 0x84, 0x94, 0x54, 0x52, 0x18, 0xdb, 0x90, 0x0f, 0xdc, - 0xc6, 0xfb, 0x44, 0x77, 0x6d, 0xe1, 0x52, 0x53, 0x9a, 0x7c, 0xe0, 0xe2, 0x5c, 0x81, 0x08, 0x14, - 0xcd, 0xa5, 0x73, 0x31, 0x42, 0x50, 0xe6, 0x12, 0x14, 0xc6, 0x37, 0x69, 0x80, 0xfc, 0x80, 0x88, - 0x3f, 0x5a, 0x40, 0x3c, 0x14, 0x18, 0x29, 0x75, 0x12, 0x45, 0xbf, 0x81, 0xf5, 0xd7, 0x3c, 0x20, - 0x2b, 0xbb, 0xb6, 0x94, 0xfc, 0x99, 0xc0, 0x50, 0xc8, 0x25, 0x0d, 0x92, 0x07, 0xdc, 0x3a, 0xb5, - 0xa6, 0xbc, 0x71, 0x7d, 0x29, 0x39, 0x13, 0x18, 0x0a, 0xb9, 0xa4, 0x31, 0xbe, 0x8e, 0x43, 0xdb, - 0x87, 0x44, 0xdc, 0x5a, 0xb4, 0x74, 0x1e, 0x3d, 0x6f, 0x47, 0x91, 0x7a, 0xb2, 0x44, 0x82, 0x27, - 0x6b, 0x9d, 0xf8, 0x6f, 0xbc, 0xc6, 0x8d, 0xa5, 0x27, 0xbb, 0x83, 0xe3, 0x0a, 0x21, 0xe1, 0x0b, - 0x42, 0xd7, 0xb7, 0x1b, 0x5b, 0x17, 0x10, 0xba, 0xbe, 0x9d, 0x21, 0x74, 0x7d, 0xdb, 0x78, 0x00, - 0x05, 0xd3, 0x9a, 0x36, 0x3e, 0x22, 0xb2, 0xeb, 0x0b, 0xc8, 0xda, 0xd6, 0x34, 0x25, 0x42, 0x5c, - 0xa1, 0x7e, 0x68, 0xba, 0xad, 0x0b, 0xd4, 0xef, 0x15, 0xf7, 0x32, 0xea, 0x87, 0x86, 0xfc, 0x08, - 0x8a, 0xbf, 0xc2, 0x32, 0xac, 0x71, 0x73, 0x29, 0x21, 0x95, 0x69, 0x0a, 0x21, 0xe1, 0x23, 0x61, - 0x88, 0x6e, 0xa1, 0xf1, 0xf1, 0x52, 0x42, 0x72, 0x1b, 0x0a, 0x21, 0xe1, 0x37, 0xc7, 0x50, 0x55, - 0x6d, 0x4f, 0x06, 0xa2, 0xdc, 0xb2, 0x40, 0x74, 0x0d, 0xf4, 0x80, 0x5b, 0xf3, 0x20, 0x74, 0x5e, - 0x0b, 0xa3, 0x2f, 0xb3, 0x14, 0x90, 0x54, 0xf8, 0x05, 0xaa, 0xfc, 0xa9, 0xdd, 0xbc, 0x07, 0x55, - 0xd5, 0x46, 0x57, 0x4c, 0x80, 0xe8, 0xaa, 0x65, 0xae, 0x42, 0x3f, 0x80, 0x5a, 0xc6, 0x1c, 0x2f, - 0xb1, 0x7e, 0xcf, 0x8f, 0x75, 0x57, 0xde, 0x35, 0x26, 0x80, 0xe6, 0x31, 0xe8, 0x89, 0x91, 0xfe, - 0x3c, 0x49, 0x5c, 0x3c, 0xcf, 0x1e, 0xd4, 0x32, 0x86, 0xbd, 0x6a, 0xae, 0x77, 0xa1, 0x14, 0x99, - 0xc1, 0x84, 0x47, 0xd2, 0xb9, 0xcb, 0x5e, 0x73, 0x1f, 0x36, 0xb2, 0x36, 0xfe, 0x87, 0x32, 0xfa, - 0xbf, 0x1c, 0x6c, 0x64, 0xcd, 0x7d, 0x15, 0xa7, 0x6f, 0x45, 0x42, 0x94, 0xa7, 0x94, 0xe6, 0xde, - 0x4a, 0xef, 0xb1, 0xfd, 0xac, 0xc3, 0x86, 0xdd, 0x41, 0x7f, 0xbc, 0xd3, 0xdb, 0xa5, 0x24, 0x09, - 0xa3, 0x92, 0x6b, 0xbe, 0x8d, 0xbd, 0x50, 0x81, 0x62, 0x8f, 0x02, 0xc1, 0x1a, 0x77, 0x12, 0x98, - 0x2f, 0x63, 0x04, 0x11, 0xc1, 0x55, 0x50, 0xeb, 0x4b, 0xa8, 0x28, 0x5c, 0x0d, 0x80, 0xd2, 0x0e, - 0xeb, 0xb4, 0x47, 0x9d, 0xfa, 0x9a, 0xa1, 0x43, 0xf1, 0xf0, 0x88, 0xed, 0x77, 0xea, 0x39, 0xa3, - 0x0c, 0xda, 0x41, 0x77, 0x38, 0xaa, 0xe7, 0xb1, 0xb5, 0xcf, 0xda, 0x4f, 0xea, 0x85, 0xe6, 0xef, - 0x35, 0xd8, 0xc8, 0xba, 0xa7, 0x05, 0x99, 0xf2, 0xca, 0x1d, 0x66, 0x39, 0x6c, 0xb3, 0xce, 0xce, - 0x8b, 0x9d, 0x83, 0x4e, 0xba, 0xc3, 0x43, 0xa8, 0x04, 0x3c, 0x8c, 0xfc, 0x80, 0x63, 0x51, 0x23, - 0x73, 0xb7, 0xed, 0x4b, 0x30, 0x12, 0x44, 0x7b, 0x58, 0x09, 0x31, 0x95, 0x85, 0xd1, 0x05, 0x7d, - 0x36, 0x0f, 0x26, 0xdc, 0x36, 0xa3, 0x38, 0x7b, 0xfe, 0x74, 0x35, 0xbf, 0x43, 0x24, 0xd9, 0x35, - 0x23, 0xce, 0x52, 0x6a, 0x63, 0x1f, 0xca, 0x53, 0x27, 0x8c, 0x68, 0x65, 0xc5, 0xcb, 0x72, 0x3a, - 0x70, 0xc2, 0x48, 0x2c, 0x2b, 0x21, 0x6e, 0x3e, 0x87, 0xaa, 0xba, 0x60, 0x2a, 0xe8, 0xfc, 0xc0, - 0xe2, 0xb2, 0xbc, 0x16, 0x1d, 0x54, 0x3c, 0xf7, 0x15, 0x65, 0x55, 0xc2, 0x54, 0x64, 0x0f, 0x33, - 0x53, 0x79, 0x9c, 0xa1, 0x34, 0x93, 0xa4, 0xdf, 0xdc, 0x07, 0x3d, 0x59, 0x3a, 0xba, 0x96, 0x53, - 0x6e, 0x06, 0xc4, 0xb5, 0xc8, 0xa8, 0x8d, 0x53, 0xb9, 0xbe, 0x27, 0x79, 0x16, 0x99, 0xe8, 0xe0, - 0x49, 0xda, 0xe6, 0xa9, 0xd4, 0x28, 0x6c, 0x36, 0x3f, 0x05, 0x3d, 0x59, 0xb9, 0xd4, 0x3b, 0xee, - 0x45, 0x81, 0x43, 0xef, 0x07, 0xb1, 0xde, 0x49, 0x48, 0xeb, 0x3e, 0x54, 0x94, 0x93, 0x34, 0x2a, - 0xb0, 0xce, 0x3a, 0xc3, 0xd1, 0x80, 0x2d, 0x53, 0xab, 0xe6, 0xdf, 0xe7, 0x61, 0xf3, 0x4c, 0xb8, - 0x5a, 0x65, 0x3c, 0x7b, 0xc9, 0xe5, 0x62, 0x9e, 0xd2, 0xc2, 0xed, 0xd5, 0x11, 0x70, 0xe1, 0x2d, - 0x63, 0xc6, 0x07, 0x15, 0xce, 0xfa, 0xa0, 0x16, 0x54, 0x5f, 0xf1, 0xd3, 0x30, 0xf2, 0x6d, 0x3e, - 0xe5, 0xa4, 0x30, 0x85, 0xdb, 0x3a, 0xcb, 0xc0, 0xf0, 0x5c, 0xac, 0x80, 0xa3, 0x3a, 0x15, 0xc5, - 0xb9, 0x88, 0xde, 0xcf, 0xb8, 0x4b, 0x6c, 0x8e, 0xa0, 0xaa, 0x46, 0xe0, 0x55, 0xb2, 0xb8, 0x15, - 0x67, 0xee, 0x4b, 0x52, 0x48, 0x31, 0xda, 0x6c, 0x23, 0xd7, 0x34, 0x3c, 0xaf, 0xe2, 0x1a, 0x47, - 0xa2, 0xbc, 0x12, 0x89, 0x7e, 0x97, 0x07, 0x48, 0x63, 0xf5, 0x2a, 0x0e, 0x8f, 0x55, 0xf3, 0xbf, - 0x73, 0x61, 0xd8, 0xdf, 0x6e, 0xef, 0x1c, 0x8c, 0x77, 0x06, 0xbd, 0x5e, 0xbb, 0x2f, 0x4d, 0xff, - 0xe2, 0x83, 0xf9, 0x3a, 0x73, 0xed, 0xf5, 0xc9, 0x6a, 0xde, 0x4a, 0xa1, 0x68, 0x80, 0x16, 0xcc, - 0xa7, 0xe2, 0xb8, 0x74, 0x46, 0x6d, 0x34, 0xa2, 0x99, 0x1f, 0x3a, 0x49, 0x05, 0x57, 0x63, 0x49, - 0xbf, 0x75, 0x0f, 0x2a, 0xca, 0xea, 0x50, 0x6d, 0xfb, 0x83, 0x3e, 0xea, 0x32, 0x40, 0xa9, 0x37, - 0xd8, 0xed, 0xee, 0xbd, 0x50, 0x95, 0xb9, 0x75, 0x0b, 0xca, 0xf1, 0x84, 0x46, 0x15, 0xca, 0x47, - 0xc3, 0x0e, 0x1b, 0xb7, 0x77, 0x0e, 0xea, 0x6b, 0x68, 0x08, 0xc3, 0x17, 0x43, 0xea, 0xe4, 0x9a, - 0x5f, 0x61, 0x94, 0x4e, 0x13, 0x98, 0x15, 0xb5, 0x8a, 0x40, 0x15, 0x18, 0xcd, 0xdf, 0xe5, 0xa0, - 0xaa, 0xe6, 0x30, 0x0b, 0xaf, 0x0e, 0x6f, 0x28, 0xe5, 0xf0, 0x39, 0x8d, 0xc0, 0xd3, 0xd9, 0x82, - 0xbc, 0x3f, 0x93, 0xf7, 0xce, 0xf5, 0xec, 0xbd, 0xf3, 0xe0, 0x90, 0xe5, 0xfd, 0x59, 0xe6, 0x16, - 0x57, 0x3b, 0x73, 0x8b, 0xab, 0xde, 0x13, 0x17, 0xcf, 0xdc, 0x13, 0xdf, 0x81, 0x22, 0xba, 0x82, - 0x53, 0x92, 0xe4, 0x86, 0xb2, 0x15, 0x62, 0xde, 0xe9, 0x8f, 0xd8, 0x0b, 0x26, 0x30, 0x9a, 0xff, - 0xa5, 0x41, 0x55, 0xcd, 0xaa, 0x8c, 0xaf, 0x20, 0x3f, 0x0d, 0xa5, 0x0c, 0x7e, 0xb1, 0x22, 0x05, - 0xdb, 0x3e, 0x08, 0xa9, 0x8b, 0xc5, 0xc0, 0x34, 0x34, 0xfe, 0x82, 0x36, 0x24, 0x76, 0xfc, 0xd9, - 0x2a, 0xd2, 0xc1, 0x0c, 0x6b, 0x55, 0x9e, 0xd0, 0xfb, 0xb3, 0xe6, 0xbf, 0xe6, 0x60, 0x5d, 0x72, - 0x34, 0x06, 0xa0, 0xfb, 0xf3, 0xe8, 0xd8, 0x0f, 0x5c, 0x33, 0x92, 0x97, 0x0e, 0x0f, 0x2e, 0xb9, - 0x9a, 0xed, 0xc1, 0x3c, 0xda, 0x23, 0x42, 0x96, 0xf2, 0xa0, 0xfa, 0x32, 0xb9, 0x23, 0x10, 0x35, - 0xbd, 0x72, 0x1b, 0xf0, 0x4b, 0xd0, 0x13, 0x2a, 0x45, 0xc1, 0x36, 0x00, 0x7a, 0x83, 0x7e, 0x77, - 0x34, 0x60, 0xdd, 0xfe, 0x7e, 0x3d, 0x87, 0x0a, 0x84, 0x4a, 0x86, 0x1d, 0x8a, 0xc5, 0xdf, 0x0d, - 0x07, 0xfd, 0x7a, 0xa1, 0xf9, 0x37, 0x79, 0xa8, 0xaa, 0xfb, 0x31, 0xbe, 0x25, 0x49, 0x88, 0x65, - 0xdf, 0xff, 0x29, 0x92, 0xd8, 0x1e, 0xcc, 0xe8, 0xe4, 0xaf, 0xc6, 0xb9, 0xb0, 0x58, 0xa9, 0xe8, - 0xa0, 0x0b, 0xc3, 0x34, 0x5e, 0xdc, 0x0f, 0x50, 0x96, 0x1e, 0x2b, 0x9e, 0xa6, 0xd4, 0xf9, 0x06, - 0x68, 0xf3, 0x90, 0x07, 0xb1, 0x79, 0x61, 0x3b, 0xbd, 0x45, 0x28, 0x29, 0xb7, 0x08, 0xad, 0x03, - 0xc8, 0x0f, 0x66, 0x99, 0xa4, 0x03, 0xa0, 0xc4, 0x3a, 0xbd, 0xc1, 0x33, 0x0c, 0x0f, 0x3a, 0x14, - 0x87, 0x4f, 0xdb, 0xac, 0x53, 0xcf, 0xe3, 0xbe, 0x8f, 0xfa, 0xa2, 0x53, 0x40, 0x9c, 0xf6, 0xce, - 0x4e, 0x67, 0x38, 0xac, 0x6b, 0x8a, 0x05, 0x16, 0x9f, 0x94, 0xa1, 0x14, 0xce, 0x5f, 0x5a, 0xae, - 0xfd, 0x44, 0x87, 0x75, 0xcb, 0x77, 0x5d, 0xd3, 0xb3, 0x5b, 0xff, 0x58, 0x05, 0xc0, 0x7d, 0xcb, - 0xeb, 0xac, 0x47, 0x50, 0xe4, 0x41, 0xe0, 0x07, 0x52, 0xc1, 0xb2, 0x35, 0x97, 0xc0, 0xd9, 0xee, - 0x20, 0x42, 0xdc, 0x63, 0x02, 0x5f, 0xad, 0xf6, 0x84, 0x82, 0xdd, 0x5c, 0x44, 0x9a, 0x24, 0x6c, - 0x92, 0x78, 0x51, 0xb5, 0x57, 0x58, 0x4e, 0x9e, 0xa4, 0x0a, 0x31, 0x79, 0x5c, 0xed, 0xc9, 0xfa, - 0x49, 0x5b, 0x50, 0x98, 0x48, 0x52, 0xf2, 0x76, 0x92, 0x2c, 0xae, 0x9f, 0x44, 0x19, 0x54, 0x5c, - 0xbe, 0x53, 0xe9, 0x43, 0xe2, 0x9d, 0x9e, 0x29, 0x83, 0x4a, 0xcb, 0x09, 0xa5, 0xfe, 0xc4, 0x84, - 0xa2, 0x0c, 0xfa, 0x02, 0x6a, 0x19, 0xd1, 0xa1, 0x22, 0x58, 0x18, 0x40, 0x72, 0x22, 0x80, 0x60, - 0x9b, 0x1e, 0x17, 0xc2, 0x89, 0x54, 0x2b, 0x6c, 0x36, 0xff, 0x3b, 0x07, 0x9b, 0x67, 0xe4, 0x76, - 0x39, 0x4a, 0xe3, 0xfb, 0x4c, 0xe2, 0x83, 0x49, 0xc0, 0xfd, 0x4b, 0x1c, 0x4a, 0xdc, 0xef, 0x7a, - 0xc7, 0xbe, 0x92, 0x29, 0xfd, 0x00, 0x15, 0x65, 0x60, 0x55, 0x64, 0x4b, 0x1e, 0x49, 0xf3, 0xcb, - 0x1f, 0x49, 0x9b, 0xbf, 0x2d, 0xc0, 0xe6, 0x99, 0x23, 0xbd, 0xfc, 0xce, 0xe4, 0xd1, 0x5f, 0xb8, - 0xb3, 0x33, 0xcc, 0xe3, 0xbe, 0xd8, 0x59, 0xcc, 0xa0, 0xf9, 0x9b, 0x3c, 0x54, 0x94, 0x91, 0x3f, - 0x4e, 0x32, 0x81, 0x12, 0xb0, 0x95, 0x57, 0x9c, 0xb3, 0x12, 0xa0, 0xb1, 0xe4, 0xf7, 0x08, 0x4d, - 0xf9, 0x3d, 0xe2, 0x50, 0x46, 0xee, 0x22, 0x79, 0xa7, 0x5f, 0xfe, 0xc4, 0x7d, 0x6d, 0xef, 0x76, - 0x0e, 0x3a, 0xa3, 0xee, 0xa0, 0xaf, 0xc4, 0x73, 0x99, 0x59, 0x95, 0x92, 0xcc, 0xaa, 0xd5, 0x82, - 0xaa, 0x8a, 0x87, 0xae, 0x72, 0xaf, 0x7b, 0x80, 0x0e, 0xa6, 0x0c, 0xda, 0x88, 0x75, 0x3a, 0xf5, - 0x5c, 0x73, 0x1f, 0x2a, 0x8a, 0xd1, 0x5c, 0xf2, 0x60, 0xe2, 0xd4, 0xa1, 0x90, 0xa6, 0x0e, 0xcd, - 0x13, 0xa8, 0x65, 0x0c, 0xe9, 0x92, 0xac, 0x1e, 0x80, 0x4e, 0x06, 0xe7, 0x89, 0x6a, 0xbf, 0x90, - 0x89, 0xf9, 0xe9, 0x43, 0x32, 0x4b, 0xb1, 0x9a, 0xa1, 0xbc, 0x33, 0xa6, 0x63, 0x8c, 0xef, 0x87, - 0x73, 0xd9, 0xfb, 0x61, 0x7a, 0x59, 0x91, 0x77, 0xc6, 0xd8, 0x5e, 0xb4, 0xe4, 0xf8, 0x41, 0x53, - 0x4b, 0x1f, 0x34, 0x1b, 0xb0, 0xee, 0x91, 0x19, 0xdb, 0x32, 0x9a, 0xc7, 0xdd, 0xe6, 0x63, 0xa8, - 0x88, 0x8b, 0x56, 0xcb, 0xe2, 0x61, 0xb8, 0x70, 0xda, 0x06, 0xac, 0x4f, 0x02, 0xd3, 0x8b, 0xb8, - 0x2d, 0x4b, 0x93, 0xb8, 0xdb, 0xfc, 0xa7, 0x1c, 0xd4, 0x32, 0xce, 0xe2, 0x92, 0xc2, 0xf9, 0x02, - 0x4a, 0x34, 0x7d, 0xac, 0xfe, 0xd7, 0x97, 0x7a, 0x21, 0x52, 0x76, 0x89, 0x6c, 0x3c, 0x82, 0x92, - 0x49, 0xcb, 0xa4, 0x44, 0x7d, 0x89, 0xab, 0x54, 0x76, 0xc3, 0x24, 0x7a, 0xeb, 0x0e, 0xd4, 0xfa, - 0xe1, 0x30, 0x32, 0xa3, 0x95, 0xd7, 0xb5, 0xad, 0x7f, 0x29, 0xc0, 0x46, 0x8c, 0x7b, 0xc1, 0x9e, - 0x0c, 0xd0, 0x78, 0xba, 0x29, 0x6a, 0x53, 0x54, 0x8d, 0xb0, 0x50, 0x90, 0x37, 0xec, 0xd4, 0xc1, - 0xfa, 0xc1, 0x53, 0x73, 0x2c, 0xd9, 0xc3, 0xea, 0xdd, 0x53, 0x7e, 0x56, 0x10, 0xc7, 0xa2, 0x82, - 0x8c, 0x0f, 0x40, 0x7f, 0xe9, 0xfb, 0xd1, 0x98, 0xec, 0x50, 0xbc, 0xe4, 0x97, 0x11, 0x40, 0x3f, - 0x55, 0xdd, 0x80, 0x8a, 0x35, 0x0f, 0xe8, 0x4f, 0x94, 0x63, 0xc7, 0x96, 0x6f, 0xf9, 0x20, 0x41, - 0x7b, 0x8e, 0xad, 0x22, 0x58, 0x8e, 0x2d, 0x5f, 0xf2, 0x63, 0x84, 0x1d, 0x81, 0xe0, 0x72, 0x77, - 0xfc, 0xda, 0x09, 0xa2, 0xb9, 0x39, 0x95, 0xef, 0xf8, 0xe0, 0x72, 0xf7, 0x99, 0x80, 0x18, 0x1f, - 0x41, 0x15, 0x11, 0x02, 0x1e, 0x3a, 0x36, 0xf7, 0x22, 0xf9, 0x30, 0x89, 0x44, 0x4c, 0x82, 0x70, - 0x89, 0x88, 0x22, 0x22, 0x4a, 0x45, 0xe6, 0x89, 0xdc, 0x15, 0x69, 0xca, 0x75, 0x40, 0x6e, 0xe3, - 0x49, 0xe0, 0xbf, 0x89, 0x4e, 0xe8, 0x95, 0x52, 0x63, 0x88, 0xbe, 0x4f, 0x00, 0x3c, 0x83, 0xe8, - 0x24, 0xe0, 0xa6, 0x2d, 0x9e, 0xe7, 0x35, 0x16, 0x77, 0x51, 0x61, 0x8e, 0xed, 0x90, 0x1e, 0x24, - 0x35, 0x86, 0x4d, 0x14, 0xe2, 0x7c, 0x46, 0x72, 0x10, 0x7f, 0x81, 0xc8, 0x5e, 0xeb, 0xdf, 0x0a, - 0x50, 0xeb, 0x99, 0x9e, 0x33, 0x4d, 0x72, 0xe5, 0x6f, 0xa1, 0x1a, 0x88, 0xe6, 0x58, 0x79, 0x51, - 0x4a, 0x2f, 0x9b, 0x7b, 0xed, 0x7e, 0xf7, 0xa0, 0x3d, 0x66, 0x9d, 0x1f, 0x8e, 0x3a, 0xc3, 0x91, - 0xa8, 0x1b, 0x2a, 0x92, 0x62, 0x84, 0xee, 0xe6, 0x7d, 0x28, 0xa3, 0x2e, 0x8c, 0xcf, 0xfc, 0x0d, - 0xf7, 0xbd, 0x78, 0x24, 0xa2, 0x3f, 0x0e, 0x2d, 0x3f, 0xce, 0x92, 0x92, 0x3e, 0x6e, 0x96, 0xa4, - 0x30, 0x56, 0xff, 0x02, 0x20, 0x08, 0xfd, 0xd1, 0xb5, 0x05, 0x15, 0x9b, 0x87, 0x56, 0xe0, 0xcc, - 0x92, 0x27, 0x15, 0x9d, 0xa9, 0x20, 0x9c, 0x57, 0x30, 0x90, 0xbf, 0x95, 0xe9, 0x6c, 0x9d, 0xfa, - 0x5d, 0xdb, 0xf8, 0x18, 0x36, 0xc4, 0x90, 0x78, 0x5d, 0x95, 0xc7, 0xad, 0xb3, 0x2a, 0x41, 0xf7, - 0x11, 0x28, 0xfe, 0x3d, 0x13, 0x29, 0x41, 0x59, 0xd4, 0xfa, 0x22, 0xde, 0x37, 0x60, 0x9d, 0x0a, - 0x56, 0x3f, 0xa0, 0x13, 0xd6, 0x59, 0xdc, 0x45, 0x99, 0x72, 0x91, 0xb5, 0x81, 0x78, 0x92, 0x11, - 0x3d, 0x3c, 0x76, 0xd3, 0x76, 0x1d, 0x6f, 0x2c, 0x47, 0x2b, 0x62, 0xad, 0x04, 0xeb, 0x24, 0xef, - 0xc0, 0x62, 0x41, 0xf4, 0x5c, 0x55, 0x55, 0x36, 0xfb, 0xd4, 0x0f, 0x23, 0xe3, 0x56, 0xbc, 0xde, - 0xf8, 0x25, 0x5c, 0xfe, 0x7f, 0x51, 0x23, 0x68, 0xfc, 0xea, 0xdd, 0xfa, 0x7d, 0x0e, 0x36, 0xe2, - 0xc3, 0x93, 0xa6, 0x26, 0x5d, 0x45, 0x2e, 0xe3, 0x92, 0xad, 0xb8, 0x4c, 0x2d, 0x4a, 0xe3, 0xbb, - 0x0e, 0x10, 0xf9, 0x91, 0x39, 0x1d, 0xcf, 0x43, 0xf9, 0x5c, 0x53, 0x60, 0x3a, 0x41, 0x8e, 0x42, - 0x8e, 0x21, 0x6e, 0x43, 0x0c, 0x5b, 0xe6, 0xcc, 0xb4, 0x9c, 0x48, 0x3c, 0xf6, 0x15, 0x58, 0x8d, - 0xa0, 0x3b, 0x12, 0x68, 0x7c, 0x02, 0x9b, 0x1e, 0x7f, 0x23, 0x74, 0x77, 0x9c, 0x26, 0x53, 0x05, - 0x56, 0xf3, 0xf8, 0x1b, 0xd2, 0x60, 0x72, 0xd3, 0x28, 0xfd, 0x14, 0x4f, 0x79, 0xf6, 0xaa, 0xc6, - 0x68, 0x87, 0x66, 0x74, 0x72, 0xf7, 0xcf, 0x41, 0x3b, 0x13, 0x8b, 0x6a, 0xa0, 0xef, 0x0c, 0xfa, - 0xa3, 0x76, 0xb7, 0xdf, 0x61, 0x0b, 0x92, 0xfb, 0xe1, 0xa8, 0x3d, 0xaa, 0x17, 0xee, 0xde, 0x03, - 0x3d, 0xf9, 0x17, 0x08, 0xc1, 0x58, 0x4f, 0x8a, 0x7b, 0x94, 0x7d, 0x36, 0x38, 0x3a, 0x14, 0xd9, - 0xf1, 0x21, 0x1b, 0x7c, 0xd7, 0xd9, 0x41, 0xf4, 0xfb, 0xb0, 0x2e, 0x4b, 0x38, 0x63, 0x1d, 0x0a, - 0xfb, 0x9d, 0x51, 0x7d, 0x0d, 0x1b, 0xc3, 0xce, 0xa8, 0x9e, 0x33, 0x4a, 0x90, 0x67, 0xbd, 0x7a, - 0x9e, 0xd2, 0xec, 0x5e, 0x7f, 0xb0, 0xdb, 0x21, 0xfe, 0x90, 0x96, 0x65, 0xd9, 0xe2, 0xf6, 0xd9, - 0xe0, 0xe0, 0xa8, 0x27, 0x53, 0xf1, 0x2e, 0xa1, 0xe7, 0xef, 0xfe, 0x26, 0x07, 0x57, 0x16, 0x98, - 0x88, 0x51, 0x87, 0xaa, 0xc8, 0xe2, 0xc7, 0x22, 0x4f, 0x5f, 0x43, 0x08, 0x05, 0xe1, 0x18, 0x92, - 0x43, 0x48, 0xe7, 0xf9, 0xa8, 0xd3, 0xdf, 0x1d, 0xc7, 0x89, 0x7d, 0x1d, 0xaa, 0xc3, 0xa7, 0xac, - 0xdb, 0xff, 0x7e, 0x1c, 0x67, 0xf7, 0x57, 0x60, 0xb3, 0xd7, 0xee, 0xb7, 0xf7, 0x3b, 0xe3, 0xce, - 0x73, 0x29, 0x0d, 0x8d, 0xca, 0xe8, 0xbe, 0x00, 0xd7, 0x8b, 0x86, 0x01, 0x1b, 0xfb, 0x9d, 0xd1, - 0x78, 0xa7, 0x7d, 0xd8, 0xde, 0xe9, 0x8e, 0xba, 0x9d, 0x61, 0xbd, 0xf4, 0xf0, 0x7f, 0x0b, 0x50, - 0xe8, 0xf8, 0xa1, 0xf1, 0x10, 0xb4, 0x43, 0xc7, 0x9b, 0x18, 0xe9, 0xfb, 0xab, 0xf2, 0xc3, 0x6f, - 0xd3, 0x38, 0x03, 0x9d, 0x4d, 0x4f, 0x5b, 0x6b, 0xc6, 0x03, 0xc8, 0xf7, 0x76, 0x0d, 0x43, 0x49, - 0x85, 0x62, 0xfc, 0x2b, 0x19, 0x98, 0x50, 0xc1, 0xd6, 0xda, 0xe7, 0x39, 0xe3, 0x0b, 0xd0, 0xf6, - 0x1c, 0xcf, 0x36, 0xd4, 0xe7, 0xee, 0xe4, 0xb1, 0x7a, 0x39, 0xd9, 0x63, 0x28, 0x89, 0xd0, 0x61, - 0xbc, 0x9b, 0x46, 0x26, 0x35, 0xee, 0x34, 0xdf, 0x3b, 0x07, 0x8f, 0xc9, 0x8d, 0xef, 0x60, 0xf3, - 0xcc, 0x1f, 0xc5, 0xc6, 0x8d, 0xf3, 0xaf, 0xe8, 0x99, 0x9f, 0x7c, 0x9b, 0xe9, 0xfa, 0x94, 0xbf, - 0x74, 0x5b, 0x6b, 0xc6, 0x5f, 0x02, 0xa4, 0x7f, 0x04, 0x1b, 0xcd, 0xcc, 0xa3, 0xfd, 0xe5, 0x38, - 0x3c, 0x00, 0xad, 0xf3, 0x96, 0x5b, 0x8a, 0xd8, 0x92, 0xf2, 0x52, 0xd9, 0x7f, 0x1a, 0x76, 0x5b, - 0x6b, 0xc6, 0x53, 0xb8, 0x22, 0xac, 0x79, 0xc8, 0x83, 0xd7, 0x3c, 0xb9, 0xe8, 0x4b, 0x45, 0x91, - 0x71, 0xd4, 0x8a, 0x28, 0xb2, 0x3e, 0xa0, 0xb5, 0xf6, 0xe4, 0x08, 0x36, 0x1d, 0x7f, 0x7b, 0x82, - 0x63, 0x12, 0xe7, 0x49, 0xb9, 0xe3, 0x87, 0x94, 0x30, 0x1d, 0xe6, 0xfe, 0xea, 0xf3, 0x89, 0x13, - 0x9d, 0xcc, 0x5f, 0x6e, 0x5b, 0xbe, 0x7b, 0xdf, 0xe2, 0x81, 0x77, 0x8f, 0xfb, 0xe1, 0x7d, 0xc4, - 0xbe, 0x47, 0xde, 0xf8, 0x3e, 0x7d, 0x5f, 0xce, 0x8f, 0x1f, 0x73, 0x3f, 0x1c, 0x23, 0xfc, 0x1f, - 0xf2, 0x85, 0xce, 0x60, 0xf8, 0xb2, 0x44, 0x03, 0x7f, 0xfa, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, - 0x8f, 0xfd, 0x31, 0xde, 0x3b, 0x2e, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// EosClient is the client API for Eos service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type EosClient interface { - // Replies to a ping - Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingReply, error) - // Replies to MD requests with a stream - MD(ctx context.Context, in *MDRequest, opts ...grpc.CallOption) (Eos_MDClient, error) - // Replies to Find requests with a stream - Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (Eos_FindClient, error) - // Replies to a NsStat operation - NsStat(ctx context.Context, in *NsStatRequest, opts ...grpc.CallOption) (*NsStatResponse, error) - // Replies to an insert - ContainerInsert(ctx context.Context, in *ContainerInsertRequest, opts ...grpc.CallOption) (*InsertReply, error) - FileInsert(ctx context.Context, in *FileInsertRequest, opts ...grpc.CallOption) (*InsertReply, error) - // Replies to a NsRequest operation - Exec(ctx context.Context, in *NSRequest, opts ...grpc.CallOption) (*NSResponse, error) - // Manila Driver - ManilaServerRequest(ctx context.Context, in *ManilaRequest, opts ...grpc.CallOption) (*ManilaResponse, error) -} - -type eosClient struct { - cc grpc.ClientConnInterface -} - -func NewEosClient(cc grpc.ClientConnInterface) EosClient { - return &eosClient{cc} -} - -func (c *eosClient) Ping(ctx context.Context, in *PingRequest, opts ...grpc.CallOption) (*PingReply, error) { - out := new(PingReply) - err := c.cc.Invoke(ctx, "/eos.rpc.Eos/Ping", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eosClient) MD(ctx context.Context, in *MDRequest, opts ...grpc.CallOption) (Eos_MDClient, error) { - stream, err := c.cc.NewStream(ctx, &_Eos_serviceDesc.Streams[0], "/eos.rpc.Eos/MD", opts...) - if err != nil { - return nil, err - } - x := &eosMDClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Eos_MDClient interface { - Recv() (*MDResponse, error) - grpc.ClientStream -} - -type eosMDClient struct { - grpc.ClientStream -} - -func (x *eosMDClient) Recv() (*MDResponse, error) { - m := new(MDResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *eosClient) Find(ctx context.Context, in *FindRequest, opts ...grpc.CallOption) (Eos_FindClient, error) { - stream, err := c.cc.NewStream(ctx, &_Eos_serviceDesc.Streams[1], "/eos.rpc.Eos/Find", opts...) - if err != nil { - return nil, err - } - x := &eosFindClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Eos_FindClient interface { - Recv() (*MDResponse, error) - grpc.ClientStream -} - -type eosFindClient struct { - grpc.ClientStream -} - -func (x *eosFindClient) Recv() (*MDResponse, error) { - m := new(MDResponse) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *eosClient) NsStat(ctx context.Context, in *NsStatRequest, opts ...grpc.CallOption) (*NsStatResponse, error) { - out := new(NsStatResponse) - err := c.cc.Invoke(ctx, "/eos.rpc.Eos/NsStat", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eosClient) ContainerInsert(ctx context.Context, in *ContainerInsertRequest, opts ...grpc.CallOption) (*InsertReply, error) { - out := new(InsertReply) - err := c.cc.Invoke(ctx, "/eos.rpc.Eos/ContainerInsert", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eosClient) FileInsert(ctx context.Context, in *FileInsertRequest, opts ...grpc.CallOption) (*InsertReply, error) { - out := new(InsertReply) - err := c.cc.Invoke(ctx, "/eos.rpc.Eos/FileInsert", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eosClient) Exec(ctx context.Context, in *NSRequest, opts ...grpc.CallOption) (*NSResponse, error) { - out := new(NSResponse) - err := c.cc.Invoke(ctx, "/eos.rpc.Eos/Exec", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *eosClient) ManilaServerRequest(ctx context.Context, in *ManilaRequest, opts ...grpc.CallOption) (*ManilaResponse, error) { - out := new(ManilaResponse) - err := c.cc.Invoke(ctx, "/eos.rpc.Eos/ManilaServerRequest", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// EosServer is the server API for Eos service. -type EosServer interface { - // Replies to a ping - Ping(context.Context, *PingRequest) (*PingReply, error) - // Replies to MD requests with a stream - MD(*MDRequest, Eos_MDServer) error - // Replies to Find requests with a stream - Find(*FindRequest, Eos_FindServer) error - // Replies to a NsStat operation - NsStat(context.Context, *NsStatRequest) (*NsStatResponse, error) - // Replies to an insert - ContainerInsert(context.Context, *ContainerInsertRequest) (*InsertReply, error) - FileInsert(context.Context, *FileInsertRequest) (*InsertReply, error) - // Replies to a NsRequest operation - Exec(context.Context, *NSRequest) (*NSResponse, error) - // Manila Driver - ManilaServerRequest(context.Context, *ManilaRequest) (*ManilaResponse, error) -} - -// UnimplementedEosServer can be embedded to have forward compatible implementations. -type UnimplementedEosServer struct { -} - -func (*UnimplementedEosServer) Ping(ctx context.Context, req *PingRequest) (*PingReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Ping not implemented") -} -func (*UnimplementedEosServer) MD(req *MDRequest, srv Eos_MDServer) error { - return status.Errorf(codes.Unimplemented, "method MD not implemented") -} -func (*UnimplementedEosServer) Find(req *FindRequest, srv Eos_FindServer) error { - return status.Errorf(codes.Unimplemented, "method Find not implemented") -} -func (*UnimplementedEosServer) NsStat(ctx context.Context, req *NsStatRequest) (*NsStatResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method NsStat not implemented") -} -func (*UnimplementedEosServer) ContainerInsert(ctx context.Context, req *ContainerInsertRequest) (*InsertReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ContainerInsert not implemented") -} -func (*UnimplementedEosServer) FileInsert(ctx context.Context, req *FileInsertRequest) (*InsertReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method FileInsert not implemented") -} -func (*UnimplementedEosServer) Exec(ctx context.Context, req *NSRequest) (*NSResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Exec not implemented") -} -func (*UnimplementedEosServer) ManilaServerRequest(ctx context.Context, req *ManilaRequest) (*ManilaResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ManilaServerRequest not implemented") -} - -func RegisterEosServer(s *grpc.Server, srv EosServer) { - s.RegisterService(&_Eos_serviceDesc, srv) -} - -func _Eos_Ping_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(PingRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(EosServer).Ping(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/eos.rpc.Eos/Ping", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(EosServer).Ping(ctx, req.(*PingRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Eos_MD_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(MDRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(EosServer).MD(m, &eosMDServer{stream}) -} - -type Eos_MDServer interface { - Send(*MDResponse) error - grpc.ServerStream -} - -type eosMDServer struct { - grpc.ServerStream -} - -func (x *eosMDServer) Send(m *MDResponse) error { - return x.ServerStream.SendMsg(m) -} - -func _Eos_Find_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(FindRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(EosServer).Find(m, &eosFindServer{stream}) -} - -type Eos_FindServer interface { - Send(*MDResponse) error - grpc.ServerStream -} - -type eosFindServer struct { - grpc.ServerStream -} - -func (x *eosFindServer) Send(m *MDResponse) error { - return x.ServerStream.SendMsg(m) -} - -func _Eos_NsStat_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NsStatRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(EosServer).NsStat(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/eos.rpc.Eos/NsStat", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(EosServer).NsStat(ctx, req.(*NsStatRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Eos_ContainerInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ContainerInsertRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(EosServer).ContainerInsert(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/eos.rpc.Eos/ContainerInsert", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(EosServer).ContainerInsert(ctx, req.(*ContainerInsertRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Eos_FileInsert_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(FileInsertRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(EosServer).FileInsert(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/eos.rpc.Eos/FileInsert", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(EosServer).FileInsert(ctx, req.(*FileInsertRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Eos_Exec_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NSRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(EosServer).Exec(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/eos.rpc.Eos/Exec", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(EosServer).Exec(ctx, req.(*NSRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Eos_ManilaServerRequest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ManilaRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(EosServer).ManilaServerRequest(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/eos.rpc.Eos/ManilaServerRequest", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(EosServer).ManilaServerRequest(ctx, req.(*ManilaRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Eos_serviceDesc = grpc.ServiceDesc{ - ServiceName: "eos.rpc.Eos", - HandlerType: (*EosServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Ping", - Handler: _Eos_Ping_Handler, - }, - { - MethodName: "NsStat", - Handler: _Eos_NsStat_Handler, - }, - { - MethodName: "ContainerInsert", - Handler: _Eos_ContainerInsert_Handler, - }, - { - MethodName: "FileInsert", - Handler: _Eos_FileInsert_Handler, - }, - { - MethodName: "Exec", - Handler: _Eos_Exec_Handler, - }, - { - MethodName: "ManilaServerRequest", - Handler: _Eos_ManilaServerRequest_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "MD", - Handler: _Eos_MD_Handler, - ServerStreams: true, - }, - { - StreamName: "Find", - Handler: _Eos_Find_Handler, - ServerStreams: true, - }, - }, - Metadata: "Rpc.proto", -} diff --git a/pkg/eosclient/eosgrpc/eos_grpc/Rpc.proto b/pkg/eosclient/eosgrpc/eos_grpc/Rpc.proto deleted file mode 100644 index 97c68bdaa5..0000000000 --- a/pkg/eosclient/eosgrpc/eos_grpc/Rpc.proto +++ /dev/null @@ -1,604 +0,0 @@ -// @project The CERN Tape Archive (CTA) -// @brief CTA-EOS gRPC API for CASTOR-EOS migration -// @copyright Copyright 2019 CERN -// @license This program is free software: you can redistribute it and/or -// modify -// it under the terms of the GNU General Public License as -// published by the Free Software Foundation, either version 3 -// of the License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be -// useful, but WITHOUT ANY WARRANTY; without even the implied -// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -// PURPOSE. See the GNU General Public License for more -// details. -// -// You should have received a copy of the GNU General Public -// License along with this program. If not, see -// . - -// NOTE: Compile for Go with: -// protoc ./eos_grpc.proto --go_out=plugins=grpc:. - -syntax = "proto3"; - -package eos.rpc; - -option java_multiple_files = true; -option java_package = "io.grpc.eos.rpc"; -option java_outer_classname = "EosProto"; -option objc_class_prefix = "EOS"; -option go_package = "github.com/cern-eos/grpc-proto/protobuf;eos_grpc"; - -service Eos { - // Replies to a ping - rpc Ping(PingRequest) returns (PingReply) {} - - // --------------------------------------------------------------------- - // NAMESPACE - // --------------------------------------------------------------------- - - // Replies to MD requests with a stream - rpc MD(MDRequest) returns (stream MDResponse) {} - - // Replies to Find requests with a stream - rpc Find(FindRequest) returns (stream MDResponse) {} - - // Replies to a NsStat operation - rpc NsStat(NsStatRequest) returns (NsStatResponse) {} - - // Replies to an insert - rpc ContainerInsert(ContainerInsertRequest) returns (InsertReply) {} - rpc FileInsert(FileInsertRequest) returns (InsertReply) {} - - // Replies to a NsRequest operation - rpc Exec(NSRequest) returns (NSResponse) {} - - // --------------------------------------------------------------------- - // OPENSTACK - // --------------------------------------------------------------------- - - // Manila Driver - rpc ManilaServerRequest(ManilaRequest) returns (ManilaResponse) {} -} - -message PingRequest { - string authkey = 1; - bytes message = 2; -} - -message PingReply { bytes message = 1; } - -// --------------------------------------------------------------------- -// NAMESPACE -// --------------------------------------------------------------------- - -message ContainerInsertRequest { - repeated ContainerMdProto container = 1; - string authkey = 2; - bool inherit_md = 3; -} - -message FileInsertRequest { - repeated FileMdProto files = 1; - string authkey = 2; -} - -message InsertReply { - repeated string message = 1; - repeated uint32 retc = 2; -} - -message Time { - uint64 sec = 1; - uint64 n_sec = 2; -} - -message Checksum { - bytes value = 1; - string type = 2; -} - -message FileMdProto { - uint64 id = 1; - uint64 cont_id = 2; - uint64 uid = 3; - uint64 gid = 4; - uint64 size = 5; - uint32 layout_id = 6; - uint32 flags = 7; - bytes name = 8; - bytes link_name = 9; - Time ctime = 10; // change time - Time mtime = 11; // modification time - Checksum checksum = 12; - repeated uint32 locations = 13; - repeated uint32 unlink_locations = 14; - map xattrs = 15; - bytes path = 16; - string etag = 17; - uint64 inode = 18; -} - -message ContainerMdProto { - uint64 id = 1; - uint64 parent_id = 2; - uint64 uid = 3; - uint64 gid = 4; - int64 tree_size = 6; - uint32 mode = 5; - uint32 flags = 7; - bytes name = 8; - Time ctime = 9; // change time - Time mtime = 10; // modification time - Time stime = 11; // sync time - map xattrs = 12; - bytes path = 13; - string etag = 14; - uint64 inode = 15; -} - -enum TYPE { - FILE = 0; - CONTAINER = 1; - LISTING = 2; - STAT = 3; -} - -enum QUOTATYPE { - USER = 0; - GROUP = 2; - PROJECT = 3; -} - -enum QUOTAOP { - GET = 0; - SET = 1; - RM = 2; - RMNODE = 3; -} - -enum QUOTAENTRY { - NONE = 0; - VOLUME = 1; - INODE = 2; -} - -message QuotaProto { - bytes path = 1; // quota node path - string name = 2; // associated name for the given type - QUOTATYPE type = 3; // user,group,project or all quota - uint64 usedbytes = 4; // bytes used physical - uint64 usedlogicalbytes = 5; // bytes used logical - uint64 usedfiles = 6; // number of files used - uint64 maxbytes = 7; // maximum number of bytes (volume quota) - uint64 maxlogicalbytes = - 8; // maximum number of logical bytes (logical volume quota) - uint64 maxfiles = 9; // maximum number of files (inode quota) - float percentageusedbytes = - 10; // percentage of volume quota used from 0 to 100 - float percentageusedfiles = 11; // percentag of inode quota used from 0 to 100 - string statusbytes = 12; // status string for volume quota ok,warning,exceeded - string statusfiles = 13; // status string for inode quota ok,warning,exceeded -} - -message RoleId { - uint64 uid = 1; - uint64 gid = 2; - string username = 3; - string groupname = 4; -} - -message MDId { - bytes path = 1; - fixed64 id = 2; - fixed64 ino = 3; - TYPE type = 4; -} - -message Limit { - bool zero = 1; - uint64 min = 2; - uint64 max = 3; -} - -message MDSelection { - bool select = 1; - Limit ctime = 2; - Limit mtime = 3; - Limit stime = 4; - Limit size = 5; - Limit treesize = 6; - Limit children = 7; - Limit locations = 8; - Limit unlinked_locations = 9; - uint64 layoutid = 10; - uint64 flags = 11; - bool symlink = 12; - Checksum checksum = 13; - uint32 owner = 14; - uint32 group = 15; - bool owner_root = 16; - bool group_root = 17; - bytes regexp_filename = 18; - bytes regexp_dirname = 19; - map xattr = 20; -} - -message MDRequest { - TYPE type = 1; - MDId id = 2; - string authkey = 3; - RoleId role = 4; - MDSelection selection = 5; -} - -message MDResponse { - TYPE type = 1; - FileMdProto fmd = 2; - ContainerMdProto cmd = 3; -} - -message FindRequest { - TYPE type = 1; - MDId id = 2; - RoleId role = 3; - string authkey = 4; - uint64 maxdepth = 5; - MDSelection selection = 6; -} - -message ShareAuth { - string prot = 1; - string name = 2; - string host = 3; -} - -message ShareProto { - string permission = 1; - uint64 expires = 2; - string owner = 3; - string group = 4; - uint64 generation = 5; - string path = 6; - bool allowtree = 7; - string vtoken = 8; - repeated ShareAuth origins = 9; -} - -message ShareToken { - ShareProto token = 1; - bytes signature = 2; - bytes serialized = 3; - int32 seed = 4; -} - -message NSRequest { - message MkdirRequest { - MDId id = 1; - bool recursive = 2; - int64 mode = 3; - } - - message RmdirRequest { MDId id = 1; } - - message TouchRequest { MDId id = 1; } - - message UnlinkRequest { - MDId id = 1; - bool norecycle = 3; - } - - message RmRequest { - MDId id = 1; - bool recursive = 2; - bool norecycle = 3; - } - - message RenameRequest { - MDId id = 1; - bytes target = 2; - } - - message SymlinkRequest { - MDId id = 1; - bytes target = 2; - } - - message VersionRequest { - enum VERSION_CMD { - CREATE = 0; - PURGE = 1; - LIST = 2; - GRAB = 3; - } - MDId id = 1; - VERSION_CMD cmd = 2; - int32 maxversion = 3; - string grabversion = 4; - } - - message RecycleRequest { - string key = 1; - enum RECYCLE_CMD { - RESTORE = 0; - PURGE = 1; - LIST = 2; - } - RECYCLE_CMD cmd = 2; - - message RestoreFlags { - bool force = 1; - bool mkpath = 2; - bool versions = 3; - } - - message PurgeDate { - int32 year = 1; - int32 month = 2; - int32 day = 3; - } - - RestoreFlags restoreflag = 3; - PurgeDate purgedate = 4; - } - - message SetXAttrRequest { - MDId id = 1; - map xattrs = 2; - bool recursive = 3; - repeated string keystodelete = 4; - bool create = 5; - } - - message ChownRequest { - MDId id = 1; - RoleId owner = 2; - } - - message ChmodRequest { - MDId id = 1; - int64 mode = 2; - } - - message AclRequest { - enum ACL_COMMAND { - NONE = 0; - MODIFY = 1; - LIST = 2; - } - - enum ACL_TYPE { - USER_ACL = 0; - SYS_ACL = 1; - } - - MDId id = 1; - ACL_COMMAND cmd = 2; - bool recursive = 3; - ACL_TYPE type = 4; - string rule = 5; - uint32 position = 6; - } - - message TokenRequest { ShareToken token = 1; } - - message QuotaRequest { - bytes path = 1; - RoleId id = 2; - QUOTAOP op = 3; // get or set, rm or rmnode - uint64 maxfiles = 4; // maximum number of bytes (volume quota) for setting - uint64 maxbytes = 5; // maximum number of bytes (volume quota) for setting - QUOTAENTRY entry = 6; // select volume or inode entry for deletion - } - - message ShareRequest { - message LsShare { - enum OutFormat { - NONE = 0; // - MONITORING = 1; // [-m] - LISTING = 2; // [-l] - JSON = 3; // [grpc] - } - OutFormat outformat = 1; // - string selection = 2; // - } - - message OperateShare { - enum Op { - CREATE = 0; - REMOVE = 1; - SHARE = 2; - UNSHARE = 3; - ACCESS = 4; - MODIFY = 5; - } - Op op = 1; - string share = 2; - string acl = 3; - string path = 4; - string user = 5; - string group = 6; - } - - oneof subcmd { - LsShare ls = 1; - OperateShare op = 2; - } - } - - string authkey = 1; - RoleId role = 2; - - // Actual request data object - oneof command { - MkdirRequest mkdir = 21; - RmdirRequest rmdir = 22; - TouchRequest touch = 23; - UnlinkRequest unlink = 24; - RmRequest rm = 25; - RenameRequest rename = 26; - SymlinkRequest symlink = 27; - VersionRequest version = 28; - RecycleRequest recycle = 29; - SetXAttrRequest xattr = 30; - ChownRequest chown = 31; - ChmodRequest chmod = 32; - AclRequest acl = 33; - TokenRequest token = 34; - QuotaRequest quota = 35; - ShareRequest share = 36; - } -} - -message NSResponse { - message ErrorResponse { - int64 code = 1; - string msg = 2; - } - - message VersionResponse { - message VersionInfo { - MDId id = 1; - Time mtime = 2; - } - int64 code = 1; - string msg = 2; - repeated VersionInfo versions = 3; - } - - message RecycleResponse { - int64 code = 1; - string msg = 2; - - message RecycleInfo { - enum DELETIONTYPE { - FILE = 0; - TREE = 1; - } - MDId id = 1; - RoleId owner = 2; - Time dtime = 3; - uint64 size = 4; - DELETIONTYPE type = 5; - string key = 6; - } - - repeated RecycleInfo recycles = 3; - } - - message AclResponse { - int64 code = 1; - string msg = 2; - string rule = 3; - } - - message QuotaResponse { - int64 code = 1; - string msg = 2; - repeated QuotaProto quotanode = 3; - } - - message ShareInfo { - string name = 1; - string root = 2; - string rule = 3; - uint64 uid = 4; - uint64 nshared = 5; - } - - message ShareAccess { - string name = 1; - bool granted = 2; - } - - message ShareResponse { - int64 code = 1; - string msg = 2; - repeated ShareInfo shares = 3; - repeated ShareAccess access = 4; - } - - ErrorResponse error = 1; - VersionResponse version = 2; - RecycleResponse recycle = 3; - AclResponse acl = 4; - QuotaResponse quota = 5; - ShareResponse share = 6; -} - -message NsStatRequest { string authkey = 1; } - -message NsStatResponse { - int64 code = 1; - string emsg = 2; - string state = 3; - uint64 nfiles = 4; - uint64 ncontainers = 5; - uint64 boot_time = 6; - uint64 current_fid = 7; - uint64 current_cid = 8; - uint64 mem_virtual = 9; - uint64 mem_resident = 10; - uint64 mem_share = 11; - uint64 mem_growth = 12; - uint64 threads = 13; - uint64 fds = 14; - uint64 uptime = 15; -} - -// --------------------------------------------------------------------- -// OPENSTACK -// --------------------------------------------------------------------- - -enum MANILA_REQUEST_TYPE { - CREATE_SHARE = 0; - DELETE_SHARE = 1; - EXTEND_SHARE = 2; - SHRINK_SHARE = 3; - MANAGE_EXISTING = 4; - UNMANAGE = 5; - GET_CAPACITIES = 6; - /* EXTRA FUNCTIONS NOT IMPLEMENTED */ - /* - CREATE_SNAPSHOT = 7; - DELETE_SNAPSHOT = 8; - CREATE_SHARE_FROM_SNAPSHOT = 9; - ENSURE_SHARE = 10; - ALLOW_ACCESS = 11; - DENY_ACCESS = 12; - GET_SHARE_STATS = 13; - DO_SETUP = 14; - SETUP_SERVER = 15; - TEARDOWN_SERVER = 16; - GET_NETWORK_ALLOCATIONS_NUMBER = 17; - VERIFY_SHARE_SERVER_HANDLING = 18; - CREATE_SHARE_GROUP = 19; - DELETE_SHARE_GROUP = 20; - */ -} - -message ManilaRequest { - MANILA_REQUEST_TYPE request_type = 1; - string auth_key = 2; - string protocol = 3; - string share_name = 4; - string description = 5; - string share_id = 6; - string share_group_id = 7; - int32 quota = 8; - string creator = 9; - string egroup = 10; - string admin_egroup = 11; - string share_host = 12; - string share_location = 13; -} - -message ManilaResponse { - string msg = 1; // for generic messages - int32 code = 2; // < 1 is an error -- > 1 is OK - int64 total_used = 3; - int64 total_capacity = 4; - int64 new_share_quota = 5; - string new_share_path = 6; -} diff --git a/pkg/eosclient/eosgrpc/eosgrpc.go b/pkg/eosclient/eosgrpc/eosgrpc.go index 59cc0c5fbc..8a86c1b5cd 100644 --- a/pkg/eosclient/eosgrpc/eosgrpc.go +++ b/pkg/eosclient/eosgrpc/eosgrpc.go @@ -23,23 +23,20 @@ package eosgrpc import ( - "bytes" "context" "encoding/hex" "fmt" "io" "os" - "os/exec" "path" "strconv" "strings" - "syscall" "time" + erpc "github.com/cern-eos/go-eosgrpc" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/eosclient" - erpc "github.com/cs3org/reva/pkg/eosclient/eosgrpc/eos_grpc" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/storage/utils/acl" "github.com/google/uuid" @@ -141,7 +138,7 @@ type Client struct { func newgrpc(ctx context.Context, log *zerolog.Logger, opt *Options) (erpc.EosClient, error) { log.Debug().Msgf("Setting up GRPC towards '%s'", opt.GrpcURI) - conn, err := grpc.Dial(opt.GrpcURI, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, err := grpc.NewClient(opt.GrpcURI, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Warn().Err(err).Msgf("Error connecting to '%s'", opt.GrpcURI) } @@ -204,7 +201,7 @@ func (c *Client) getRespError(rsp *erpc.NSResponse, err error) error { } // Common code to create and initialize a NSRequest. -func (c *Client) initNSRequest(ctx context.Context, auth eosclient.Authorization) (*erpc.NSRequest, error) { +func (c *Client) initNSRequest(ctx context.Context, auth eosclient.Authorization, app string) (*erpc.NSRequest, error) { // Stuff filename, uid, gid into the MDRequest type log := appctx.GetLogger(ctx) @@ -223,12 +220,15 @@ func (c *Client) initNSRequest(ctx context.Context, auth eosclient.Authorization } rq.Role.Uid = uidInt rq.Role.Gid = gidInt + if app != "" { + rq.Role.App = app + } rq.Authkey = c.opt.Authkey return rq, nil } -// Common code to create and initialize a NSRequest. +// Common code to create and initialize a MDRequest. func (c *Client) initMDRequest(ctx context.Context, auth eosclient.Authorization) (*erpc.MDRequest, error) { // Stuff filename, uid, gid into the MDRequest type @@ -260,7 +260,7 @@ func (c *Client) AddACL(ctx context.Context, auth, rootAuth eosclient.Authorizat log.Info().Str("func", "AddACL").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Msg("") // Init a new NSRequest - rq, err := c.initNSRequest(ctx, rootAuth) + rq, err := c.initNSRequest(ctx, rootAuth, "") if err != nil { return err } @@ -311,7 +311,7 @@ func (c *Client) RemoveACL(ctx context.Context, auth, rootAuth eosclient.Authori sysACL := acls.Serialize() // Init a new NSRequest - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -388,7 +388,7 @@ func (c *Client) getACLForPath(ctx context.Context, auth eosclient.Authorization log.Info().Str("func", "GetACLForPath").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return nil, err } @@ -507,12 +507,12 @@ func (c *Client) fixupACLs(ctx context.Context, auth eosclient.Authorization, in } // SetAttr sets an extended attributes on a path. -func (c *Client) SetAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, errorIfExists, recursive bool, path string) error { +func (c *Client) SetAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, errorIfExists, recursive bool, path, app string) error { log := appctx.GetLogger(ctx) log.Info().Str("func", "SetAttr").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, app) if err != nil { return err } @@ -557,12 +557,12 @@ func (c *Client) SetAttr(ctx context.Context, auth eosclient.Authorization, attr } // UnsetAttr unsets an extended attribute on a path. -func (c *Client) UnsetAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, recursive bool, path string) error { +func (c *Client) UnsetAttr(ctx context.Context, auth eosclient.Authorization, attr *eosclient.Attribute, recursive bool, path, app string) error { log := appctx.GetLogger(ctx) log.Info().Str("func", "UnsetAttr").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, app) if err != nil { return err } @@ -572,7 +572,6 @@ func (c *Client) UnsetAttr(ctx context.Context, auth eosclient.Authorization, at var ktd = []string{attr.GetKey()} msg.Keystodelete = ktd msg.Recursive = recursive - msg.Id = new(erpc.MDId) msg.Id.Path = []byte(path) @@ -725,7 +724,7 @@ func (c *Client) GetQuota(ctx context.Context, username string, rootAuth eosclie log.Info().Str("func", "GetQuota").Str("rootuid,rootgid", rootAuth.Role.UID+","+rootAuth.Role.GID).Str("username", username).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, rootAuth) + rq, err := c.initNSRequest(ctx, rootAuth, "") if err != nil { return nil, err } @@ -801,7 +800,7 @@ func (c *Client) SetQuota(ctx context.Context, rootAuth eosclient.Authorization, // return errtypes.NotSupported("eosgrpc: SetQuota not implemented") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, rootAuth) + rq, err := c.initNSRequest(ctx, rootAuth, "") if err != nil { return err } @@ -859,7 +858,7 @@ func (c *Client) Touch(ctx context.Context, auth eosclient.Authorization, path s log.Info().Str("func", "Touch").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -894,7 +893,7 @@ func (c *Client) Chown(ctx context.Context, auth, chownAuth eosclient.Authorizat log.Info().Str("func", "Chown").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("chownuid,chowngid", chownAuth.Role.UID+","+chownAuth.Role.GID).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -938,7 +937,7 @@ func (c *Client) Chmod(ctx context.Context, auth eosclient.Authorization, mode, log.Info().Str("func", "Chmod").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("mode", mode).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -979,7 +978,7 @@ func (c *Client) CreateDir(ctx context.Context, auth eosclient.Authorization, pa log.Info().Str("func", "Createdir").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -1020,7 +1019,7 @@ func (c *Client) rm(ctx context.Context, auth eosclient.Authorization, path stri log.Info().Str("func", "rm").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -1055,7 +1054,7 @@ func (c *Client) rmdir(ctx context.Context, auth eosclient.Authorization, path s log.Info().Str("func", "rmdir").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -1110,7 +1109,7 @@ func (c *Client) Rename(ctx context.Context, auth eosclient.Authorization, oldPa log.Info().Str("func", "Rename").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("oldPath", oldPath).Str("newPath", newPath).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -1322,7 +1321,7 @@ func (c *Client) Read(ctx context.Context, auth eosclient.Authorization, path st // Write writes a file to the mgm // Somehow the same considerations as Read apply. -func (c *Client) Write(ctx context.Context, auth eosclient.Authorization, path string, stream io.ReadCloser) error { +func (c *Client) Write(ctx context.Context, auth eosclient.Authorization, path string, stream io.ReadCloser, app string) error { log := appctx.GetLogger(ctx) log.Info().Str("func", "Write").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Msg("") var length int64 @@ -1355,24 +1354,10 @@ func (c *Client) Write(ctx context.Context, auth eosclient.Authorization, path s defer wfd.Close() defer os.RemoveAll(fd.Name()) - return c.httpcl.PUTFile(ctx, u.Username, auth, path, wfd, length) + return c.httpcl.PUTFile(ctx, u.Username, auth, path, wfd, length, app) } - return c.httpcl.PUTFile(ctx, u.Username, auth, path, stream, length) - - // return c.httpcl.PUTFile(ctx, remoteuser, auth, urlpathng, stream) - // return c.WriteFile(ctx, uid, gid, path, fd.Name()) -} - -// WriteFile writes an existing file to the mgm. Old xrdcp utility. -func (c *Client) WriteFile(ctx context.Context, auth eosclient.Authorization, path, source string) error { - log := appctx.GetLogger(ctx) - log.Info().Str("func", "WriteFile").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Str("source", source).Msg("") - - xrdPath := fmt.Sprintf("%s//%s", c.opt.URL, path) - cmd := exec.CommandContext(ctx, c.opt.XrdcopyBinary, "--nopbar", "--silent", "-f", source, xrdPath, fmt.Sprintf("-ODeos.ruid=%s&eos.rgid=%s", auth.Role.UID, auth.Role.GID)) - _, _, err := c.execute(ctx, cmd) - return err + return c.httpcl.PUTFile(ctx, u.Username, auth, path, stream, length, app) } // ListDeletedEntries returns a list of the deleted entries. @@ -1381,7 +1366,7 @@ func (c *Client) ListDeletedEntries(ctx context.Context, auth eosclient.Authoriz log.Info().Str("func", "ListDeletedEntries").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return nil, err } @@ -1449,7 +1434,7 @@ func (c *Client) RestoreDeletedEntry(ctx context.Context, auth eosclient.Authori log.Info().Str("func", "RestoreDeletedEntries").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("key", key).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -1487,7 +1472,7 @@ func (c *Client) PurgeDeletedEntries(ctx context.Context, auth eosclient.Authori log.Info().Str("func", "PurgeDeletedEntries").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -1534,7 +1519,7 @@ func (c *Client) RollbackToVersion(ctx context.Context, auth eosclient.Authoriza log.Info().Str("func", "RollbackToVersion").Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", path).Str("version", version).Msg("") // Initialize the common fields of the NSReq - rq, err := c.initNSRequest(ctx, auth) + rq, err := c.initNSRequest(ctx, auth, "") if err != nil { return err } @@ -1677,51 +1662,3 @@ func (c *Client) grpcMDResponseToFileInfo(ctx context.Context, st *erpc.MDRespon } return fi, nil } - -// exec executes the command and returns the stdout, stderr and return code. -func (c *Client) execute(ctx context.Context, cmd *exec.Cmd) (string, string, error) { - log := appctx.GetLogger(ctx) - - outBuf := &bytes.Buffer{} - errBuf := &bytes.Buffer{} - cmd.Stdout = outBuf - cmd.Stderr = errBuf - cmd.Env = []string{ - "EOS_MGM_URL=" + c.opt.URL, - } - - if c.opt.UseKeytab { - cmd.Env = append(cmd.Env, "XrdSecPROTOCOL="+c.opt.SecProtocol) - cmd.Env = append(cmd.Env, "XrdSecSSSKT="+c.opt.Keytab) - } - - err := cmd.Run() - - var exitStatus int - if exiterr, ok := err.(*exec.ExitError); ok { - // The program has exited with an exit code != 0 - // This works on both Unix and Windows. Although package - // syscall is generally platform dependent, WaitStatus is - // defined for both Unix and Windows and in both cases has - // an ExitStatus() method with the same signature. - if status, ok := exiterr.Sys().(syscall.WaitStatus); ok { - exitStatus = status.ExitStatus() - switch exitStatus { - case 0: - err = nil - case 2: - err = errtypes.NotFound(errBuf.String()) - } - } - } - - args := fmt.Sprintf("%s", cmd.Args) - env := fmt.Sprintf("%s", cmd.Env) - log.Info().Str("args", args).Str("env", env).Int("exit", exitStatus).Msg("eos cmd") - - if err != nil && exitStatus != 2 { // don't wrap the errtypes.NotFoundError - err = errors.Wrap(err, "eosclient: error while executing command") - } - - return outBuf.String(), errBuf.String(), err -} diff --git a/pkg/eosclient/eosgrpc/eoshttp.go b/pkg/eosclient/eosgrpc/eoshttp.go index e75fc8c409..ee1aa3aacf 100644 --- a/pkg/eosclient/eosgrpc/eoshttp.go +++ b/pkg/eosclient/eosgrpc/eoshttp.go @@ -210,8 +210,8 @@ func (c *EOSHTTPClient) doReq(req *http.Request, remoteuser string) (*http.Respo return resp, err } -// If the error is not nil, take that -// If there is an error coming from EOS, erturn a descriptive error. +// If the error is not nil, take that. +// If there is an error coming from EOS, return a descriptive error. func (c *EOSHTTPClient) getRespError(rsp *http.Response, err error) error { if err != nil { return err @@ -228,6 +228,8 @@ func (c *EOSHTTPClient) getRespError(rsp *http.Response, err error) error { return errtypes.PermissionDenied(rspdesc(rsp)) case http.StatusNotFound: return errtypes.NotFound(rspdesc(rsp)) + case http.StatusConflict: + return errtypes.Conflict(rspdesc(rsp)) } return errtypes.InternalError("Err from EOS: " + rspdesc(rsp)) @@ -281,6 +283,8 @@ func (c *EOSHTTPClient) GETFile(ctx context.Context, remoteuser string, auth eos log.Error().Str("func", "GETFile").Str("url", finalurl).Str("err", err.Error()).Msg("can't create request") return nil, err } + // similar to eosbinary.go::Read() + req.Header.Set("app", "reva_eosclient::read") ntries := 0 nredirs := 0 @@ -360,9 +364,9 @@ func (c *EOSHTTPClient) GETFile(ctx context.Context, remoteuser string, auth eos } // PUTFile does an entire PUT to upload a full file, taking the data from a stream. -func (c *EOSHTTPClient) PUTFile(ctx context.Context, remoteuser string, auth eosclient.Authorization, urlpath string, stream io.ReadCloser, length int64) error { +func (c *EOSHTTPClient) PUTFile(ctx context.Context, remoteuser string, auth eosclient.Authorization, urlpath string, stream io.ReadCloser, length int64, app string) error { log := appctx.GetLogger(ctx) - log.Info().Str("func", "PUTFile").Str("remoteuser", remoteuser).Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", urlpath).Int64("length", length).Msg("") + log.Info().Str("func", "PUTFile").Str("remoteuser", remoteuser).Str("uid,gid", auth.Role.UID+","+auth.Role.GID).Str("path", urlpath).Int64("length", length).Str("app", app).Msg("") // Now send the req and see what happens finalurl, err := c.buildFullURL(urlpath, auth) @@ -376,6 +380,9 @@ func (c *EOSHTTPClient) PUTFile(ctx context.Context, remoteuser string, auth eos return err } + if app != "" { + req.Header.Set("app", app) + } req.Close = true ntries := 0 diff --git a/pkg/errtypes/errtypes.go b/pkg/errtypes/errtypes.go index 119bc7f8a9..f67f7a452e 100644 --- a/pkg/errtypes/errtypes.go +++ b/pkg/errtypes/errtypes.go @@ -94,6 +94,14 @@ func (e BadRequest) Error() string { return "error: bad request: " + string(e) } // IsBadRequest implements the IsBadRequest interface. func (e BadRequest) IsBadRequest() {} +// Conflict is the error to use when the server found a conflict when processing the request (e.g. with an existing lock). +type Conflict string + +func (e Conflict) Error() string { return "error: conflict: " + string(e) } + +// IsConflict implements the IsConflict interface. +func (e Conflict) IsConflict() {} + // ChecksumMismatch is the error to use when the sent hash does not match the calculated hash. type ChecksumMismatch string diff --git a/pkg/ocm/invite/repository/nextcloud/nextcloud.go b/pkg/ocm/invite/repository/nextcloud/nextcloud.go index eb6519a513..40e7d7c0db 100644 --- a/pkg/ocm/invite/repository/nextcloud/nextcloud.go +++ b/pkg/ocm/invite/repository/nextcloud/nextcloud.go @@ -159,7 +159,7 @@ func (c *Client) doPostToken(token string, initiator string, description string, defer resp.Body.Close() if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { - return false, fmt.Errorf("Unexpected response code from EFSS API: " + strconv.Itoa(resp.StatusCode)) + return false, fmt.Errorf("Unexpected response code from EFSS API: %s", strconv.Itoa(resp.StatusCode)) } return true, nil } @@ -185,7 +185,7 @@ func (c *Client) doGetToken(token string) (*apiToken, error) { } if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("Unexpected response code from API: " + strconv.Itoa(resp.StatusCode)) + return nil, fmt.Errorf("Unexpected response code from API: %s", strconv.Itoa(resp.StatusCode)) } result := &apiToken{} @@ -218,7 +218,7 @@ func (c *Client) doGetAllTokens(initiator string) ([]*apiToken, error) { } if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("Unexpected response code from API: " + strconv.Itoa(resp.StatusCode)) + return nil, fmt.Errorf("Unexpected response code from API: %s", strconv.Itoa(resp.StatusCode)) } result := []*apiToken{} @@ -257,7 +257,7 @@ func (c *Client) doPostRemoteUser(initiator string, opaqueUserID string, idp str defer resp.Body.Close() if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { - return false, fmt.Errorf("Unexpected response code from EFSS API: " + strconv.Itoa(resp.StatusCode)) + return false, fmt.Errorf("Unexpected response code from EFSS API: %s", strconv.Itoa(resp.StatusCode)) } return true, nil } @@ -282,7 +282,7 @@ func (c *Client) doGetRemoteUser(initiator string, opaqueUserID string, idp stri } if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("Unexpected response code from API: " + strconv.Itoa(resp.StatusCode)) + return nil, fmt.Errorf("Unexpected response code from API: %s", strconv.Itoa(resp.StatusCode)) } result := &apiOCMUser{} @@ -315,7 +315,7 @@ func (c *Client) doGetAllRemoteUsers(initiator string, search string) ([]*apiOCM } if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("Unexpected response code from API: " + strconv.Itoa(resp.StatusCode)) + return nil, fmt.Errorf("Unexpected response code from API: %s", strconv.Itoa(resp.StatusCode)) } result := []*apiOCMUser{} diff --git a/pkg/ocm/share/repository/nextcloud/nextcloud.go b/pkg/ocm/share/repository/nextcloud/nextcloud.go index b70f48b529..98d379ca59 100644 --- a/pkg/ocm/share/repository/nextcloud/nextcloud.go +++ b/pkg/ocm/share/repository/nextcloud/nextcloud.go @@ -483,7 +483,7 @@ func (sm *Manager) do(ctx context.Context, a Action, username string) (int, []by log.Info().Int("status", resp.StatusCode).Msgf("sent request to EFSS API, response: %s", body) if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { - return 0, nil, fmt.Errorf("Unexpected response from EFSS API: " + strconv.Itoa(resp.StatusCode)) + return 0, nil, fmt.Errorf("Unexpected response from EFSS API: %s", strconv.Itoa(resp.StatusCode)) } return resp.StatusCode, body, nil } diff --git a/pkg/ocm/share/repository/nextcloud/nextcloud_test.go b/pkg/ocm/share/repository/nextcloud/nextcloud_test.go index 72b5b7a86a..1273dc944f 100644 --- a/pkg/ocm/share/repository/nextcloud/nextcloud_test.go +++ b/pkg/ocm/share/repository/nextcloud/nextcloud_test.go @@ -234,16 +234,10 @@ var _ = Describe("Nextcloud", func() { // Ctime: &types.Timestamp{ // Seconds: 1234567890, // Nanos: 0, - // XXX_NoUnkeyedLiteral: struct{}{}, - // XXX_unrecognized: nil, - // XXX_sizecache: 0, // }, // Mtime: &types.Timestamp{ // Seconds: 1234567890, // Nanos: 0, - // XXX_NoUnkeyedLiteral: struct{}{}, - // XXX_unrecognized: nil, - // XXX_sizecache: 0, // }, // })) // checkCalled(called, `POST /apps/sciencemesh/~tester/api/ocm/addReceivedShare {"md":{"opaque_id":"fileid-/some/path"},"g":{"grantee":{"Id":{"UserId":{"idp":"0.0.0.0:19000","opaque_id":"f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c","type":1}}},"permissions":{"permissions":{"get_path":true}}},"provider_domain":"cern.ch","resource_type":"file","provider_id":2,"owner_opaque_id":"einstein","owner_display_name":"Albert Einstein","protocol":{"name":"webdav","options":{"sharedSecret":"secret","permissions":"webdav-property"}}}`) @@ -294,18 +288,12 @@ var _ = Describe("Nextcloud", func() { ocmshare.NewTransferAccessMethod(), }, Ctime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, Mtime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, ShareType: ocm.ShareType_SHARE_TYPE_USER, Token: "some-token", @@ -370,16 +358,10 @@ var _ = Describe("Nextcloud", func() { // Ctime: &types.Timestamp{ // Seconds: 1234567890, // Nanos: 0, - // XXX_NoUnkeyedLiteral: struct{}{}, - // XXX_unrecognized: nil, - // XXX_sizecache: 0, // }, // Mtime: &types.Timestamp{ // Seconds: 1234567890, // Nanos: 0, - // XXX_NoUnkeyedLiteral: struct{}{}, - // XXX_unrecognized: nil, - // XXX_sizecache: 0, // }, // })) // checkCalled(called, `POST /apps/sciencemesh/~tester/api/ocm/UpdateShare {"ref":{"Spec":{"Id":{"opaque_id":"some-share-id"}}},"p":{"permissions":{"add_grant":true,"create_container":true,"delete":true,"get_path":true,"get_quota":true,"initiate_file_download":true,"initiate_file_upload":true,"list_grants":true,"list_container":true,"list_file_versions":true,"list_recycle":true,"move":true,"remove_grant":true,"purge_recycle":true,"restore_file_version":true,"restore_recycle_item":true,"stat":true,"update_grant":true,"deny_grant":true}}}`) @@ -431,18 +413,12 @@ var _ = Describe("Nextcloud", func() { OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", }, Ctime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, Mtime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, ShareType: ocm.ShareType_SHARE_TYPE_USER, AccessMethods: []*ocm.AccessMethod{ @@ -487,18 +463,12 @@ var _ = Describe("Nextcloud", func() { OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", }, Ctime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, Mtime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, ShareType: ocm.ShareType_SHARE_TYPE_USER, ResourceType: provider.ResourceType_RESOURCE_TYPE_FILE, @@ -551,18 +521,12 @@ var _ = Describe("Nextcloud", func() { OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", }, Ctime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, Mtime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, ShareType: ocm.ShareType_SHARE_TYPE_USER, ResourceType: provider.ResourceType_RESOURCE_TYPE_FILE, @@ -610,18 +574,12 @@ var _ = Describe("Nextcloud", func() { Type: userpb.UserType_USER_TYPE_PRIMARY, }, Ctime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, Mtime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, ShareType: ocm.ShareType_SHARE_TYPE_USER, State: ocm.ShareState_SHARE_STATE_ACCEPTED, @@ -652,18 +610,12 @@ var _ = Describe("Nextcloud", func() { OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", }, Ctime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, Mtime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, ShareType: ocm.ShareType_SHARE_TYPE_USER, ResourceType: provider.ResourceType_RESOURCE_TYPE_FILE, diff --git a/pkg/ocm/share/repository/sql/sql_test.go b/pkg/ocm/share/repository/sql/sql_test.go index fa7683c1d9..029d89d745 100644 --- a/pkg/ocm/share/repository/sql/sql_test.go +++ b/pkg/ocm/share/repository/sql/sql_test.go @@ -34,6 +34,7 @@ import ( typesv1beta1 "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" "github.com/cs3org/reva/internal/http/services/owncloud/ocs/conversions" "google.golang.org/genproto/protobuf/field_mask" + "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/fieldmaskpb" "github.com/cs3org/reva/pkg/ocm/share" @@ -632,7 +633,7 @@ func TestGetShare(t *testing.T) { } if tt.err == nil { - if !reflect.DeepEqual(got, tt.expected) { + if !proto.Equal(got, tt.expected) { t.Fatalf("shares do not match. got=%+v expected=%+v", render.AsCode(got), render.AsCode(tt.expected)) } } diff --git a/pkg/ocm/storage/outcoming/ocm.go b/pkg/ocm/storage/outcoming/ocm.go index ac80120f7c..b771106f2d 100644 --- a/pkg/ocm/storage/outcoming/ocm.go +++ b/pkg/ocm/storage/outcoming/ocm.go @@ -32,8 +32,9 @@ import ( rpcv1beta1 "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" ocmv1beta1 "github.com/cs3org/go-cs3apis/cs3/sharing/ocm/v1beta1" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" - typepb "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" + typespb "github.com/cs3org/go-cs3apis/cs3/types/v1beta1" "github.com/cs3org/reva/internal/http/services/datagateway" + "github.com/cs3org/reva/internal/http/services/owncloud/ocdav" "github.com/cs3org/reva/internal/http/services/owncloud/ocs/conversions" "github.com/cs3org/reva/pkg/appctx" @@ -396,14 +397,19 @@ func getUploadProtocol(protocols []*gateway.FileUploadProtocol, protocol string) return "", "", false } -func (d *driver) Upload(ctx context.Context, ref *provider.Reference, content io.ReadCloser) error { +func (d *driver) Upload(ctx context.Context, ref *provider.Reference, content io.ReadCloser, metadata map[string]string) error { share, rel, err := d.shareAndRelativePathFromRef(ctx, ref) if err != nil { return err } + if metadata == nil { + metadata = map[string]string{} + } return d.unwrappedOpFromShareCreator(ctx, share, rel, func(ctx context.Context, newRef *provider.Reference) error { - initRes, err := d.gateway.InitiateFileUpload(ctx, &provider.InitiateFileUploadRequest{Ref: newRef}) + initRes, err := d.gateway.InitiateFileUpload(ctx, &provider.InitiateFileUploadRequest{ + Ref: newRef, + LockId: metadata["lockid"]}) switch { case err != nil: return err @@ -422,6 +428,12 @@ func (d *driver) Upload(ctx context.Context, ref *provider.Reference, content io } httpReq.Header.Set(datagateway.TokenTransportHeader, token) + if lockid := metadata["lockid"]; lockid != "" { + httpReq.Header.Set(ocdav.HeaderLockID, lockid) + } + if lockholder := metadata["lockholder"]; lockholder != "" { + httpReq.Header.Set(ocdav.HeaderLockHolder, lockholder) + } httpRes, err := httpclient.New().Do(httpReq) if err != nil { @@ -673,7 +685,7 @@ func (d *driver) RestoreRevision(ctx context.Context, ref *provider.Reference, k return errtypes.NotSupported("operation not supported") } -func (d *driver) ListRecycle(ctx context.Context, basePath, key, relativePath string, from, to *typepb.Timestamp) ([]*provider.RecycleItem, error) { +func (d *driver) ListRecycle(ctx context.Context, basePath, key, relativePath string, from, to *typespb.Timestamp) ([]*provider.RecycleItem, error) { return nil, errtypes.NotSupported("operation not supported") } diff --git a/pkg/ocm/storage/received/ocm.go b/pkg/ocm/storage/received/ocm.go index 89e73ef29b..75a0f38ff6 100644 --- a/pkg/ocm/storage/received/ocm.go +++ b/pkg/ocm/storage/received/ocm.go @@ -285,7 +285,7 @@ func (d *driver) InitiateUpload(ctx context.Context, ref *provider.Reference, _ }, nil } -func (d *driver) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error { +func (d *driver) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser, _ map[string]string) error { client, _, rel, err := d.webdavClient(ctx, ref) if err != nil { return err diff --git a/pkg/rgrpc/todo/pool/pool.go b/pkg/rgrpc/todo/pool/pool.go index c78f749ca6..c6bf42c2c9 100644 --- a/pkg/rgrpc/todo/pool/pool.go +++ b/pkg/rgrpc/todo/pool/pool.go @@ -83,7 +83,7 @@ var ( // NewConn creates a new connection to a grpc server // TODO(labkode): make grpc tls configurable. func NewConn(options Options) (*grpc.ClientConn, error) { - conn, err := grpc.Dial( + conn, err := grpc.NewClient( options.Endpoint, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithDefaultCallOptions( diff --git a/pkg/rhttp/datatx/manager/simple/simple.go b/pkg/rhttp/datatx/manager/simple/simple.go index 40bbd3104e..a776ba3f7b 100644 --- a/pkg/rhttp/datatx/manager/simple/simple.go +++ b/pkg/rhttp/datatx/manager/simple/simple.go @@ -23,6 +23,7 @@ import ( "net/http" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/cs3org/reva/internal/http/services/owncloud/ocdav" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rhttp/datatx" @@ -75,8 +76,15 @@ func (m *manager) Handler(fs storage.FS) (http.Handler, error) { defer r.Body.Close() ref := &provider.Reference{Path: fn} + metadata := map[string]string{} + if lockid := r.Header.Get(ocdav.HeaderLockID); lockid != "" { + metadata["lockid"] = lockid + } + if lockholder := r.Header.Get(ocdav.HeaderLockHolder); lockholder != "" { + metadata["lockholder"] = lockholder + } - err := fs.Upload(ctx, ref, r.Body) + err := fs.Upload(ctx, ref, r.Body, metadata) switch v := err.(type) { case nil: w.WriteHeader(http.StatusOK) @@ -92,6 +100,8 @@ func (m *manager) Handler(fs storage.FS) (http.Handler, error) { w.WriteHeader(http.StatusUnauthorized) case errtypes.InsufficientStorage: w.WriteHeader(http.StatusInsufficientStorage) + case errtypes.Conflict: + w.WriteHeader(http.StatusConflict) default: sublog.Error().Err(v).Msg("error uploading file") w.WriteHeader(http.StatusInternalServerError) diff --git a/pkg/rhttp/datatx/manager/spaces/spaces.go b/pkg/rhttp/datatx/manager/spaces/spaces.go index 07a346d32e..ee87211026 100644 --- a/pkg/rhttp/datatx/manager/spaces/spaces.go +++ b/pkg/rhttp/datatx/manager/spaces/spaces.go @@ -25,6 +25,7 @@ import ( "strings" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" + "github.com/cs3org/reva/internal/http/services/owncloud/ocdav" "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/rhttp/datatx" @@ -96,7 +97,15 @@ func (m *manager) Handler(fs storage.FS) (http.Handler, error) { ResourceId: &provider.ResourceId{StorageId: storageid, OpaqueId: opaqeid}, Path: fn, } - err = fs.Upload(ctx, ref, r.Body) + metadata := map[string]string{} + if lockid := r.Header.Get(ocdav.HeaderLockID); lockid != "" { + metadata["lockid"] = lockid + } + if lockholder := r.Header.Get(ocdav.HeaderLockHolder); lockholder != "" { + metadata["lockholder"] = lockholder + } + + err = fs.Upload(ctx, ref, r.Body, metadata) switch v := err.(type) { case nil: w.WriteHeader(http.StatusOK) @@ -112,6 +121,8 @@ func (m *manager) Handler(fs storage.FS) (http.Handler, error) { w.WriteHeader(http.StatusUnauthorized) case errtypes.InsufficientStorage: w.WriteHeader(http.StatusInsufficientStorage) + case errtypes.Conflict: + w.WriteHeader(http.StatusConflict) default: sublog.Error().Err(v).Msg("error uploading file") w.WriteHeader(http.StatusInternalServerError) diff --git a/pkg/storage/fs/cephfs/cephfs.go b/pkg/storage/fs/cephfs/cephfs.go index 1f32df6bb2..83b13495dc 100644 --- a/pkg/storage/fs/cephfs/cephfs.go +++ b/pkg/storage/fs/cephfs/cephfs.go @@ -48,14 +48,8 @@ import ( ) const ( - xattrTrustedNs = "trusted." - xattrEID = xattrTrustedNs + "eid" - xattrMd5 = xattrTrustedNs + "checksum" - xattrMd5ts = xattrTrustedNs + "checksumTS" - xattrRef = xattrTrustedNs + "ref" - xattrUserNs = "user." - snap = ".snap" - xattrLock = xattrUserNs + "reva.lockpayload" + xattrUserNs = "user." + xattrLock = xattrUserNs + "reva.lockpayload" ) type cephfs struct { @@ -82,19 +76,9 @@ func New(ctx context.Context, m map[string]interface{}) (fs storage.FS, err erro return nil, errors.New("cephfs: can't create caches") } - adminConn := newAdminConn(&o) - if adminConn == nil { - return nil, errors.Wrap(err, "cephfs: Couldn't create admin connections") - } - - for _, dir := range []string{o.ShadowFolder, o.UploadFolder} { - _, err := adminConn.adminMount.Statx(dir, goceph.StatxMask(goceph.StatxIno), 0) - if err != nil { - err = adminConn.adminMount.MakeDir(dir, dirPermFull) - if err != nil && err.Error() != errFileExists { - return nil, errors.New("cephfs: can't initialise system dir " + dir + ":" + err.Error()) - } - } + adminConn, err := newAdminConn(&o) + if err != nil { + return nil, errors.Wrap(err, "cephfs: couldn't create admin connections") } return &cephfs{ @@ -105,27 +89,30 @@ func New(ctx context.Context, m map[string]interface{}) (fs storage.FS, err erro } func (fs *cephfs) GetHome(ctx context.Context) (string, error) { - if fs.conf.DisableHome { - return "", errtypes.NotSupported("cephfs: GetHome() home supported disabled") - } - - user := fs.makeUser(ctx) - - return user.home, nil + log := appctx.GetLogger(ctx) + mount := fs.getMount(ctx) + log.Debug().Interface("mount", mount).Msg("GetHome") + return mount.GetHome(), nil } func (fs *cephfs) CreateHome(ctx context.Context) (err error) { - if fs.conf.DisableHome { - return errtypes.NotSupported("cephfs: GetHome() home supported disabled") - } + log := appctx.GetLogger(ctx) user := fs.makeUser(ctx) + log.Debug().Interface("user", user).Msg("CreateHome for user") - // Stop createhome from running the whole thing because it is called multiple times - if _, err = fs.adminConn.adminMount.Statx(user.home, goceph.StatxMode, 0); err == nil { - return + // Skip home creation if the directory already exists. + // We do not check for all necessary attributes, only for the existence of the directory. + stat, err := fs.adminConn.adminMount.Statx(user.home, goceph.StatxMode, 0) + if err != nil { + return errors.Wrap(err, "error stating user home when trying to create it") } + log.Debug().Interface("stat", stat).Msgf("home is %s") + + // TODO(labkode): for now we always try to create the home directory even if it exists. + // One needs to check for "no such of file or directory" error to short-cut. + err = walkPath(user.home, func(path string) error { return fs.adminConn.adminMount.MakeDir(path, fs.conf.DirPerms) }, false) @@ -143,75 +130,57 @@ func (fs *cephfs) CreateHome(ctx context.Context) (err error) { return getRevaError(err) } - user.op(func(cv *cacheVal) { - err = cv.mount.MakeDir(removeLeadingSlash(fs.conf.ShareFolder), fs.conf.DirPerms) - if err != nil && err.Error() == errFileExists { - err = nil - } - }) - - return getRevaError(err) + return nil } func (fs *cephfs) CreateDir(ctx context.Context, ref *provider.Reference) error { - user := fs.makeUser(ctx) - path, err := user.resolveRef(ref) + mount := fs.getMount(ctx) + path, err := fs.resolveRef(ref) if err != nil { return getRevaError(err) } - user.op(func(cv *cacheVal) { - if err = cv.mount.MakeDir(path, fs.conf.DirPerms); err != nil { - return - } - - //TODO(tmourati): Add entry id logic - }) - - return getRevaError(err) + if err = mount.MakeDir(path, fs.conf.DirPerms); err != nil { + return getRevaError(err) + } + return nil } -func (fs *cephfs) Delete(ctx context.Context, ref *provider.Reference) (err error) { - var path string - user := fs.makeUser(ctx) - path, err = user.resolveRef(ref) +func (fs *cephfs) Delete(ctx context.Context, ref *provider.Reference) error { + path, err := fs.resolveRef(ref) if err != nil { - return err + return getRevaError(err) } - user.op(func(cv *cacheVal) { - if err = cv.mount.Unlink(path); err != nil && err.Error() == errIsADirectory { - err = cv.mount.RemoveDir(path) - } - - //TODO(tmourati): Add entry id logic - }) + mount := fs.getMount(ctx) + err = mount.Unlink(path) + if err != nil && err.Error() == errIsADirectory { + err = mount.RemoveDir(path) + } - //has already been deleted by direct mount - if err != nil && err.Error() == errNotFound { + if err != nil && err.Error() != errNotFound { return nil } - return getRevaError(err) + // has already been deleted by direct mount + return nil } -func (fs *cephfs) Move(ctx context.Context, oldRef, newRef *provider.Reference) (err error) { - var oldPath, newPath string - user := fs.makeUser(ctx) - if oldPath, err = user.resolveRef(oldRef); err != nil { - return - } - if newPath, err = user.resolveRef(newRef); err != nil { - return +func (fs *cephfs) Move(ctx context.Context, oldRef, newRef *provider.Reference) error { + oldPath, err := fs.resolveRef(oldRef) + if err != nil { + return getRevaError(err) } - user.op(func(cv *cacheVal) { - if err = cv.mount.Rename(oldPath, newPath); err != nil { - return - } + newPath, err := fs.resolveRef(newRef) + if err != nil { + return getRevaError(err) + } - //TODO(tmourati): Add entry id logic, handle already moved file error - }) + mount := fs.getMount(ctx) + if err := mount.Rename(oldPath, newPath); err != nil { + return getRevaError(err) + } // has already been moved by direct mount if err != nil && err.Error() == errNotFound { @@ -221,66 +190,60 @@ func (fs *cephfs) Move(ctx context.Context, oldRef, newRef *provider.Reference) return getRevaError(err) } -func (fs *cephfs) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (ri *provider.ResourceInfo, err error) { - var path string - user := fs.makeUser(ctx) +func (fs *cephfs) GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) { + path, err := fs.resolveRef(ref) + if err != nil { + return nil, getRevaError(err) + } - if path, err = user.resolveRef(ref); err != nil { - return nil, err + mount := fs.getMount(ctx) + + stat, err := mount.Statx(path, goceph.StatxBasicStats, 0) + if err != nil { + return nil, getRevaError(err) } - user.op(func(cv *cacheVal) { - var stat Statx - if stat, err = cv.mount.Statx(path, goceph.StatxBasicStats, 0); err != nil { - return - } - ri, err = user.fileAsResourceInfo(cv, path, stat, mdKeys) - }) + ri, err := fs.fileAsResourceInfo(mount, path, stat, mdKeys) + if err != nil { + return nil, err + } return ri, getRevaError(err) } -func (fs *cephfs) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) (files []*provider.ResourceInfo, err error) { - var path string - user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { - return +func (fs *cephfs) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) { + path, err := fs.resolveRef(ref) + if err != nil { + return nil, getRevaError(err) } - // The user wants to access their home, create it if it doesn't exist - if path == fs.conf.Root { - if err = fs.CreateHome(ctx); err != nil { - return - } + mount := fs.getMount(ctx) + dir, err := mount.OpenDir(path) + if err != nil { + return nil, getRevaError(err) } + defer closeDir(dir) - user.op(func(cv *cacheVal) { - var dir *goceph.Directory - if dir, err = cv.mount.OpenDir(path); err != nil { - return - } - defer closeDir(dir) + var entry *goceph.DirEntryPlus + var ri *provider.ResourceInfo - var entry *goceph.DirEntryPlus - var ri *provider.ResourceInfo - for entry, err = dir.ReadDirPlus(goceph.StatxBasicStats, 0); entry != nil && err == nil; entry, err = dir.ReadDirPlus(goceph.StatxBasicStats, 0) { - if fs.conf.HiddenDirs[entry.Name()] { - continue - } + for entry, err = dir.ReadDirPlus(goceph.StatxBasicStats, 0); entry != nil && err == nil; entry, err = dir.ReadDirPlus(goceph.StatxBasicStats, 0) { + if fs.conf.HiddenDirs[entry.Name()] { + continue + } - ri, err = user.fileAsResourceInfo(cv, filepath.Join(path, entry.Name()), entry.Statx(), mdKeys) - if ri == nil || err != nil { - if err != nil { - log := appctx.GetLogger(ctx) - log.Err(err).Msg("cephfs: error in file as resource info") - } - err = nil - continue + ri, err = fs.fileAsResourceInfo(mount, filepath.Join(path, entry.Name()), entry.Statx(), mdKeys) + if ri == nil || err != nil { + if err != nil { + log := appctx.GetLogger(ctx) + log.Err(err).Msg("cephfs: error in file as resource info") } - - files = append(files, ri) + err = nil + continue } - }) + + files = append(files, ri) + } return files, getRevaError(err) } @@ -288,15 +251,11 @@ func (fs *cephfs) ListFolder(ctx context.Context, ref *provider.Reference, mdKey func (fs *cephfs) Download(ctx context.Context, ref *provider.Reference) (rc io.ReadCloser, err error) { var path string user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { + if path, err = fs.resolveRef(ref); err != nil { return nil, errors.Wrap(err, "cephfs: error resolving ref") } user.op(func(cv *cacheVal) { - if strings.HasPrefix(strings.TrimPrefix(path, user.home), fs.conf.ShareFolder) { - err = errtypes.PermissionDenied("cephfs: cannot download under the virtual share folder") - return - } rc, err = cv.mount.Open(path, os.O_RDONLY, 0) }) @@ -304,110 +263,25 @@ func (fs *cephfs) Download(ctx context.Context, ref *provider.Reference) (rc io. } func (fs *cephfs) ListRevisions(ctx context.Context, ref *provider.Reference) (fvs []*provider.FileVersion, err error) { - //TODO(tmourati): Fix entry id logic - var path string - user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { - return nil, errors.Wrap(err, "cephfs: error resolving ref") - } - - user.op(func(cv *cacheVal) { - if strings.HasPrefix(path, removeLeadingSlash(fs.conf.ShareFolder)) { - err = errtypes.PermissionDenied("cephfs: cannot download under the virtual share folder") - return - } - var dir *goceph.Directory - if dir, err = cv.mount.OpenDir(".snap"); err != nil { - return - } - defer closeDir(dir) - - for d, _ := dir.ReadDir(); d != nil; d, _ = dir.ReadDir() { - var revPath string - var stat Statx - var e error - - if strings.HasPrefix(d.Name(), ".") { - continue - } - - revPath, e = resolveRevRef(cv.mount, ref, d.Name()) - if e != nil { - continue - } - stat, e = cv.mount.Statx(revPath, goceph.StatxMtime|goceph.StatxSize, 0) - if e != nil { - continue - } - fvs = append(fvs, &provider.FileVersion{ - Key: d.Name(), - Size: stat.Size, - Mtime: uint64(stat.Mtime.Sec), - }) - } - }) - - return fvs, getRevaError(err) + return nil, errtypes.NotSupported("cephfs: RestoreRevision not supported") } func (fs *cephfs) DownloadRevision(ctx context.Context, ref *provider.Reference, key string) (file io.ReadCloser, err error) { - //TODO(tmourati): Fix entry id logic - user := fs.makeUser(ctx) - - user.op(func(cv *cacheVal) { - var revPath string - revPath, err = resolveRevRef(cv.mount, ref, key) - if err != nil { - return - } - - file, err = cv.mount.Open(revPath, os.O_RDONLY, 0) - }) - - return file, getRevaError(err) + return nil, errtypes.NotSupported("cephfs: RestoreRevision not supported") } func (fs *cephfs) RestoreRevision(ctx context.Context, ref *provider.Reference, key string) (err error) { - //TODO(tmourati): Fix entry id logic - var path string - user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { - return errors.Wrap(err, "cephfs: error resolving ref") - } - - user.op(func(cv *cacheVal) { - var revPath string - if revPath, err = resolveRevRef(cv.mount, ref, key); err != nil { - err = errors.Wrap(err, "cephfs: error resolving revision ref "+ref.String()) - return - } - - var src, dst *goceph.File - if src, err = cv.mount.Open(revPath, os.O_RDONLY, 0); err != nil { - return - } - defer closeFile(src) - - if dst, err = cv.mount.Open(path, os.O_WRONLY|os.O_TRUNC, 0); err != nil { - return - } - defer closeFile(dst) - - _, err = io.Copy(dst, src) - }) - - return getRevaError(err) + return errtypes.NotSupported("cephfs: RestoreRevision not supported") } func (fs *cephfs) GetPathByID(ctx context.Context, id *provider.ResourceId) (str string, err error) { - //TODO(tmourati): Add entry id logic - return "", errtypes.NotSupported("cephfs: entry IDs currently not supported") + return "", errtypes.NotSupported("cephfs: ids currently not supported") } func (fs *cephfs) AddGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) (err error) { var path string user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { + if path, err = fs.resolveRef(ref); err != nil { return } @@ -421,7 +295,7 @@ func (fs *cephfs) AddGrant(ctx context.Context, ref *provider.Reference, g *prov func (fs *cephfs) RemoveGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) (err error) { var path string user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { + if path, err = fs.resolveRef(ref); err != nil { return } @@ -435,7 +309,7 @@ func (fs *cephfs) RemoveGrant(ctx context.Context, ref *provider.Reference, g *p func (fs *cephfs) UpdateGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) (err error) { var path string user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { + if path, err = fs.resolveRef(ref); err != nil { return } @@ -449,7 +323,7 @@ func (fs *cephfs) UpdateGrant(ctx context.Context, ref *provider.Reference, g *p func (fs *cephfs) DenyGrant(ctx context.Context, ref *provider.Reference, g *provider.Grantee) (err error) { var path string user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { + if path, err = fs.resolveRef(ref); err != nil { return } @@ -464,7 +338,7 @@ func (fs *cephfs) DenyGrant(ctx context.Context, ref *provider.Reference, g *pro func (fs *cephfs) ListGrants(ctx context.Context, ref *provider.Reference) (glist []*provider.Grant, err error) { var path string user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { + if path, err = fs.resolveRef(ref); err != nil { return } @@ -503,24 +377,7 @@ func (fs *cephfs) GetQuota(ctx context.Context, ref *provider.Reference) (total } func (fs *cephfs) CreateReference(ctx context.Context, path string, targetURI *url.URL) (err error) { - user := fs.makeUser(ctx) - - user.op(func(cv *cacheVal) { - if !strings.HasPrefix(strings.TrimPrefix(path, user.home), fs.conf.ShareFolder) { - err = errors.New("cephfs: can't create reference outside a share folder") - } else { - err = cv.mount.MakeDir(path, fs.conf.DirPerms) - } - }) - if err != nil { - return getRevaError(err) - } - - user.op(func(cv *cacheVal) { - err = cv.mount.SetXattr(path, xattrRef, []byte(targetURI.String()), 0) - }) - - return getRevaError(err) + return errors.New("error: CreateReference not implemented") } func (fs *cephfs) Shutdown(ctx context.Context) (err error) { @@ -536,7 +393,7 @@ func (fs *cephfs) Shutdown(ctx context.Context) (err error) { func (fs *cephfs) SetArbitraryMetadata(ctx context.Context, ref *provider.Reference, md *provider.ArbitraryMetadata) (err error) { var path string user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { + if path, err = fs.resolveRef(ref); err != nil { return err } @@ -558,7 +415,7 @@ func (fs *cephfs) SetArbitraryMetadata(ctx context.Context, ref *provider.Refere func (fs *cephfs) UnsetArbitraryMetadata(ctx context.Context, ref *provider.Reference, keys []string) (err error) { var path string user := fs.makeUser(ctx) - if path, err = user.resolveRef(ref); err != nil { + if path, err = fs.resolveRef(ref); err != nil { return err } @@ -579,7 +436,7 @@ func (fs *cephfs) UnsetArbitraryMetadata(ctx context.Context, ref *provider.Refe func (fs *cephfs) TouchFile(ctx context.Context, ref *provider.Reference) error { user := fs.makeUser(ctx) - path, err := user.resolveRef(ref) + path, err := fs.resolveRef(ref) if err != nil { return getRevaError(err) } @@ -590,8 +447,6 @@ func (fs *cephfs) TouchFile(ctx context.Context, ref *provider.Reference) error if file, err = cv.mount.Open(path, os.O_CREATE|os.O_WRONLY, fs.conf.FilePerms); err != nil { return } - - //TODO(tmourati): Add entry id logic }) return getRevaError(err) @@ -654,7 +509,7 @@ func decodeLock(content string) (*provider.Lock, error) { func (fs *cephfs) SetLock(ctx context.Context, ref *provider.Reference, lock *provider.Lock) error { user := fs.makeUser(ctx) - path, err := user.resolveRef(ref) + path, err := fs.resolveRef(ref) if err != nil { return getRevaError(err) } @@ -689,7 +544,7 @@ func (fs *cephfs) SetLock(ctx context.Context, ref *provider.Reference, lock *pr func (fs *cephfs) GetLock(ctx context.Context, ref *provider.Reference) (*provider.Lock, error) { user := fs.makeUser(ctx) - path, err := user.resolveRef(ref) + path, err := fs.resolveRef(ref) if err != nil { return nil, getRevaError(err) } @@ -785,7 +640,7 @@ func (fs *cephfs) RefreshLock(ctx context.Context, ref *provider.Reference, newL func (fs *cephfs) Unlock(ctx context.Context, ref *provider.Reference, lock *provider.Lock) error { user := fs.makeUser(ctx) - path, err := user.resolveRef(ref) + path, err := fs.resolveRef(ref) if err != nil { return getRevaError(err) } diff --git a/pkg/storage/fs/cephfs/chunking.go b/pkg/storage/fs/cephfs/chunking.go index a89fa23824..1b5be2b4b0 100644 --- a/pkg/storage/fs/cephfs/chunking.go +++ b/pkg/storage/fs/cephfs/chunking.go @@ -26,6 +26,7 @@ import ( "fmt" "io" "os" + "path" "path/filepath" "regexp" "strconv" @@ -43,11 +44,12 @@ func IsChunked(fn string) (bool, error) { } // ChunkBLOBInfo stores info about a particular chunk +// example: given /users/peter/myfile.txt-chunking-1234-10-2 type ChunkBLOBInfo struct { - Path string - TransferID string - TotalChunks int - CurrentChunk int + Path string // example: /users/peter/myfile.txt + TransferID string // example: 1234 + TotalChunks int // example: 10 + CurrentChunk int // example: 2 } // Not using the resource path in the chunk folder name allows uploading to @@ -85,21 +87,22 @@ func GetChunkBLOBInfo(path string) (*ChunkBLOBInfo, error) { // ChunkHandler manages chunked uploads, storing the chunks in a temporary directory // until it gets the final chunk which is then returned. type ChunkHandler struct { - user *User - chunkFolder string + user *User + uploadFolder string // example: /users/peter/.uploads } // NewChunkHandler creates a handler for chunked uploads. func NewChunkHandler(ctx context.Context, fs *cephfs) *ChunkHandler { - return &ChunkHandler{fs.makeUser(ctx), fs.conf.UploadFolder} + u := fs.makeUser(ctx) + return &ChunkHandler{u, path.Join(u.home, fs.conf.UploadFolder)} } -func (c *ChunkHandler) getChunkTempFileName() string { +func (c *ChunkHandler) getTempFileName() string { return fmt.Sprintf("__%d_%s", time.Now().Unix(), uuid.New().String()) } -func (c *ChunkHandler) getChunkFolderName(i *ChunkBLOBInfo) (path string, err error) { - path = filepath.Join(c.chunkFolder, i.uploadID()) +func (c *ChunkHandler) getAndCreateTransferFolderName(i *ChunkBLOBInfo) (path string, err error) { + path = filepath.Join(c.uploadFolder, i.uploadID()) c.user.op(func(cv *cacheVal) { err = cv.mount.MakeDir(path, 0777) }) @@ -107,6 +110,7 @@ func (c *ChunkHandler) getChunkFolderName(i *ChunkBLOBInfo) (path string, err er return } +// TODO(labkode): I don't like how this function looks like, better to refactor func (c *ChunkHandler) saveChunk(path string, r io.ReadCloser) (finish bool, chunk string, err error) { chunkInfo, err := GetChunkBLOBInfo(path) if err != nil { @@ -114,10 +118,21 @@ func (c *ChunkHandler) saveChunk(path string, r io.ReadCloser) (finish bool, chu return } - chunkTempFilename := c.getChunkTempFileName() + transferFolderName, err := c.getAndCreateTransferFolderName(chunkInfo) + if err != nil { + // TODO(labkode): skip error for now + // err = fmt.Errorf("error getting transfer folder anme", err) + return + } + + // here we write a temporary file that will be renamed to the transfer folder + // with the correct sequence number filename. + // we do not store this before-rename temporary files inside the transfer folder + // to avoid errors when counting the number of chunks for finalizing the transfer. + tmpFilename := c.getTempFileName() c.user.op(func(cv *cacheVal) { var tmpFile *goceph.File - target := filepath.Join(c.chunkFolder, chunkTempFilename) + target := filepath.Join(c.uploadFolder, tmpFilename) tmpFile, err = cv.mount.Open(target, os.O_CREATE|os.O_WRONLY, c.user.fs.conf.FilePerms) defer closeFile(tmpFile) if err != nil { @@ -129,15 +144,9 @@ func (c *ChunkHandler) saveChunk(path string, r io.ReadCloser) (finish bool, chu return } - chunksFolderName, err := c.getChunkFolderName(chunkInfo) - if err != nil { - return - } - // c.logger.Info().Log("chunkfolder", chunksFolderName) - - chunkTarget := filepath.Join(chunksFolderName, strconv.Itoa(chunkInfo.CurrentChunk)) + chunkTarget := filepath.Join(transferFolderName, strconv.Itoa(chunkInfo.CurrentChunk)) c.user.op(func(cv *cacheVal) { - err = cv.mount.Rename(chunkTempFilename, chunkTarget) + err = cv.mount.Rename(tmpFilename, chunkTarget) }) if err != nil { return @@ -154,7 +163,7 @@ func (c *ChunkHandler) saveChunk(path string, r io.ReadCloser) (finish bool, chu var entry *goceph.DirEntry var chunkFile, assembledFile *goceph.File - dir, err = cv.mount.OpenDir(chunksFolderName) + dir, err = cv.mount.OpenDir(transferFolderName) defer closeDir(dir) for entry, err = dir.ReadDir(); entry != nil && err == nil; entry, err = dir.ReadDir() { @@ -167,16 +176,20 @@ func (c *ChunkHandler) saveChunk(path string, r io.ReadCloser) (finish bool, chu return } - chunk = filepath.Join(c.chunkFolder, c.getChunkTempFileName()) - assembledFile, err = cv.mount.Open(chunk, os.O_CREATE|os.O_WRONLY, c.user.fs.conf.FilePerms) + // from now on we do have all the necessary chunks, + // so we create a temporary file where all the chunks will be written + // before being renamed to the requested location, from the example: /users/peter/myfile.txt + + assemblyFilename := filepath.Join(c.uploadFolder, c.getTempFileName()) + assembledFile, err = cv.mount.Open(assemblyFilename, os.O_CREATE|os.O_WRONLY, c.user.fs.conf.FilePerms) defer closeFile(assembledFile) - defer deleteFile(cv.mount, chunk) + defer deleteFile(cv.mount, assemblyFilename) if err != nil { return } for i := 0; i < numEntries; i++ { - target := filepath.Join(chunksFolderName, strconv.Itoa(i)) + target := filepath.Join(transferFolderName, strconv.Itoa(i)) chunkFile, err = cv.mount.Open(target, os.O_RDONLY, 0) if err != nil { @@ -189,22 +202,22 @@ func (c *ChunkHandler) saveChunk(path string, r io.ReadCloser) (finish bool, chu } } - // necessary approach in case assembly fails + // clean all the chunks that made the assembly file for i := 0; i < numEntries; i++ { - target := filepath.Join(chunksFolderName, strconv.Itoa(i)) + target := filepath.Join(transferFolderName, strconv.Itoa(i)) err = cv.mount.Unlink(target) if err != nil { return } } - _ = cv.mount.Unlink(chunksFolderName) }) - - return true, chunk, nil + return } // WriteChunk saves an intermediate chunk temporarily and assembles all chunks // once the final one is received. +// this function will return the original filename (myfile.txt) and the assemblyPath when +// the upload is completed func (c *ChunkHandler) WriteChunk(fn string, r io.ReadCloser) (string, string, error) { finish, chunk, err := c.saveChunk(fn, r) if err != nil { diff --git a/pkg/storage/fs/cephfs/connections.go b/pkg/storage/fs/cephfs/connections.go index 916c6b9a93..13238ce080 100644 --- a/pkg/storage/fs/cephfs/connections.go +++ b/pkg/storage/fs/cephfs/connections.go @@ -24,6 +24,7 @@ package cephfs import ( "context" "fmt" + "path/filepath" "time" "github.com/ceph/go-ceph/cephfs/admin" @@ -31,7 +32,9 @@ import ( 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" + "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/rgrpc/todo/pool" + "github.com/cs3org/reva/pkg/storage/utils/templates" "github.com/pkg/errors" goceph "github.com/ceph/go-ceph/cephfs" @@ -116,21 +119,21 @@ type adminConn struct { // radosIO *rados2.IOContext } -func newAdminConn(conf *Options) *adminConn { +func newAdminConn(conf *Options) (*adminConn, error) { rados, err := rados2.NewConnWithUser(conf.ClientID) if err != nil { - return nil + return nil, errors.Wrap(err, "error creating connection with user for client id: "+conf.ClientID) } if err = rados.ReadConfigFile(conf.Config); err != nil { - return nil + return nil, errors.Wrapf(err, "error reading config file %s", conf.Config) } if err = rados.SetConfigOption("keyring", conf.Keyring); err != nil { - return nil + return nil, errors.Wrapf(err, "error setting keyring conf: %s", conf.Keyring) } if err = rados.Connect(); err != nil { - return nil + return nil, errors.Wrap(err, "error connecting to rados") } // TODO: May use later for file ids @@ -166,13 +169,13 @@ func newAdminConn(conf *Options) *adminConn { mount, err := goceph.CreateFromRados(rados) if err != nil { rados.Shutdown() - return nil + return nil, errors.Wrap(err, "error calling CreateFromRados") } if err = mount.MountWithRoot(conf.Root); err != nil { rados.Shutdown() destroyCephConn(mount, nil) - return nil + return nil, errors.Wrapf(err, "error mounting with root %s", conf.Root) } return &adminConn{ @@ -181,7 +184,7 @@ func newAdminConn(conf *Options) *adminConn { mount, rados, // radosIO, - } + }, nil } func newConn(user *User) *cacheVal { @@ -213,11 +216,14 @@ func newConn(user *User) *cacheVal { return destroyCephConn(mount, perm) } - if user != nil && !user.fs.conf.DisableHome { - if err = mount.ChangeDir(user.fs.conf.Root); err != nil { - return destroyCephConn(mount, perm) + // TODO(labkode): we leave the mount on the fs root + /* + if user != nil && !user.fs.conf.DisableHome { + if err = mount.ChangeDir(user.fs.conf.Root); err != nil { + return destroyCephConn(mount, perm) + } } - } + */ return &cacheVal{ perm: perm, @@ -327,3 +333,21 @@ func (fs *cephfs) getGroupByOpaqueID(ctx context.Context, oid string) (*grouppb. return getGroupResp.Group, nil } + +type mount struct { + *goceph.MountInfo + userHomePath string +} + +func (m *mount) GetHome() string { + return m.userHomePath +} + +func (fs *cephfs) getMount(ctx context.Context) *mount { + u := appctx.ContextMustGetUser(ctx) + userHomePath := filepath.Join(fs.conf.Root, templates.WithUser(u, fs.conf.UserLayout)) + m := &mount{ + userHomePath: userHomePath, + } + return m +} diff --git a/pkg/storage/fs/cephfs/options.go b/pkg/storage/fs/cephfs/options.go index c33e76eb89..a7b6149462 100644 --- a/pkg/storage/fs/cephfs/options.go +++ b/pkg/storage/fs/cephfs/options.go @@ -22,25 +22,19 @@ package cephfs import ( - "path/filepath" - "github.com/cs3org/reva/pkg/sharedconf" ) // Options for the cephfs module type Options struct { - ClientID string `mapstructure:"client_id"` - Config string `mapstructure:"config"` - GatewaySvc string `mapstructure:"gatewaysvc"` - IndexPool string `mapstructure:"index_pool"` - Keyring string `mapstructure:"keyring"` - Root string `mapstructure:"root"` - ShadowFolder string `mapstructure:"shadow_folder"` - ShareFolder string `mapstructure:"share_folder"` - UploadFolder string `mapstructure:"uploads"` - UserLayout string `mapstructure:"user_layout"` - - DisableHome bool `mapstructure:"disable_home"` + ClientID string `mapstructure:"client_id"` + Config string `mapstructure:"config"` + GatewaySvc string `mapstructure:"gatewaysvc"` + IndexPool string `mapstructure:"index_pool"` + Keyring string `mapstructure:"keyring"` + Root string `mapstructure:"root"` + UploadFolder string `mapstructure:"uploads"` + UserLayout string `mapstructure:"user_layout"` DirPerms uint32 `mapstructure:"dir_perms"` FilePerms uint32 `mapstructure:"file_perms"` UserQuotaBytes uint64 `mapstructure:"user_quota_bytes"` @@ -71,27 +65,14 @@ func (c *Options) ApplyDefaults() { } if c.Root == "" { - c.Root = "/home" + c.Root = "/cephfs" } else { c.Root = addLeadingSlash(c.Root) } - if c.ShadowFolder == "" { - c.ShadowFolder = "/.reva_hidden" - } else { - c.ShadowFolder = addLeadingSlash(c.ShadowFolder) - } - - if c.ShareFolder == "" { - c.ShareFolder = "/Shares" - } else { - c.ShareFolder = addLeadingSlash(c.ShareFolder) - } - if c.UploadFolder == "" { c.UploadFolder = ".uploads" } - c.UploadFolder = filepath.Join(c.ShadowFolder, c.UploadFolder) if c.UserLayout == "" { c.UserLayout = "{{.Username}}" @@ -100,7 +81,7 @@ func (c *Options) ApplyDefaults() { c.HiddenDirs = map[string]bool{ ".": true, "..": true, - removeLeadingSlash(c.ShadowFolder): true, + removeLeadingSlash(c.UploadFolder): true, } if c.DirPerms == 0 { diff --git a/pkg/storage/fs/cephfs/upload.go b/pkg/storage/fs/cephfs/upload.go index d5cc71a863..44639881a7 100644 --- a/pkg/storage/fs/cephfs/upload.go +++ b/pkg/storage/fs/cephfs/upload.go @@ -31,52 +31,60 @@ import ( "github.com/pkg/errors" ) -func (fs *cephfs) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error { +func (fs *cephfs) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser, metadata map[string]string) error { user := fs.makeUser(ctx) p := ref.GetPath() + // TODO(lopresti) validate lock metadata if present + ok, err := IsChunked(p) if err != nil { - return errors.Wrap(err, "cephfs: error checking path") + return errors.Wrap(err, "cephfs: error checking if path is chunked") } - if ok { - var assembledFile string - p, assembledFile, err = NewChunkHandler(ctx, fs).WriteChunk(p, r) - if err != nil { - return err - } - if p == "" { - return errtypes.PartialContent(ref.String()) - } + + if !ok { + var file io.WriteCloser user.op(func(cv *cacheVal) { - r, err = cv.mount.Open(assembledFile, os.O_RDONLY, 0) - }) - if err != nil { - return errors.Wrap(err, "cephfs: error opening assembled file") - } - defer r.Close() - defer user.op(func(cv *cacheVal) { - _ = cv.mount.Unlink(assembledFile) + file, err = cv.mount.Open(p, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, fs.conf.FilePerms) + if err != nil { + err = errors.Wrap(err, "cephfs: error opening binary file") + return + } + defer file.Close() + + _, err = io.Copy(file, r) + if err != nil { + err = errors.Wrap(err, "cephfs: error writing to binary file") + return + } }) + + return nil } - var file io.WriteCloser + // upload is chunked + + var assembledFile string + + // iniate the chunk handler + originalFilename, assembledFile, err := NewChunkHandler(ctx, fs).WriteChunk(p, r) + if err != nil { + return errors.Wrapf(err, "error writing chunk %v %v %v", p, r, assembledFile) + } + if originalFilename == "" { // means we wrote a chunk only + return errtypes.PartialContent(ref.String()) + } user.op(func(cv *cacheVal) { - file, err = cv.mount.Open(p, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, fs.conf.FilePerms) - if err != nil { - err = errors.Wrap(err, "cephfs: error opening binary file") - return - } - defer file.Close() - - _, err = io.Copy(file, r) - if err != nil { - err = errors.Wrap(err, "cephfs: error writing to binary file") - return - } + err = cv.mount.Rename(assembledFile, originalFilename) + }) + if err != nil { + return errors.Wrap(err, "cephfs: error renaming assembled file") + } + defer user.op(func(cv *cacheVal) { + _ = cv.mount.Unlink(assembledFile) }) + return nil - return err } func (fs *cephfs) InitiateUpload(ctx context.Context, ref *provider.Reference, uploadLength int64, metadata map[string]string) (map[string]string, error) { diff --git a/pkg/storage/fs/cephfs/user.go b/pkg/storage/fs/cephfs/user.go index da15b1ec45..5a7a867ef7 100644 --- a/pkg/storage/fs/cephfs/user.go +++ b/pkg/storage/fs/cephfs/user.go @@ -53,11 +53,8 @@ type User struct { func (fs *cephfs) makeUser(ctx context.Context) *User { u := appctx.ContextMustGetUser(ctx) - home := fs.conf.Root - if !fs.conf.DisableHome { - home = filepath.Join(fs.conf.Root, templates.WithUser(u, fs.conf.UserLayout)) - } - + // home := fs.conf.Root + home := filepath.Join(fs.conf.Root, templates.WithUser(u, fs.conf.UserLayout)) return &User{u, fs, ctx, home} } @@ -92,7 +89,7 @@ func (user *User) op(cb callBack) { cb(val.(*cacheVal)) } -func (user *User) fileAsResourceInfo(cv *cacheVal, path string, stat *goceph.CephStatx, mdKeys []string) (ri *provider.ResourceInfo, err error) { +func (fs *cephfs) fileAsResourceInfo(mount *mount, path string, stat *goceph.CephStatx, mdKeys []string) (ri *provider.ResourceInfo, err error) { var ( _type provider.ResourceType target string @@ -103,7 +100,7 @@ func (user *User) fileAsResourceInfo(cv *cacheVal, path string, stat *goceph.Cep switch int(stat.Mode) & syscall.S_IFMT { case syscall.S_IFDIR: _type = provider.ResourceType_RESOURCE_TYPE_CONTAINER - if buf, err = cv.mount.GetXattr(path, "ceph.dir.rbytes"); err == nil { + if buf, err = mount.GetXattr(path, "ceph.dir.rbytes"); err == nil { size, err = strconv.ParseUint(string(buf), 10, 64) } else if err.Error() == errPermissionDenied { // Ignore permission denied errors so ListFolder does not fail because of them. @@ -111,7 +108,7 @@ func (user *User) fileAsResourceInfo(cv *cacheVal, path string, stat *goceph.Cep } case syscall.S_IFLNK: _type = provider.ResourceType_RESOURCE_TYPE_SYMLINK - target, err = cv.mount.Readlink(path) + target, err = mount.Readlink(path) case syscall.S_IFREG: _type = provider.ResourceType_RESOURCE_TYPE_FILE size = stat.Size @@ -129,21 +126,19 @@ func (user *User) fileAsResourceInfo(cv *cacheVal, path string, stat *goceph.Cep keys = map[string]bool{} } mx := make(map[string]string) - if xattrs, err = cv.mount.ListXattr(path); err == nil { + if xattrs, err = mount.ListXattr(path); err == nil { for _, xattr := range xattrs { if len(mdKeys) == 0 || keys[xattr] { - if buf, err := cv.mount.GetXattr(path, xattr); err == nil { + if buf, err := mount.GetXattr(path, xattr); err == nil { mx[xattr] = string(buf) } } } } - //TODO(tmourati): Add entry id logic here - var etag string if isDir(_type) { - rctime, _ := cv.mount.GetXattr(path, "ceph.dir.rctime") + rctime, _ := mount.GetXattr(path, "ceph.dir.rctime") etag = fmt.Sprint(stat.Inode) + ":" + string(rctime) } else { etag = fmt.Sprint(stat.Inode) + ":" + strconv.FormatInt(stat.Ctime.Sec, 10) @@ -154,7 +149,7 @@ func (user *User) fileAsResourceInfo(cv *cacheVal, path string, stat *goceph.Cep Nanos: uint32(stat.Mtime.Nsec), } - perms := getPermissionSet(user, stat, cv.mount, path) + perms := getPermissionSet(user, stat, mount, path) for key := range mx { if !strings.HasPrefix(key, xattrUserNs) { @@ -162,37 +157,11 @@ func (user *User) fileAsResourceInfo(cv *cacheVal, path string, stat *goceph.Cep } } + // cephfs does not provide checksums, so we cannot set it + // a 3rd party tool can add a checksum attribute and we can read it, + // if ever that is implemented. var checksum provider.ResourceChecksum - var md5 string - if _type == provider.ResourceType_RESOURCE_TYPE_FILE { - md5tsBA, err := cv.mount.GetXattr(path, xattrMd5ts) //local error inside if scope - if err == nil { - md5ts, _ := strconv.ParseInt(string(md5tsBA), 10, 64) - if stat.Mtime.Sec == md5ts { - md5BA, err := cv.mount.GetXattr(path, xattrMd5) - if err != nil { - md5, err = calcChecksum(path, cv.mount, stat) - } else { - md5 = string(md5BA) - } - } else { - md5, err = calcChecksum(path, cv.mount, stat) - } - } else { - md5, err = calcChecksum(path, cv.mount, stat) - } - - if err != nil && err.Error() == errPermissionDenied { - checksum.Type = provider.ResourceChecksumType_RESOURCE_CHECKSUM_TYPE_UNSET - } else if err != nil { - return nil, errors.New("cephfs: error calculating checksum of file") - } else { - checksum.Type = provider.ResourceChecksumType_RESOURCE_CHECKSUM_TYPE_MD5 - checksum.Sum = md5 - } - } else { - checksum.Type = provider.ResourceChecksumType_RESOURCE_CHECKSUM_TYPE_UNSET - } + checksum.Type = provider.ResourceChecksumType_RESOURCE_CHECKSUM_TYPE_UNSET var ownerID *userv1beta1.UserId if stat.Uid != 0 { @@ -230,13 +199,13 @@ func (user *User) fileAsResourceInfo(cv *cacheVal, path string, stat *goceph.Cep return } -func (user *User) resolveRef(ref *provider.Reference) (str string, err error) { +func (fs *cephfs) resolveRef(ref *provider.Reference) (string, error) { if ref == nil { - return "", fmt.Errorf("cephfs: nil reference") + return "", fmt.Errorf("cephfs: nil reference provided") } - if str = ref.GetPath(); str == "" { - return "", errtypes.NotSupported("cephfs: entry IDs not currently supported") + if ref.GetPath() == "" { + return "", errtypes.NotSupported("cephfs: path not provided, id based refs are not supported") } - return + return ref.GetPath(), nil } diff --git a/pkg/storage/fs/cephfs/utils.go b/pkg/storage/fs/cephfs/utils.go index 8649e5323b..fa868ec895 100644 --- a/pkg/storage/fs/cephfs/utils.go +++ b/pkg/storage/fs/cephfs/utils.go @@ -22,13 +22,7 @@ package cephfs import ( - "crypto/md5" - "encoding/hex" - "fmt" - "io" - "os" "path/filepath" - "strconv" goceph "github.com/ceph/go-ceph/cephfs" provider "github.com/cs3org/go-cs3apis/cs3/storage/provider/v1beta1" @@ -74,75 +68,6 @@ func isDir(t provider.ResourceType) bool { return t == provider.ResourceType_RESOURCE_TYPE_CONTAINER } -// TODO: Use when fileids are available -/* -func (fs *cephfs) makeFIDPath(fid string) string { - return "" // filepath.Join(fs.conf.EIDFolder, fid) EIDFolder does not exist -} - -func (fs *cephfs) makeFID(absolutePath string, inode string) (rid *provider.ResourceId, err error) { - sum := md5.New() - sum.Write([]byte(absolutePath)) - fid := fmt.Sprintf("%s-%s", hex.EncodeToString(sum.Sum(nil)), inode) - rid = &provider.ResourceId{OpaqueId: fid} - - _ = fs.adminConn.adminMount.Link(absolutePath, fs.makeFIDPath(fid)) - _ = fs.adminConn.adminMount.SetXattr(absolutePath, xattrEID, []byte(fid), 0) - - return -} - -func (fs *cephfs) getFIDPath(cv *cacheVal, path string) (fid string, err error) { - var buffer []byte - if buffer, err = cv.mount.GetXattr(path, xattrEID); err != nil { - return - } - - return fs.makeFIDPath(string(buffer)), err -} -*/ - -func calcChecksum(filepath string, mt Mount, stat Statx) (checksum string, err error) { - file, err := mt.Open(filepath, os.O_RDONLY, 0) - defer closeFile(file) - if err != nil { - return - } - hash := md5.New() - if _, err = io.Copy(hash, file); err != nil { - return - } - checksum = hex.EncodeToString(hash.Sum(nil)) - // we don't care if they fail, the checksum will just be recalculated if an error happens - _ = mt.SetXattr(filepath, xattrMd5ts, []byte(strconv.FormatInt(stat.Mtime.Sec, 10)), 0) - _ = mt.SetXattr(filepath, xattrMd5, []byte(checksum), 0) - - return -} - -func resolveRevRef(mt Mount, ref *provider.Reference, revKey string) (str string, err error) { - var buf []byte - if ref.GetResourceId() != nil { - str, err = mt.Readlink(filepath.Join(snap, revKey, ref.ResourceId.OpaqueId)) - if err != nil { - return "", fmt.Errorf("cephfs: invalid reference %+v", ref) - } - } else if str = ref.GetPath(); str != "" { - buf, err = mt.GetXattr(str, xattrEID) - if err != nil { - return - } - str, err = mt.Readlink(filepath.Join(snap, revKey, string(buf))) - if err != nil { - return - } - } else { - return "", fmt.Errorf("cephfs: empty reference %+v", ref) - } - - return filepath.Join(snap, revKey, str), err -} - func removeLeadingSlash(path string) string { return filepath.Join(".", path) } @@ -182,6 +107,7 @@ func pathGenerator(path string, reverse bool, str chan string) { func walkPath(path string, f func(string) error, reverse bool) (err error) { paths := make(chan string) + // TODO(labkode): carefully review this, a race could happen if pathGenerator gorouting is slow go pathGenerator(path, reverse, paths) for path := range paths { if path == "" { @@ -196,55 +122,3 @@ func walkPath(path string, f func(string) error, reverse bool) (err error) { return } - -// TODO: Use when fileids are available -/* -func (fs *cephfs) writeIndex(oid string, value string) (err error) { - return fs.adminConn.radosIO.WriteFull(oid, []byte(value)) -} - -func (fs *cephfs) removeIndex(oid string) error { - return fs.adminConn.radosIO.Delete(oid) -} - -func (fs *cephfs) resolveIndex(oid string) (fullPath string, err error) { - var i int - var currPath strings.Builder - root := string(filepath.Separator) - offset := uint64(0) - io := fs.adminConn.radosIO - bsize := 4096 - buffer := make([]byte, bsize) - for { - for { //read object - i, err = io.Read(oid, buffer, offset) - offset += uint64(bsize) - currPath.Write(buffer) - if err == nil && i >= bsize { - buffer = buffer[:0] - continue - } else { - offset = 0 - break - } - } - if err != nil { - return - } - - ss := strings.SplitN(currPath.String(), string(filepath.Separator), 2) - if len(ss) != 2 { - if currPath.String() == root { - return - } - - return "", fmt.Errorf("cephfs: entry id is not in the form of \"parentID/entryname\"") - } - parentOID := ss[0] - entryName := ss[1] - fullPath = filepath.Join(entryName, fullPath) - oid = parentOID - currPath.Reset() - } -} -*/ diff --git a/pkg/storage/fs/nextcloud/nextcloud.go b/pkg/storage/fs/nextcloud/nextcloud.go index db081d3d73..e66307ca49 100644 --- a/pkg/storage/fs/nextcloud/nextcloud.go +++ b/pkg/storage/fs/nextcloud/nextcloud.go @@ -317,8 +317,8 @@ func (nc *StorageDriver) InitiateUpload(ctx context.Context, ref *provider.Refer return res, err } -// Upload as defined in the storage.FS interface. -func (nc *StorageDriver) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error { +// Upload as defined in the storage.FS interface. The metadata parameters (e.g. lock context) are ignored. +func (nc *StorageDriver) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser, _ map[string]string) error { req, err := nc.prepareRequest(ctx, http.MethodPut, filepath.Join("/Upload/home", ref.Path), r) if err != nil { return err diff --git a/pkg/storage/fs/nextcloud/nextcloud_test.go b/pkg/storage/fs/nextcloud/nextcloud_test.go index 5ff07bdb16..8d56566ace 100644 --- a/pkg/storage/fs/nextcloud/nextcloud_test.go +++ b/pkg/storage/fs/nextcloud/nextcloud_test.go @@ -217,27 +217,18 @@ var _ = Describe("Nextcloud", func() { Opaque: nil, Type: provider.ResourceType_RESOURCE_TYPE_FILE, Id: &provider.ResourceId{ - StorageId: "", - OpaqueId: "fileid-/some/path", - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + StorageId: "", + OpaqueId: "fileid-/some/path", }, Checksum: &provider.ResourceChecksum{ - Type: 0, - Sum: "", - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Type: 0, + Sum: "", }, Etag: "deadbeef", MimeType: "text/plain", Mtime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, Path: "/some/path", PermissionSet: conversions.RoleFromOCSPermissions(conversions.Permissions(0)).CS3ResourcePermissions(), @@ -247,12 +238,9 @@ var _ = Describe("Nextcloud", func() { OpaqueId: "", Type: 1, }, - Target: "", - CanonicalMetadata: nil, - ArbitraryMetadata: nil, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Target: "", + CanonicalMetadata: nil, + ArbitraryMetadata: nil, })) checkCalled(called, `POST /apps/sciencemesh/~tester/api/storage/GetMD {"ref":{"resource_id":{"storage_id":"storage-id","opaque_id":"opaque-id"},"path":"/some/path"},"mdKeys":["val1","val2","val3"]}`) }) @@ -279,27 +267,18 @@ var _ = Describe("Nextcloud", func() { Opaque: nil, Type: provider.ResourceType_RESOURCE_TYPE_FILE, Id: &provider.ResourceId{ - StorageId: "", - OpaqueId: "fileid-/some/path", - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + StorageId: "", + OpaqueId: "fileid-/some/path", }, Checksum: &provider.ResourceChecksum{ - Type: 0, - Sum: "", - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Type: 0, + Sum: "", }, Etag: "deadbeef", MimeType: "text/plain", Mtime: &types.Timestamp{ - Seconds: 1234567890, - Nanos: 0, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Seconds: 1234567890, + Nanos: 0, }, Path: "/some/path", PermissionSet: conversions.RoleFromOCSPermissions(conversions.Permissions(0)).CS3ResourcePermissions(), @@ -309,12 +288,9 @@ var _ = Describe("Nextcloud", func() { OpaqueId: "", Type: 1, }, - Target: "", - CanonicalMetadata: nil, - ArbitraryMetadata: nil, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Target: "", + CanonicalMetadata: nil, + ArbitraryMetadata: nil, })) Expect(err).ToNot(HaveOccurred()) checkCalled(called, `POST /apps/sciencemesh/~tester/api/storage/ListFolder {"ref":{"resource_id":{"storage_id":"storage-id","opaque_id":"opaque-id"},"path":"/some"},"mdKeys":["val1","val2","val3"]}`) @@ -351,7 +327,7 @@ var _ = Describe("Nextcloud", func() { }) }) - // Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error + // Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser, metadata map[string]string) error Describe("Upload", func() { It("calls the Upload endpoint", func() { nc, called, teardown := setUpNextcloudServer() @@ -366,7 +342,7 @@ var _ = Describe("Nextcloud", func() { } stringReader := strings.NewReader("shiny!") stringReadCloser := io.NopCloser(stringReader) - err := nc.Upload(ctx, ref, stringReadCloser) + err := nc.Upload(ctx, ref, stringReadCloser, map[string]string{}) Expect(err).ToNot(HaveOccurred()) checkCalled(called, `PUT /apps/sciencemesh/~tester/api/storage/Upload/home/some/file/path.txt shiny!`) }) @@ -419,13 +395,10 @@ var _ = Describe("Nextcloud", func() { }, }, }, - Key: "version-12", - Size: uint64(12345), - Mtime: uint64(1234567890), - Etag: "deadb00f", - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Key: "version-12", + Size: uint64(12345), + Mtime: uint64(1234567890), + Etag: "deadb00f", })) Expect(*results[1]).To(Equal(provider.FileVersion{ Opaque: &types.Opaque{ @@ -435,13 +408,10 @@ var _ = Describe("Nextcloud", func() { }, }, }, - Key: "asdf", - Size: uint64(12345), - Mtime: uint64(1234567890), - Etag: "deadbeef", - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + Key: "asdf", + Size: uint64(12345), + Mtime: uint64(1234567890), + Etag: "deadbeef", })) checkCalled(called, `POST /apps/sciencemesh/~tester/api/storage/ListRevisions {"resource_id":{"storage_id":"storage-id","opaque_id":"opaque-id"},"path":"/some/path"}`) }) @@ -505,17 +475,11 @@ var _ = Describe("Nextcloud", func() { Opaque: &types.Opaque{}, Key: "some-deleted-version", Ref: &provider.Reference{ - ResourceId: &provider.ResourceId{}, - Path: "/some/file.txt", - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, - }, - Size: uint64(12345), - DeletionTime: &types.Timestamp{Seconds: uint64(1234567890)}, - XXX_NoUnkeyedLiteral: struct{}{}, - XXX_unrecognized: nil, - XXX_sizecache: 0, + ResourceId: &provider.ResourceId{}, + Path: "/some/file.txt", + }, + Size: uint64(12345), + DeletionTime: &types.Timestamp{Seconds: uint64(1234567890)}, })) checkCalled(called, `POST /apps/sciencemesh/~tester/api/storage/ListRecycle {"key":"asdf","path":"/some/file.txt"}`) }) diff --git a/pkg/storage/registry/dynamic/dynamic_test.go b/pkg/storage/registry/dynamic/dynamic_test.go index 9f62c21212..a295467890 100644 --- a/pkg/storage/registry/dynamic/dynamic_test.go +++ b/pkg/storage/registry/dynamic/dynamic_test.go @@ -410,7 +410,7 @@ var _ = Describe("Dynamic storage provider", func() { Path: "/non/existent", }) Expect(err).To(HaveOccurred()) - Expect(err).To(MatchError(errtypes.NotFound("storage provider not found for ref path:\"/non/existent\" "))) + Expect(err.Error()).To(Equal("error: not found: storage provider not found for ref path:\"/non/existent\"")) }) }) }) diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index 54de8aefa1..1ce30d9142 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -39,7 +39,7 @@ type FS interface { GetMD(ctx context.Context, ref *provider.Reference, mdKeys []string) (*provider.ResourceInfo, error) ListFolder(ctx context.Context, ref *provider.Reference, mdKeys []string) ([]*provider.ResourceInfo, error) InitiateUpload(ctx context.Context, ref *provider.Reference, uploadLength int64, metadata map[string]string) (map[string]string, error) - Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error + Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser, metadata map[string]string) error Download(ctx context.Context, ref *provider.Reference) (io.ReadCloser, error) ListRevisions(ctx context.Context, ref *provider.Reference) ([]*provider.FileVersion, error) DownloadRevision(ctx context.Context, ref *provider.Reference, key string) (io.ReadCloser, error) diff --git a/pkg/storage/utils/eosfs/eosfs.go b/pkg/storage/utils/eosfs/eosfs.go index d98bde1fe5..b4860c5927 100644 --- a/pkg/storage/utils/eosfs/eosfs.go +++ b/pkg/storage/utils/eosfs/eosfs.go @@ -62,8 +62,10 @@ import ( ) const ( - refTargetAttrKey = "reva.target" - lwShareAttrKey = "reva.lwshare" + refTargetAttrKey = "reva.target" // used as user attr to store a reference + lwShareAttrKey = "reva.lwshare" // used to store grants to lightweight accounts + lockPayloadKey = "reva.lockpayload" // used to store lock payloads + eosLockKey = "app.lock" // this is the key known by EOS to enforce a lock. ) const ( @@ -73,12 +75,6 @@ const ( UserAttr ) -// EosLockKey is the key in the xattrs known by EOS to enforce a lock. -const EosLockKey = "app.lock" - -// LockPayloadKey is the key in the xattrs used to store the lock payload. -const LockPayloadKey = "reva.lockpayload" - var hiddenReg = regexp.MustCompile(`\.sys\..#.`) var eosLockReg = regexp.MustCompile(`expires:\d+,type:[a-z]+,owner:.+:.+`) @@ -541,9 +537,9 @@ func (fs *eosfs) SetArbitraryMetadata(ctx context.Context, ref *provider.Referen return errtypes.BadRequest(fmt.Sprintf("eosfs: key or value is empty: key:%s, value:%s", k, v)) } - // do not allow to set a lock key attr - if k == LockPayloadKey || k == EosLockKey { - return errtypes.BadRequest(fmt.Sprintf("eosfs: key %s not allowed", k)) + // do not allow to override system-reserved keys + if k == lockPayloadKey || k == eosLockKey || k == lwShareAttrKey || k == refTargetAttrKey { + return errtypes.BadRequest(fmt.Sprintf("eosfs: key %s is reserved", k)) } attr := &eosclient.Attribute{ @@ -554,7 +550,7 @@ func (fs *eosfs) SetArbitraryMetadata(ctx context.Context, ref *provider.Referen // TODO(labkode): SetArbitraryMetadata does not have semantics for recursivity. // We set it to false - err := fs.c.SetAttr(ctx, rootAuth, attr, false, false, fn) + err := fs.c.SetAttr(ctx, rootAuth, attr, false, false, fn, "") if err != nil { return errors.Wrap(err, "eosfs: error setting xattr in eos driver") } @@ -587,7 +583,7 @@ func (fs *eosfs) UnsetArbitraryMetadata(ctx context.Context, ref *provider.Refer Key: k, } - err := fs.c.UnsetAttr(ctx, rootAuth, attr, false, fn) + err := fs.c.UnsetAttr(ctx, rootAuth, attr, false, fn, "") if err != nil { if errors.Is(err, eosclient.AttrNotExistsError) { continue @@ -598,18 +594,26 @@ func (fs *eosfs) UnsetArbitraryMetadata(ctx context.Context, ref *provider.Refer return nil } +func (fs *eosfs) EncodeAppName(a string) string { + // this function returns the string to be used as EOS "app" tag, both in uploads and when handling locks; + // note that the GET (and PUT) operations in eosbinary.go and eoshttp.go use a `reva_eosclient::read` + // (resp. `write`) tag when no locks are involved. + r := strings.NewReplacer(" ", "_") + return "reva_eosclient::app_" + strings.ToLower(r.Replace(a)) +} + func (fs *eosfs) getLockPayloads(ctx context.Context, path string) (string, string, error) { // sys attributes want root auth, buddy rootauth, err := fs.getRootAuth(ctx) if err != nil { return "", "", err } - data, err := fs.c.GetAttr(ctx, rootauth, "sys."+LockPayloadKey, path) + data, err := fs.c.GetAttr(ctx, rootauth, "sys."+lockPayloadKey, path) if err != nil { return "", "", err } - eoslock, err := fs.c.GetAttr(ctx, rootauth, "sys."+EosLockKey, path) + eoslock, err := fs.c.GetAttr(ctx, rootauth, "sys."+eosLockKey, path) if err != nil { return "", "", err } @@ -617,7 +621,7 @@ func (fs *eosfs) getLockPayloads(ctx context.Context, path string) (string, stri return data.Val, eoslock.Val, nil } -func (fs *eosfs) removeLockAttrs(ctx context.Context, path string) error { +func (fs *eosfs) removeLockAttrs(ctx context.Context, path, app string) error { rootAuth, err := fs.getRootAuth(ctx) if err != nil { return err @@ -625,16 +629,16 @@ func (fs *eosfs) removeLockAttrs(ctx context.Context, path string) error { err = fs.c.UnsetAttr(ctx, rootAuth, &eosclient.Attribute{ Type: SystemAttr, - Key: EosLockKey, - }, false, path) + Key: eosLockKey, + }, false, path, app) if err != nil { return errors.Wrap(err, "eosfs: error unsetting the eos lock") } err = fs.c.UnsetAttr(ctx, rootAuth, &eosclient.Attribute{ Type: SystemAttr, - Key: LockPayloadKey, - }, false, path) + Key: lockPayloadKey, + }, false, path, app) if err != nil { return errors.Wrap(err, "eosfs: error unsetting the lock payload") } @@ -665,9 +669,9 @@ func (fs *eosfs) getLock(ctx context.Context, user *userpb.User, path string, re return nil, errors.Wrap(err, "eosfs: malformed lock payload") } - if time.Unix(int64(l.Expiration.Seconds), 0).After(time.Now()) { + if time.Unix(int64(l.Expiration.Seconds), 0).Before(time.Now()) { // the lock expired - if err := fs.removeLockAttrs(ctx, path); err != nil { + if err := fs.removeLockAttrs(ctx, path, fs.EncodeAppName(l.AppName)); err != nil { return nil, err } return nil, errtypes.NotFound("lock not found for ref") @@ -708,7 +712,7 @@ func (fs *eosfs) setLock(ctx context.Context, lock *provider.Lock, path string) return err } - encodedLock, eosLock, err := encodeLock(lock) + encodedLock, eosLock, err := fs.encodeLock(lock) if err != nil { return errors.Wrap(err, "eosfs: error encoding lock") } @@ -716,12 +720,12 @@ func (fs *eosfs) setLock(ctx context.Context, lock *provider.Lock, path string) // set eos lock err = fs.c.SetAttr(ctx, auth, &eosclient.Attribute{ Type: SystemAttr, - Key: EosLockKey, + Key: eosLockKey, Val: eosLock, - }, false, false, path) + }, false, false, path, fs.EncodeAppName(lock.AppName)) switch { - case errors.Is(err, eosclient.AttrAlreadyExistsError): - return errtypes.BadRequest("resource already locked") + case errors.Is(err, eosclient.FileIsLockedError): + return errtypes.Conflict("resource already locked") case err != nil: return errors.Wrap(err, "eosfs: error setting eos lock") } @@ -729,9 +733,9 @@ func (fs *eosfs) setLock(ctx context.Context, lock *provider.Lock, path string) // set payload err = fs.c.SetAttr(ctx, auth, &eosclient.Attribute{ Type: SystemAttr, - Key: LockPayloadKey, + Key: lockPayloadKey, Val: encodedLock, - }, false, false, path) + }, false, false, path, fs.EncodeAppName(lock.AppName)) if err != nil { return errors.Wrap(err, "eosfs: error setting lock payload") } @@ -826,14 +830,15 @@ func (fs *eosfs) userHasReadAccess(ctx context.Context, user *userpb.User, ref * return resInfo.PermissionSet.InitiateFileDownload, nil } -func encodeLock(l *provider.Lock) (string, string, error) { +func (fs *eosfs) encodeLock(l *provider.Lock) (string, string, error) { data, err := json.Marshal(l) if err != nil { return "", "", err } var a string if l.AppName != "" { - a = l.AppName + // cf. upload implementation + a = fs.EncodeAppName(l.AppName) } else { a = "*" } @@ -974,7 +979,7 @@ func (fs *eosfs) Unlock(ctx context.Context, ref *provider.Reference, lock *prov } path = fs.wrap(ctx, path) - return fs.removeLockAttrs(ctx, path) + return fs.removeLockAttrs(ctx, path, fs.EncodeAppName(lock.AppName)) } func (fs *eosfs) AddGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error { @@ -1003,7 +1008,7 @@ func (fs *eosfs) AddGrant(ctx context.Context, ref *provider.Reference, g *provi Key: fmt.Sprintf("%s.%s", lwShareAttrKey, eosACL.Qualifier), Val: eosACL.Permissions, } - if err := fs.c.SetAttr(ctx, rootAuth, attr, false, true, fn); err != nil { + if err := fs.c.SetAttr(ctx, rootAuth, attr, false, true, fn, ""); err != nil { return errors.Wrap(err, "eosfs: error adding acl for lightweight account") } return nil @@ -1106,7 +1111,7 @@ func (fs *eosfs) RemoveGrant(ctx context.Context, ref *provider.Reference, g *pr Type: SystemAttr, Key: fmt.Sprintf("%s.%s", lwShareAttrKey, eosACL.Qualifier), } - if err := fs.c.UnsetAttr(ctx, rootAuth, attr, true, fn); err != nil { + if err := fs.c.UnsetAttr(ctx, rootAuth, attr, true, fn, ""); err != nil { return errors.Wrap(err, "eosfs: error removing acl for lightweight account") } return nil @@ -1457,6 +1462,9 @@ func (fs *eosfs) createShadowHome(ctx context.Context) error { } } + log := appctx.GetLogger(ctx) + log.Info().Str("home", home).Interface("user", u.Id).Msg("created shadow home") + return nil } @@ -1518,6 +1526,9 @@ func (fs *eosfs) createNominalHome(ctx context.Context) error { } } + log := appctx.GetLogger(ctx) + log.Info().Interface("quotaInfo", quotaInfo).Interface("user", u.Id).Msg("created nominal home") + return nil } @@ -1593,7 +1604,7 @@ func (fs *eosfs) createUserDir(ctx context.Context, u *userpb.User, path string, } for _, attr := range attrs { - err = fs.c.SetAttr(ctx, rootAuth, attr, false, recursiveAttr, path) + err = fs.c.SetAttr(ctx, rootAuth, attr, false, recursiveAttr, path, "") if err != nil { return errors.Wrap(err, "eosfs: error setting attribute") } @@ -1676,7 +1687,7 @@ func (fs *eosfs) CreateReference(ctx context.Context, p string, targetURI *url.U Val: targetURI.String(), } - if err := fs.c.SetAttr(ctx, rootAuth, attr, false, false, tmp); err != nil { + if err := fs.c.SetAttr(ctx, rootAuth, attr, false, false, tmp, ""); err != nil { err = errors.Wrapf(err, "eosfs: error setting reva.ref attr on file: %q", tmp) return err } @@ -2253,7 +2264,7 @@ func (fs *eosfs) convert(ctx context.Context, eosFileInfo *eosclient.FileInfo) ( } } - // filter 'sys' attrs and the reserved lock + // filter 'sys' attrs filteredAttrs := make(map[string]string) for k, v := range eosFileInfo.Attrs { if !strings.HasPrefix(k, "sys") { @@ -2276,6 +2287,9 @@ func (fs *eosfs) convert(ctx context.Context, eosFileInfo *eosclient.FileInfo) ( Seconds: eosFileInfo.MTimeSec, Nanos: eosFileInfo.MTimeNanos, }, + ArbitraryMetadata: &provider.ArbitraryMetadata{ + Metadata: filteredAttrs, + }, Opaque: &types.Opaque{ Map: map[string]*types.OpaqueEntry{ "eos": { @@ -2284,11 +2298,17 @@ func (fs *eosfs) convert(ctx context.Context, eosFileInfo *eosclient.FileInfo) ( }, }, }, - ArbitraryMetadata: &provider.ArbitraryMetadata{ - Metadata: filteredAttrs, - }, } - + if eosFileInfo.Attrs[eosLockKey] != "" { + // populate the lock if decodable, log failure (but move on) if not + l, err := decodeLock(eosFileInfo.Attrs[lockPayloadKey], eosFileInfo.Attrs[eosLockKey]) + if err != nil { + sublog := appctx.GetLogger(ctx).With().Logger() + sublog.Warn().Interface("xattrs", eosFileInfo.Attrs).Msg("could not decode lock, leaving empty") + } else { + info.Lock = l + } + } if eosFileInfo.IsDir { info.Opaque.Map["disable_tus"] = &types.OpaqueEntry{ Decoder: "plain", diff --git a/pkg/storage/utils/eosfs/upload.go b/pkg/storage/utils/eosfs/upload.go index 2c53920fe1..fb46c2699d 100644 --- a/pkg/storage/utils/eosfs/upload.go +++ b/pkg/storage/utils/eosfs/upload.go @@ -30,7 +30,7 @@ import ( "github.com/pkg/errors" ) -func (fs *eosfs) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error { +func (fs *eosfs) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser, metadata map[string]string) error { p, err := fs.resolve(ctx, ref) if err != nil { return errors.Wrap(err, "eos: error resolving reference") @@ -75,7 +75,18 @@ func (fs *eosfs) Upload(ctx context.Context, ref *provider.Reference, r io.ReadC if err != nil { return err } - return fs.c.Write(ctx, auth, fn, r) + + if metadata == nil { + metadata = map[string]string{} + } + app := metadata["lockholder"] + if app == "" { + app = "reva_eosclient::write" + } else { + // if we have a lock context, the app for EOS must match the lock holder + app = fs.EncodeAppName(app) + } + return fs.c.Write(ctx, auth, fn, r, app) } func (fs *eosfs) InitiateUpload(ctx context.Context, ref *provider.Reference, uploadLength int64, metadata map[string]string) (map[string]string, error) { diff --git a/pkg/storage/utils/grants/grants.go b/pkg/storage/utils/grants/grants.go index cb30b54893..b4aee7fb41 100644 --- a/pkg/storage/utils/grants/grants.go +++ b/pkg/storage/utils/grants/grants.go @@ -24,7 +24,7 @@ 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" + "google.golang.org/protobuf/proto" ) // GetACLPerm generates a string representation of CS3APIs' ResourcePermissions, @@ -32,7 +32,7 @@ import ( // TODO(labkode): fine grained permission controls. func GetACLPerm(set *provider.ResourcePermissions) (string, error) { // resource permission is denied - if cmp.Equal(provider.ResourcePermissions{}, *set) { + if proto.Equal(&provider.ResourcePermissions{}, set) { return "!r!w!x!m!u!d", nil } @@ -129,10 +129,10 @@ func GetGranteeType(aclType string) provider.GranteeType { // PermissionsEqual returns true if the permissions are equal. func PermissionsEqual(p1, p2 *provider.ResourcePermissions) bool { - return p1 != nil && p2 != nil && cmp.Equal(*p1, *p2) + return p1 != nil && p2 != nil && proto.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) + return g1 != nil && g2 != nil && proto.Equal(g1, g2) } diff --git a/pkg/storage/utils/localfs/upload.go b/pkg/storage/utils/localfs/upload.go index 67967fa495..604cd26b4f 100644 --- a/pkg/storage/utils/localfs/upload.go +++ b/pkg/storage/utils/localfs/upload.go @@ -39,7 +39,7 @@ import ( var defaultFilePerm = os.FileMode(0664) -func (fs *localfs) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser) error { +func (fs *localfs) Upload(ctx context.Context, ref *provider.Reference, r io.ReadCloser, metadata map[string]string) error { upload, err := fs.GetUpload(ctx, ref.GetPath()) if err != nil { return errors.Wrap(err, "localfs: error retrieving upload") diff --git a/pkg/user/manager/demo/demo.go b/pkg/user/manager/demo/demo.go index d451795294..6ea270f2c6 100644 --- a/pkg/user/manager/demo/demo.go +++ b/pkg/user/manager/demo/demo.go @@ -28,6 +28,7 @@ import ( "github.com/cs3org/reva/pkg/errtypes" "github.com/cs3org/reva/pkg/user" "github.com/cs3org/reva/pkg/user/manager/registry" + "google.golang.org/protobuf/proto" ) func init() { @@ -57,11 +58,11 @@ func (m *manager) Configure(ml map[string]interface{}) error { func (m *manager) GetUser(ctx context.Context, uid *userpb.UserId, skipFetchingGroups bool) (*userpb.User, error) { if user, ok := m.catalog[uid.OpaqueId]; ok { if uid.Idp == "" || user.Id.Idp == uid.Idp { - u := *user + u := proto.Clone(user).(*userpb.User) if skipFetchingGroups { u.Groups = nil } - return &u, nil + return u, nil } } return nil, errtypes.NotFound(uid.OpaqueId) @@ -70,11 +71,11 @@ func (m *manager) GetUser(ctx context.Context, uid *userpb.UserId, skipFetchingG func (m *manager) GetUserByClaim(ctx context.Context, claim, value string, skipFetchingGroups bool) (*userpb.User, error) { for _, u := range m.catalog { if userClaim, err := extractClaim(u, claim); err == nil && value == userClaim { - user := *u + u2 := proto.Clone(u).(*userpb.User) if skipFetchingGroups { - user.Groups = nil + u2.Groups = nil } - return &user, nil + return u2, nil } } return nil, errtypes.NotFound(value) @@ -103,11 +104,11 @@ func (m *manager) FindUsers(ctx context.Context, query string, skipFetchingGroup users := []*userpb.User{} for _, u := range m.catalog { if userContains(u, query) { - user := *u + user := proto.Clone(u).(*userpb.User) if skipFetchingGroups { user.Groups = nil } - users = append(users, &user) + users = append(users, user) } } return users, nil diff --git a/pkg/user/manager/demo/demo_test.go b/pkg/user/manager/demo/demo_test.go index a22f4d8de3..8c062453bb 100644 --- a/pkg/user/manager/demo/demo_test.go +++ b/pkg/user/manager/demo/demo_test.go @@ -25,6 +25,7 @@ import ( userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/errtypes" + "google.golang.org/protobuf/proto" ) var ctx = context.Background() @@ -58,7 +59,7 @@ func TestUserManager(t *testing.T) { // positive test GetUserByClaim by uid resUserByUID, _ := manager.GetUserByClaim(ctx, "uid", "123", false) - if !reflect.DeepEqual(resUserByUID, userEinstein) { + if !proto.Equal(resUserByUID, userEinstein) { t.Fatalf("user differs: expected=%v got=%v", userEinstein, resUserByUID) } @@ -71,13 +72,13 @@ func TestUserManager(t *testing.T) { // positive test GetUserByClaim by mail resUserByEmail, _ := manager.GetUserByClaim(ctx, "mail", "einstein@example.org", false) - if !reflect.DeepEqual(resUserByEmail, userEinstein) { + if !proto.Equal(resUserByEmail, userEinstein) { t.Fatalf("user differs: expected=%v got=%v", userEinstein, resUserByEmail) } // positive test GetUserByClaim by uid without groups resUserByUIDWithoutGroups, _ := manager.GetUserByClaim(ctx, "uid", "123", true) - if !reflect.DeepEqual(resUserByUIDWithoutGroups, userEinsteinWithoutGroups) { + if !proto.Equal(resUserByUIDWithoutGroups, userEinsteinWithoutGroups) { t.Fatalf("user differs: expected=%v got=%v", userEinsteinWithoutGroups, resUserByUIDWithoutGroups) } @@ -96,7 +97,7 @@ func TestUserManager(t *testing.T) { // test FindUsers resUser, _ := manager.FindUsers(ctx, "einstein", false) - if !reflect.DeepEqual(resUser, []*userpb.User{userEinstein}) { + if !proto.Equal(resUser[0], userEinstein) { t.Fatalf("user differs: expected=%v got=%v", []*userpb.User{userEinstein}, resUser) } diff --git a/pkg/user/manager/json/json.go b/pkg/user/manager/json/json.go index c8a93aeb3d..c26eb9a3f5 100644 --- a/pkg/user/manager/json/json.go +++ b/pkg/user/manager/json/json.go @@ -31,6 +31,7 @@ import ( "github.com/cs3org/reva/pkg/user/manager/registry" "github.com/cs3org/reva/pkg/utils/cfg" "github.com/pkg/errors" + "google.golang.org/protobuf/proto" ) func init() { @@ -86,11 +87,11 @@ func (m *manager) Configure(ml map[string]interface{}) error { func (m *manager) GetUser(ctx context.Context, uid *userpb.UserId, skipFetchingGroups bool) (*userpb.User, error) { for _, u := range m.users { if (u.Id.GetOpaqueId() == uid.OpaqueId || u.Username == uid.OpaqueId) && (uid.Idp == "" || uid.Idp == u.Id.GetIdp()) { - user := *u + user := proto.Clone(u).(*userpb.User) if skipFetchingGroups { user.Groups = nil } - return &user, nil + return user, nil } } return nil, errtypes.NotFound(uid.OpaqueId) @@ -99,11 +100,11 @@ func (m *manager) GetUser(ctx context.Context, uid *userpb.UserId, skipFetchingG func (m *manager) GetUserByClaim(ctx context.Context, claim, value string, skipFetchingGroups bool) (*userpb.User, error) { for _, u := range m.users { if userClaim, err := extractClaim(u, claim); err == nil && value == userClaim { - user := *u + user := proto.Clone(u).(*userpb.User) if skipFetchingGroups { user.Groups = nil } - return &user, nil + return user, nil } } return nil, errtypes.NotFound(value) @@ -134,11 +135,11 @@ func (m *manager) FindUsers(ctx context.Context, query string, skipFetchingGroup users := []*userpb.User{} for _, u := range m.users { if userContains(u, query) { - user := *u + user := proto.Clone(u).(*userpb.User) if skipFetchingGroups { user.Groups = nil } - users = append(users, &user) + users = append(users, user) } } return users, nil diff --git a/pkg/user/manager/json/json_test.go b/pkg/user/manager/json/json_test.go index d26df75835..e7f448ac84 100644 --- a/pkg/user/manager/json/json_test.go +++ b/pkg/user/manager/json/json_test.go @@ -26,6 +26,7 @@ import ( userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" "github.com/cs3org/reva/pkg/errtypes" + "google.golang.org/protobuf/proto" ) var ctx = context.Background() @@ -108,26 +109,26 @@ func TestUserManager(t *testing.T) { // negative test GetUserGroups expectedErr := errtypes.NotFound(userFake.OpaqueId) _, err = manager.GetUserGroups(ctx, userFake) - if !reflect.DeepEqual(err, expectedErr) { + if err != expectedErr { t.Fatalf("user not found error differ: expected='%v' got='%v'", expectedErr, err) } // positive test GetUserByClaim by mail resUserByEmail, _ := manager.GetUserByClaim(ctx, "mail", "einstein@example.org", false) - if !reflect.DeepEqual(resUserByEmail, userEinstein) { + if !proto.Equal(resUserByEmail, userEinstein) { t.Fatalf("user differs: expected=%v got=%v", userEinstein, resUserByEmail) } // negative test GetUserByClaim by mail expectedErr = errtypes.NotFound("abc@example.com") _, err = manager.GetUserByClaim(ctx, "mail", "abc@example.com", false) - if !reflect.DeepEqual(err, expectedErr) { + if err != expectedErr { t.Fatalf("user not found error differs: expected='%v' got='%v'", expectedErr, err) } // positive test GetUserByClaim by mail without groups resUserByEmailWithoutGroups, _ := manager.GetUserByClaim(ctx, "mail", "einstein@example.org", true) - if !reflect.DeepEqual(resUserByEmailWithoutGroups, userEinsteinWithoutGroups) { + if !proto.Equal(resUserByEmailWithoutGroups, userEinsteinWithoutGroups) { t.Fatalf("user differs: expected=%v got=%v", userEinsteinWithoutGroups, resUserByEmailWithoutGroups) } @@ -142,7 +143,8 @@ func TestUserManager(t *testing.T) { if len(resUser) != 1 { t.Fatalf("too many users found: expected=%d got=%d", 1, len(resUser)) } - if !reflect.DeepEqual(resUser[0].Username, "einstein") { + + if resUser[0].Username != "einstein" { t.Fatalf("user differ: expected=%v got=%v", "einstein", resUser[0].Username) } } diff --git a/pkg/user/manager/ldap/ldap.go b/pkg/user/manager/ldap/ldap.go index 31dbf8d2af..0973f0a99e 100644 --- a/pkg/user/manager/ldap/ldap.go +++ b/pkg/user/manager/ldap/ldap.go @@ -374,6 +374,9 @@ func (m *manager) FindUsers(ctx context.Context, query string, skipFetchingGroup } func (m *manager) GetUserGroups(ctx context.Context, uid *userpb.UserId) ([]string, error) { + if m.c.GroupFilter == "" { + return []string{}, nil + } l, err := utils.GetLDAPConnection(&m.c.LDAPConn) if err != nil { return []string{}, err diff --git a/pkg/user/manager/ldap/ldap_test.go b/pkg/user/manager/ldap/ldap_test.go index e9a071d42a..c721809437 100644 --- a/pkg/user/manager/ldap/ldap_test.go +++ b/pkg/user/manager/ldap/ldap_test.go @@ -67,6 +67,6 @@ func TestUserManager(t *testing.T) { // positive tests for New _, err = New(context.Background(), map[string]interface{}{}) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } } diff --git a/pkg/user/manager/nextcloud/nextcloud.go b/pkg/user/manager/nextcloud/nextcloud.go index b2e3f13607..fb7cbcb5e9 100644 --- a/pkg/user/manager/nextcloud/nextcloud.go +++ b/pkg/user/manager/nextcloud/nextcloud.go @@ -130,7 +130,7 @@ func (um *Manager) do(ctx context.Context, a Action, username string) (int, []by body, err := io.ReadAll(resp.Body) log.Info().Msgf("um.do res %s %s", url, string(body)) if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { - return 0, nil, fmt.Errorf("Unexpected response code from EFSS API: " + strconv.Itoa(resp.StatusCode)) + return 0, nil, fmt.Errorf("Unexpected response code from EFSS API: %s", strconv.Itoa(resp.StatusCode)) } return resp.StatusCode, body, err } diff --git a/pkg/user/manager/nextcloud/nextcloud_test.go b/pkg/user/manager/nextcloud/nextcloud_test.go index 63ec1dbe0b..6df35059bf 100644 --- a/pkg/user/manager/nextcloud/nextcloud_test.go +++ b/pkg/user/manager/nextcloud/nextcloud_test.go @@ -23,12 +23,12 @@ import ( "os" userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" - "github.com/cs3org/reva/pkg/appctx" "github.com/cs3org/reva/pkg/auth/scope" jwt "github.com/cs3org/reva/pkg/token/manager/jwt" "github.com/cs3org/reva/pkg/user/manager/nextcloud" "github.com/cs3org/reva/tests/helpers" + "github.com/jt-nti/gproto" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "google.golang.org/grpc/metadata" @@ -204,7 +204,8 @@ var _ = Describe("Nextcloud", func() { users, err := um.FindUsers(ctx, "some-query", false) Expect(err).ToNot(HaveOccurred()) Expect(len(users)).To(Equal(1)) - Expect(*users[0]).To(Equal(userpb.User{ + + Expect(users[0]).To(gproto.Equal(&userpb.User{ Id: &userpb.UserId{ Idp: "some-idp", OpaqueId: "some-opaque-user-id", diff --git a/tests/acceptance/config/behat-core.yml b/tests/acceptance/config/behat-core.yml deleted file mode 100644 index ecc1059aa4..0000000000 --- a/tests/acceptance/config/behat-core.yml +++ /dev/null @@ -1,401 +0,0 @@ -default: - autoload: - "": "%paths.base%/../../ocis/tests/acceptance/features/bootstrap" - suites: - coreApiMain: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiMain" - context: &common_ldap_suite_context - parameters: - ldapAdminPassword: admin - ldapUsersOU: TestUsers - ldapGroupsOU: TestGroups - ldapInitialUserFilePath: /../../config/ldap-users.ldif - contexts: - - FeatureContext: &common_feature_context_params - baseUrl: http://localhost:8080 - adminUsername: admin - adminPassword: admin - regularUserPassword: 123456 - ocPath: apps/testing/api/v1/occ - - AppConfigurationContext: - - ChecksumContext: - - FilesVersionsContext: - - TrashbinContext: - - coreApiAuth: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiAuth" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - AuthContext: - - coreApiAuthOcs: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiAuthOcs" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - AuthContext: - - coreApiAuthWebDav: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiAuthWebDav" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - SearchContext: - - PublicWebDavContext: - - WebDavPropertiesContext: - - AuthContext: - - coreApiCapabilities: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiCapabilities" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - CapabilitiesContext: - - AppConfigurationContext: - - coreApiFavorites: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiFavorites" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - FavoritesContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiShareCreateSpecialToShares1: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareCreateSpecialToShares1" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - TrashbinContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiShareCreateSpecialToShares2: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareCreateSpecialToShares2" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - TrashbinContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiSharees: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiSharees" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - ShareesContext: - - AppConfigurationContext: - - coreApiShareManagementToShares: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareManagementToShares" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - FilesVersionsContext: - - coreApiShareManagementBasicToShares: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareManagementBasicToShares" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - AuthContext: - - coreApiShareOperationsToShares1: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareOperationsToShares1" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - coreApiShareOperationsToShares2: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareOperationsToShares2" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - coreApiSharePublicLink1: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiSharePublicLink1" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiSharePublicLink2: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiSharePublicLink2" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiSharePublicLink3: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiSharePublicLink3" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiShareReshareToShares1: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareReshareToShares1" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - coreApiShareReshareToShares2: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareReshareToShares2" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiShareReshareToShares3: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareReshareToShares3" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiShareUpdateToShares: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiShareUpdateToShares" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TrashbinContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiTrashbin: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiTrashbin" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - TrashbinContext: - - AppConfigurationContext: - - WebDavPropertiesContext: - - coreApiTrashbinRestore: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiTrashbinRestore" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - TrashbinContext: - - AppConfigurationContext: - - WebDavPropertiesContext: - - coreApiVersions: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiVersions" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - ChecksumContext: - - FilesVersionsContext: - - WebDavPropertiesContext: - - AppConfigurationContext: - - TrashbinContext: - - coreApiWebdavDelete: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavDelete" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - SearchContext: - - PublicWebDavContext: - - WebDavPropertiesContext: - - TrashbinContext: - - coreApiWebdavLocks: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavLocks" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - WebDavLockingContext: - - WebDavPropertiesContext: - - coreApiWebdavLocks2: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavLocks2" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - WebDavLockingContext: - - WebDavPropertiesContext: - - coreApiWebdavLocksUnlock: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavLocksUnlock" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - WebDavLockingContext: - - WebDavPropertiesContext: - - coreApiWebdavMove1: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavMove1" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - WebDavPropertiesContext: - - coreApiWebdavMove2: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavMove2" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - WebDavPropertiesContext: - - coreApiWebdavOperations: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavOperations" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - SearchContext: - - PublicWebDavContext: - - WebDavPropertiesContext: - - TrashbinContext: - - coreApiWebdavPreviews: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavPreviews" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - WebDavPropertiesContext: - - coreApiWebdavProperties1: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavProperties1" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiWebdavProperties2: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavProperties2" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - WebDavPropertiesContext: - - AppConfigurationContext: - - coreApiWebdavUpload1: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavUpload1" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - WebDavPropertiesContext: - - coreApiWebdavUpload2: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavUpload2" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - coreApiWebdavUploadTUS: - paths: - - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavUploadTUS" - context: *common_ldap_suite_context - contexts: - - FeatureContext: *common_feature_context_params - - PublicWebDavContext: - - TUSContext: - - FilesVersionsContext: - - ChecksumContext: - - # coreApiWebdavEtagPropagation1: - # paths: - # - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavEtagPropagation1" - # context: *common_ldap_suite_context - # contexts: - # - FeatureContext: *common_feature_context_params - # - TrashbinContext: - # - PublicWebDavContext: - # - FilesVersionsContext: - # - WebDavPropertiesContext: - # - AppConfigurationContext: - - # coreApiWebdavEtagPropagation2: - # paths: - # - "%paths.base%/../../ocis/tests/acceptance/features/coreApiWebdavEtagPropagation2" - # context: *common_ldap_suite_context - # contexts: - # - FeatureContext: *common_feature_context_params - # - TrashbinContext: - # - PublicWebDavContext: - # - FilesVersionsContext: - # - WebDavPropertiesContext: - # - AppConfigurationContext: - - extensions: - rdx\behatvars\BehatVariablesExtension: ~ - - Cjm\Behat\StepThroughExtension: ~ diff --git a/tests/acceptance/config/behat.yml b/tests/acceptance/config/behat.yml deleted file mode 100644 index 5429722ec4..0000000000 --- a/tests/acceptance/config/behat.yml +++ /dev/null @@ -1,20 +0,0 @@ -default: - autoload: - '': '%paths.base%/../features/bootstrap' - - suites: - apiVirtualViews: - paths: - - '%paths.base%/../features/apiVirtualViews' - contexts: - - RevaContext: - - FeatureContext: &common_feature_context_params - baseUrl: http://frontend:20180 - adminUsername: admin - adminPassword: admin - regularUserPassword: relativity - ocPath: apps/testing/api/v1/occ - - WebDavPropertiesContext: - - extensions: - Cjm\Behat\StepThroughExtension: ~ diff --git a/tests/acceptance/expected-failures-on-EOS-storage.md b/tests/acceptance/expected-failures-on-EOS-storage.md deleted file mode 100644 index 9a24d5ed28..0000000000 --- a/tests/acceptance/expected-failures-on-EOS-storage.md +++ /dev/null @@ -1,1770 +0,0 @@ -## Scenarios from OCIS API tests that are expected to fail with OCIS storage - -The expected failures in this file are from features in the owncloud/ocis repo. - -#### Virtual Views -- [apiVirtualViews/virtualViews.feature:19](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiVirtualViews/virtualViews.feature#L19) -- [apiVirtualViews/virtualViews.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/apiVirtualViews/virtualViews.feature#L56) - -### File -Basic file management like up and download, move, copy, properties, quota, trash, versions and chunking. - -#### [invalid webdav responses for unauthorized requests.](https://github.com/owncloud/product/issues/273) -These tests succeed when running against ocis because there we handle the relevant authentication in the proxy. -- [coreApiTrashbin/trashbinFilesFolders.feature:235](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L235) -- [coreApiTrashbin/trashbinFilesFolders.feature:268](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L268) - -#### [Getting information about a folder overwritten by a file gives 500 error instead of 404](https://github.com/owncloud/ocis/issues/1239) -These tests are about overwriting files or folders in the `Shares` folder of a user. -- [coreApiWebdavProperties1/copyFile.feature:272](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L272) -- [coreApiWebdavProperties1/copyFile.feature:271](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L271) -- [coreApiWebdavProperties1/copyFile.feature:290](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L290) -- [coreApiWebdavProperties1/copyFile.feature:289](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L289) -- [coreApiWebdavProperties1/copyFile.feature:313](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L313) -- [coreApiWebdavProperties1/copyFile.feature:312](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L312) -- [coreApiWebdavProperties1/copyFile.feature:338](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L338) -- [coreApiWebdavProperties1/copyFile.feature:337](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L337) -- [coreApiWebdavProperties1/copyFile.feature:362](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L362) -- [coreApiWebdavProperties1/copyFile.feature:361](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L361) -- [coreApiWebdavProperties1/copyFile.feature:386](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L386) -- [coreApiWebdavProperties1/copyFile.feature:385](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L385) -- [coreApiWebdavProperties1/copyFile.feature:465](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L465) -- [coreApiWebdavProperties1/copyFile.feature:493](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L493) -- [coreApiWebdavProperties1/copyFile.feature:492](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L492) -- [coreApiWebdavProperties1/copyFile.feature:520](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L520) -- [coreApiWebdavProperties1/copyFile.feature:519](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L519) -- [coreApiWebdavProperties1/copyFile.feature:547](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L547) - -#### [Custom dav properties with namespaces are rendered incorrectly](https://github.com/owncloud/ocis/issues/2140) -_ocdav: double check the webdav property parsing when custom namespaces are used_ -- [coreApiWebdavProperties1/setFileProperties.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/setFileProperties.feature#L36) -- [coreApiWebdavProperties1/setFileProperties.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/setFileProperties.feature#L37) -- [coreApiWebdavProperties1/setFileProperties.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/setFileProperties.feature#L77) -- [coreApiWebdavProperties1/setFileProperties.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/setFileProperties.feature#L78) - -#### [Cannot set custom webDav properties](https://github.com/owncloud/product/issues/264) -- [coreApiWebdavProperties2/getFileProperties.feature:340](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L340) -- [coreApiWebdavProperties2/getFileProperties.feature:341](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L341) -- [coreApiWebdavProperties2/getFileProperties.feature:376](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L376) -- [coreApiWebdavProperties2/getFileProperties.feature:377](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L377) - -### Sync -Synchronization features like etag propagation, setting mtime and locking files - -#### [Uploading an old method chunked file with checksum should fail using new DAV path](https://github.com/owncloud/ocis/issues/2323) -- [coreApiMain/checksums.feature:260](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L260) - -#### [Webdav LOCK operations](https://github.com/owncloud/ocis/issues/1284) -- [coreApiWebdavLocks/exclusiveLocks.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L22) -- [coreApiWebdavLocks/exclusiveLocks.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L23) -- [coreApiWebdavLocks/exclusiveLocks.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L24) -- [coreApiWebdavLocks/exclusiveLocks.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L25) -- [coreApiWebdavLocks/exclusiveLocks.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L49) -- [coreApiWebdavLocks/exclusiveLocks.feature:50](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L50) -- [coreApiWebdavLocks/exclusiveLocks.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L51) -- [coreApiWebdavLocks/exclusiveLocks.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L52) -- [coreApiWebdavLocks/exclusiveLocks.feature:76](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L76) -- [coreApiWebdavLocks/exclusiveLocks.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L77) -- [coreApiWebdavLocks/exclusiveLocks.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L78) -- [coreApiWebdavLocks/exclusiveLocks.feature:79](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L79) -- [coreApiWebdavLocks/exclusiveLocks.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L103) -- [coreApiWebdavLocks/exclusiveLocks.feature:104](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L104) -- [coreApiWebdavLocks/exclusiveLocks.feature:105](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L105) -- [coreApiWebdavLocks/exclusiveLocks.feature:106](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/exclusiveLocks.feature#L106) -- [coreApiWebdavLocks/requestsWithToken.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/requestsWithToken.feature#L32) -- [coreApiWebdavLocks/requestsWithToken.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks/requestsWithToken.feature#L33) -- [coreApiWebdavLocks2/independentLocks.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L25) -- [coreApiWebdavLocks2/independentLocks.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L26) -- [coreApiWebdavLocks2/independentLocks.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L27) -- [coreApiWebdavLocks2/independentLocks.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L28) -- [coreApiWebdavLocks2/independentLocks.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L53) -- [coreApiWebdavLocks2/independentLocks.feature:54](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L54) -- [coreApiWebdavLocks2/independentLocks.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L55) -- [coreApiWebdavLocks2/independentLocks.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L56) -- [coreApiWebdavLocks2/independentLocks.feature:57](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L57) -- [coreApiWebdavLocks2/independentLocks.feature:58](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L58) -- [coreApiWebdavLocks2/independentLocks.feature:59](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L59) -- [coreApiWebdavLocks2/independentLocks.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocks.feature#L60) -- [coreApiWebdavLocks2/independentLocksShareToShares.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocksShareToShares.feature#L30) -- [coreApiWebdavLocks2/independentLocksShareToShares.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocksShareToShares.feature#L31) -- [coreApiWebdavLocks2/independentLocksShareToShares.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocksShareToShares.feature#L32) -- [coreApiWebdavLocks2/independentLocksShareToShares.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocksShareToShares.feature#L33) -- [coreApiWebdavLocks2/independentLocksShareToShares.feature:59](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocksShareToShares.feature#L59) -- [coreApiWebdavLocks2/independentLocksShareToShares.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocksShareToShares.feature#L60) -- [coreApiWebdavLocks2/independentLocksShareToShares.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocksShareToShares.feature#L61) -- [coreApiWebdavLocks2/independentLocksShareToShares.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocks2/independentLocksShareToShares.feature#L62) -- [coreApiWebdavLocksUnlock/unlock.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlock.feature#L23) -- [coreApiWebdavLocksUnlock/unlock.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlock.feature#L24) -- [coreApiWebdavLocksUnlock/unlock.feature:43](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlock.feature#L43) -- [coreApiWebdavLocksUnlock/unlock.feature:44](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlock.feature#L44) -- [coreApiWebdavLocksUnlock/unlock.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlock.feature#L66) -- [coreApiWebdavLocksUnlock/unlock.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlock.feature#L67) -- [coreApiWebdavLocksUnlock/unlock.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlock.feature#L68) -- [coreApiWebdavLocksUnlock/unlock.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlock.feature#L69) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L28) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L29) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L30) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L31) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L52) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L53) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:54](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L54) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L55) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:76](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L76) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L77) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L78) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:79](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L79) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L100) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:101](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L101) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:102](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L102) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L103) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:124](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L124) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:125](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L125) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:126](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L126) -- [coreApiWebdavLocksUnlock/unlockSharingToShares.feature:127](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavLocksUnlock/unlockSharingToShares.feature#L127) - -### Share -File and sync features in a shared scenario - -### [Different response containing exact and non exact match in response of getting sharees](https://github.com/owncloud/ocis/issues/2376) -- [coreApiSharees/sharees.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L99) -- [coreApiSharees/sharees.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L100) -- [coreApiSharees/sharees.feature:119](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L119) -- [coreApiSharees/sharees.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L120) -- [coreApiSharees/sharees.feature:139](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L139) -- [coreApiSharees/sharees.feature:140](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L140) -- [coreApiSharees/sharees.feature:159](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L159) -- [coreApiSharees/sharees.feature:160](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharees/sharees.feature#L160) - -#### [accepting matching name shared resources from different users/groups sets no serial identifiers on the resource name for the receiver](https://github.com/owncloud/ocis/issues/4289) -- [coreApiShareManagementToShares/acceptShares.feature:238](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L238) -- [coreApiShareManagementToShares/acceptShares.feature:260](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L260) - - -#### [Getting content of a shared file with same name returns 500](https://github.com/owncloud/ocis/issues/3880) -- [coreApiShareManagementToShares/acceptShares.feature:459](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L459) -- [coreApiShareManagementToShares/acceptShares.feature:524](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L524) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:127](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L127) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:128](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L128) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:160](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L160) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:161](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L161) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L39) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L38) - -#### [different webdav permissions in ocis](https://github.com/owncloud/ocis/issues/4929) -- [coreApiShareManagementToShares/mergeShare.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L98) - -#### [file_target of a auto-renamed file is not correct directly after sharing](https://github.com/owncloud/ocis/issues/32322) - -- [coreApiShareManagementToShares/mergeShare.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L111) - -#### [[OCIS-storage] not possible to move file into a received folder](https://github.com/owncloud/ocis/issues/764) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:528](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L528) - -#### [File deletion using dav gives unique string in filename in the trashbin](https://github.com/owncloud/product/issues/178) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L49) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:75](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L75) - - cannot share a folder with create permission -#### [Listing shares via ocs API does not show path for parent folders](https://github.com/owncloud/ocis/issues/1231) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:125](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L125) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:138](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L138) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:172](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L172) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:173](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L173) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:174](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L174) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:175](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L175) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:191](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L191) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:192](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L192) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:193](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L193) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:194](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L194) -- [coreApiShareOperationsToShares1/gettingShares.feature:188](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L188) -- [coreApiShareOperationsToShares1/gettingShares.feature:189](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L189) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L36) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L37) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:326](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L326) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:327](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L327) - -#### [OCS error message for attempting to access share via share id as an unauthorized user is not informative](https://github.com/owncloud/ocis/issues/1233) - -- [coreApiShareOperationsToShares1/gettingShares.feature:151](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L151) -- [coreApiShareOperationsToShares1/gettingShares.feature:152](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L152) - - -#### [Public link enforce permissions](https://github.com/owncloud/ocis/issues/1269) - -- [coreApiSharePublicLink1/accessToPublicLinkShare.feature:12](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/accessToPublicLinkShare.feature#L12) -- [coreApiSharePublicLink1/accessToPublicLinkShare.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/accessToPublicLinkShare.feature#L31) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:163](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L163) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:164](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L164) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:317](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L317) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:327](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L327) - - -#### [copying a folder within a public link folder to folder with same name as an already existing file overwrites the parent file](https://github.com/owncloud/ocis/issues/1232) - -- [coreApiSharePublicLink2/copyFromPublicLink.feature:65](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L65) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L91) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:175](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L175) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L176) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:191](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L191) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:192](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L192) - -#### [Upload-only shares must not overwrite but create a separate file](https://github.com/owncloud/ocis/issues/1267) - -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:13](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L13) -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:114](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L114) - -#### [Set quota over settings](https://github.com/owncloud/ocis/issues/1290) -_requires a [CS3 user provisioning api that can update the quota for a user](https://github.com/cs3org/cs3apis/pull/95#issuecomment-772780683)_ - -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:87](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L87) -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:96](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L96) - -#### [path property in pending shares gives only filename](https://github.com/owncloud/ocis/issues/2156) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L61) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:732](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L732) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:733](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L733) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:751](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L751) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:752](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L752) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:767](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L767) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:768](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L768) - -#### [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) - -- [coreApiTrashbin/trashbinSharingToShares.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L46) -- [coreApiTrashbin/trashbinSharingToShares.feature:73](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L73) -- [coreApiTrashbin/trashbinSharingToShares.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L100) -- [coreApiTrashbin/trashbinSharingToShares.feature:128](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L128) -- [coreApiTrashbin/trashbinSharingToShares.feature:156](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L156) -- [coreApiTrashbin/trashbinSharingToShares.feature:184](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L184) - -#### [Folder overwrite on shared files doesn't works correctly on copying file](https://github.com/owncloud/ocis/issues/2183) -- [coreApiWebdavProperties1/copyFile.feature:464](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L464) -- [coreApiWebdavProperties1/copyFile.feature:546](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L546) - -#### [cannot get share-types webdav property](https://github.com/owncloud/ocis/issues/567) -- [coreApiWebdavProperties2/getFileProperties.feature:237](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L237) -- [coreApiWebdavProperties2/getFileProperties.feature:238](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L238) - -#### [oc:privatelink property not returned in webdav responses](https://github.com/owncloud/product/issues/262) -- [coreApiWebdavProperties2/getFileProperties.feature:293](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L293) -- [coreApiWebdavProperties2/getFileProperties.feature:294](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L294) - -#### [changing user quota gives ocs status 103 / Cannot set quota](https://github.com/owncloud/product/issues/247) -_requires a [CS3 user provisioning api that can update the quota for a user](https://github.com/cs3org/cs3apis/pull/95#issuecomment-772780683)_ -- [coreApiShareOperationsToShares2/uploadToShare.feature:210](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L210) -- [coreApiShareOperationsToShares2/uploadToShare.feature:211](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L211) - -#### [not possible to move file into a received folder](https://github.com/owncloud/ocis/issues/764) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L26) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L27) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:70](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L70) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:71](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L71) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L92) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:93](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L93) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:108](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L108) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:109](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L109) -- [coreApiWebdavMove2/moveShareOnOcis.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L29) -- [coreApiWebdavMove2/moveShareOnOcis.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L31) -- [coreApiWebdavMove2/moveShareOnOcis.feature:74](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L74) -- [coreApiWebdavMove2/moveShareOnOcis.feature:75](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L75) -- [coreApiWebdavMove2/moveShareOnOcis.feature:97](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L97) -- [coreApiWebdavMove2/moveShareOnOcis.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L99) -- [coreApiWebdavMove2/moveShareOnOcis.feature:148](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L148) -- [coreApiWebdavMove2/moveShareOnOcis.feature:149](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L149) -- [coreApiWebdavMove2/moveShareOnOcis.feature:168](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L168) -- [coreApiWebdavMove2/moveShareOnOcis.feature:169](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L169) -- [coreApiWebdavMove2/moveFile.feature:175](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L175) -- [coreApiWebdavMove2/moveFile.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L176) - -#### [OCIS-storage overwriting a file as share receiver, does not create a new file version for the sharer](https://github.com/owncloud/ocis/issues/766) //todo -- [coreApiVersions/fileVersions.feature:274](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L274) - -#### [restoring an older version of a shared file deletes the share](https://github.com/owncloud/ocis/issues/765) -- [coreApiShareManagementToShares/acceptShares.feature:448](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L448) -- [coreApiVersions/fileVersions.feature:286](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L286) - -#### [Expiration date for shares is not implemented](https://github.com/owncloud/ocis/issues/1250) -#### Expiration date of user shares -- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:35](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L35) -- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L36) - -#### Expiration date of group shares -- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L60) -- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L61) -- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:82](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L82) -- [coreApiShareReshareToShares3/reShareWithExpiryDate.feature:83](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareWithExpiryDate.feature#L83) - -#### [Getting content of a shared file with same name returns 500](https://github.com/owncloud/ocis/issues/3880) -- [coreApiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature:15](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares1/createShareUniqueReceivedNames.feature#L15) - -#### [Empty OCS response for a share create request using a disabled user](https://github.com/owncloud/ocis/issues/2212) -- [coreApiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:21](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L21) -- [coreApiShareCreateSpecialToShares2/createShareWithDisabledUser.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithDisabledUser.feature#L22) -- [coreApiShareUpdateToShares/updateShare.feature:96](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L96) -- [coreApiShareUpdateToShares/updateShare.feature:97](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L97) -- [coreApiShareUpdateToShares/updateShare.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L98) -- [coreApiShareUpdateToShares/updateShare.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L99) -- [coreApiShareUpdateToShares/updateShare.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L100) -- [coreApiShareUpdateToShares/updateShare.feature:101](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L101) -- [coreApiShareUpdateToShares/updateShare.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L120) -- [coreApiShareUpdateToShares/updateShare.feature:121](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L121) -- [coreApiShareUpdateToShares/updateShare.feature:122](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L122) -- [coreApiShareUpdateToShares/updateShare.feature:123](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L123) -- [coreApiShareUpdateToShares/updateShare.feature:124](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L124) -- [coreApiShareUpdateToShares/updateShare.feature:125](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L125) - -#### [Edit user share response has an "name" field](https://github.com/owncloud/ocis/issues/1225) -- [coreApiShareUpdateToShares/updateShare.feature:235](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L235) -- [coreApiShareUpdateToShares/updateShare.feature:236](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L236) - -#### [user can access version metadata of a received share before accepting it](https://github.com/owncloud/ocis/issues/760) -- [coreApiVersions/fileVersions.feature:311](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L311) - -#### [Share lists deleted user as 'user'](https://github.com/owncloud/ocis/issues/903) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:667](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L667) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:668](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L668) - -#### [OCIS-storage overwriting a file as share receiver, does not create a new file version for the sharer](https://github.com/owncloud/ocis/issues/766) -- [coreApiVersions/fileVersions.feature:431](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L431) //todo - -#### [deleting a share with wrong authentication returns OCS status 996 / HTTP 500](https://github.com/owncloud/ocis/issues/1229) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:221](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L221) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:222](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L222) - -### User Management -User and group management features - -### Other -API, search, favorites, config, capabilities, not existing endpoints, CORS and others - -#### [no robots.txt available](https://github.com/owncloud/ocis/issues/1314) -- [coreApiMain/main.feature:7](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/main.feature#L7) - -#### [Ability to return error messages in Webdav response bodies](https://github.com/owncloud/ocis/issues/1293) -- [coreApiAuthOcs/ocsDELETEAuth.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsDELETEAuth.feature#L10) -- [coreApiAuthOcs/ocsGETAuth.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsGETAuth.feature#L10) -- [coreApiAuthOcs/ocsGETAuth.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsGETAuth.feature#L31) -- [coreApiAuthOcs/ocsGETAuth.feature:44](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsGETAuth.feature#L44) -- [coreApiAuthOcs/ocsGETAuth.feature:75](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsGETAuth.feature#L75) -- [coreApiAuthOcs/ocsGETAuth.feature:106](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsGETAuth.feature#L106) -- [coreApiAuthOcs/ocsGETAuth.feature:123](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsGETAuth.feature#L123) -- [coreApiAuthOcs/ocsPOSTAuth.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsPOSTAuth.feature#L10) -- [coreApiAuthOcs/ocsPUTAuth.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsPUTAuth.feature#L10) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L69) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:70](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L70) - -#### [sending MKCOL requests to another or non-existing user's webDav endpoints as normal user should return 404](https://github.com/owncloud/ocis/issues/5049) -_ocdav: api compatibility, return correct status code_ -- [coreApiAuthWebDav/webDavDELETEAuth.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavDELETEAuth.feature#L48) -- [coreApiAuthWebDav/webDavPROPFINDAuth.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPFINDAuth.feature#L45) -- [coreApiAuthWebDav/webDavPROPPATCHAuth.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPPATCHAuth.feature#L46) -- [coreApiAuthWebDav/webDavMKCOLAuth.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMKCOLAuth.feature#L42) -- [coreApiAuthWebDav/webDavMKCOLAuth.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMKCOLAuth.feature#L53) - -#### [trying to lock file of another user gives http 200](https://github.com/owncloud/ocis/issues/2176) -- [coreApiAuthWebDav/webDavLOCKAuth.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavLOCKAuth.feature#L46) - -#### [send (MOVE, COPY) requests to another user's webDav endpoints as normal user gives 400 instead of 403](https://github.com/owncloud/ocis/issues/3882) -_ocdav: api compatibility, return correct status code_ -- [coreApiAuthWebDav/webDavMOVEAuth.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMOVEAuth.feature#L45) Scenario: send MOVE requests to another user's webDav endpoints as normal user -- [coreApiAuthWebDav/webDavCOPYAuth.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavCOPYAuth.feature#L45) - -#### [send POST requests to another user's webDav endpoints as normal user](https://github.com/owncloud/ocis/issues/1287) -_ocdav: api compatibility, return correct status code_ -- [coreApiAuthWebDav/webDavPOSTAuth.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPOSTAuth.feature#L46) - -#### [Using double slash in URL to access a folder gives 501 and other status codes](https://github.com/owncloud/ocis/issues/1667) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L36) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:123](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L123) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:165](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L165) - -#### [Difference in response content of status.php and default capabilities](https://github.com/owncloud/ocis/issues/1286) -- [coreApiCapabilities/capabilitiesWithNormalUser.feature:13](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiCapabilities/capabilitiesWithNormalUser.feature#L13) - -#### [spaces endpoint does not allow REPORT requests](https://github.com/owncloud/ocis/issues/4034) -- [coreApiWebdavOperations/search.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L42) -- [coreApiWebdavOperations/search.feature:43](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L43) -- [coreApiWebdavOperations/search.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L64) -- [coreApiWebdavOperations/search.feature:65](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L65) -- [coreApiWebdavOperations/search.feature:87](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L87) -- [coreApiWebdavOperations/search.feature:88](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L88) -- [coreApiWebdavOperations/search.feature:102](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L102) -- [coreApiWebdavOperations/search.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L103) -- [coreApiWebdavOperations/search.feature:126](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L126) -- [coreApiWebdavOperations/search.feature:127](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L127) -- [coreApiWebdavOperations/search.feature:150](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L150) -- [coreApiWebdavOperations/search.feature:151](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L151) -- [coreApiWebdavOperations/search.feature:175](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L175) -- [coreApiWebdavOperations/search.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L176) -- [coreApiWebdavOperations/search.feature:208](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L208) -- [coreApiWebdavOperations/search.feature:209](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L209) -- [coreApiWebdavOperations/search.feature:240](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L240) -- [coreApiWebdavOperations/search.feature:241](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L241) -- [coreApiWebdavOperations/search.feature:265](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L265) -- [coreApiWebdavOperations/search.feature:266](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/search.feature#L266) - -#### [Support for favorites](https://github.com/owncloud/ocis/issues/1228) -- [coreApiFavorites/favorites.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L117) -- [coreApiFavorites/favorites.feature:118](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L118) -- [coreApiFavorites/favorites.feature:169](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L169) -- [coreApiFavorites/favorites.feature:170](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L170) -- [coreApiFavorites/favorites.feature:202](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L202) -- [coreApiFavorites/favorites.feature:203](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L203) -- [coreApiFavorites/favorites.feature:221](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L221) -- [coreApiFavorites/favorites.feature:222](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L222) -- [coreApiFavorites/favorites.feature:144](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L144) -- [coreApiFavorites/favorites.feature:145](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L145) -- [coreApiFavorites/favoritesSharingToShares.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L67) -- [coreApiFavorites/favoritesSharingToShares.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L68) - -#### [resource inside Shares dir is not found using the spaces WebDAV API](https://github.com/owncloud/ocis/issues/2968) -- [coreApiFavorites/favoritesSharingToShares.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L22) -- [coreApiFavorites/favoritesSharingToShares.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L23) -- [coreApiFavorites/favoritesSharingToShares.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L37) -- [coreApiFavorites/favoritesSharingToShares.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L38) -- [coreApiFavorites/favoritesSharingToShares.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L51) -- [coreApiFavorites/favoritesSharingToShares.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L52) -- [coreApiFavorites/favoritesSharingToShares.feature:82](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L82) -- [coreApiFavorites/favoritesSharingToShares.feature:83](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favoritesSharingToShares.feature#L83) -- [coreApiMain/checksums.feature:189](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L189) - -#### [WWW-Authenticate header for unauthenticated requests is not clear](https://github.com/owncloud/ocis/issues/2285) -- [coreApiWebdavOperations/refuseAccess.feature:21](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/refuseAccess.feature#L21) -- [coreApiWebdavOperations/refuseAccess.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/refuseAccess.feature#L22) -- [coreApiWebdavOperations/refuseAccess.feature:34](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/refuseAccess.feature#L34) -- [coreApiWebdavOperations/refuseAccess.feature:35](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/refuseAccess.feature#L35) - -#### [App Passwords/Tokens for legacy WebDAV clients](https://github.com/owncloud/ocis/issues/197) -- [coreApiAuthWebDav/webDavDELETEAuth.feature:108](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavDELETEAuth.feature#L108) - -#### [Sharing a same file twice to the same group](https://github.com/owncloud/ocis/issues/1710) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:715](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L715) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:716](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L716) - -#### [Request to edit non-existing user by authorized admin gets unauthorized in http response](https://github.com/owncloud/ocis/issues/38423) -- [coreApiAuthOcs/ocsPUTAuth.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthOcs/ocsPUTAuth.feature#L26) - - -### Won't fix -Not everything needs to be implemented for ocis. While the oc10 testsuite covers these things we are not looking at them right now. - -* _The `OC-LazyOps` header is [no longer supported by the client](https://github.com/owncloud/client/pull/8398), implmenting this is not necessary for a first production release. We plan to have an uploed state machine to visualize the state of a file, see https://github.com/owncloud/ocis/issues/214_ -* _Blacklisted ignored files are no longer required because ocis can handle `.htaccess` files without security implications introduced by serving user provided files with apache._ - -#### [Blacklist files extensions](https://github.com/owncloud/ocis/issues/2177) -- [coreApiWebdavProperties1/copyFile.feature:118](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L118) -- [coreApiWebdavProperties1/copyFile.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L117) -- [coreApiWebdavProperties1/createFileFolder.feature:97](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L97) -- [coreApiWebdavProperties1/createFileFolder.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L98) -- [coreApiWebdavUpload1/uploadFile.feature:180](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L180) -- [coreApiWebdavUpload1/uploadFile.feature:181](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L181) - -#### [cannot set blacklisted file names](https://github.com/owncloud/product/issues/260) -- [coreApiWebdavMove1/moveFolderToBlacklistedName.feature:20](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolderToBlacklistedName.feature#L20) -- [coreApiWebdavMove1/moveFolderToBlacklistedName.feature:21](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolderToBlacklistedName.feature#L21) - -#### [cannot set blacklisted file names](https://github.com/owncloud/product/issues/260) -- [coreApiWebdavMove2/moveFileToBlacklistedName.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFileToBlacklistedName.feature#L18) -- [coreApiWebdavMove2/moveFileToBlacklistedName.feature:19](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFileToBlacklistedName.feature#L19) - -#### [PATCH request for TUS upload with wrong checksum gives incorrect response](https://github.com/owncloud/ocis/issues/1755) -- [coreApiWebdavUploadTUS/checksums.feature:86](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L86) -- [coreApiWebdavUploadTUS/checksums.feature:87](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L87) -- [coreApiWebdavUploadTUS/checksums.feature:88](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L88) -- [coreApiWebdavUploadTUS/checksums.feature:89](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L89) -- [coreApiWebdavUploadTUS/checksums.feature:175](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L175) -- [coreApiWebdavUploadTUS/checksums.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L176) -- [coreApiWebdavUploadTUS/checksums.feature:228](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L228) -- [coreApiWebdavUploadTUS/checksums.feature:229](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L229) -- [coreApiWebdavUploadTUS/checksums.feature:230](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L230) -- [coreApiWebdavUploadTUS/checksums.feature:231](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L231) -- [coreApiWebdavUploadTUS/checksums.feature:284](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L284) -- [coreApiWebdavUploadTUS/checksums.feature:285](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L285) -- [coreApiWebdavUploadTUS/checksums.feature:286](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L286) -- [coreApiWebdavUploadTUS/checksums.feature:287](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L287) -- [coreApiWebdavUploadTUS/optionsRequest.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/optionsRequest.feature#L10) -- [coreApiWebdavUploadTUS/optionsRequest.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/optionsRequest.feature#L25) -- [coreApiWebdavUploadTUS/optionsRequest.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/optionsRequest.feature#L40) -- [coreApiWebdavUploadTUS/optionsRequest.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/optionsRequest.feature#L55) -- [coreApiWebdavUploadTUS/uploadToShare.feature:175](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L175) -- [coreApiWebdavUploadTUS/uploadToShare.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L176) -- [coreApiWebdavUploadTUS/uploadToShare.feature:194](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L194) -- [coreApiWebdavUploadTUS/uploadToShare.feature:195](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L195) -- [coreApiWebdavUploadTUS/uploadToShare.feature:213](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L213) -- [coreApiWebdavUploadTUS/uploadToShare.feature:214](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L214) -- [coreApiWebdavUploadTUS/uploadToShare.feature:252](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L252) -- [coreApiWebdavUploadTUS/uploadToShare.feature:253](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L253) -- [coreApiWebdavUploadTUS/uploadToShare.feature:294](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L294) -- [coreApiWebdavUploadTUS/uploadToShare.feature:295](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L295) - -#### [Share inaccessible if folder with same name was deleted and recreated](https://github.com/owncloud/ocis/issues/1787) -- [coreApiShareReshareToShares1/reShare.feature:267](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L267) -- [coreApiShareReshareToShares1/reShare.feature:268](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L268) -- [coreApiShareReshareToShares1/reShare.feature:285](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L285) -- [coreApiShareReshareToShares1/reShare.feature:286](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L286) -- [coreApiShareReshareToShares1/reShare.feature:303](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L303) -- [coreApiShareReshareToShares1/reShare.feature:304](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L304) - -#### [incorrect ocs(v2) status value when getting info of share that does not exist should be 404, gives 998](https://github.com/owncloud/product/issues/250) -_ocs: api compatibility, return correct status code_ -- [coreApiShareOperationsToShares2/shareAccessByID.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L48) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L49) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:50](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L50) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L51) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L52) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L53) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:54](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L54) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L55) - - -#### [Trying to accept a share with invalid ID gives incorrect OCS and HTTP status](https://github.com/owncloud/ocis/issues/2111) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:84](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L84) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:85](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L85) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:86](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L86) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:87](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L87) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:88](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L88) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:89](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L89) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:90](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L90) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L91) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:102](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L102) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L103) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:133](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L133) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:134](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L134) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:135](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L135) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:136](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L136) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:137](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L137) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:138](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L138) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:139](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L139) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:140](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L140) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:151](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L151) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:152](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L152) - -#### [[OC-storage] share-types field empty for shared file folder in webdav response](https://github.com/owncloud/ocis/issues/2144) -- [coreApiWebdavProperties2/getFileProperties.feature:214](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L214) -- [coreApiWebdavProperties2/getFileProperties.feature:215](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L215) - -#### [Different share permissions provides varying roles in oc10 and ocis](https://github.com/owncloud/ocis/issues/1277) -- [coreApiWebdavProperties2/getFileProperties.feature:274](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L274) -- [coreApiWebdavProperties2/getFileProperties.feature:275](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L275) - -#### [Cannot move folder/file from one received share to another](https://github.com/owncloud/ocis/issues/2442) -- - [coreApiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L128) -- [coreApiShareUpdateToShares/updateShare.feature:160](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L160) -- [coreApiShareManagementToShares/mergeShare.feature:131](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L131) - -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:221](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L221) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:252](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L252) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:351](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L351) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:382](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L382) - -#### [copying the file inside Shares folder returns 404](https://github.com/owncloud/ocis/issues/3874) -- [coreApiWebdavProperties1/copyFile.feature:408](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L408) -- [coreApiWebdavProperties1/copyFile.feature:407](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L407) -- [coreApiWebdavProperties1/copyFile.feature:434](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L434) -- [coreApiWebdavProperties1/copyFile.feature:433](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L433) - -#### [Downloading the older version of shared file gives 404](https://github.com/owncloud/ocis/issues/3868) -- [coreApiVersions/fileVersions.feature:158](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L158) -- [coreApiVersions/fileVersions.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L176) -- [coreApiVersions/fileVersions.feature:443](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L443) - -#### [file versions do not report the version author](https://github.com/owncloud/ocis/issues/2914) -- [coreApiVersions/fileVersionAuthor.feature:15](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L15) -- [coreApiVersions/fileVersionAuthor.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L46) -- [coreApiVersions/fileVersionAuthor.feature:73](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L73) -- [coreApiVersions/fileVersionAuthor.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L99) -- [coreApiVersions/fileVersionAuthor.feature:132](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L132) -- [coreApiVersions/fileVersionAuthor.feature:159](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L159) -- [coreApiVersions/fileVersionAuthor.feature:190](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L190) -- [coreApiVersions/fileVersionAuthor.feature:225](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L225) -- [coreApiVersions/fileVersionAuthor.feature:277](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L277) -- [coreApiVersions/fileVersionAuthor.feature:326](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L326) -- [coreApiVersions/fileVersionAuthor.feature:347](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersionAuthor.feature#L347) - -#### [Shares to deleted group listed in the response](https://github.com/owncloud/ocis/issues/2441) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:529](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L529) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:532](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L532) - -### [Share path in the response is different between share states](https://github.com/owncloud/ocis/issues/2540) -- [coreApiShareManagementToShares/acceptShares.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L28) -- [coreApiShareManagementToShares/acceptShares.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L62) -- [coreApiShareManagementToShares/acceptShares.feature:134](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L134) -- [coreApiShareManagementToShares/acceptShares.feature:155](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L155) -- [coreApiShareManagementToShares/acceptShares.feature:183](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L183) -- [coreApiShareManagementToShares/acceptShares.feature:228](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L228) -- [coreApiShareManagementToShares/acceptShares.feature:438](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L438) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:121](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L121) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:122](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L122) -- [coreApiShareManagementToShares/acceptShares.feature:208](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L208) - -### [Content-type is not multipart/byteranges when downloading file with Range Header](https://github.com/owncloud/ocis/issues/2677) -- [coreApiWebdavOperations/downloadFile.feature:183](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/downloadFile.feature#L183) -- [coreApiWebdavOperations/downloadFile.feature:184](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/downloadFile.feature#L184) - -#### [Creating a new folder which is a substring of Shares leads to Unknown Error](https://github.com/owncloud/ocis/issues/3033) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L26) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L29) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L42) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L45) - -#### [moveShareInsideAnotherShare behaves differently on oCIS than oC10](https://github.com/owncloud/ocis/issues/3047) -- [coreApiShareManagementToShares/moveShareInsideAnotherShare.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveShareInsideAnotherShare.feature#L22) -- [coreApiShareManagementToShares/moveShareInsideAnotherShare.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveShareInsideAnotherShare.feature#L42) -- [coreApiShareManagementToShares/moveShareInsideAnotherShare.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveShareInsideAnotherShare.feature#L56) - -#### [resource path is included in the returned error message](https://github.com/owncloud/ocis/issues/3344) -- [coreApiWebdavProperties2/getFileProperties.feature:310](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L310) - -#### [OCS status code zero](https://github.com/owncloud/ocis/issues/3621) -- [coreApiShareManagementToShares/moveReceivedShare.feature:13](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L13) - -#### [HTTP status code differ while listing the contents of another user's trash bin](https://github.com/owncloud/ocis/issues/3561) -- [coreApiTrashbin/trashbinFilesFolders.feature:249](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L249) - -#### [Cannot disable the dav propfind depth infinity for resources](https://github.com/owncloud/ocis/issues/3720) -- [coreApiWebdavOperations/listFiles.feature:354](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L354) -- [coreApiWebdavOperations/listFiles.feature:355](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L355) -- [coreApiWebdavOperations/listFiles.feature:374](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L374) -- [coreApiWebdavOperations/listFiles.feature:393](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L393) -- [coreApiWebdavOperations/listFiles.feature:394](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L394) - -#### [trash-bin propfind responses are wrong in reva master](https://github.com/cs3org/reva/issues/2861) -- [coreApiTrashbin/trashbinDelete.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L29) -- [coreApiTrashbin/trashbinDelete.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L30) -- [coreApiTrashbin/trashbinDelete.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L53) -- [coreApiTrashbin/trashbinDelete.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L80) -- [coreApiTrashbin/trashbinDelete.feature:123](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L123) -- [coreApiTrashbin/trashbinDelete.feature:146](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L146) -- [coreApiTrashbin/trashbinDelete.feature:171](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L171) -- [coreApiTrashbin/trashbinDelete.feature:196](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L196) -- [coreApiTrashbin/trashbinDelete.feature:233](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L233) -- [coreApiTrashbin/trashbinDelete.feature:270](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L270) -- [coreApiTrashbin/trashbinDelete.feature:319](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinDelete.feature#L319) -- [coreApiTrashbin/trashbinFilesFolders.feature:20](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L20) -- [coreApiTrashbin/trashbinFilesFolders.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L36) -- [coreApiTrashbin/trashbinFilesFolders.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L55) -- [coreApiTrashbin/trashbinFilesFolders.feature:76](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L76) -- [coreApiTrashbin/trashbinFilesFolders.feature:95](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L95) -- [coreApiTrashbin/trashbinFilesFolders.feature:131](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L131) -- [coreApiTrashbin/trashbinFilesFolders.feature:154](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L154) -- [coreApiTrashbin/trashbinFilesFolders.feature:287](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L287) -- [coreApiTrashbin/trashbinFilesFolders.feature:305](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L305) -- [coreApiTrashbin/trashbinFilesFolders.feature:306](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L306) -- [coreApiTrashbin/trashbinFilesFolders.feature:307](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L307) -- [coreApiTrashbin/trashbinFilesFolders.feature:326](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L326) -- [coreApiTrashbin/trashbinFilesFolders.feature:346](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L346) -- [coreApiTrashbin/trashbinFilesFolders.feature:400](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L400) -- [coreApiTrashbin/trashbinFilesFolders.feature:437](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L437) -- [coreApiTrashbin/trashbinSharingToShares.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L24) -- [coreApiTrashbin/trashbinSharingToShares.feature:207](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L207) -- [coreApiTrashbin/trashbinSharingToShares.feature:231](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinSharingToShares.feature#L231) -- [coreApiTrashbinRestore/trashbinRestore.feature:34](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L34) -- [coreApiTrashbinRestore/trashbinRestore.feature:35](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L35) -- [coreApiTrashbinRestore/trashbinRestore.feature:50](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L50) -- [coreApiTrashbinRestore/trashbinRestore.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L51) -- [coreApiTrashbinRestore/trashbinRestore.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L68) -- [coreApiTrashbinRestore/trashbinRestore.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L69) -- [coreApiTrashbinRestore/trashbinRestore.feature:88](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L88) -- [coreApiTrashbinRestore/trashbinRestore.feature:89](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L89) -- [coreApiTrashbinRestore/trashbinRestore.feature:90](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L90) -- [coreApiTrashbinRestore/trashbinRestore.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L91) -- [coreApiTrashbinRestore/trashbinRestore.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L92) -- [coreApiTrashbinRestore/trashbinRestore.feature:93](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L93) -- [coreApiTrashbinRestore/trashbinRestore.feature:108](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L108) -- [coreApiTrashbinRestore/trashbinRestore.feature:109](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L109) -- [coreApiTrashbinRestore/trashbinRestore.feature:110](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L110) -- [coreApiTrashbinRestore/trashbinRestore.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L111) -- [coreApiTrashbinRestore/trashbinRestore.feature:130](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L130) -- [coreApiTrashbinRestore/trashbinRestore.feature:131](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L131) -- [coreApiTrashbinRestore/trashbinRestore.feature:145](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L145) -- [coreApiTrashbinRestore/trashbinRestore.feature:146](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L146) -- [coreApiTrashbinRestore/trashbinRestore.feature:160](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L160) -- [coreApiTrashbinRestore/trashbinRestore.feature:161](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L161) -- [coreApiTrashbinRestore/trashbinRestore.feature:175](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L175) -- [coreApiTrashbinRestore/trashbinRestore.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L176) -- [coreApiTrashbinRestore/trashbinRestore.feature:192](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L192) -- [coreApiTrashbinRestore/trashbinRestore.feature:193](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L193) -- [coreApiTrashbinRestore/trashbinRestore.feature:194](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L194) -- [coreApiTrashbinRestore/trashbinRestore.feature:195](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L195) -- [coreApiTrashbinRestore/trashbinRestore.feature:190](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L190) -- [coreApiTrashbinRestore/trashbinRestore.feature:191](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L191) -- [coreApiTrashbinRestore/trashbinRestore.feature:212](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L212) -- [coreApiTrashbinRestore/trashbinRestore.feature:213](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L213) -- [coreApiTrashbinRestore/trashbinRestore.feature:230](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L230) -- [coreApiTrashbinRestore/trashbinRestore.feature:231](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L231) -- [coreApiTrashbinRestore/trashbinRestore.feature:250](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L250) -- [coreApiTrashbinRestore/trashbinRestore.feature:251](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L251) -- [coreApiTrashbinRestore/trashbinRestore.feature:270](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L270) -- [coreApiTrashbinRestore/trashbinRestore.feature:271](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L271) -- [coreApiTrashbinRestore/trashbinRestore.feature:304](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L304) -- [coreApiTrashbinRestore/trashbinRestore.feature:305](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L305) -- [coreApiTrashbinRestore/trashbinRestore.feature:343](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L343) -- [coreApiTrashbinRestore/trashbinRestore.feature:344](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L344) -- [coreApiTrashbinRestore/trashbinRestore.feature:382](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L382) -- [coreApiTrashbinRestore/trashbinRestore.feature:383](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L383) -- [coreApiTrashbinRestore/trashbinRestore.feature:400](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L400) -- [coreApiTrashbinRestore/trashbinRestore.feature:401](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L401) -- [coreApiTrashbinRestore/trashbinRestore.feature:419](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L419) -- [coreApiTrashbinRestore/trashbinRestore.feature:420](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L420) -- [coreApiTrashbinRestore/trashbinRestore.feature:443](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L443) -- [coreApiTrashbinRestore/trashbinRestore.feature:444](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L444) -- [coreApiTrashbinRestore/trashbinRestore.feature:462](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L462) -- [coreApiTrashbinRestore/trashbinRestore.feature:463](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L463) -- [coreApiTrashbinRestore/trashbinRestore.feature:477](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L477) -- [coreApiTrashbinRestore/trashbinRestore.feature:478](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L478) -- [coreApiTrashbinRestore/trashbinRestore.feature:531](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L531) -- [coreApiTrashbinRestore/trashbinRestore.feature:532](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbinRestore/trashbinRestore.feature#L532) -- [coreApiWebdavEtagPropagation2/restoreFromTrash.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/restoreFromTrash.feature#L28) -- [coreApiWebdavEtagPropagation2/restoreFromTrash.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/restoreFromTrash.feature#L29) -- [coreApiWebdavEtagPropagation2/restoreFromTrash.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/restoreFromTrash.feature#L51) -- [coreApiWebdavEtagPropagation2/restoreFromTrash.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/restoreFromTrash.feature#L52) -- [coreApiWebdavEtagPropagation2/restoreFromTrash.feature:72](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/restoreFromTrash.feature#L72) -- [coreApiWebdavEtagPropagation2/restoreFromTrash.feature:73](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/restoreFromTrash.feature#L73) -- [coreApiWebdavEtagPropagation2/restoreFromTrash.feature:95](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/restoreFromTrash.feature#L95) -- [coreApiWebdavEtagPropagation2/restoreFromTrash.feature:96](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavEtagPropagation2/restoreFromTrash.feature#L96) -- [coreApiVersions/fileVersions.feature:231](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L231) - -#### [`meta` requests have empty responses with master branch](https://github.com/cs3org/reva/issues/2897) -- [coreApiVersions/fileVersions.feature:195](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L195) -- [coreApiVersions/fileVersions.feature:201](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L201) -- [coreApiVersions/fileVersions.feature:208](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L208) -- [coreApiVersions/fileVersions.feature:216](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L216) -- [coreApiVersions/fileVersions.feature:229](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L229) -- [coreApiVersions/fileVersions.feature:230](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L230) -- [coreApiVersions/fileVersions.feature:232](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L232) -- [coreApiVersions/fileVersions.feature:235](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L235) - -#### [WebDAV MOVE with body returns 400 rather than 415](https://github.com/cs3org/reva/issues/3119) - -- [coreApiAuthWebDav/webDavMOVEAuth.feature:105](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMOVEAuth.feature#L105) - -#### [reShareUpdate API tests failing in reva](https://github.com/cs3org/reva/issues/2916) - -- [coreApiShareReshareToShares3/reShareUpdate.feature:153](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L153) -- [coreApiShareReshareToShares3/reShareUpdate.feature:154](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L154) - -#### [coreApiShareOperationsToShares1/gettingShares.feature:28 fails in CI](https://github.com/cs3org/reva/issues/2926) - -- [coreApiShareOperationsToShares1/gettingShares.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L39) -- [coreApiShareOperationsToShares1/gettingShares.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L40) - -#### [These tests pass in ocis and reva egde but fail in master with `file_target has unexpected value '/home'`](https://github.com/owncloud/ocis/issues/2113) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:280](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L280) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:281](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L281) - -#### [valid WebDAV (DELETE, COPY or MOVE) requests with body must exit with 415](https://github.com/owncloud/ocis/issues/4332) -- [coreApiAuthWebDav/webDavCOPYAuth.feature:105](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavCOPYAuth.feature#L105) - -#### [PROPFIND on (password protected) public link returns invalid XML](https://github.com/owncloud/ocis/issues/39707) -The problem has been fixed in reva edge branch but not in reva master -- [coreApiWebdavOperations/propfind.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L64) -- [coreApiWebdavOperations/propfind.feature:76](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L76) - -#### [Updating the role of a public link to internal gives returns 400] -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:483](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L483) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:480](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L480) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:481](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L481) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:482](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L482) - -#### [Default capabilities for normal user and admin user not same as in oC-core](https://github.com/owncloud/ocis/issues/1285) -- [coreApiCapabilities/capabilities.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiCapabilities/capabilities.feature#L10) -- [coreApiCapabilities/capabilities.feature:135](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiCapabilities/capabilities.feature#L135) -- [coreApiCapabilities/capabilities.feature:174](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiCapabilities/capabilities.feature#L174) - -#### [Sharing of project space root via public link does no longer work](https://github.com/owncloud/ocis/issues/6278) -- [coreApiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L23) -- [coreApiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareDefaultFolderForReceivedShares.feature#L24) - - -#### Others -- [coreApiAuthWebDav/webDavCOPYAuth.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavCOPYAuth.feature#L31) -- [coreApiAuthWebDav/webDavCOPYAuth.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavCOPYAuth.feature#L63) -- [coreApiAuthWebDav/webDavCOPYAuth.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavCOPYAuth.feature#L77) -- [coreApiAuthWebDav/webDavCOPYAuth.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavCOPYAuth.feature#L91) -- [coreApiAuthWebDav/webDavDELETEAuth.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavDELETEAuth.feature#L18) -- [coreApiAuthWebDav/webDavDELETEAuth.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavDELETEAuth.feature#L33) -- [coreApiAuthWebDav/webDavDELETEAuth.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavDELETEAuth.feature#L66) -- [coreApiAuthWebDav/webDavDELETEAuth.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavDELETEAuth.feature#L80) -- [coreApiAuthWebDav/webDavDELETEAuth.feature:94](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavDELETEAuth.feature#L94) -- [coreApiAuthWebDav/webDavLOCKAuth.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavLOCKAuth.feature#L18) -- [coreApiAuthWebDav/webDavLOCKAuth.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavLOCKAuth.feature#L32) -- [coreApiAuthWebDav/webDavLOCKAuth.feature:70](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavLOCKAuth.feature#L70) -- [coreApiAuthWebDav/webDavLOCKAuth.feature:84](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavLOCKAuth.feature#L84) -- [coreApiAuthWebDav/webDavLOCKAuth.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavLOCKAuth.feature#L98) -- [coreApiAuthWebDav/webDavMKCOLAuth.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMKCOLAuth.feature#L100) -- [coreApiAuthWebDav/webDavMKCOLAuth.feature:115](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMKCOLAuth.feature#L115) -- [coreApiAuthWebDav/webDavMKCOLAuth.feature:14](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMKCOLAuth.feature#L14) -- [coreApiAuthWebDav/webDavMKCOLAuth.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMKCOLAuth.feature#L28) -- [coreApiAuthWebDav/webDavMKCOLAuth.feature:86](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMKCOLAuth.feature#L86) -- [coreApiAuthWebDav/webDavMOVEAuth.feature:17](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMOVEAuth.feature#L17) -- [coreApiAuthWebDav/webDavMOVEAuth.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMOVEAuth.feature#L31) -- [coreApiAuthWebDav/webDavMOVEAuth.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMOVEAuth.feature#L63) -- [coreApiAuthWebDav/webDavMOVEAuth.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMOVEAuth.feature#L77) -- [coreApiAuthWebDav/webDavMOVEAuth.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavMOVEAuth.feature#L91) -- [coreApiAuthWebDav/webDavPOSTAuth.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPOSTAuth.feature#L18) -- [coreApiAuthWebDav/webDavPOSTAuth.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPOSTAuth.feature#L32) -- [coreApiAuthWebDav/webDavPOSTAuth.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPOSTAuth.feature#L64) -- [coreApiAuthWebDav/webDavPOSTAuth.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPOSTAuth.feature#L78) -- [coreApiAuthWebDav/webDavPOSTAuth.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPOSTAuth.feature#L92) -- [coreApiAuthWebDav/webDavPROPFINDAuth.feature:17](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPFINDAuth.feature#L17) -- [coreApiAuthWebDav/webDavPROPFINDAuth.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPFINDAuth.feature#L31) -- [coreApiAuthWebDav/webDavPROPFINDAuth.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPFINDAuth.feature#L63) -- [coreApiAuthWebDav/webDavPROPFINDAuth.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPFINDAuth.feature#L77) -- [coreApiAuthWebDav/webDavPROPFINDAuth.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPFINDAuth.feature#L91) -- [coreApiAuthWebDav/webDavPROPPATCHAuth.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPPATCHAuth.feature#L18) -- [coreApiAuthWebDav/webDavPROPPATCHAuth.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPPATCHAuth.feature#L32) -- [coreApiAuthWebDav/webDavPROPPATCHAuth.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPPATCHAuth.feature#L64) -- [coreApiAuthWebDav/webDavPROPPATCHAuth.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPPATCHAuth.feature#L78) -- [coreApiAuthWebDav/webDavPROPPATCHAuth.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPROPPATCHAuth.feature#L92) -- [coreApiAuthWebDav/webDavPUTAuth.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPUTAuth.feature#L18) -- [coreApiAuthWebDav/webDavPUTAuth.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPUTAuth.feature#L32) -- [coreApiAuthWebDav/webDavPUTAuth.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPUTAuth.feature#L46) -- [coreApiAuthWebDav/webDavPUTAuth.feature:70](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPUTAuth.feature#L70) -- [coreApiAuthWebDav/webDavPUTAuth.feature:84](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPUTAuth.feature#L84) -- [coreApiAuthWebDav/webDavPUTAuth.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavPUTAuth.feature#L98) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:102](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L102) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:144](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L144) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:15](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L15) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:186](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L186) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:57](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L57) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L68) -- [coreApiAuthWebDav/webDavSpecialURLs.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiAuthWebDav/webDavSpecialURLs.feature#L78) -- [coreApiFavorites/favorites.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L31) -- [coreApiFavorites/favorites.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L32) -- [coreApiFavorites/favorites.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L53) -- [coreApiFavorites/favorites.feature:54](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L54) -- [coreApiFavorites/favorites.feature:74](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L74) -- [coreApiFavorites/favorites.feature:75](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L75) -- [coreApiFavorites/favorites.feature:96](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L96) -- [coreApiFavorites/favorites.feature:97](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiFavorites/favorites.feature#L97) -- [coreApiMain/checksums.feature:102](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L102) -- [coreApiMain/checksums.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L120) -- [coreApiMain/checksums.feature:137](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L137) -- [coreApiMain/checksums.feature:138](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L138) -- [coreApiMain/checksums.feature:154](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L154) -- [coreApiMain/checksums.feature:16](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L16) -- [coreApiMain/checksums.feature:170](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L170) -- [coreApiMain/checksums.feature:178](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L178) -- [coreApiMain/checksums.feature:208](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L208) -- [coreApiMain/checksums.feature:209](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L209) -- [coreApiMain/checksums.feature:223](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L223) -- [coreApiMain/checksums.feature:224](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L224) -- [coreApiMain/checksums.feature:242](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L242) -- [coreApiMain/checksums.feature:243](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L243) -- [coreApiMain/checksums.feature:283](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L283) -- [coreApiMain/checksums.feature:284](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L284) -- [coreApiMain/checksums.feature:306](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L306) -- [coreApiMain/checksums.feature:307](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L307) -- [coreApiMain/checksums.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L31) -- [coreApiMain/checksums.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L32) -- [coreApiMain/checksums.feature:324](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L324) -- [coreApiMain/checksums.feature:325](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L325) -- [coreApiMain/checksums.feature:345](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L345) -- [coreApiMain/checksums.feature:347](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L347) -- [coreApiMain/checksums.feature:348](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L348) -- [coreApiMain/checksums.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L48) -- [coreApiMain/checksums.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L49) -- [coreApiMain/checksums.feature:65](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L65) -- [coreApiMain/checksums.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L66) -- [coreApiMain/checksums.feature:83](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L83) -- [coreApiMain/checksums.feature:84](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiMain/checksums.feature#L84) -- [coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature#L103) -- [coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature:13](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature#L13) -- [coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature:154](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature#L154) -- [coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature:201](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature#L201) -- [coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature:248](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature#L248) -- [coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature:58](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares1/createShareResourceCaseSensitiveName.feature#L58) -- [coreApiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L10) -- [coreApiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L32) -- [coreApiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:54](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L54) -- [coreApiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature:76](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareGroupAndUserWithSameName.feature#L76) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:191](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L191) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:283](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L283) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:319](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L319) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:413](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L413) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:445](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L445) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:514](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L514) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:515](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L515) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:543](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L543) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:544](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L544) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:570](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L570) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:571](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L571) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L63) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L64) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L80) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:81](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L81) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L98) -- [coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareReceivedInMultipleWays.feature#L99) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:115](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L115) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:116](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L116) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L117) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:118](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L118) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L27) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L28) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L29) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L30) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L31) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L32) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L33) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:34](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L34) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L52) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L53) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:71](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L71) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:72](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L72) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:73](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L73) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:74](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L74) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:94](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L94) -- [coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature:95](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareCreateSpecialToShares2/createShareWithInvalidPermissions.feature#L95) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L100) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:101](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L101) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:116](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L116) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L117) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:133](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L133) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:157](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L157) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:158](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L158) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:182](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L182) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:183](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L183) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:207](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L207) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:208](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L208) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:235](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L235) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:236](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L236) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:274](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L274) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:275](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L275) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:294](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L294) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:295](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L295) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:342](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L342) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:343](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L343) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:360](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L360) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:361](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L361) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:377](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L377) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:378](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L378) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:396](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L396) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:397](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L397) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:400](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L400) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:422](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L422) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:466](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L466) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:467](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L467) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:561](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L561) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:579](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L579) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:597](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L597) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:644](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L644) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:645](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L645) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:65](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L65) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L66) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:700](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L700) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:701](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L701) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L91) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L92) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:94](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L94) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:95](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L95) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:97](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L97) -- [coreApiShareManagementBasicToShares/createShareToSharesFolder.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/createShareToSharesFolder.feature#L98) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:113](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L113) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:208](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L208) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:209](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L209) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:235](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L235) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:236](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L236) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L30) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L31) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L45) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L46) -- [coreApiShareManagementBasicToShares/deleteShareFromShares.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementBasicToShares/deleteShareFromShares.feature#L92) -- [coreApiShareManagementToShares/acceptShares.feature:121](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L121) -- [coreApiShareManagementToShares/acceptShares.feature:174](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L174) -- [coreApiShareManagementToShares/acceptShares.feature:287](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L287) -- [coreApiShareManagementToShares/acceptShares.feature:310](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L310) -- [coreApiShareManagementToShares/acceptShares.feature:349](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L349) -- [coreApiShareManagementToShares/acceptShares.feature:374](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L374) -- [coreApiShareManagementToShares/acceptShares.feature:396](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L396) -- [coreApiShareManagementToShares/acceptShares.feature:421](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L421) -- [coreApiShareManagementToShares/acceptShares.feature:81](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptShares.feature#L81) -- [coreApiShareManagementToShares/acceptSharesToSharesFolder.feature:15](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptSharesToSharesFolder.feature#L15) -- [coreApiShareManagementToShares/acceptSharesToSharesFolder.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptSharesToSharesFolder.feature#L24) -- [coreApiShareManagementToShares/acceptSharesToSharesFolder.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptSharesToSharesFolder.feature#L32) -- [coreApiShareManagementToShares/acceptSharesToSharesFolder.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/acceptSharesToSharesFolder.feature#L53) -- [coreApiShareManagementToShares/mergeShare.feature:14](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L14) -- [coreApiShareManagementToShares/mergeShare.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L25) -- [coreApiShareManagementToShares/mergeShare.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L36) -- [coreApiShareManagementToShares/mergeShare.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L49) -- [coreApiShareManagementToShares/mergeShare.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L62) -- [coreApiShareManagementToShares/mergeShare.feature:76](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L76) -- [coreApiShareManagementToShares/mergeShare.feature:85](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/mergeShare.feature#L85) -- [coreApiShareManagementToShares/moveReceivedShare.feature:105](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L105) -- [coreApiShareManagementToShares/moveReceivedShare.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L117) -- [coreApiShareManagementToShares/moveReceivedShare.feature:129](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L129) -- [coreApiShareManagementToShares/moveReceivedShare.feature:141](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L141) -- [coreApiShareManagementToShares/moveReceivedShare.feature:153](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L153) -- [coreApiShareManagementToShares/moveReceivedShare.feature:184](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L184) -- [coreApiShareManagementToShares/moveReceivedShare.feature:185](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L185) -- [coreApiShareManagementToShares/moveReceivedShare.feature:209](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L209) -- [coreApiShareManagementToShares/moveReceivedShare.feature:210](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L210) -- [coreApiShareManagementToShares/moveReceivedShare.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L29) -- [coreApiShareManagementToShares/moveReceivedShare.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L42) -- [coreApiShareManagementToShares/moveReceivedShare.feature:58](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L58) -- [coreApiShareManagementToShares/moveReceivedShare.feature:73](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L73) -- [coreApiShareManagementToShares/moveReceivedShare.feature:83](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L83) -- [coreApiShareManagementToShares/moveReceivedShare.feature:93](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveReceivedShare.feature#L93) -- [coreApiShareManagementToShares/moveShareInsideAnotherShare.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareManagementToShares/moveShareInsideAnotherShare.feature#L31) -- [coreApiShareOperationsToShares1/accessToShare.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/accessToShare.feature#L24) -- [coreApiShareOperationsToShares1/accessToShare.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/accessToShare.feature#L25) -- [coreApiShareOperationsToShares1/accessToShare.feature:41](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/accessToShare.feature#L41) -- [coreApiShareOperationsToShares1/accessToShare.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/accessToShare.feature#L42) -- [coreApiShareOperationsToShares1/accessToShare.feature:58](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/accessToShare.feature#L58) -- [coreApiShareOperationsToShares1/accessToShare.feature:59](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/accessToShare.feature#L59) -- [coreApiShareOperationsToShares1/accessToShare.feature:74](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/accessToShare.feature#L74) -- [coreApiShareOperationsToShares1/accessToShare.feature:75](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/accessToShare.feature#L75) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L48) -- [coreApiShareOperationsToShares1/changingFilesShare.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/changingFilesShare.feature#L49) -- [coreApiShareOperationsToShares1/gettingShares.feature:106](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L106) -- [coreApiShareOperationsToShares1/gettingShares.feature:107](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L107) -- [coreApiShareOperationsToShares1/gettingShares.feature:137](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L137) -- [coreApiShareOperationsToShares1/gettingShares.feature:138](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L138) -- [coreApiShareOperationsToShares1/gettingShares.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L24) -- [coreApiShareOperationsToShares1/gettingShares.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L25) -- [coreApiShareOperationsToShares1/gettingShares.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L62) -- [coreApiShareOperationsToShares1/gettingShares.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L63) -- [coreApiShareOperationsToShares1/gettingShares.feature:85](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L85) -- [coreApiShareOperationsToShares1/gettingShares.feature:86](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingShares.feature#L86) -- [coreApiShareOperationsToShares1/gettingSharesPendingFiltered.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L42) -- [coreApiShareOperationsToShares1/gettingSharesPendingFiltered.feature:43](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L43) -- [coreApiShareOperationsToShares1/gettingSharesPendingFiltered.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L55) -- [coreApiShareOperationsToShares1/gettingSharesPendingFiltered.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesPendingFiltered.feature#L56) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L39) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L40) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L61) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L62) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:90](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L90) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFilteredEmpty.feature#L91) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L45) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L46) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:59](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L59) -- [coreApiShareOperationsToShares1/gettingSharesReceivedFiltered.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesReceivedFiltered.feature#L60) -- [coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L39) -- [coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L40) -- [coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L61) -- [coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L62) -- [coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:81](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L81) -- [coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature:82](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFilteredEmpty.feature#L82) -- [coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L45) -- [coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L46) -- [coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature:59](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L59) -- [coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L60) -- [coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature:73](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L73) -- [coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature:74](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L74) -- [coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature:89](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L89) -- [coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature:90](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares1/gettingSharesSharedFiltered.feature#L90) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:104](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L104) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:105](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L105) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:119](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L119) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L120) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:141](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L141) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:142](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L142) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:156](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L156) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L176) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:177](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L177) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:197](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L197) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:198](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L198) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:212](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L212) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:213](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L213) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:234](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L234) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:235](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L235) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:249](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L249) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L25) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:250](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L250) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:271](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L271) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:272](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L272) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:286](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L286) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:287](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L287) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:308](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L308) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:309](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L309) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:323](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L323) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:324](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L324) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:345](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L345) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:346](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L346) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L45) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L46) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L67) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L68) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:82](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L82) -- [coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature:83](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/getWebDAVSharePermissions.feature#L83) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L36) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L37) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:72](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L72) -- [coreApiShareOperationsToShares2/shareAccessByID.feature:73](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/shareAccessByID.feature#L73) -- [coreApiShareOperationsToShares2/uploadToShare.feature:10](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L10) -- [coreApiShareOperationsToShares2/uploadToShare.feature:119](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L119) -- [coreApiShareOperationsToShares2/uploadToShare.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L120) -- [coreApiShareOperationsToShares2/uploadToShare.feature:145](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L145) -- [coreApiShareOperationsToShares2/uploadToShare.feature:146](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L146) -- [coreApiShareOperationsToShares2/uploadToShare.feature:272](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L272) -- [coreApiShareOperationsToShares2/uploadToShare.feature:273](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L273) -- [coreApiShareOperationsToShares2/uploadToShare.feature:288](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L288) -- [coreApiShareOperationsToShares2/uploadToShare.feature:289](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L289) -- [coreApiShareOperationsToShares2/uploadToShare.feature:41](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L41) -- [coreApiShareOperationsToShares2/uploadToShare.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L42) -- [coreApiShareOperationsToShares2/uploadToShare.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L67) -- [coreApiShareOperationsToShares2/uploadToShare.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L68) -- [coreApiShareOperationsToShares2/uploadToShare.feature:95](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L95) -- [coreApiShareOperationsToShares2/uploadToShare.feature:96](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareOperationsToShares2/uploadToShare.feature#L96) -- [coreApiSharePublicLink1/accessToPublicLinkShare.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/accessToPublicLinkShare.feature#L22) -- [coreApiSharePublicLink1/accessToPublicLinkShare.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/accessToPublicLinkShare.feature#L46) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L103) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:113](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L113) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:123](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L123) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L26) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L27) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L28) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L29) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L32) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L42) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L51) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L61) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:71](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L71) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:82](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L82) -- [coreApiSharePublicLink1/changingPublicLinkShare.feature:93](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/changingPublicLinkShare.feature#L93) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L100) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:129](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L129) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:130](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L130) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:228](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L228) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:229](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L229) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:248](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L248) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:249](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L249) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:268](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L268) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:269](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L269) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:296](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L296) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:297](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L297) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:313](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L313) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:314](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L314) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:338](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L338) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:358](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L358) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:359](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L359) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L37) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:373](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L373) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:374](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L374) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:377](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L377) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L38) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:389](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L389) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:402](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L402) -- [coreApiSharePublicLink1/createPublicLinkShare.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/createPublicLinkShare.feature#L99) -- [coreApiSharePublicLink1/deletePublicLinkShare.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/deletePublicLinkShare.feature#L22) -- [coreApiSharePublicLink1/deletePublicLinkShare.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/deletePublicLinkShare.feature#L23) -- [coreApiSharePublicLink1/deletePublicLinkShare.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/deletePublicLinkShare.feature#L39) -- [coreApiSharePublicLink1/deletePublicLinkShare.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/deletePublicLinkShare.feature#L40) -- [coreApiSharePublicLink1/deletePublicLinkShare.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/deletePublicLinkShare.feature#L55) -- [coreApiSharePublicLink1/deletePublicLinkShare.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/deletePublicLinkShare.feature#L56) -- [coreApiSharePublicLink1/deletePublicLinkShare.feature:72](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/deletePublicLinkShare.feature#L72) -- [coreApiSharePublicLink1/deletePublicLinkShare.feature:73](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink1/deletePublicLinkShare.feature#L73) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:11](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L11) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:119](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L119) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L120) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:121](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L121) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:122](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L122) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:138](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L138) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:139](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L139) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:140](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L140) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:141](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L141) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:158](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L158) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:159](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L159) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:160](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L160) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:161](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L161) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L24) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L38) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L52) -- [coreApiSharePublicLink2/copyFromPublicLink.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/copyFromPublicLink.feature#L80) -- [coreApiSharePublicLink2/multilinkSharing.feature:112](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L112) -- [coreApiSharePublicLink2/multilinkSharing.feature:113](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L113) -- [coreApiSharePublicLink2/multilinkSharing.feature:178](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L178) -- [coreApiSharePublicLink2/multilinkSharing.feature:179](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L179) -- [coreApiSharePublicLink2/multilinkSharing.feature:206](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L206) -- [coreApiSharePublicLink2/multilinkSharing.feature:207](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L207) -- [coreApiSharePublicLink2/multilinkSharing.feature:241](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L241) -- [coreApiSharePublicLink2/multilinkSharing.feature:242](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L242) -- [coreApiSharePublicLink2/multilinkSharing.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L45) -- [coreApiSharePublicLink2/multilinkSharing.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L46) -- [coreApiSharePublicLink2/multilinkSharing.feature:81](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L81) -- [coreApiSharePublicLink2/multilinkSharing.feature:82](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/multilinkSharing.feature#L82) -- [coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature:119](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature#L119) -- [coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature#L120) -- [coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature#L45) -- [coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature#L46) -- [coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature#L98) -- [coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink2/reShareAsPublicLinkToSharesNewDav.feature#L99) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L117) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:118](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L118) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:149](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L149) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:150](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L150) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:181](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L181) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:182](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L182) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:213](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L213) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:214](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L214) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:245](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L245) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:246](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L246) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:287](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L287) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:288](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L288) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:329](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L329) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:330](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L330) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:349](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L349) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:350](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L350) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:371](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L371) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:372](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L372) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:409](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L409) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:410](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L410) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:411](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L411) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:412](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L412) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:455](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L455) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:456](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L456) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:457](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L457) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:458](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L458) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:47](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L47) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L48) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L80) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:81](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L81) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L98) -- [coreApiSharePublicLink3/updatePublicLinkShare.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/updatePublicLinkShare.feature#L99) -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:105](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L105) -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L39) -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L40) -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L48) -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L56) -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L67) -- [coreApiSharePublicLink3/uploadToPublicLinkShare.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiSharePublicLink3/uploadToPublicLinkShare.feature#L77) -- [coreApiShareReshareToShares1/reShare.feature:109](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L109) -- [coreApiShareReshareToShares1/reShare.feature:110](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L110) -- [coreApiShareReshareToShares1/reShare.feature:165](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L165) -- [coreApiShareReshareToShares1/reShare.feature:166](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L166) -- [coreApiShareReshareToShares1/reShare.feature:167](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L167) -- [coreApiShareReshareToShares1/reShare.feature:168](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L168) -- [coreApiShareReshareToShares1/reShare.feature:169](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L169) -- [coreApiShareReshareToShares1/reShare.feature:170](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L170) -- [coreApiShareReshareToShares1/reShare.feature:171](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L171) -- [coreApiShareReshareToShares1/reShare.feature:172](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L172) -- [coreApiShareReshareToShares1/reShare.feature:173](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L173) -- [coreApiShareReshareToShares1/reShare.feature:174](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L174) -- [coreApiShareReshareToShares1/reShare.feature:175](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L175) -- [coreApiShareReshareToShares1/reShare.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L176) -- [coreApiShareReshareToShares1/reShare.feature:177](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L177) -- [coreApiShareReshareToShares1/reShare.feature:178](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L178) -- [coreApiShareReshareToShares1/reShare.feature:179](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L179) -- [coreApiShareReshareToShares1/reShare.feature:180](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L180) -- [coreApiShareReshareToShares1/reShare.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L61) -- [coreApiShareReshareToShares1/reShare.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L62) -- [coreApiShareReshareToShares1/reShare.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L77) -- [coreApiShareReshareToShares1/reShare.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L78) -- [coreApiShareReshareToShares1/reShare.feature:93](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L93) -- [coreApiShareReshareToShares1/reShare.feature:94](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares1/reShare.feature#L94) -- [coreApiShareReshareToShares2/reShareChain.feature:8](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares2/reShareChain.feature#L8) -- [coreApiShareReshareToShares2/reShareDisabled.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares2/reShareDisabled.feature#L22) -- [coreApiShareReshareToShares2/reShareDisabled.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares2/reShareDisabled.feature#L23) -- [coreApiShareReshareToShares2/reShareSubfolder.feature:103](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares2/reShareSubfolder.feature#L103) -- [coreApiShareReshareToShares2/reShareSubfolder.feature:104](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares2/reShareSubfolder.feature#L104) -- [coreApiShareReshareToShares2/reShareSubfolder.feature:123](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares2/reShareSubfolder.feature#L123) -- [coreApiShareReshareToShares2/reShareSubfolder.feature:124](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares2/reShareSubfolder.feature#L124) -- [coreApiShareReshareToShares2/reShareSubfolder.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares2/reShareSubfolder.feature#L29) -- [coreApiShareReshareToShares2/reShareSubfolder.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares2/reShareSubfolder.feature#L30) -- [coreApiShareReshareToShares3/reShareUpdate.feature:116](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L116) -- [coreApiShareReshareToShares3/reShareUpdate.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L117) -- [coreApiShareReshareToShares3/reShareUpdate.feature:135](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L135) -- [coreApiShareReshareToShares3/reShareUpdate.feature:136](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L136) -- [coreApiShareReshareToShares3/reShareUpdate.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L29) -- [coreApiShareReshareToShares3/reShareUpdate.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L30) -- [coreApiShareReshareToShares3/reShareUpdate.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L46) -- [coreApiShareReshareToShares3/reShareUpdate.feature:47](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L47) -- [coreApiShareReshareToShares3/reShareUpdate.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L80) -- [coreApiShareReshareToShares3/reShareUpdate.feature:81](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L81) -- [coreApiShareReshareToShares3/reShareUpdate.feature:97](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L97) -- [coreApiShareReshareToShares3/reShareUpdate.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareReshareToShares3/reShareUpdate.feature#L98) -- [coreApiShareUpdateToShares/updateShare.feature:128](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L128) -- [coreApiShareUpdateToShares/updateShare.feature:258](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L258) -- [coreApiShareUpdateToShares/updateShare.feature:259](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L259) -- [coreApiShareUpdateToShares/updateShare.feature:279](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L279) -- [coreApiShareUpdateToShares/updateShare.feature:280](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L280) -- [coreApiShareUpdateToShares/updateShare.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L30) -- [coreApiShareUpdateToShares/updateShare.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L31) -- [coreApiShareUpdateToShares/updateShare.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L63) -- [coreApiShareUpdateToShares/updateShare.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L64) -- [coreApiShareUpdateToShares/updateShare.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L78) -- [coreApiShareUpdateToShares/updateShare.feature:79](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShare.feature#L79) -- [coreApiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:35](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L35) -- [coreApiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:36](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L36) -- [coreApiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L55) -- [coreApiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiShareUpdateToShares/updateShareGroupAndUserWithSameName.feature#L56) -- [coreApiTrashbin/trashbinFilesFolders.feature:363](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiTrashbin/trashbinFilesFolders.feature#L363) -- [coreApiVersions/fileVersions.feature:12](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L12) -- [coreApiVersions/fileVersions.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L120) -- [coreApiVersions/fileVersions.feature:129](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L129) -- [coreApiVersions/fileVersions.feature:141](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L141) -- [coreApiVersions/fileVersions.feature:148](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L148) -- [coreApiVersions/fileVersions.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L18) -- [coreApiVersions/fileVersions.feature:251](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L251) -- [coreApiVersions/fileVersions.feature:258](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L258) -- [coreApiVersions/fileVersions.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L26) -- [coreApiVersions/fileVersions.feature:266](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L266) -- [coreApiVersions/fileVersions.feature:298](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L298) -- [coreApiVersions/fileVersions.feature:324](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L324) -- [coreApiVersions/fileVersions.feature:337](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L337) -- [coreApiVersions/fileVersions.feature:34](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L34) -- [coreApiVersions/fileVersions.feature:350](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L350) -- [coreApiVersions/fileVersions.feature:391](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L391) -- [coreApiVersions/fileVersions.feature:392](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L392) -- [coreApiVersions/fileVersions.feature:416](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L416) -- [coreApiVersions/fileVersions.feature:417](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L417) -- [coreApiVersions/fileVersions.feature:420](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L420) -- [coreApiVersions/fileVersions.feature:43](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L43) -- [coreApiVersions/fileVersions.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L53) -- [coreApiVersions/fileVersions.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L62) -- [coreApiVersions/fileVersions.feature:71](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L71) -- [coreApiVersions/fileVersions.feature:84](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiVersions/fileVersions.feature#L84) -- [coreApiWebdavDelete/deleteFile.feature:124](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L124) -- [coreApiWebdavDelete/deleteFile.feature:125](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L125) -- [coreApiWebdavDelete/deleteFile.feature:57](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L57) -- [coreApiWebdavDelete/deleteFile.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L62) -- [coreApiWebdavDelete/deleteFile.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L63) -- [coreApiWebdavDelete/deleteFile.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L64) -- [coreApiWebdavDelete/deleteFile.feature:65](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L65) -- [coreApiWebdavDelete/deleteFile.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L66) -- [coreApiWebdavDelete/deleteFile.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L67) -- [coreApiWebdavDelete/deleteFile.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L68) -- [coreApiWebdavDelete/deleteFile.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFile.feature#L69) -- [coreApiWebdavDelete/deleteFolderContents.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFolderContents.feature#L32) -- [coreApiWebdavDelete/deleteFolderContents.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFolderContents.feature#L33) -- [coreApiWebdavDelete/deleteFolder.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFolder.feature#L37) -- [coreApiWebdavDelete/deleteFolder.feature:76](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFolder.feature#L76) -- [coreApiWebdavDelete/deleteFolder.feature:83](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavDelete/deleteFolder.feature#L83) -- [coreApiWebdavMove1/moveFolder.feature:114](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L114) -- [coreApiWebdavMove1/moveFolder.feature:115](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L115) -- [coreApiWebdavMove1/moveFolder.feature:116](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L116) -- [coreApiWebdavMove1/moveFolder.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L117) -- [coreApiWebdavMove1/moveFolder.feature:118](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L118) -- [coreApiWebdavMove1/moveFolder.feature:119](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L119) -- [coreApiWebdavMove1/moveFolder.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L120) -- [coreApiWebdavMove1/moveFolder.feature:121](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L121) -- [coreApiWebdavMove1/moveFolder.feature:122](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L122) -- [coreApiWebdavMove1/moveFolder.feature:21](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L21) -- [coreApiWebdavMove1/moveFolder.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L38) -- [coreApiWebdavMove1/moveFolder.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L39) -- [coreApiWebdavMove1/moveFolder.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L56) -- [coreApiWebdavMove1/moveFolder.feature:57](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L57) -- [coreApiWebdavMove1/moveFolder.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L77) -- [coreApiWebdavMove1/moveFolder.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L78) -- [coreApiWebdavMove1/moveFolder.feature:95](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L95) -- [coreApiWebdavMove1/moveFolder.feature:96](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove1/moveFolder.feature#L96) -- [coreApiWebdavMove2/moveFile.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L100) -- [coreApiWebdavMove2/moveFile.feature:152](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L152) -- [coreApiWebdavMove2/moveFile.feature:153](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L153) -- [coreApiWebdavMove2/moveFile.feature:204](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L204) -- [coreApiWebdavMove2/moveFile.feature:222](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L222) -- [coreApiWebdavMove2/moveFile.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L23) -- [coreApiWebdavMove2/moveFile.feature:240](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L240) -- [coreApiWebdavMove2/moveFile.feature:245](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L245) -- [coreApiWebdavMove2/moveFile.feature:246](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L246) -- [coreApiWebdavMove2/moveFile.feature:247](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L247) -- [coreApiWebdavMove2/moveFile.feature:248](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L248) -- [coreApiWebdavMove2/moveFile.feature:249](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L249) -- [coreApiWebdavMove2/moveFile.feature:250](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L250) -- [coreApiWebdavMove2/moveFile.feature:271](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L271) -- [coreApiWebdavMove2/moveFile.feature:272](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L272) -- [coreApiWebdavMove2/moveFile.feature:318](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L318) -- [coreApiWebdavMove2/moveFile.feature:319](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L319) -- [coreApiWebdavMove2/moveFile.feature:349](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L349) -- [coreApiWebdavMove2/moveFile.feature:370](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L370) -- [coreApiWebdavMove2/moveFile.feature:371](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L371) -- [coreApiWebdavMove2/moveFile.feature:372](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L372) -- [coreApiWebdavMove2/moveFile.feature:374](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L374) -- [coreApiWebdavMove2/moveFile.feature:375](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L375) -- [coreApiWebdavMove2/moveFile.feature:376](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L376) -- [coreApiWebdavMove2/moveFile.feature:377](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L377) -- [coreApiWebdavMove2/moveFile.feature:378](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L378) -- [coreApiWebdavMove2/moveFile.feature:379](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L379) -- [coreApiWebdavMove2/moveFile.feature:380](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L380) -- [coreApiWebdavMove2/moveFile.feature:381](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L381) -- [coreApiWebdavMove2/moveFile.feature:382](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L382) -- [coreApiWebdavMove2/moveFile.feature:383](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L383) -- [coreApiWebdavMove2/moveFile.feature:384](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L384) -- [coreApiWebdavMove2/moveFile.feature:410](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L410) -- [coreApiWebdavMove2/moveFile.feature:411](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L411) -- [coreApiWebdavMove2/moveFile.feature:412](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L412) -- [coreApiWebdavMove2/moveFile.feature:413](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L413) -- [coreApiWebdavMove2/moveFile.feature:414](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L414) -- [coreApiWebdavMove2/moveFile.feature:415](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L415) -- [coreApiWebdavMove2/moveFile.feature:416](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L416) -- [coreApiWebdavMove2/moveFile.feature:417](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L417) -- [coreApiWebdavMove2/moveFile.feature:418](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L418) -- [coreApiWebdavMove2/moveFile.feature:419](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L419) -- [coreApiWebdavMove2/moveFile.feature:420](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L420) -- [coreApiWebdavMove2/moveFile.feature:421](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L421) -- [coreApiWebdavMove2/moveFile.feature:445](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L445) -- [coreApiWebdavMove2/moveFile.feature:463](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L463) -- [coreApiWebdavMove2/moveFile.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L61) -- [coreApiWebdavMove2/moveFile.feature:79](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L79) -- [coreApiWebdavMove2/moveFile.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L80) -- [coreApiWebdavMove2/moveFile.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveFile.feature#L99) -- [coreApiWebdavMove2/moveShareOnOcis.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L100) -- [coreApiWebdavMove2/moveShareOnOcis.feature:124](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L124) -- [coreApiWebdavMove2/moveShareOnOcis.feature:125](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L125) -- [coreApiWebdavMove2/moveShareOnOcis.feature:190](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L190) -- [coreApiWebdavMove2/moveShareOnOcis.feature:191](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L191) -- [coreApiWebdavMove2/moveShareOnOcis.feature:220](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L220) -- [coreApiWebdavMove2/moveShareOnOcis.feature:221](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L221) -- [coreApiWebdavMove2/moveShareOnOcis.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L30) -- [coreApiWebdavMove2/moveShareOnOcis.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L32) -- [coreApiWebdavMove2/moveShareOnOcis.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L53) -- [coreApiWebdavMove2/moveShareOnOcis.feature:54](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L54) -- [coreApiWebdavMove2/moveShareOnOcis.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavMove2/moveShareOnOcis.feature#L98) -- [coreApiWebdavOperations/downloadFile.feature:257](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/downloadFile.feature#L257) -- [coreApiWebdavOperations/downloadFile.feature:258](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/downloadFile.feature#L258) -- [coreApiWebdavOperations/listFiles.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L120) -- [coreApiWebdavOperations/listFiles.feature:121](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L121) -- [coreApiWebdavOperations/listFiles.feature:148](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L148) -- [coreApiWebdavOperations/listFiles.feature:149](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L149) -- [coreApiWebdavOperations/listFiles.feature:173](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L173) -- [coreApiWebdavOperations/listFiles.feature:174](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L174) -- [coreApiWebdavOperations/listFiles.feature:182](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L182) -- [coreApiWebdavOperations/listFiles.feature:205](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L205) -- [coreApiWebdavOperations/listFiles.feature:230](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L230) -- [coreApiWebdavOperations/listFiles.feature:275](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L275) -- [coreApiWebdavOperations/listFiles.feature:276](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L276) -- [coreApiWebdavOperations/listFiles.feature:308](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L308) -- [coreApiWebdavOperations/listFiles.feature:309](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L309) -- [coreApiWebdavOperations/listFiles.feature:339](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L339) -- [coreApiWebdavOperations/listFiles.feature:340](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L340) -- [coreApiWebdavOperations/listFiles.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L42) -- [coreApiWebdavOperations/listFiles.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L67) -- [coreApiWebdavOperations/listFiles.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L68) -- [coreApiWebdavOperations/listFiles.feature:96](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L96) -- [coreApiWebdavOperations/listFiles.feature:97](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/listFiles.feature#L97) -- [coreApiWebdavOperations/propfind.feature:39](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L39) -- [coreApiWebdavOperations/propfind.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavOperations/propfind.feature#L51) -- [coreApiWebdavProperties1/copyFile.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L100) -- [coreApiWebdavProperties1/copyFile.feature:101](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L101) -- [coreApiWebdavProperties1/copyFile.feature:136](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L136) -- [coreApiWebdavProperties1/copyFile.feature:137](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L137) -- [coreApiWebdavProperties1/copyFile.feature:154](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L154) -- [coreApiWebdavProperties1/copyFile.feature:155](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L155) -- [coreApiWebdavProperties1/copyFile.feature:176](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L176) -- [coreApiWebdavProperties1/copyFile.feature:177](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L177) -- [coreApiWebdavProperties1/copyFile.feature:200](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L200) -- [coreApiWebdavProperties1/copyFile.feature:201](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L201) -- [coreApiWebdavProperties1/copyFile.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L22) -- [coreApiWebdavProperties1/copyFile.feature:223](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L223) -- [coreApiWebdavProperties1/copyFile.feature:224](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L224) -- [coreApiWebdavProperties1/copyFile.feature:247](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L247) -- [coreApiWebdavProperties1/copyFile.feature:248](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L248) -- [coreApiWebdavProperties1/copyFile.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L37) -- [coreApiWebdavProperties1/copyFile.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L38) -- [coreApiWebdavProperties1/copyFile.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L55) -- [coreApiWebdavProperties1/copyFile.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L56) -- [coreApiWebdavProperties1/copyFile.feature:560](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L560) -- [coreApiWebdavProperties1/copyFile.feature:561](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L561) -- [coreApiWebdavProperties1/copyFile.feature:577](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L577) -- [coreApiWebdavProperties1/copyFile.feature:578](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L578) -- [coreApiWebdavProperties1/copyFile.feature:593](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L593) -- [coreApiWebdavProperties1/copyFile.feature:594](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L594) -- [coreApiWebdavProperties1/copyFile.feature:611](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L611) -- [coreApiWebdavProperties1/copyFile.feature:612](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L612) -- [coreApiWebdavProperties1/copyFile.feature:636](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L636) -- [coreApiWebdavProperties1/copyFile.feature:637](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L637) -- [coreApiWebdavProperties1/copyFile.feature:657](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L657) -- [coreApiWebdavProperties1/copyFile.feature:658](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L658) -- [coreApiWebdavProperties1/copyFile.feature:679](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L679) -- [coreApiWebdavProperties1/copyFile.feature:680](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L680) -- [coreApiWebdavProperties1/copyFile.feature:701](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L701) -- [coreApiWebdavProperties1/copyFile.feature:702](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L702) -- [coreApiWebdavProperties1/copyFile.feature:723](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L723) -- [coreApiWebdavProperties1/copyFile.feature:724](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L724) -- [coreApiWebdavProperties1/copyFile.feature:759](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L759) -- [coreApiWebdavProperties1/copyFile.feature:760](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L760) -- [coreApiWebdavProperties1/copyFile.feature:79](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L79) -- [coreApiWebdavProperties1/copyFile.feature:791](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L791) -- [coreApiWebdavProperties1/copyFile.feature:792](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L792) -- [coreApiWebdavProperties1/copyFile.feature:80](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L80) -- [coreApiWebdavProperties1/copyFile.feature:820](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L820) -- [coreApiWebdavProperties1/copyFile.feature:821](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L821) -- [coreApiWebdavProperties1/copyFile.feature:836](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L836) -- [coreApiWebdavProperties1/copyFile.feature:837](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L837) -- [coreApiWebdavProperties1/copyFile.feature:874](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L874) -- [coreApiWebdavProperties1/copyFile.feature:875](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/copyFile.feature#L875) -- [coreApiWebdavProperties1/create](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/create) -- [coreApiWebdavProperties1/createFileFolder.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L117) -- [coreApiWebdavProperties1/createFileFolder.feature:155](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L155) -- [coreApiWebdavProperties1/createFileFolder.feature:160](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L160) -- [coreApiWebdavProperties1/createFileFolder.feature:161](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L161) -- [coreApiWebdavProperties1/createFileFolder.feature:162](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L162) -- [coreApiWebdavProperties1/createFileFolder.feature:163](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L163) -- [coreApiWebdavProperties1/createFileFolder.feature:164](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L164) -- [coreApiWebdavProperties1/createFileFolder.feature:165](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L165) -- [coreApiWebdavProperties1/createFileFolder.feature:166](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L166) -- [coreApiWebdavProperties1/createFileFolder.feature:167](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L167) -- [coreApiWebdavProperties1/createFileFolder.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L26) -- [coreApiWebdavProperties1/createFileFolder.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L27) -- [coreApiWebdavProperties1/createFileFolder.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L28) -- [coreApiWebdavProperties1/createFileFolder.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L29) -- [coreApiWebdavProperties1/createFileFolder.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L30) -- [coreApiWebdavProperties1/createFileFolder.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L31) -- [coreApiWebdavProperties1/createFileFolder.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L32) -- [coreApiWebdavProperties1/createFileFolder.feature:33](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L33) -- [coreApiWebdavProperties1/createFileFolder.feature:59](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L59) -- [coreApiWebdavProperties1/createFileFolder.feature:78](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolder.feature#L78) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L24) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L25) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L27) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L28) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:40](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L40) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:41](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L41) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:43](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L43) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:44](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L44) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L56) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:57](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L57) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L68) -- [coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/createFileFolderWhenSharesExist.feature#L69) -- [coreApiWebdavProperties1/setFileProperties.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties1/setFileProperties.feature#L55) -- [coreApiWebdavProperties2/getFileProperties.feature:112](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L112) -- [coreApiWebdavProperties2/getFileProperties.feature:113](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L113) -- [coreApiWebdavProperties2/getFileProperties.feature:114](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L114) -- [coreApiWebdavProperties2/getFileProperties.feature:115](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L115) -- [coreApiWebdavProperties2/getFileProperties.feature:116](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L116) -- [coreApiWebdavProperties2/getFileProperties.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L117) -- [coreApiWebdavProperties2/getFileProperties.feature:119](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L119) -- [coreApiWebdavProperties2/getFileProperties.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L120) -- [coreApiWebdavProperties2/getFileProperties.feature:121](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L121) -- [coreApiWebdavProperties2/getFileProperties.feature:143](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L143) -- [coreApiWebdavProperties2/getFileProperties.feature:144](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L144) -- [coreApiWebdavProperties2/getFileProperties.feature:163](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L163) -- [coreApiWebdavProperties2/getFileProperties.feature:188](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L188) -- [coreApiWebdavProperties2/getFileProperties.feature:189](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L189) -- [coreApiWebdavProperties2/getFileProperties.feature:19](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L19) -- [coreApiWebdavProperties2/getFileProperties.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L23) -- [coreApiWebdavProperties2/getFileProperties.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L24) -- [coreApiWebdavProperties2/getFileProperties.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L25) -- [coreApiWebdavProperties2/getFileProperties.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L26) -- [coreApiWebdavProperties2/getFileProperties.feature:395](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L395) -- [coreApiWebdavProperties2/getFileProperties.feature:396](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L396) -- [coreApiWebdavProperties2/getFileProperties.feature:414](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L414) -- [coreApiWebdavProperties2/getFileProperties.feature:415](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L415) -- [coreApiWebdavProperties2/getFileProperties.feature:434](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L434) -- [coreApiWebdavProperties2/getFileProperties.feature:452](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L452) -- [coreApiWebdavProperties2/getFileProperties.feature:453](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L453) -- [coreApiWebdavProperties2/getFileProperties.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L46) -- [coreApiWebdavProperties2/getFileProperties.feature:47](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L47) -- [coreApiWebdavProperties2/getFileProperties.feature:471](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L471) -- [coreApiWebdavProperties2/getFileProperties.feature:472](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L472) -- [coreApiWebdavProperties2/getFileProperties.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L48) -- [coreApiWebdavProperties2/getFileProperties.feature:490](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L490) -- [coreApiWebdavProperties2/getFileProperties.feature:491](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L491) -- [coreApiWebdavProperties2/getFileProperties.feature:50](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L50) -- [coreApiWebdavProperties2/getFileProperties.feature:509](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L509) -- [coreApiWebdavProperties2/getFileProperties.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L51) -- [coreApiWebdavProperties2/getFileProperties.feature:510](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L510) -- [coreApiWebdavProperties2/getFileProperties.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L52) -- [coreApiWebdavProperties2/getFileProperties.feature:528](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L528) -- [coreApiWebdavProperties2/getFileProperties.feature:529](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L529) -- [coreApiWebdavProperties2/getFileProperties.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L53) -- [coreApiWebdavProperties2/getFileProperties.feature:547](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L547) -- [coreApiWebdavProperties2/getFileProperties.feature:548](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L548) -- [coreApiWebdavProperties2/getFileProperties.feature:566](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L566) -- [coreApiWebdavProperties2/getFileProperties.feature:567](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L567) -- [coreApiWebdavProperties2/getFileProperties.feature:585](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L585) -- [coreApiWebdavProperties2/getFileProperties.feature:586](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L586) -- [coreApiWebdavProperties2/getFileProperties.feature:604](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L604) -- [coreApiWebdavProperties2/getFileProperties.feature:605](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L605) -- [coreApiWebdavProperties2/getFileProperties.feature:623](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L623) -- [coreApiWebdavProperties2/getFileProperties.feature:624](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L624) -- [coreApiWebdavProperties2/getFileProperties.feature:647](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L647) -- [coreApiWebdavProperties2/getFileProperties.feature:648](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L648) -- [coreApiWebdavProperties2/getFileProperties.feature:76](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L76) -- [coreApiWebdavProperties2/getFileProperties.feature:77](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L77) -- [coreApiWebdavProperties2/getFileProperties.feature:79](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L79) -- [coreApiWebdavProperties2/getFileProperties.feature:81](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L81) -- [coreApiWebdavProperties2/getFileProperties.feature:83](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L83) -- [coreApiWebdavProperties2/getFileProperties.feature:84](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L84) -- [coreApiWebdavProperties2/getFileProperties.feature:85](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L85) -- [coreApiWebdavProperties2/getFileProperties.feature:86](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L86) -- [coreApiWebdavProperties2/getFileProperties.feature:87](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L87) -- [coreApiWebdavProperties2/getFileProperties.feature:88](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L88) -- [coreApiWebdavProperties2/getFileProperties.feature:89](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavProperties2/getFileProperties.feature#L89) -- [coreApiWebdavUpload1/uploadFile.feature:110](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L110) -- [coreApiWebdavUpload1/uploadFile.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L111) -- [coreApiWebdavUpload1/uploadFile.feature:112](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L112) -- [coreApiWebdavUpload1/uploadFile.feature:113](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L113) -- [coreApiWebdavUpload1/uploadFile.feature:114](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L114) -- [coreApiWebdavUpload1/uploadFile.feature:115](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L115) -- [coreApiWebdavUpload1/uploadFile.feature:116](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L116) -- [coreApiWebdavUpload1/uploadFile.feature:117](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L117) -- [coreApiWebdavUpload1/uploadFile.feature:118](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L118) -- [coreApiWebdavUpload1/uploadFile.feature:119](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L119) -- [coreApiWebdavUpload1/uploadFile.feature:140](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L140) -- [coreApiWebdavUpload1/uploadFile.feature:141](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L141) -- [coreApiWebdavUpload1/uploadFile.feature:142](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L142) -- [coreApiWebdavUpload1/uploadFile.feature:143](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L143) -- [coreApiWebdavUpload1/uploadFile.feature:160](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L160) -- [coreApiWebdavUpload1/uploadFile.feature:161](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L161) -- [coreApiWebdavUpload1/uploadFile.feature:199](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L199) -- [coreApiWebdavUpload1/uploadFile.feature:20](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L20) -- [coreApiWebdavUpload1/uploadFile.feature:204](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L204) -- [coreApiWebdavUpload1/uploadFile.feature:205](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L205) -- [coreApiWebdavUpload1/uploadFile.feature:206](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L206) -- [coreApiWebdavUpload1/uploadFile.feature:207](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L207) -- [coreApiWebdavUpload1/uploadFile.feature:208](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L208) -- [coreApiWebdavUpload1/uploadFile.feature:21](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L21) -- [coreApiWebdavUpload1/uploadFile.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L22) -- [coreApiWebdavUpload1/uploadFile.feature:228](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L228) -- [coreApiWebdavUpload1/uploadFile.feature:229](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L229) -- [coreApiWebdavUpload1/uploadFile.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L23) -- [coreApiWebdavUpload1/uploadFile.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L24) -- [coreApiWebdavUpload1/uploadFile.feature:245](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L245) -- [coreApiWebdavUpload1/uploadFile.feature:246](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L246) -- [coreApiWebdavUpload1/uploadFile.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L25) -- [coreApiWebdavUpload1/uploadFile.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L26) -- [coreApiWebdavUpload1/uploadFile.feature:263](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L263) -- [coreApiWebdavUpload1/uploadFile.feature:264](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L264) -- [coreApiWebdavUpload1/uploadFile.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L27) -- [coreApiWebdavUpload1/uploadFile.feature:281](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L281) -- [coreApiWebdavUpload1/uploadFile.feature:282](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L282) -- [coreApiWebdavUpload1/uploadFile.feature:300](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L300) -- [coreApiWebdavUpload1/uploadFile.feature:301](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L301) -- [coreApiWebdavUpload1/uploadFile.feature:319](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L319) -- [coreApiWebdavUpload1/uploadFile.feature:320](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L320) -- [coreApiWebdavUpload1/uploadFile.feature:346](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L346) -- [coreApiWebdavUpload1/uploadFile.feature:347](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L347) -- [coreApiWebdavUpload1/uploadFile.feature:363](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L363) -- [coreApiWebdavUpload1/uploadFile.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L45) -- [coreApiWebdavUpload1/uploadFile.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L46) -- [coreApiWebdavUpload1/uploadFile.feature:47](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L47) -- [coreApiWebdavUpload1/uploadFile.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L48) -- [coreApiWebdavUpload1/uploadFile.feature:65](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L65) -- [coreApiWebdavUpload1/uploadFile.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L66) -- [coreApiWebdavUpload1/uploadFile.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L68) -- [coreApiWebdavUpload1/uploadFile.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L69) -- [coreApiWebdavUpload1/uploadFile.feature:70](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L70) -- [coreApiWebdavUpload1/uploadFile.feature:90](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L90) -- [coreApiWebdavUpload1/uploadFile.feature:91](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L91) -- [coreApiWebdavUpload1/uploadFile.feature:92](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload1/uploadFile.feature#L92) -- [coreApiWebdavUpload2/uploadFileUsingOldChunking.feature:114](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUpload2/uploadFileUsingOldChunking.feature#L114) -- [coreApiWebdavUploadTUS/checksums.feature:110](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L110) -- [coreApiWebdavUploadTUS/checksums.feature:111](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L111) -- [coreApiWebdavUploadTUS/checksums.feature:132](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L132) -- [coreApiWebdavUploadTUS/checksums.feature:133](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L133) -- [coreApiWebdavUploadTUS/checksums.feature:154](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L154) -- [coreApiWebdavUploadTUS/checksums.feature:155](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L155) -- [coreApiWebdavUploadTUS/checksums.feature:201](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L201) -- [coreApiWebdavUploadTUS/checksums.feature:202](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L202) -- [coreApiWebdavUploadTUS/checksums.feature:203](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L203) -- [coreApiWebdavUploadTUS/checksums.feature:204](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L204) -- [coreApiWebdavUploadTUS/checksums.feature:21](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L21) -- [coreApiWebdavUploadTUS/checksums.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L22) -- [coreApiWebdavUploadTUS/checksums.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L23) -- [coreApiWebdavUploadTUS/checksums.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L24) -- [coreApiWebdavUploadTUS/checksums.feature:257](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L257) -- [coreApiWebdavUploadTUS/checksums.feature:258](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L258) -- [coreApiWebdavUploadTUS/checksums.feature:259](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L259) -- [coreApiWebdavUploadTUS/checksums.feature:260](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L260) -- [coreApiWebdavUploadTUS/checksums.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L45) -- [coreApiWebdavUploadTUS/checksums.feature:46](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L46) -- [coreApiWebdavUploadTUS/checksums.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L66) -- [coreApiWebdavUploadTUS/checksums.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/checksums.feature#L67) -- [coreApiWebdavUploadTUS/creationWithUploadExtension.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/creationWithUploadExtension.feature#L27) -- [coreApiWebdavUploadTUS/creationWithUploadExtension.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/creationWithUploadExtension.feature#L28) -- [coreApiWebdavUploadTUS/creationWithUploadExtension.feature:42](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/creationWithUploadExtension.feature#L42) -- [coreApiWebdavUploadTUS/creationWithUploadExtension.feature:43](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/creationWithUploadExtension.feature#L43) -- [coreApiWebdavUploadTUS/lowLevelCreationExtension.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelCreationExtension.feature#L23) -- [coreApiWebdavUploadTUS/lowLevelCreationExtension.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelCreationExtension.feature#L24) -- [coreApiWebdavUploadTUS/lowLevelUpload.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelUpload.feature#L22) -- [coreApiWebdavUploadTUS/lowLevelUpload.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelUpload.feature#L23) -- [coreApiWebdavUploadTUS/lowLevelUpload.feature:44](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelUpload.feature#L44) -- [coreApiWebdavUploadTUS/lowLevelUpload.feature:45](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelUpload.feature#L45) -- [coreApiWebdavUploadTUS/lowLevelUpload.feature:66](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelUpload.feature#L66) -- [coreApiWebdavUploadTUS/lowLevelUpload.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelUpload.feature#L67) -- [coreApiWebdavUploadTUS/lowLevelUpload.feature:86](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelUpload.feature#L86) -- [coreApiWebdavUploadTUS/lowLevelUpload.feature:87](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/lowLevelUpload.feature#L87) -- [coreApiWebdavUploadTUS/uploadFile.feature:114](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L114) -- [coreApiWebdavUploadTUS/uploadFile.feature:115](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L115) -- [coreApiWebdavUploadTUS/uploadFile.feature:129](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L129) -- [coreApiWebdavUploadTUS/uploadFile.feature:130](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L130) -- [coreApiWebdavUploadTUS/uploadFile.feature:146](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L146) -- [coreApiWebdavUploadTUS/uploadFile.feature:147](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L147) -- [coreApiWebdavUploadTUS/uploadFile.feature:16](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L16) -- [coreApiWebdavUploadTUS/uploadFile.feature:161](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L161) -- [coreApiWebdavUploadTUS/uploadFile.feature:162](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L162) -- [coreApiWebdavUploadTUS/uploadFile.feature:17](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L17) -- [coreApiWebdavUploadTUS/uploadFile.feature:173](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L173) -- [coreApiWebdavUploadTUS/uploadFile.feature:174](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L174) -- [coreApiWebdavUploadTUS/uploadFile.feature:18](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L18) -- [coreApiWebdavUploadTUS/uploadFile.feature:19](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L19) -- [coreApiWebdavUploadTUS/uploadFile.feature:197](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L197) -- [coreApiWebdavUploadTUS/uploadFile.feature:20](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L20) -- [coreApiWebdavUploadTUS/uploadFile.feature:201](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L201) -- [coreApiWebdavUploadTUS/uploadFile.feature:21](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L21) -- [coreApiWebdavUploadTUS/uploadFile.feature:22](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L22) -- [coreApiWebdavUploadTUS/uploadFile.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L23) -- [coreApiWebdavUploadTUS/uploadFile.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L24) -- [coreApiWebdavUploadTUS/uploadFile.feature:25](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L25) -- [coreApiWebdavUploadTUS/uploadFile.feature:26](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L26) -- [coreApiWebdavUploadTUS/uploadFile.feature:27](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L27) -- [coreApiWebdavUploadTUS/uploadFile.feature:28](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L28) -- [coreApiWebdavUploadTUS/uploadFile.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L29) -- [coreApiWebdavUploadTUS/uploadFile.feature:50](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L50) -- [coreApiWebdavUploadTUS/uploadFile.feature:51](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L51) -- [coreApiWebdavUploadTUS/uploadFile.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L52) -- [coreApiWebdavUploadTUS/uploadFile.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L53) -- [coreApiWebdavUploadTUS/uploadFile.feature:54](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L54) -- [coreApiWebdavUploadTUS/uploadFile.feature:55](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L55) -- [coreApiWebdavUploadTUS/uploadFile.feature:56](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L56) -- [coreApiWebdavUploadTUS/uploadFile.feature:57](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L57) -- [coreApiWebdavUploadTUS/uploadFile.feature:58](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L58) -- [coreApiWebdavUploadTUS/uploadFile.feature:59](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L59) -- [coreApiWebdavUploadTUS/uploadFile.feature:60](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L60) -- [coreApiWebdavUploadTUS/uploadFile.feature:61](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L61) -- [coreApiWebdavUploadTUS/uploadFile.feature:62](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L62) -- [coreApiWebdavUploadTUS/uploadFile.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L63) -- [coreApiWebdavUploadTUS/uploadFile.feature:83](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L83) -- [coreApiWebdavUploadTUS/uploadFile.feature:84](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L84) -- [coreApiWebdavUploadTUS/uploadFile.feature:98](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L98) -- [coreApiWebdavUploadTUS/uploadFile.feature:99](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFile.feature#L99) -- [coreApiWebdavUploadTUS/uploadFileMtime.feature:16](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L16) -- [coreApiWebdavUploadTUS/uploadFileMtime.feature:17](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L17) -- [coreApiWebdavUploadTUS/uploadFileMtime.feature:31](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L31) -- [coreApiWebdavUploadTUS/uploadFileMtime.feature:32](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L32) -- [coreApiWebdavUploadTUS/uploadFileMtime.feature:47](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L47) -- [coreApiWebdavUploadTUS/uploadFileMtime.feature:48](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L48) -- [coreApiWebdavUploadTUS/uploadFileMtime.feature:63](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L63) -- [coreApiWebdavUploadTUS/uploadFileMtime.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtime.feature#L64) -- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L23) -- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L24) -- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L37) -- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L38) -- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:52](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L52) -- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L53) -- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:67](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L67) -- [coreApiWebdavUploadTUS/uploadFileMtimeShares.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadFileMtimeShares.feature#L68) -- [coreApiWebdavUploadTUS/uploadToMoveFolder.feature:20](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToMoveFolder.feature#L20) -- [coreApiWebdavUploadTUS/uploadToMoveFolder.feature:21](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToMoveFolder.feature#L21) -- [coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature:29](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature#L29) -- [coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature:30](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature#L30) -- [coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature:49](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature#L49) -- [coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature:50](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature#L50) -- [coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature:64](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature#L64) -- [coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature:65](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToNonExistingFolder.feature#L65) -- [coreApiWebdavUploadTUS/uploadToShare.feature:100](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L100) -- [coreApiWebdavUploadTUS/uploadToShare.feature:101](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L101) -- [coreApiWebdavUploadTUS/uploadToShare.feature:119](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L119) -- [coreApiWebdavUploadTUS/uploadToShare.feature:120](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L120) -- [coreApiWebdavUploadTUS/uploadToShare.feature:137](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L137) -- [coreApiWebdavUploadTUS/uploadToShare.feature:138](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L138) -- [coreApiWebdavUploadTUS/uploadToShare.feature:155](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L155) -- [coreApiWebdavUploadTUS/uploadToShare.feature:156](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L156) -- [coreApiWebdavUploadTUS/uploadToShare.feature:23](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L23) -- [coreApiWebdavUploadTUS/uploadToShare.feature:231](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L231) -- [coreApiWebdavUploadTUS/uploadToShare.feature:232](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L232) -- [coreApiWebdavUploadTUS/uploadToShare.feature:24](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L24) -- [coreApiWebdavUploadTUS/uploadToShare.feature:273](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L273) -- [coreApiWebdavUploadTUS/uploadToShare.feature:274](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L274) -- [coreApiWebdavUploadTUS/uploadToShare.feature:37](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L37) -- [coreApiWebdavUploadTUS/uploadToShare.feature:38](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L38) -- [coreApiWebdavUploadTUS/uploadToShare.feature:53](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L53) -- [coreApiWebdavUploadTUS/uploadToShare.feature:54](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L54) -- [coreApiWebdavUploadTUS/uploadToShare.feature:68](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L68) -- [coreApiWebdavUploadTUS/uploadToShare.feature:69](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L69) -- [coreApiWebdavUploadTUS/uploadToShare.feature:81](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L81) -- [coreApiWebdavUploadTUS/uploadToShare.feature:82](https://github.com/owncloud/ocis/blob/master/tests/acceptance/features/coreApiWebdavUploadTUS/uploadToShare.feature#L82) - -Note: always have an empty line at the end of this file. -The bash script that processes this file may not process a scenario reference on the last line. diff --git a/tests/acceptance/features/apiVirtualViews/virtualViews.feature b/tests/acceptance/features/apiVirtualViews/virtualViews.feature deleted file mode 100644 index 3baa7b0fb5..0000000000 --- a/tests/acceptance/features/apiVirtualViews/virtualViews.feature +++ /dev/null @@ -1,65 +0,0 @@ -@api @virtual-views-required -Feature: virtual views - As admin - I want to be able to shard large folders over multiple storage providers - So that I can scale large numbers of users better. - - Background: - Given user "einstein" deletes everything from folder "virtual/" using the WebDAV API - And user "einstein" has created the following folders - | path | - | virtual/a | - | virtual/a/alice | - | virtual/b | - | virtual/c | - | virtual/k | - | virtual/l | - | virtual/z | - - Scenario: list large folder - Given using old DAV path - When user "einstein" lists the resources in "/virtual" with depth "0" using the WebDAV API - Then the HTTP status code should be "207" - And the last DAV response for user "einstein" should not contain these nodes - | name | - | virtual/a | - | virtual/b | - | virtual/c | - | virtual/k | - | virtual/l | - | virtual/z | - When user "einstein" lists the resources in "/virtual" with depth 1 using the WebDAV API - Then the HTTP status code should be "207" - And the last DAV response for user "einstein" should contain these nodes - | name | - | virtual/a | - | virtual/b | - | virtual/c | - | virtual/k | - | virtual/l | - | virtual/z | - And the last DAV response for user "einstein" should not contain these nodes - | name | - | virtual/a/alice | - When user "einstein" lists the resources in "/virtual" with depth "infinity" using the WebDAV API - Then the HTTP status code should be "207" - And the last DAV response for user "einstein" should contain these nodes - | name | - | virtual/a | - | virtual/a/alice | - | virtual/b | - | virtual/c | - | virtual/k | - | virtual/l | - | virtual/z | - - Scenario: etag changes when adding a folder - Given user "einstein" has stored etag of element "/" - And user "einstein" has stored etag of element "/virtual" - And user "einstein" has stored etag of element "/virtual/b" - When user "einstein" creates folder "/virtual/b/bar" using the WebDAV API - Then these etags should have changed: - | user | path | - | einstein | / | - | einstein | /virtual | - | einstein | /virtual/b | \ No newline at end of file diff --git a/tests/acceptance/features/bootstrap/RevaContext.php b/tests/acceptance/features/bootstrap/RevaContext.php deleted file mode 100644 index 1da62bb46b..0000000000 --- a/tests/acceptance/features/bootstrap/RevaContext.php +++ /dev/null @@ -1,40 +0,0 @@ -getEnvironment(); - // Get all the contexts you need in this context - $this->featureContext = $environment->getContext('FeatureContext'); - SetupHelper::init( - $this->featureContext->getAdminUsername(), - $this->featureContext->getAdminPassword(), - $this->featureContext->getBaseUrl(), - $this->featureContext->getOcPath() - ); - } -} diff --git a/tests/acceptance/features/bootstrap/bootstrap.php b/tests/acceptance/features/bootstrap/bootstrap.php deleted file mode 100644 index 23204c3688..0000000000 --- a/tests/acceptance/features/bootstrap/bootstrap.php +++ /dev/null @@ -1,14 +0,0 @@ -addPsr4( - "", $pathToApiTests . "/tests/acceptance/features/bootstrap", true -); - -$classLoader->register(); diff --git a/tests/acceptance/filtered-suites-acceptance-2-EOS b/tests/acceptance/filtered-suites-acceptance-2-EOS deleted file mode 100644 index 1a333a03ef..0000000000 --- a/tests/acceptance/filtered-suites-acceptance-2-EOS +++ /dev/null @@ -1,2 +0,0 @@ -coreApiWebdavEtagPropagation1 -coreApiWebdavEtagPropagation2 diff --git a/tests/acceptance/lint-expected-failures.sh b/tests/acceptance/lint-expected-failures.sh deleted file mode 100755 index c17be50595..0000000000 --- a/tests/acceptance/lint-expected-failures.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env bash - -log_error() { - if [ -n "${PLAIN_OUTPUT}" ] - then - echo -e "$1" - else - echo -e "\e[31m$1\e[0m" - fi -} - -log_info() { - if [ -n "${PLAIN_OUTPUT}" ] - then - echo -e "$1" - else - echo -e "\e[34m$1\e[0m" - fi -} - -log_success() { - if [ -n "${PLAIN_OUTPUT}" ] - then - echo -e "$1" - else - echo -e "\e[32m$1\e[0m" - fi -} - -declare -A scenarioLines - -if [ -n "${EXPECTED_FAILURES_FILE}" ] -then - if [ -f "${EXPECTED_FAILURES_FILE}" ] - then - log_info "Checking expected failures in ${EXPECTED_FAILURES_FILE}" - else - log_error "Expected failures file ${EXPECTED_FAILURES_FILE} not found" - log_error "Check the setting of EXPECTED_FAILURES_FILE environment variable" - exit 1 - fi - FINAL_EXIT_STATUS=0 - # If the last line of the expected-failures file ends without a newline character - # then that line may not get processed by some of the bash code in this script - # So check that the last character in the file is a newline - if [ "$(tail -c1 "${EXPECTED_FAILURES_FILE}" | wc -l)" -eq 0 ] - then - log_error "Expected failures file ${EXPECTED_FAILURES_FILE} must end with a newline" - log_error "Put a newline at the end of the last line and try again" - FINAL_EXIT_STATUS=1 - fi - # Check the expected-failures file to ensure that the lines are self-consistent - # In most cases the features that are being run are in owncloud/core, - # so assume that by default. - FEATURE_FILE_REPO="owncloud/core" - FEATURE_FILE_PATH="tests/acceptance/features" - LINE_NUMBER=0 - while read -r INPUT_LINE - do - LINE_NUMBER=$(("$LINE_NUMBER" + 1)) - - # Ignore comment lines (starting with hash) - if [[ "${INPUT_LINE}" =~ ^# ]] - then - continue - fi - # A line of text in the feature file can be used to indicate that the - # features being run are actually from some other repo. For example: - # "The expected failures in this file are from features in the owncloud/ocis repo." - # Write a line near the top of the expected-failures file to "declare" this, - # overriding the default "owncloud/core" - FEATURE_FILE_SPEC_LINE_FOUND="false" - if [[ "${INPUT_LINE}" =~ features[[:blank:]]in[[:blank:]]the[[:blank:]]([a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+)[[:blank:]]repo ]]; then - FEATURE_FILE_REPO="${BASH_REMATCH[1]}" - log_info "Features are expected to be in the ${FEATURE_FILE_REPO} repo\n" - FEATURE_FILE_SPEC_LINE_FOUND="true" - fi - if [[ "${INPUT_LINE}" =~ repo[[:blank:]]in[[:blank:]]the[[:blank:]]([a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+)[[:blank:]]folder[[:blank:]]tree ]]; then - FEATURE_FILE_PATH="${BASH_REMATCH[1]}" - log_info "Features are expected to be in the ${FEATURE_FILE_PATH} folder tree\n" - FEATURE_FILE_SPEC_LINE_FOUND="true" - fi - if [[ $FEATURE_FILE_SPEC_LINE_FOUND == "true" ]]; then - continue - fi - # Match lines that have "- [someSuite/someName.feature:n]" pattern on start - # the part inside the brackets is the suite, feature and line number of the expected failure. - if [[ "${INPUT_LINE}" =~ ^-[[:space:]]\[([a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+\.feature:[0-9]+)] ]]; then - SUITE_SCENARIO_LINE="${BASH_REMATCH[1]}" - elif [[ - # report for lines like: " - someSuite/someName.feature:n" - "${INPUT_LINE}" =~ ^[[:space:]]*-[[:space:]][a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+\.feature:[0-9]+[[:space:]]*$ || - # report for lines starting with: "[someSuite/someName.feature:n]" - "${INPUT_LINE}" =~ ^[[:space:]]*\[([a-zA-Z0-9_-]+/[a-zA-Z0-9_-]+\.feature:[0-9]+)] - ]]; then - log_error "> Line ${LINE_NUMBER}: Not in the correct format." - log_error " + Actual Line : '${INPUT_LINE}'" - log_error " - Expected Format : '- [suite/scenario.feature:line_number](scenario_line_url)'" - FINAL_EXIT_STATUS=1 - continue - else - # otherwise, ignore the line - continue - fi - # Find the link in round-brackets that should be after the SUITE_SCENARIO_LINE - if [[ "${INPUT_LINE}" =~ \(([a-zA-Z0-9:/.#_-]+)\) ]]; then - ACTUAL_LINK="${BASH_REMATCH[1]}" - else - log_error "Line ${LINE_NUMBER}: ${INPUT_LINE} : Link is empty" - FINAL_EXIT_STATUS=1 - continue - fi - if [[ -n "${scenarioLines[${SUITE_SCENARIO_LINE}]:-}" ]]; - then - log_error "> Line ${LINE_NUMBER}: Scenario line ${SUITE_SCENARIO_LINE} is duplicated" - FINAL_EXIT_STATUS=1 - fi - scenarioLines[${SUITE_SCENARIO_LINE}]="exists" - OLD_IFS=${IFS} - IFS=':' - read -ra FEATURE_PARTS <<< "${SUITE_SCENARIO_LINE}" - IFS=${OLD_IFS} - SUITE_FEATURE="${FEATURE_PARTS[0]}" - FEATURE_LINE="${FEATURE_PARTS[1]}" - EXPECTED_LINK="https://github.com/${FEATURE_FILE_REPO}/blob/master/${FEATURE_FILE_PATH}/${SUITE_FEATURE}#L${FEATURE_LINE}" - if [[ "${ACTUAL_LINK}" != "${EXPECTED_LINK}" ]]; then - log_error "> Line ${LINE_NUMBER}: Link is not correct for ${SUITE_SCENARIO_LINE}" - log_error " + Actual link : ${ACTUAL_LINK}" - log_error " - Expected link : ${EXPECTED_LINK}" - FINAL_EXIT_STATUS=1 - fi - - done < "${EXPECTED_FAILURES_FILE}" -else - log_error "Environment variable EXPECTED_FAILURES_FILE must be defined to be the file to check" - exit 1 -fi - -if [ ${FINAL_EXIT_STATUS} == 1 ] -then - log_error "\nErrors were found in the expected failures file - see the messages above!" -else - log_success "\nNo problems were found in the expected failures file." -fi -exit ${FINAL_EXIT_STATUS} diff --git a/tests/acceptance/run.sh b/tests/acceptance/run.sh deleted file mode 100755 index 3435e89e5e..0000000000 --- a/tests/acceptance/run.sh +++ /dev/null @@ -1,712 +0,0 @@ -#!/bin/bash -[[ "${DEBUG}" == "true" ]] && set -x - -# from http://stackoverflow.com/a/630387 -SCRIPT_PATH="`dirname \"$0\"`" # relative -SCRIPT_PATH="`( cd \"${SCRIPT_PATH}\" && pwd )`" # absolutized and normalized - -echo 'Script path: '${SCRIPT_PATH} - -# Allow optionally passing in the path to the behat program. -# This gives flexibility for callers that have installed their own behat -if [ -z "${BEHAT_BIN}" ] -then - BEHAT=${SCRIPT_PATH}/../../vendor-bin/behat/vendor/bin/behat -else - BEHAT=${BEHAT_BIN} -fi -BEHAT_TAGS_OPTION_FOUND=false - -if [ -n "${STEP_THROUGH}" ] -then - STEP_THROUGH_OPTION="--step-through" -fi - -if [ -n "${STOP_ON_FAILURE}" ] -then - STOP_OPTION="--stop-on-failure" -fi - -if [ -n "${PLAIN_OUTPUT}" ] -then - # explicitly tell Behat to not do colored output - COLORS_OPTION="--no-colors" - # Use the Bash "null" command to do nothing, rather than use tput to set a color - RED_COLOR=":" - GREEN_COLOR=":" - YELLOW_COLOR=":" -else - COLORS_OPTION="--colors" - RED_COLOR="tput setaf 1" - GREEN_COLOR="tput setaf 2" - YELLOW_COLOR="tput setaf 3" -fi - -# The following environment variables can be specified: -# -# ACCEPTANCE_TEST_TYPE - see "--type" description -# BEHAT_FEATURE - see "--feature" description -# BEHAT_FILTER_TAGS - see "--tags" description -# BEHAT_SUITE - see "--suite" description -# BEHAT_YML - see "--config" description -# RUN_PART and DIVIDE_INTO_NUM_PARTS - see "--part" description -# SHOW_OC_LOGS - see "--show-oc-logs" description -# TESTING_REMOTE_SYSTEM - see "--remote" description -# EXPECTED_FAILURES_FILE - a file that contains a list of the scenarios that are expected to fail - -if [ -n "${EXPECTED_FAILURES_FILE}" ] -then - # Check the expected-failures file - ${SCRIPT_PATH}/lint-expected-failures.sh - LINT_STATUS=$? - if [ ${LINT_STATUS} -ne 0 ] - then - echo "Error: expected failures file ${EXPECTED_FAILURES_FILE} is invalid" - exit ${LINT_STATUS} - fi -fi - -# Default to API tests -# Note: if a specific feature or suite is also specified, then the acceptance -# test type is deduced from the suite name, and this environment variable -# ACCEPTANCE_TEST_TYPE is overridden. -if [ -z "${ACCEPTANCE_TEST_TYPE}" ] -then - ACCEPTANCE_TEST_TYPE="api" -fi - -# Look for command line options for: -# -c or --config - specify a behat.yml to use -# --feature - specify a single feature to run -# --suite - specify a single suite to run -# --type - api or core-api - if no individual feature or suite is specified, then -# specify the type of acceptance tests to run. Default api. -# --tags - specify tags for scenarios to run (or not) -# --remote - the server under test is remote, so we cannot locally enable the -# testing app. We have to assume it is already enabled. -# --show-oc-logs - tail the ownCloud log after the test run -# --loop - loop tests for given number of times. Only use it for debugging purposes -# --part - run a subset of scenarios, need two numbers. -# first number: which part to run -# second number: in how many parts to divide the set of scenarios -# --step-through - pause after each test step - -# Command line options processed here will override environment variables that -# might have been set by the caller, or in the code above. -while [[ $# -gt 0 ]] -do - key="$1" - case ${key} in - -c|--config) - BEHAT_YML="$2" - shift - ;; - --feature) - BEHAT_FEATURE="$2" - shift - ;; - --suite) - BEHAT_SUITE="$2" - shift - ;; - --loop) - BEHAT_RERUN_TIMES="$2" - shift - ;; - --type) - # Lowercase the parameter value, so the user can provide "API", "CORE-API", etc - ACCEPTANCE_TEST_TYPE="${2,,}" - shift - ;; - --tags) - BEHAT_FILTER_TAGS="$2" - BEHAT_TAGS_OPTION_FOUND=true - shift - ;; - --part) - RUN_PART="$2" - DIVIDE_INTO_NUM_PARTS="$3" - if [ ${RUN_PART} -gt ${DIVIDE_INTO_NUM_PARTS} ] - then - echo "cannot run part ${RUN_PART} of ${DIVIDE_INTO_NUM_PARTS}" - exit 1 - fi - shift 2 - ;; - --step-through) - STEP_THROUGH_OPTION="--step-through" - ;; - *) - # A "random" parameter is presumed to be a feature file to run. - # Typically that will be specified at the end, or as the only - # parameter. - BEHAT_FEATURE="$1" - ;; - esac - shift -done - -# Set the language to "C" -# We want to have it all in english to be able to parse outputs -export LANG=C - -# Provide a default admin username and password. -# But let the caller pass them if they wish -if [ -z "${ADMIN_USERNAME}" ] -then - ADMIN_USERNAME="admin" -fi - -if [ -z "${ADMIN_PASSWORD}" ] -then - ADMIN_PASSWORD="admin" -fi - -export ADMIN_USERNAME -export ADMIN_PASSWORD - -if [ -z "${BEHAT_RERUN_TIMES}" ] -then - BEHAT_RERUN_TIMES=1 -fi - -# expected variables -# -------------------- -# $SUITE_FEATURE_TEXT - human readable which test to run -# $BEHAT_SUITE_OPTION - suite setting with "--suite" or empty if all suites have to be run -# $BEHAT_FEATURE - feature file, or empty -# $BEHAT_FILTER_TAGS - list of tags -# $BEHAT_TAGS_OPTION_FOUND -# $TEST_LOG_FILE -# $BEHAT - behat executable -# $BEHAT_YML -# -# set arrays -# --------------- -# $UNEXPECTED_FAILED_SCENARIOS array of scenarios that failed unexpectedly -# $UNEXPECTED_PASSED_SCENARIOS array of scenarios that passed unexpectedly (while running with expected-failures.txt) -# $STOP_ON_FAILURE - aborts the test run after the first failure - -declare -a UNEXPECTED_FAILED_SCENARIOS -declare -a UNEXPECTED_PASSED_SCENARIOS -declare -a UNEXPECTED_BEHAT_EXIT_STATUSES - -function run_behat_tests() { - echo "Running ${SUITE_FEATURE_TEXT} tests tagged ${BEHAT_FILTER_TAGS}" | tee ${TEST_LOG_FILE} - - if [ "${REPLACE_USERNAMES}" == "true" ] - then - echo "Usernames and attributes in tests are being replaced:" - cat ${SCRIPT_PATH}/usernames.json - fi - - echo "Using behat config '${BEHAT_YML}'" - ${BEHAT} ${COLORS_OPTION} ${STOP_OPTION} --strict ${STEP_THROUGH_OPTION} -c ${BEHAT_YML} -f pretty ${BEHAT_SUITE_OPTION} --tags ${BEHAT_FILTER_TAGS} ${BEHAT_FEATURE} -v 2>&1 | tee -a ${TEST_LOG_FILE} - - BEHAT_EXIT_STATUS=${PIPESTATUS[0]} - - # remove nullbytes from the test log - TEMP_CONTENT=$(tr < ${TEST_LOG_FILE} -d '\000') - OLD_IFS="${IFS}" - IFS="" - echo ${TEMP_CONTENT} > ${TEST_LOG_FILE} - IFS="${OLD_IFS}" - - # Find the count of scenarios that passed - SCENARIO_RESULTS_COLORED=`grep -Ea '^[0-9]+[[:space:]]scenario(|s)[[:space:]]\(' ${TEST_LOG_FILE}` - SCENARIO_RESULTS=$(echo "${SCENARIO_RESULTS_COLORED}" | sed "s/\x1b[^m]*m//g") - if [ ${BEHAT_EXIT_STATUS} -eq 0 ] - then - # They (SCENARIO_RESULTS) all passed, so just get the first number. - # The text looks like "1 scenario (1 passed)" or "123 scenarios (123 passed)" - [[ ${SCENARIO_RESULTS} =~ ([0-9]+) ]] - SCENARIOS_THAT_PASSED=$((SCENARIOS_THAT_PASSED + BASH_REMATCH[1])) - else - # "Something went wrong" with the Behat run (non-zero exit status). - # If there were "ordinary" test fails, then we process that later. Maybe they are all "expected failures". - # But if there were steps in a feature file that are undefined, we want to fail immediately. - # So exit the tests and do not lint expected failures when undefined steps exist. - if [[ ${SCENARIO_RESULTS} == *"undefined"* ]] - then - ${RED_COLOR}; echo -e "Undefined steps: There were some undefined steps found." - exit 1 - fi - # If there were no scenarios in the requested suite or feature that match - # the requested combination of tags, then Behat exits with an error status - # and reports "No scenarios" in its output. - # This can happen, for example, when running core suites from an app and - # requesting some tag combination that does not happen frequently. Then - # sometimes there may not be any matching scenarios in one of the suites. - # In this case, consider the test has passed. - MATCHING_COUNT=`grep -ca '^No scenarios$' ${TEST_LOG_FILE}` - if [ ${MATCHING_COUNT} -eq 1 ] - then - echo "Information: no matching scenarios were found." - BEHAT_EXIT_STATUS=0 - else - # Find the count of scenarios that passed and failed - SCENARIO_RESULTS_COLORED=`grep -Ea '^[0-9]+[[:space:]]scenario(|s)[[:space:]]\(' ${TEST_LOG_FILE}` - SCENARIO_RESULTS=$(echo "${SCENARIO_RESULTS_COLORED}" | sed "s/\x1b[^m]*m//g") - if [[ ${SCENARIO_RESULTS} =~ [0-9]+[^0-9]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+ ]] - then - # Some passed and some failed, we got the second and third numbers. - # The text looked like "15 scenarios (6 passed, 9 failed)" - SCENARIOS_THAT_PASSED=$((SCENARIOS_THAT_PASSED + BASH_REMATCH[1])) - SCENARIOS_THAT_FAILED=$((SCENARIOS_THAT_FAILED + BASH_REMATCH[2])) - elif [[ ${SCENARIO_RESULTS} =~ [0-9]+[^0-9]+([0-9]+)[^0-9]+ ]] - then - # All failed, we got the second number. - # The text looked like "4 scenarios (4 failed)" - SCENARIOS_THAT_FAILED=$((SCENARIOS_THAT_FAILED + BASH_REMATCH[1])) - fi - fi - fi - - FAILED_SCENARIO_PATHS_COLORED=`awk '/Failed scenarios:/',0 ${TEST_LOG_FILE} | grep -a feature` - # There will be some ANSI escape codes for color in the FEATURE_COLORED var. - # Strip them out so we can pass just the ordinary feature details to Behat. - # Thanks to https://en.wikipedia.org/wiki/Tee_(command) and - # https://stackoverflow.com/questions/23416278/how-to-strip-ansi-escape-sequences-from-a-variable - # for ideas. - FAILED_SCENARIO_PATHS=$(echo "${FAILED_SCENARIO_PATHS_COLORED}" | sed "s/\x1b[^m]*m//g") - - # If something else went wrong, and there were no failed scenarios, - # then the awk, grep, sed command sequence above ends up with an empty string. - # Unset FAILED_SCENARIO_PATHS to avoid later code thinking that there might be - # one failed scenario. - if [ -z "${FAILED_SCENARIO_PATHS}" ] - then - unset FAILED_SCENARIO_PATHS - fi - - if [ -n "${EXPECTED_FAILURES_FILE}" ] - then - if [ -n "${BEHAT_SUITE_TO_RUN}" ] - then - echo "Checking expected failures for suite ${BEHAT_SUITE_TO_RUN}" - else - echo "Checking expected failures" - fi - - # Check that every failed scenario is in the list of expected failures - for FAILED_SCENARIO_PATH in ${FAILED_SCENARIO_PATHS} - do - SUITE_PATH=`dirname ${FAILED_SCENARIO_PATH}` - SUITE=`basename ${SUITE_PATH}` - SCENARIO=`basename ${FAILED_SCENARIO_PATH}` - SUITE_SCENARIO="${SUITE}/${SCENARIO}" - grep "\[${SUITE_SCENARIO}\]" "${EXPECTED_FAILURES_FILE}" > /dev/null - if [ $? -ne 0 ] - then - echo "Error: Scenario ${SUITE_SCENARIO} failed but was not expected to fail." - UNEXPECTED_FAILED_SCENARIOS+=("${SUITE_SCENARIO}") - fi - done - - # Check that every scenario in the list of expected failures did fail - while read SUITE_SCENARIO - do - # Ignore comment lines (starting with hash) - if [[ "${SUITE_SCENARIO}" =~ ^# ]] - then - continue - fi - # Match lines that have [someSuite/someName.feature:n] - the part inside the - # brackets is the suite, feature and line number of the expected failure. - # Else ignore the line. - if [[ "${SUITE_SCENARIO}" =~ \[([a-zA-Z0-9-]+/[a-zA-Z0-9-]+\.feature:[0-9]+)] ]]; then - SUITE_SCENARIO="${BASH_REMATCH[1]}" - else - continue - fi - if [ -n "${BEHAT_SUITE_TO_RUN}" ] - then - # If the expected failure is not in the suite that is currently being run, - # then do not try and check that it failed. - REGEX_TO_MATCH="^${BEHAT_SUITE_TO_RUN}/" - if ! [[ "${SUITE_SCENARIO}" =~ ${REGEX_TO_MATCH} ]] - then - continue - fi - fi - - # look for the expected suite-scenario at the end of a line in the - # FAILED_SCENARIO_PATHS - for example looking for apiComments/comments.feature:9 - # we want to match lines like: - # tests/acceptance/features/apiComments/comments.feature:9 - # but not lines like:: - # tests/acceptance/features/apiComments/comments.feature:902 - echo "${FAILED_SCENARIO_PATHS}" | grep ${SUITE_SCENARIO}$ > /dev/null - if [ $? -ne 0 ] - then - echo "Info: Scenario ${SUITE_SCENARIO} was expected to fail but did not fail." - UNEXPECTED_PASSED_SCENARIOS+=("${SUITE_SCENARIO}") - fi - done < ${EXPECTED_FAILURES_FILE} - else - for FAILED_SCENARIO_PATH in ${FAILED_SCENARIO_PATHS} - do - SUITE_PATH=$(dirname "${FAILED_SCENARIO_PATH}") - SUITE=$(basename "${SUITE_PATH}") - SCENARIO=$(basename "${FAILED_SCENARIO_PATH}") - SUITE_SCENARIO="${SUITE}/${SCENARIO}" - UNEXPECTED_FAILED_SCENARIOS+=("${SUITE_SCENARIO}") - done - fi - - if [ ${BEHAT_EXIT_STATUS} -ne 0 ] && [ ${#FAILED_SCENARIO_PATHS[@]} -eq 0 ] - then - # Behat had some problem and there were no failed scenarios reported - # So the problem is something else. - # Possibly there were missing step definitions. Or Behat crashed badly, or... - UNEXPECTED_BEHAT_EXIT_STATUSES+=("${SUITE_FEATURE_TEXT} had behat exit status ${BEHAT_EXIT_STATUS}") - fi - - if [ "${BEHAT_TAGS_OPTION_FOUND}" != true ] - then - # The behat run specified to skip scenarios tagged @skip - # Report them in a dry-run so they can be seen - # Big red error output is displayed if there are no matching scenarios - send it to null - DRY_RUN_FILE=$(mktemp) - SKIP_TAGS="@skip" - ${BEHAT} --dry-run {$COLORS_OPTION} -c ${BEHAT_YML} -f pretty ${BEHAT_SUITE_OPTION} --tags "${SKIP_TAGS}" ${BEHAT_FEATURE} 1>${DRY_RUN_FILE} 2>/dev/null - if grep -q -m 1 'No scenarios' "${DRY_RUN_FILE}" - then - # If there are no skip scenarios, then no need to report that - : - else - echo "" - echo "The following tests were skipped because they are tagged @skip:" - cat "${DRY_RUN_FILE}" | tee -a ${TEST_LOG_FILE} - fi - rm -f "${DRY_RUN_FILE}" - fi -} - -declare -x TEST_SERVER_URL - -if [ -z "${IPV4_URL}" ] -then - IPV4_URL="${TEST_SERVER_URL}" -fi - -if [ -z "${IPV6_URL}" ] -then - IPV6_URL="${TEST_SERVER_URL}" -fi - -# If a feature file has been specified but no suite, then deduce the suite -if [ -n "${BEHAT_FEATURE}" ] && [ -z "${BEHAT_SUITE}" ] -then - SUITE_PATH=`dirname ${BEHAT_FEATURE}` - BEHAT_SUITE=`basename ${SUITE_PATH}` -fi - -if [ -z "${BEHAT_YML}" ] -then - # Look for a behat.yml somewhere below the current working directory - # This saves app acceptance tests being forced to specify BEHAT_YML - BEHAT_YML="config/behat.yml" - if [ ! -f "${BEHAT_YML}" ] - then - BEHAT_YML="acceptance/config/behat.yml" - fi - if [ ! -f "${BEHAT_YML}" ] - then - BEHAT_YML="tests/acceptance/config/behat.yml" - fi - # If no luck above, then use the core behat.yml that should live below this script - if [ ! -f "${BEHAT_YML}" ] - then - BEHAT_YML="${SCRIPT_PATH}/config/behat.yml" - fi -fi - -BEHAT_CONFIG_DIR=$(dirname "${BEHAT_YML}") -ACCEPTANCE_DIR=$(dirname "${BEHAT_CONFIG_DIR}") - -if [[ -z "$BEHAT_FEATURES_DIR" ]] -then - BEHAT_FEATURES_DIR="${ACCEPTANCE_DIR}/features" -fi - -declare -a BEHAT_SUITES - -function get_behat_suites() { - # $1 type of suites to get "api" or "core-api" - # defaults to "api" - TYPE="$1" - if [[ -z "$TYPE" ]] - then - TYPE="api" - fi - - ALL_SUITES="" - for suite in `find ${BEHAT_FEATURES_DIR}/ -type d -iname ${TYPE}* | sort | rev | cut -d"/" -f1 | rev` - do - if [[ -f "${BEHAT_FILTER_SUITE_FILE}" ]] - then - if [[ ! `grep $suite "${BEHAT_FILTER_SUITE_FILE}"` ]] - then - ALL_SUITES+="$suite"$'\n' - fi - else - ALL_SUITES+="$suite"$'\n' - fi - done - - COUNT_ALL_SUITES=`echo "${ALL_SUITES}" | tr " " "\n" | wc -l` - - #divide the suites letting it round down (could be zero) - MIN_SUITES_PER_RUN=$((${COUNT_ALL_SUITES} / ${DIVIDE_INTO_NUM_PARTS})) - #some jobs might need an extra suite - MAX_SUITES_PER_RUN=$((${MIN_SUITES_PER_RUN} + 1)) - # the remaining number of suites that need to be distributed (could be zero) - REMAINING_SUITES=$((${COUNT_ALL_SUITES} - (${DIVIDE_INTO_NUM_PARTS} * ${MIN_SUITES_PER_RUN}))) - - if [[ ${RUN_PART} -le ${REMAINING_SUITES} ]] - then - SUITES_THIS_RUN=${MAX_SUITES_PER_RUN} - SUITES_IN_PREVIOUS_RUNS=$((${MAX_SUITES_PER_RUN} * (${RUN_PART} - 1))) - else - SUITES_THIS_RUN=${MIN_SUITES_PER_RUN} - SUITES_IN_PREVIOUS_RUNS=$((((${MAX_SUITES_PER_RUN} * ${REMAINING_SUITES}) + (${MIN_SUITES_PER_RUN} * (${RUN_PART} - ${REMAINING_SUITES} - 1))))) - fi - - if [ ${SUITES_THIS_RUN} -eq 0 ] - then - echo "there are only ${COUNT_ALL_SUITES} suites, nothing to do in part ${RUN_PART}" - exit 0 - fi - - COUNT_FINISH_AND_TODO_SUITES=$((${SUITES_IN_PREVIOUS_RUNS} + ${SUITES_THIS_RUN})) - BEHAT_SUITES+=(`echo "${ALL_SUITES}" | tr " " "\n" | head -n ${COUNT_FINISH_AND_TODO_SUITES} | tail -n ${SUITES_THIS_RUN}`) -} - -if [[ -n "${BEHAT_SUITE}" ]] -then - BEHAT_SUITES+=("${BEHAT_SUITE}") -else - if [[ -n "${RUN_PART}" ]]; then - if [[ "${ACCEPTANCE_TEST_TYPE}" == "core-api" ]]; then - get_behat_suites "core" - else - get_behat_suites "${ACCEPTANCE_TEST_TYPE}" - fi - fi -fi - - -TEST_TYPE_TEXT="API" - -# Always have "@api" -if [ ! -z "${BEHAT_FILTER_TAGS}" ] -then - # Be nice to the caller - # Remove any extra "&&" at the end of their tags list - BEHAT_FILTER_TAGS="${BEHAT_FILTER_TAGS%&&}" - # Remove any extra "&&" at the beginning of their tags list - BEHAT_FILTER_TAGS="${BEHAT_FILTER_TAGS#&&}" -fi - -# EMAIL_HOST defines where the system-under-test can find the email server (inbucket) -# for sending email. -if [ -z "${EMAIL_HOST}" ] -then - EMAIL_HOST="127.0.0.1" -fi - -# LOCAL_INBUCKET_HOST defines where this test script can find the Inbucket server -# for sending email. When testing a remote system, the Inbucket server somewhere -# "in the middle" might have a different host name from the point of view of -# the test script. -if [ -z "${LOCAL_EMAIL_HOST}" ] -then - LOCAL_EMAIL_HOST="${EMAIL_HOST}" -fi - -if [ -z "${EMAIL_SMTP_PORT}" ] -then - EMAIL_SMTP_PORT="2500" -fi - -# If the caller did not mention specific tags, skip the skipped tests by default -if [ "${BEHAT_TAGS_OPTION_FOUND}" = false ] -then - if [[ -z $BEHAT_FILTER_TAGS ]] - then - BEHAT_FILTER_TAGS="~@skip" - # If the caller has already specified specifically to run "@skip" scenarios - # then do not append "not @skip" - elif [[ ! ${BEHAT_FILTER_TAGS} =~ (^|&)@skip(&|$) ]] - then - BEHAT_FILTER_TAGS="${BEHAT_FILTER_TAGS}&&~@skip" - fi -fi - -export IPV4_URL -export IPV6_URL -export FILES_FOR_UPLOAD="${SCRIPT_PATH}/filesForUpload/" - -if [ "${TEST_OCIS}" != "true" ] && [ "${TEST_REVA}" != "true" ] -then - # We are testing on an ownCloud core server. - # Tell the tests to wait 1 second between each upload/delete action - # to avoid problems with actions that depend on timestamps in seconds. - export UPLOAD_DELETE_WAIT_TIME=1 -fi - -TEST_LOG_FILE=$(mktemp) -SCENARIOS_THAT_PASSED=0 -SCENARIOS_THAT_FAILED=0 - -if [ ${#BEHAT_SUITES[@]} -eq 0 ] && [ -z "${BEHAT_FEATURE}" ] -then - SUITE_FEATURE_TEXT="all ${TEST_TYPE_TEXT}" - run_behat_tests -else - if [ -n "${BEHAT_SUITE}" ] - then - SUITE_FEATURE_TEXT="${BEHAT_SUITE}" - fi - - if [ -n "${BEHAT_FEATURE}" ] - then - # If running a whole feature, it will be something like login.feature - # If running just a single scenario, it will also have the line number - # like login.feature:36 - which will be parsed correctly like a "file" - # by basename. - BEHAT_FEATURE_FILE=`basename ${BEHAT_FEATURE}` - SUITE_FEATURE_TEXT="${SUITE_FEATURE_TEXT} ${BEHAT_FEATURE_FILE}" - fi -fi - -for i in "${!BEHAT_SUITES[@]}" - do - BEHAT_SUITE_TO_RUN="${BEHAT_SUITES[$i]}" - BEHAT_SUITE_OPTION="--suite=${BEHAT_SUITE_TO_RUN}" - SUITE_FEATURE_TEXT="${BEHAT_SUITES[$i]}" - for rerun_number in $(seq 1 ${BEHAT_RERUN_TIMES}) - do - if ((${BEHAT_RERUN_TIMES} > 1)) - then - echo -e "\nTest repeat $rerun_number of ${BEHAT_RERUN_TIMES}" - fi - run_behat_tests - done -done - -TOTAL_SCENARIOS=$((SCENARIOS_THAT_PASSED + SCENARIOS_THAT_FAILED)) - -echo "runsh: Total ${TOTAL_SCENARIOS} scenarios (${SCENARIOS_THAT_PASSED} passed, ${SCENARIOS_THAT_FAILED} failed)" - -# 3 types of things can have gone wrong: -# - some scenario failed (and it was not expected to fail) -# - some scenario passed (but it was expected to fail) -# - Behat exited with non-zero status because of some other error -# If any of these happened then report about it and exit with status 1 (error) - -if [ ${#UNEXPECTED_FAILED_SCENARIOS[@]} -gt 0 ] -then - UNEXPECTED_FAILURE=true -else - UNEXPECTED_FAILURE=false -fi - -if [ ${#UNEXPECTED_PASSED_SCENARIOS[@]} -gt 0 ] -then - UNEXPECTED_SUCCESS=true -else - UNEXPECTED_SUCCESS=false -fi - -if [ ${#UNEXPECTED_BEHAT_EXIT_STATUSES[@]} -gt 0 ] -then - UNEXPECTED_BEHAT_EXIT_STATUS=true -else - UNEXPECTED_BEHAT_EXIT_STATUS=false -fi - -# If we got some unexpected success, and we only ran a single feature or scenario -# then the fact that some expected failures did not happen might be because those -# scenarios were never even run. -# Filter the UNEXPECTED_PASSED_SCENARIOS to remove scenarios that were not run. -if [ "${UNEXPECTED_SUCCESS}" = true ] -then - ACTUAL_UNEXPECTED_PASS=() - # if running a single feature or a single scenario - if [[ -n "${BEHAT_FEATURE}" ]] - then - for unexpected_passed_value in "${UNEXPECTED_PASSED_SCENARIOS[@]}" - do - # check only for the running feature - if [[ $BEHAT_FEATURE == *":"* ]] - then - BEHAT_FEATURE_WITH_LINE_NUM=$BEHAT_FEATURE - else - LINE_NUM=$(echo ${unexpected_passed_value} | cut -d":" -f2) - BEHAT_FEATURE_WITH_LINE_NUM=$BEHAT_FEATURE:$LINE_NUM - fi - if [[ $BEHAT_FEATURE_WITH_LINE_NUM == *"${unexpected_passed_value}" ]] - then - ACTUAL_UNEXPECTED_PASS+=("${unexpected_passed_value}") - fi - done - else - ACTUAL_UNEXPECTED_PASS=("${UNEXPECTED_PASSED_SCENARIOS[@]}") - fi - - if [ ${#ACTUAL_UNEXPECTED_PASS[@]} -eq 0 ] - then - UNEXPECTED_SUCCESS=false - fi -fi - -if [ "${UNEXPECTED_FAILURE}" = false ] && [ "${UNEXPECTED_SUCCESS}" = false ] && [ "${UNEXPECTED_BEHAT_EXIT_STATUS}" = false ] -then - FINAL_EXIT_STATUS=0 -else - FINAL_EXIT_STATUS=1 -fi - -if [ -n "${EXPECTED_FAILURES_FILE}" ] -then - echo "runsh: Exit code after checking expected failures: ${FINAL_EXIT_STATUS}" -fi - -if [ "${UNEXPECTED_FAILURE}" = true ] -then - ${YELLOW_COLOR}; echo "runsh: Total unexpected failed scenarios throughout the test run:" - ${RED_COLOR}; printf "%s\n" "${UNEXPECTED_FAILED_SCENARIOS[@]}" -else - ${GREEN_COLOR}; echo "runsh: There were no unexpected failures." -fi - -if [ "${UNEXPECTED_SUCCESS}" = true ] -then - ${YELLOW_COLOR}; echo "runsh: Total unexpected passed scenarios throughout the test run:" - ${RED_COLOR}; printf "%s\n" "${ACTUAL_UNEXPECTED_PASS[@]}" -else - ${GREEN_COLOR}; echo "runsh: There were no unexpected success." -fi - -if [ "${UNEXPECTED_BEHAT_EXIT_STATUS}" = true ] -then - ${YELLOW_COLOR}; echo "runsh: The following Behat test runs exited with non-zero status:" - ${RED_COLOR}; printf "%s\n" "${UNEXPECTED_BEHAT_EXIT_STATUSES[@]}" -fi - -# sync the file-system so all output will be flushed to storage. -# In drone we sometimes see that the last lines of output are missing from the -# drone log. -sync - -# If we are running in drone CI, then sleep for a bit to (hopefully) let the -# drone agent send all the output to the drone server. -if [ -n "${CI_REPO}" ] -then - echo "sleeping for 30 seconds at end of test run" - sleep 30 -fi - -exit ${FINAL_EXIT_STATUS} diff --git a/tests/docker/docker-compose.yml b/tests/docker/docker-compose.yml index 5f40f17d61..b1067b9684 100644 --- a/tests/docker/docker-compose.yml +++ b/tests/docker/docker-compose.yml @@ -1,4 +1,3 @@ -version: "3.4" services: revad: # image: ${REVAD_IMAGE} @@ -9,11 +8,11 @@ services: build: context: ../../ dockerfile: docker/Dockerfile.revad-eos - volumes: - - ../revad:/etc/revad working_dir: /etc/revad/ healthcheck: test: sleep 5 + volumes: + - ../revad:/etc/revad eos-storage: image: ${EOS_FULL_IMAGE} security_opt: @@ -31,50 +30,56 @@ services: interval: 10s timeout: 5s retries: 5 + depends_on: + ldap: + condition: service_healthy litmus: image: registry.cern.ch/docker.io/owncloud/litmus:latest environment: LITMUS_USERNAME: einstein LITMUS_PASSWORD: relativity - TESTS: basic http copymove props - acceptance: - image: cs3org/behat:latest - entrypoint: /mnt/acceptance/run.sh - environment: - OCIS_REVA_DATA_ROOT: /var/tmp/reva/data/ - DELETE_USER_DATA_CMD: rm -rf /var/tmp/reva/data/nodes/root/* /var/tmp/reva/data/nodes/*-*-*-* /var/tmp/reva/data/blobs/* - SKELETON_DIR: /mnt/testing/data/apiSkeleton - PLAIN_OUTPUT: 'true' - volumes: - - ../testing:/mnt/testing - - ../ocis:/mnt/ocis - - ../acceptance:/mnt/acceptance + TESTS: basic http copymove gateway: extends: revad command: -c /etc/revad/gateway.toml volumes: - shared-volume:/var/tmp + depends_on: + ldap: + condition: service_healthy frontend: extends: revad command: -c /etc/revad/frontend.toml volumes: - shared-volume:/var/tmp + depends_on: + ldap: + condition: service_healthy storage-home: extends: revad hostname: storage-home command: -c /etc/revad/storage-home.toml volumes: - shared-volume:/var/tmp + depends_on: + ldap: + condition: service_healthy users: extends: revad command: -c /etc/revad/users.toml volumes: - shared-volume:/var/tmp + depends_on: + ldap: + condition: service_healthy shares: extends: revad command: -c /etc/revad/shares.toml volumes: - shared-volume:/var/tmp + depends_on: + ldap: + condition: service_healthy litmus-1: extends: litmus environment: @@ -92,6 +97,8 @@ services: condition: service_healthy shares: condition: service_healthy + ldap: + condition: service_healthy litmus-2: extends: litmus environment: @@ -120,10 +127,12 @@ services: condition: service_healthy frontend-global: extends: revad - hostname: frontend command: -c /etc/revad/frontend-global.toml volumes: - shared-volume:/var/tmp + depends_on: + eos-storage: + condition: service_healthy storage-local-1: extends: revad command: -c /etc/revad/storage-local-1.toml @@ -140,35 +149,6 @@ services: depends_on: eos-storage: condition: service_healthy - acceptance-1: - extends: acceptance - environment: - PATH_TO_APITESTS: /mnt/ocis - TEST_SERVER_URL: http://frontend:20180 - TEST_REVA: 'true' - EXPECTED_FAILURES_FILE: /mnt/acceptance/expected-failures-on-EOS-storage.md - REGULAR_USER_PASSWORD: relativity - SEND_SCENARIO_LINE_REFERENCES: 'true' - BEHAT_SUITE: apiVirtualViews - ACCEPTANCE_TEST_TYPE: api - volumes: - - shared-volume:/var/tmp - working_dir: /mnt/acceptance - depends_on: - gateway: - condition: service_healthy - frontend-global: - condition: service_healthy - storage-home: - condition: service_healthy - users: - condition: service_healthy - shares: - condition: service_healthy - storage-local-1: - condition: service_healthy - storage-local-2: - condition: service_healthy ldap: image: osixia/openldap:1.5.0 environment: @@ -198,58 +178,5 @@ services: depends_on: ldap: condition: service_healthy - acceptance-2: - extends: acceptance - environment: - TEST_SERVER_URL: http://frontend:20080 - TEST_WITH_LDAP: 'true' - REVA_LDAP_HOSTNAME: ldap - TEST_REVA: 'true' - SEND_SCENARIO_LINE_REFERENCES: 'true' - BEHAT_FILTER_TAGS: ~@provisioning_api-app-required&&~@skipOnOcis-OCIS-Storage&&~@personalSpace&&~@skipOnGraph&&~@carddav&&~@skipOnReva&&~@skipOnRevaMaster - DIVIDE_INTO_NUM_PARTS: ${PARTS:-1} - RUN_PART: ${PART:-1} - EXPECTED_FAILURES_FILE: /mnt/acceptance/expected-failures-on-EOS-storage.md - BEHAT_FEATURES_DIR: /mnt/ocis/tests/acceptance/features - BEHAT_YML: /mnt/acceptance/config/behat-core.yml - ACCEPTANCE_TEST_TYPE: core-api - BEHAT_FILTER_SUITE_FILE: /mnt/acceptance/filtered-suites-acceptance-2-EOS - volumes: - - shared-volume:/var/tmp - working_dir: /mnt/ocis - depends_on: - gateway: - condition: service_healthy - frontend: - condition: service_healthy - storage-home: - condition: service_healthy - shares: - condition: service_healthy - storage-users: - condition: service_healthy - storage-publiclink: - condition: service_healthy - ldap-users: - condition: service_healthy - # ceph: - # image: ceph/daemon - # environment: - # CEPH_DAEMON: demo - # NETWORK_AUTO_DETECT: 4 - # MON_IP: 0.0.0.0 - # CEPH_PUBLIC_NETWORK: 0.0.0.0/0 - # RGW_CIVETWEB_PORT: 4000 - # RGW_NAME: ceph - # CEPH_DEMO_UID: test-user - # CEPH_DEMO_ACCESS_KEY: test - # CEPH_DEMO_SECRET_KEY: test - # CEPH_DEMO_BUCKET: test - # healthcheck: - # test: ceph health - # interval: 5s - # timeout: 5s - # retries: 5 - volumes: shared-volume: diff --git a/tests/docker/eos-storage/Dockerfile b/tests/docker/eos-storage/Dockerfile index 587331fa0d..00a5798caf 100644 --- a/tests/docker/eos-storage/Dockerfile +++ b/tests/docker/eos-storage/Dockerfile @@ -5,7 +5,7 @@ # needs to be passed, else the container will run out of fd. # docker run myeoscontainer --ulimit nofiles:1024000:1024000 -FROM gitlab-registry.cern.ch/dss/eos/eos-ci:5.1.25 +FROM gitlab-registry.cern.ch/dss/eos/eos-ci:02352772.el9 COPY scripts/eos-run.sh /mnt/scripts/eos-run.sh COPY sssd/sssd.conf /etc/sssd/sssd.conf diff --git a/tests/docker/eos-storage/scripts/eos-run.sh b/tests/docker/eos-storage/scripts/eos-run.sh index 1237c96216..7f51bb55a7 100755 --- a/tests/docker/eos-storage/scripts/eos-run.sh +++ b/tests/docker/eos-storage/scripts/eos-run.sh @@ -32,11 +32,21 @@ for letter in {a..z}; do eos mkdir -p "/eos/user/$letter" done +# create cbox sudoer user +adduser cbox -u 58679 -g 0 -m -s /bin/sh eos vid set membership 0 +sudo -eos vid set membership 99 +sudo -eos vid set map -tident "*@storage-home" vuid:0 vgid:0 -eos vid set map -tident "*@storage-users" vuid:0 vgid:0 -eos vid set map -tident "*@storage-local-1" vuid:0 vgid:0 -eos vid set map -tident "*@storage-local-2" vuid:0 vgid:0 +eos vid set membership cbox +sudo + +eos vid set map -tident "*@storage-home" vuid:58679 vgid:0 +eos vid set map -tident "*@storage-users" vuid:58679 vgid:0 +eos vid set map -tident "*@storage-local-1" vuid:58679 vgid:0 +eos vid set map -tident "*@storage-local-2" vuid:58679 vgid:0 +eos vid set map -tident "*@docker-storage-home-1.docker_default" vuid:58679 vgid:0 + +eos vid set map -tident "unix@storage-home" vuid:58679 vgid:0 +eos vid set map -tident "unix@storage-users" vuid:58679 vgid:0 +eos vid set map -tident "unix@storage-local-1" vuid:58679 vgid:0 +eos vid set map -tident "unix@storage-local-2" vuid:58679 vgid:0 +eos vid set map -tident "unix@docker-storage-home-1.docker_default" vuid:58679 vgid:0 tail -f /dev/null diff --git a/tests/helpers/helpers.go b/tests/helpers/helpers.go index d84923b15c..2354c72be0 100644 --- a/tests/helpers/helpers.go +++ b/tests/helpers/helpers.go @@ -105,7 +105,7 @@ func Upload(ctx context.Context, fs storage.FS, ref *provider.Reference, content return errors.New("simple upload method not available") } uploadRef := &provider.Reference{Path: "/" + uploadID} - err = fs.Upload(ctx, uploadRef, io.NopCloser(bytes.NewReader(content))) + err = fs.Upload(ctx, uploadRef, io.NopCloser(bytes.NewReader(content)), map[string]string{}) return err } diff --git a/tests/integration/grpc/ocm_share_test.go b/tests/integration/grpc/ocm_share_test.go.disabled similarity index 100% rename from tests/integration/grpc/ocm_share_test.go rename to tests/integration/grpc/ocm_share_test.go.disabled diff --git a/tests/revad/revad.toml b/tests/revad/revad.toml new file mode 100644 index 0000000000..e69de29bb2