diff --git a/reva/.codacy.yml b/reva/.codacy.yml new file mode 100644 index 0000000000..02e0cf2ebe --- /dev/null +++ b/reva/.codacy.yml @@ -0,0 +1,9 @@ +--- +exclude_paths: + - CHANGELOG.md + - changelog/** + - docs/** + - pkg/proto/** + - tests/acceptance/features/bootstrap/* + +... diff --git a/reva/.dockerignore b/reva/.dockerignore new file mode 100644 index 0000000000..4ec85b5e4f --- /dev/null +++ b/reva/.dockerignore @@ -0,0 +1,2 @@ +* +!bin/ diff --git a/reva/.drone.star b/reva/.drone.star new file mode 100644 index 0000000000..4f933c4c98 --- /dev/null +++ b/reva/.drone.star @@ -0,0 +1,1051 @@ +config = { + 'apiTests': { + 'coreBranch': 'master', + 'coreCommit': 'cb90a3b8bfcddb81f8cf6d84750feaa779105b94', + 'numberOfParts': 4 + } +} + +def main(ctx): + before = testPipelines(ctx) + + stages = [ + docker(ctx, 'amd64'), + docker(ctx, 'arm64'), + docker(ctx, 'arm'), + binary(ctx, 'linux'), + binary(ctx, 'darwin'), + binary(ctx, 'windows'), + ] + + after = [ + manifest(ctx), + changelog(ctx), + readme(ctx), + badges(ctx), + website(ctx), + ] + + return before + stages + after + +def testPipelines(ctx): + pipelines = [ + testing(ctx), + localApiTests(ctx, config['apiTests']['coreBranch'], config['apiTests']['coreCommit'], 'owncloud'), + localApiTests(ctx, config['apiTests']['coreBranch'], config['apiTests']['coreCommit'], 'ocis') + ] + + for runPart in range(1, config['apiTests']['numberOfParts'] + 1): + pipelines.append(coreApiTests(ctx, config['apiTests']['coreBranch'], config['apiTests']['coreCommit'], runPart, config['apiTests']['numberOfParts'], 'owncloud')) + pipelines.append(coreApiTests(ctx, config['apiTests']['coreBranch'], config['apiTests']['coreCommit'], runPart, config['apiTests']['numberOfParts'], 'ocis')) + + return pipelines + +def localApiTests(ctx, coreBranch = 'master', coreCommit = '', storage = 'owncloud'): + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': 'localApiTests-%s-storage' % (storage), + 'platform': { + 'os': 'linux', + 'arch': 'amd64', + }, + 'steps': + build() + + revaServer(storage) + + cloneCoreRepos(coreBranch, coreCommit) + [ + { + 'name': 'localApiTests-%s-storage' % (storage), + 'image': 'owncloudci/php:7.2', + 'pull': 'always', + 'environment' : { + 'TEST_SERVER_URL': 'http://reva-server:9140', + 'OCIS_REVA_DATA_ROOT': '%s' % ('/srv/app/tmp/reva/' if storage == 'owncloud' else ''), + 'DELETE_USER_DATA_CMD': '%s' % ('rm -rf /srv/app/tmp/reva/data/*' if storage == 'owncloud' else 'rm -rf /srv/app/tmp/ocis/root/nodes/root/*'), + 'SKELETON_DIR': '/srv/app/tmp/testing/data/apiSkeleton', + 'TEST_EXTERNAL_USER_BACKENDS':'true', + 'REVA_LDAP_HOSTNAME':'ldap', + 'TEST_OCIS':'true', + 'BEHAT_FILTER_TAGS': '~@skipOnOcis-%s-Storage' % ('OC' if storage == 'owncloud' else 'OCIS'), + 'PATH_TO_CORE': '/srv/app/testrunner' + }, + 'commands': [ + 'make test-acceptance-api' + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ] + }, + ], + 'services': + ldap() + + redis(), + 'volumes': [ + { + 'name': 'gopath', + 'temp': {}, + }, + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/tags/**', + 'refs/pull/**', + ], + }, + } + +def coreApiTests(ctx, coreBranch = 'master', coreCommit = '', part_number = 1, number_of_parts = 1, storage = 'owncloud'): + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': 'Core-API-Tests-%s-storage-%s' % (storage, part_number), + 'platform': { + 'os': 'linux', + 'arch': 'amd64', + }, + 'steps': + build() + + revaServer(storage) + + cloneCoreRepos(coreBranch, coreCommit) + [ + { + 'name': 'oC10ApiTests-%s-storage-%s' % (storage, part_number), + 'image': 'owncloudci/php:7.2', + 'pull': 'always', + 'environment' : { + 'TEST_SERVER_URL': 'http://reva-server:9140', + 'OCIS_REVA_DATA_ROOT': '%s' % ('/srv/app/tmp/reva/' if storage == 'owncloud' else ''), + 'DELETE_USER_DATA_CMD': '%s' % ('rm -rf /srv/app/tmp/reva/data/*' if storage == 'owncloud' else 'rm -rf /srv/app/tmp/ocis/root/nodes/root/*'), + 'SKELETON_DIR': '/srv/app/tmp/testing/data/apiSkeleton', + 'TEST_EXTERNAL_USER_BACKENDS':'true', + 'REVA_LDAP_HOSTNAME':'ldap', + 'TEST_OCIS':'true', + 'BEHAT_FILTER_TAGS': '~@notToImplementOnOCIS&&~@toImplementOnOCIS&&~comments-app-required&&~@federation-app-required&&~@notifications-app-required&&~systemtags-app-required&&~@provisioning_api-app-required&&~@preview-extension-required&&~@local_storage', + 'DIVIDE_INTO_NUM_PARTS': number_of_parts, + 'RUN_PART': part_number, + 'EXPECTED_FAILURES_FILE': '/drone/src/tests/acceptance/expected-failures-on-%s-storage.txt' % (storage.upper()) + }, + 'commands': [ + 'cd /srv/app/testrunner', + 'make test-acceptance-api' + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ] + }, + ], + 'services': + ldap() + + redis(), + 'volumes': [ + { + 'name': 'gopath', + 'temp': {}, + }, + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/tags/**', + 'refs/pull/**', + ], + }, + } + +def testing(ctx): + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': 'testing', + 'platform': { + 'os': 'linux', + 'arch': 'amd64', + }, + 'steps': [ + { + 'name': 'generate', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make generate', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'vet', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make vet', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'staticcheck', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make staticcheck', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'lint', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make lint', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'build', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make build', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'test', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make test', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'codacy', + 'image': 'plugins/codacy:1', + 'pull': 'always', + 'settings': { + 'token': { + 'from_secret': 'codacy_token', + }, + }, + }, + { + 'name': 'reva-server', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'detach': True, + 'environment' : { + 'REVA_LDAP_HOSTNAME': 'ldap', + 'REVA_LDAP_PORT': 636, + 'REVA_LDAP_BIND_DN': 'cn=admin,dc=owncloud,dc=com', + 'REVA_LDAP_BIND_PASSWORD': 'admin', + 'REVA_LDAP_BASE_DN': 'dc=owncloud,dc=com', + 'REVA_LDAP_SCHEMA_UID': 'uid', + 'REVA_STORAGE_HOME_DATA_TEMP_FOLDER': '/srv/app/tmp/', + 'REVA_STORAGE_OWNCLOUD_DATADIR': '/srv/app/tmp/reva/data', + 'REVA_STORAGE_OC_DATA_TEMP_FOLDER': '/srv/app/tmp/', + 'REVA_STORAGE_OC_DATA_URL': 'reva-server:9164', + 'REVA_STORAGE_OC_DATA_SERVER_URL': 'http://reva-server:9164/data', + 'REVA_STORAGE_OWNCLOUD_REDIS_ADDR': 'redis:6379', + 'REVA_SHARING_USER_JSON_FILE': '/srv/app/tmp/reva/shares.json', + 'REVA_OIDC_ISSUER': 'https://konnectd:9130', + 'REVA_FRONTEND_URL': 'http://reva-server:9140', + 'REVA_DATAGATEWAY_URL': 'http://reva-server:9140/data', + }, + 'commands': [ + 'mkdir -p /srv/app/tmp/reva', + 'bin/ocis-reva --log-level debug --log-pretty gateway &', + 'bin/ocis-reva --log-level debug --log-pretty users &', + 'bin/ocis-reva --log-level debug --log-pretty auth-basic &', + 'bin/ocis-reva --log-level debug --log-pretty auth-bearer &', + 'bin/ocis-reva --log-level debug --log-pretty sharing &', + 'bin/ocis-reva --log-level debug --log-pretty storage-home &', + 'bin/ocis-reva --log-level debug --log-pretty storage-home-data &', + 'bin/ocis-reva --log-level debug --log-pretty storage-oc &', + 'bin/ocis-reva --log-level debug --log-pretty storage-oc-data &', + 'bin/ocis-reva --log-level debug --log-pretty frontend &', + 'bin/ocis-reva --log-level debug --log-pretty reva-storage-public-link' + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ] + }, + { + 'name': 'import-litmus-users', + 'image': 'emeraldsquad/ldapsearch', + 'pull': 'always', + 'commands': [ + 'ldapadd -h ldap -p 389 -D "cn=admin,dc=owncloud,dc=com" -w admin -f ./tests/data/testusers.ldif', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'litmus', + 'image': 'owncloud/litmus:latest', + 'pull': 'always', + 'environment' : { + 'LITMUS_URL': 'http://reva-server:9140/remote.php/webdav', + 'LITMUS_USERNAME': 'tu1', + 'LITMUS_PASSWORD': '1234', + 'TESTS': 'basic http copymove props' + }, + }, + ], + 'services': [ + { + 'name': 'ldap', + 'image': 'osixia/openldap', + 'pull': 'always', + 'environment': { + 'LDAP_DOMAIN': 'owncloud.com', + 'LDAP_ORGANISATION': 'owncloud', + 'LDAP_ADMIN_PASSWORD': 'admin', + 'LDAP_TLS_VERIFY_CLIENT': 'never', + }, + }, + { + 'name': 'redis', + 'image': 'webhippie/redis', + 'pull': 'always', + 'environment': { + 'REDIS_DATABASES': 1 + }, + }, + ], + 'volumes': [ + { + 'name': 'gopath', + 'temp': {}, + }, + { + 'name': 'config', + 'temp': {}, + }, + { + 'name': 'uploads', + 'temp': {}, + }, + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/tags/**', + 'refs/pull/**', + ], + }, + } + +def docker(ctx, arch): + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': arch, + 'platform': { + 'os': 'linux', + 'arch': arch, + }, + 'steps': [ + { + 'name': 'generate', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make generate', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'build', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make build', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'dryrun', + 'image': 'plugins/docker:18.09', + 'pull': 'always', + 'settings': { + 'dry_run': True, + 'tags': 'linux-%s' % (arch), + 'dockerfile': 'docker/Dockerfile.linux.%s' % (arch), + 'repo': ctx.repo.slug, + }, + 'when': { + 'ref': { + 'include': [ + 'refs/pull/**', + ], + }, + }, + }, + { + 'name': 'docker', + 'image': 'plugins/docker:18.09', + 'pull': 'always', + 'settings': { + 'username': { + 'from_secret': 'docker_username', + }, + 'password': { + 'from_secret': 'docker_password', + }, + 'auto_tag': True, + 'auto_tag_suffix': 'linux-%s' % (arch), + 'dockerfile': 'docker/Dockerfile.linux.%s' % (arch), + 'repo': ctx.repo.slug, + }, + 'when': { + 'ref': { + 'exclude': [ + 'refs/pull/**', + ], + }, + }, + }, + ], + 'volumes': [ + { + 'name': 'gopath', + 'temp': {}, + }, + ], + 'depends_on': [ + 'testing', + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/tags/**', + 'refs/pull/**', + ], + }, + } + +def binary(ctx, name): + if ctx.build.event == "tag": + settings = { + 'endpoint': { + 'from_secret': 's3_endpoint', + }, + 'access_key': { + 'from_secret': 'aws_access_key_id', + }, + 'secret_key': { + 'from_secret': 'aws_secret_access_key', + }, + 'bucket': { + 'from_secret': 's3_bucket', + }, + 'path_style': True, + 'strip_prefix': 'dist/release/', + 'source': 'dist/release/*', + 'target': '/ocis/%s/%s' % (ctx.repo.name.replace("ocis-", ""), ctx.build.ref.replace("refs/tags/v", "")), + } + else: + settings = { + 'endpoint': { + 'from_secret': 's3_endpoint', + }, + 'access_key': { + 'from_secret': 'aws_access_key_id', + }, + 'secret_key': { + 'from_secret': 'aws_secret_access_key', + }, + 'bucket': { + 'from_secret': 's3_bucket', + }, + 'path_style': True, + 'strip_prefix': 'dist/release/', + 'source': 'dist/release/*', + 'target': '/ocis/%s/testing' % (ctx.repo.name.replace("ocis-", "")), + } + + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': name, + 'platform': { + 'os': 'linux', + 'arch': 'amd64', + }, + 'steps': [ + { + 'name': 'generate', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make generate', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'build', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make release-%s' % (name), + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'finish', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make release-finish', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ], + }, + { + 'name': 'upload', + 'image': 'plugins/s3:1', + 'pull': 'always', + 'settings': settings, + 'when': { + 'ref': [ + 'refs/heads/master', + 'refs/tags/**', + ], + }, + }, + { + 'name': 'changelog', + 'image': 'toolhippie/calens:latest', + 'pull': 'always', + 'commands': [ + 'calens --version %s -o dist/CHANGELOG.md' % ctx.build.ref.replace("refs/tags/v", "").split("-")[0], + ], + 'when': { + 'ref': [ + 'refs/tags/**', + ], + }, + }, + { + 'name': 'release', + 'image': 'plugins/github-release:1', + 'pull': 'always', + 'settings': { + 'api_key': { + 'from_secret': 'github_token', + }, + 'files': [ + 'dist/release/*', + ], + 'title': ctx.build.ref.replace("refs/tags/v", ""), + 'note': 'dist/CHANGELOG.md', + 'overwrite': True, + 'prerelease': len(ctx.build.ref.split("-")) > 1, + }, + 'when': { + 'ref': [ + 'refs/tags/**', + ], + }, + }, + ], + 'volumes': [ + { + 'name': 'gopath', + 'temp': {}, + }, + ], + 'depends_on': [ + 'testing', + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/tags/**', + 'refs/pull/**', + ], + }, + } + +def manifest(ctx): + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': 'manifest', + 'platform': { + 'os': 'linux', + 'arch': 'amd64', + }, + 'steps': [ + { + 'name': 'execute', + 'image': 'plugins/manifest:1', + 'pull': 'always', + 'settings': { + 'username': { + 'from_secret': 'docker_username', + }, + 'password': { + 'from_secret': 'docker_password', + }, + 'spec': 'docker/manifest.tmpl', + 'auto_tag': True, + 'ignore_missing': True, + }, + }, + ], + 'depends_on': [ + 'amd64', + 'arm64', + 'arm', + 'linux', + 'darwin', + 'windows', + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/tags/**', + ], + }, + } + +def changelog(ctx): + repo_slug = ctx.build.source_repo if ctx.build.source_repo else ctx.repo.slug + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': 'changelog', + 'platform': { + 'os': 'linux', + 'arch': 'amd64', + }, + 'clone': { + 'disable': True, + }, + 'steps': [ + { + 'name': 'clone', + 'image': 'plugins/git-action:1', + 'pull': 'always', + 'settings': { + 'actions': [ + 'clone', + ], + 'remote': 'https://github.com/%s' % (repo_slug), + 'branch': ctx.build.source if ctx.build.event == 'pull_request' else 'master', + 'path': '/drone/src', + 'netrc_machine': 'github.com', + 'netrc_username': { + 'from_secret': 'github_username', + }, + 'netrc_password': { + 'from_secret': 'github_token', + }, + }, + }, + { + 'name': 'generate', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make changelog', + ], + }, + { + 'name': 'diff', + 'image': 'owncloud/alpine:latest', + 'pull': 'always', + 'commands': [ + 'git diff', + ], + }, + { + 'name': 'output', + 'image': 'owncloud/alpine:latest', + 'pull': 'always', + 'commands': [ + 'cat CHANGELOG.md', + ], + }, + { + 'name': 'publish', + 'image': 'plugins/git-action:1', + 'pull': 'always', + 'settings': { + 'actions': [ + 'commit', + 'push', + ], + 'message': 'Automated changelog update [skip ci]', + 'branch': 'master', + 'author_email': 'devops@owncloud.com', + 'author_name': 'ownClouders', + 'netrc_machine': 'github.com', + 'netrc_username': { + 'from_secret': 'github_username', + }, + 'netrc_password': { + 'from_secret': 'github_token', + }, + }, + 'when': { + 'ref': { + 'exclude': [ + 'refs/pull/**', + ], + }, + }, + }, + ], + 'depends_on': [ + 'manifest', + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/pull/**', + ], + }, + } + +def readme(ctx): + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': 'readme', + 'platform': { + 'os': 'linux', + 'arch': 'amd64', + }, + 'steps': [ + { + 'name': 'execute', + 'image': 'sheogorath/readme-to-dockerhub:latest', + 'pull': 'always', + 'environment': { + 'DOCKERHUB_USERNAME': { + 'from_secret': 'docker_username', + }, + 'DOCKERHUB_PASSWORD': { + 'from_secret': 'docker_password', + }, + 'DOCKERHUB_REPO_PREFIX': ctx.repo.namespace, + 'DOCKERHUB_REPO_NAME': ctx.repo.name, + 'SHORT_DESCRIPTION': 'Docker images for %s' % (ctx.repo.name), + 'README_PATH': 'README.md', + }, + }, + ], + 'depends_on': [ + 'changelog', + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/tags/**', + ], + }, + } + +def badges(ctx): + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': 'badges', + 'platform': { + 'os': 'linux', + 'arch': 'amd64', + }, + 'steps': [ + { + 'name': 'execute', + 'image': 'plugins/webhook:1', + 'pull': 'always', + 'settings': { + 'urls': { + 'from_secret': 'microbadger_url', + }, + }, + }, + ], + 'depends_on': [ + 'readme', + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/tags/**', + ], + }, + } + +def website(ctx): + return { + 'kind': 'pipeline', + 'type': 'docker', + 'name': 'website', + 'platform': { + 'os': 'linux', + 'arch': 'amd64', + }, + 'steps': [ + { + 'name': 'prepare', + 'image': 'owncloudci/alpine:latest', + 'commands': [ + 'make docs-copy' + ], + }, + { + 'name': 'test', + 'image': 'webhippie/hugo:latest', + 'commands': [ + 'cd hugo', + 'hugo', + ], + }, + { + 'name': 'list', + 'image': 'owncloudci/alpine:latest', + 'commands': [ + 'tree hugo/public', + ], + }, + { + 'name': 'publish', + 'image': 'plugins/gh-pages:1', + 'pull': 'always', + 'settings': { + 'username': { + 'from_secret': 'github_username', + }, + 'password': { + 'from_secret': 'github_token', + }, + 'pages_directory': 'docs/', + 'target_branch': 'docs', + }, + 'when': { + 'ref': { + 'exclude': [ + 'refs/pull/**', + ], + }, + }, + }, + { + 'name': 'downstream', + 'image': 'plugins/downstream', + 'settings': { + 'server': 'https://cloud.drone.io/', + 'token': { + 'from_secret': 'drone_token', + }, + 'repositories': [ + 'owncloud/owncloud.github.io@source', + ], + }, + 'when': { + 'ref': { + 'exclude': [ + 'refs/pull/**', + ], + }, + }, + }, + ], + 'depends_on': [ + 'badges', + ], + 'trigger': { + 'ref': [ + 'refs/heads/master', + 'refs/pull/**', + ], + }, + } + +def build(): + return [ + { + 'name': 'build', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'commands': [ + 'make build', + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + } + ] + } + ] + +def revaServer(storage): + return [ + { + 'name': 'reva-server', + 'image': 'webhippie/golang:1.13', + 'pull': 'always', + 'detach': True, + 'environment' : { + 'REVA_LDAP_HOSTNAME': 'ldap', + 'REVA_LDAP_PORT': 636, + 'REVA_LDAP_BIND_DN': 'cn=admin,dc=owncloud,dc=com', + 'REVA_LDAP_BIND_PASSWORD': 'admin', + 'REVA_LDAP_BASE_DN': 'dc=owncloud,dc=com', + 'REVA_LDAP_SCHEMA_UID': 'uid', + 'REVA_STORAGE_HOME_DRIVER': '%s' % (storage), + 'REVA_STORAGE_HOME_DATA_DRIVER': '%s' % (storage), + 'REVA_STORAGE_OC_DRIVER': '%s' % (storage), + 'REVA_STORAGE_OC_DATA_DRIVER': '%s' % (storage), + 'REVA_STORAGE_HOME_DATA_TEMP_FOLDER': '/srv/app/tmp/', + 'REVA_STORAGE_OCIS_ROOT': '/srv/app/tmp/ocis/root', + 'REVA_STORAGE_OWNCLOUD_DATADIR': '/srv/app/tmp/reva/data', + 'REVA_STORAGE_OC_DATA_TEMP_FOLDER': '/srv/app/tmp/', + 'REVA_STORAGE_OC_DATA_SERVER_URL': 'http://reva-server:9164/data', + 'REVA_STORAGE_OC_DATA_URL': 'reva-server:9164', + 'REVA_STORAGE_OWNCLOUD_REDIS_ADDR': 'redis:6379', + 'REVA_SHARING_USER_JSON_FILE': '/srv/app/tmp/reva/shares.json', + 'REVA_FRONTEND_URL': 'http://reva-server:9140', + 'REVA_DATAGATEWAY_URL': 'http://reva-server:9140/data', + }, + 'commands': [ + 'apk add mailcap', + 'mkdir -p /srv/app/tmp/reva', + 'mkdir -p /srv/app/tmp/ocis/root/nodes', + 'bin/ocis-reva --log-level debug --log-pretty gateway &', + 'bin/ocis-reva --log-level debug --log-pretty users &', + 'bin/ocis-reva --log-level debug --log-pretty auth-basic &', + 'bin/ocis-reva --log-level debug --log-pretty auth-bearer &', + 'bin/ocis-reva --log-level debug --log-pretty sharing &', + 'bin/ocis-reva --log-level debug --log-pretty storage-home &', + 'bin/ocis-reva --log-level debug --log-pretty storage-home-data &', + 'bin/ocis-reva --log-level debug --log-pretty storage-oc &', + 'bin/ocis-reva --log-level debug --log-pretty storage-oc-data &', + 'bin/ocis-reva --log-level debug --log-pretty frontend &', + 'bin/ocis-reva --log-level debug --log-pretty reva-storage-public-link' + ], + 'volumes': [ + { + 'name': 'gopath', + 'path': '/srv/app', + }, + ] + } + ] + +def cloneCoreRepos(coreBranch, coreCommit): + return [ + { + 'name': 'clone-core-repos', + 'image': 'owncloudci/php:7.2', + 'pull': 'always', + 'commands': [ + 'git clone -b master --depth=1 https://github.com/owncloud/testing.git /srv/app/tmp/testing', + 'git clone -b %s --single-branch --no-tags https://github.com/owncloud/core.git /srv/app/testrunner' % (coreBranch), + 'cd /srv/app/testrunner', + ] + ([ + 'git checkout %s' % (coreCommit) + ] if coreCommit != '' else []), + 'volumes': [{ + 'name': 'gopath', + 'path': '/srv/app', + }] + } + ] + +def ldap(): + return [ + { + 'name': 'ldap', + 'image': 'osixia/openldap', + 'pull': 'always', + 'environment': { + 'LDAP_DOMAIN': 'owncloud.com', + 'LDAP_ORGANISATION': 'owncloud', + 'LDAP_ADMIN_PASSWORD': 'admin', + 'LDAP_TLS_VERIFY_CLIENT': 'never', + }, + } + ] + +def redis(): + return [ + { + 'name': 'redis', + 'image': 'webhippie/redis', + 'pull': 'always', + 'environment': { + 'REDIS_DATABASES': 1 + }, + } + ] diff --git a/reva/.editorconfig b/reva/.editorconfig new file mode 100644 index 0000000000..77129cd393 --- /dev/null +++ b/reva/.editorconfig @@ -0,0 +1,35 @@ +# http://editorconfig.org + +root = true + +[*] +charset = utf-8 +insert_final_newline = true +trim_trailing_whitespace = true + +[Makefile] +indent_style = tab +indent_size = 4 + +[*.go] +indent_style = tab +indent_size = 4 + +[*.starlark] +indent_style = space +indent_size = 2 + +[*.{yml,json}] +indent_style = space +indent_size = 2 + +[*.{js,vue}] +indent_style = space +indent_size = 2 + +[*.{css,less}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = true diff --git a/reva/.github/config.yml b/reva/.github/config.yml new file mode 100644 index 0000000000..5766304785 --- /dev/null +++ b/reva/.github/config.yml @@ -0,0 +1,12 @@ +# Configuration for update-docs - https://github.com/behaviorbot/update-docs + +# Comment to be posted to on PRs that don't update documentation +updateDocsComment: > + Thanks for opening this pull request! The maintainers of this repository would appreciate it if you would create a [changelog](https://github.com/owncloud/ocis-reva/blob/master/changelog/README.md) item based on your changes. +updateDocsWhiteList: + - Tests-only + - tests-only + - Tests-Only + +updateDocsTargetFiles: + - changelog/unreleased/ diff --git a/reva/.github/issue_template.md b/reva/.github/issue_template.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/reva/.github/pull_request_template.md b/reva/.github/pull_request_template.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/reva/.github/settings.yml b/reva/.github/settings.yml new file mode 100644 index 0000000000..bf6f837316 --- /dev/null +++ b/reva/.github/settings.yml @@ -0,0 +1,98 @@ +--- +repository: + name: ocis-reva + description: ':arrows_counterclockwise: reva integration for oCIS' + homepage: https://owncloud.github.io/ocis-reva/ + topics: reva, ocis + + private: false + has_issues: true + has_projects: false + has_wiki: true + has_downloads: false + + default_branch: master + + allow_squash_merge: true + allow_merge_commit: true + allow_rebase_merge: true + +labels: + - name: bug + color: d73a4a + description: Something isn't working + - name: documentation + color: 0075ca + description: Improvements or additions to documentation + - name: duplicate + color: cfd3d7 + description: This issue or pull request already exists + - name: enhancement + color: a2eeef + description: New feature or request + - name: good first issue + color: 7057ff + description: Good for newcomers + - name: help wanted + color: 008672 + description: Extra attention is needed + - name: invalid + color: e4e669 + description: This doesn't seem right + - name: question + color: d876e3 + description: Further information is requested + - name: wontfix + color: ffffff + description: This will not be worked on + - name: effort/trivial + color: c2e0c6 + description: Required effort to finish task + - name: effort/0.25d + color: c2e0c6 + description: Required effort to finish task + - name: effort/0.5d + color: c2e0c6 + description: Required effort to finish task + - name: effort/1d + color: c2e0c6 + description: Required effort to finish task + - name: effort/2d + color: c2e0c6 + description: Required effort to finish task + - name: effort/4d + color: c2e0c6 + description: Required effort to finish task + - name: effort/5d + color: c2e0c6 + description: Required effort to finish task + - name: effort/10d + color: c2e0c6 + description: Required effort to finish task + +teams: + - name: ci + permission: admin + - name: employees + permission: push + +branches: + - name: master + protection: + required_pull_request_reviews: + required_approving_review_count: 1 + dismiss_stale_reviews: false + require_code_owner_reviews: false + dismissal_restrictions: {} + required_status_checks: + strict: true + contexts: + - continuous-integration/drone/pr + enforce_admins: false + restrictions: + users: [] + teams: + - ci + - employees + +... diff --git a/reva/.gitignore b/reva/.gitignore new file mode 100644 index 0000000000..4899c1247d --- /dev/null +++ b/reva/.gitignore @@ -0,0 +1,15 @@ +coverage.out + +/bin +/dist +/hugo + +/node_modules +/assets + +# API acceptance tests +composer.lock +/vendor +vendor-bin/**/vendor +vendor-bin/**/composer.lock +tests/acceptance/output diff --git a/reva/.vscode/launch.json b/reva/.vscode/launch.json new file mode 100644 index 0000000000..05fb2687c6 --- /dev/null +++ b/reva/.vscode/launch.json @@ -0,0 +1,18 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/ocis-reva", + "env": {}, + "cwd": "${workspaceFolder}", + "args": ["legacy"] + } + ] +} \ No newline at end of file diff --git a/reva/CHANGELOG.md b/reva/CHANGELOG.md new file mode 100644 index 0000000000..eda0af9386 --- /dev/null +++ b/reva/CHANGELOG.md @@ -0,0 +1,948 @@ +# Changelog for [0.14.0] (2020-09-11) + +The following sections list the changes in ocis-reva 0.14.0. + +[0.14.0]: https://github.com/owncloud/ocis-reva/compare/v0.13.0...v0.14.0 + +## Summary + +* Bugfix - Fix default configuration for accessing shares: [#205](https://github.com/owncloud/product/issues/205) +* Enhancement - Allow configuring arbitrary storage registry rules: [#193](https://github.com/owncloud/product/issues/193) +* Enhancement - Update reva to v1.2.1-0.20200826162318-c0f54e1f37ea: [#454](https://github.com/owncloud/ocis-reva/pull/454) +* Enhancement - Update reva to v1.2.1-0.20200911111727-51649e37df2d: [#466](https://github.com/owncloud/ocis-reva/pull/466) + +## Details + +* Bugfix - Fix default configuration for accessing shares: [#205](https://github.com/owncloud/product/issues/205) + + The storage provider mounted at `/home` should always have EnableHome set to `true`. The other + storage providers should have it set to `false`. + + https://github.com/owncloud/product/issues/205 + https://github.com/owncloud/ocis-reva/pull/461 + + +* Enhancement - Allow configuring arbitrary storage registry rules: [#193](https://github.com/owncloud/product/issues/193) + + We added a new config flag `storage-registry-rule` that can be given multiple times for the + gateway to specify arbitrary storage registry rules. You can also use a comma separated list of + rules in the `REVA_STORAGE_REGISTRY_RULES` environment variable. + + https://github.com/owncloud/product/issues/193 + https://github.com/owncloud/ocis-reva/pull/461 + + +* Enhancement - Update reva to v1.2.1-0.20200826162318-c0f54e1f37ea: [#454](https://github.com/owncloud/ocis-reva/pull/454) + + - Update reva to v1.2.1-0.20200826162318-c0f54e1f37ea - Do not swallow 'not found' errors in + Stat [(reva/#1124)](https://github.com/cs3org/reva/pull/1124) - Rewire dav files to the + home storage [(reva/#1125)](https://github.com/cs3org/reva/pull/1125) - Do not restore + recycle entry on purge [(reva/#1099)](https://github.com/cs3org/reva/pull/1099) - + Allow listing the trashbin [(reva/#1091)](https://github.com/cs3org/reva/pull/1091) - + Restore and delete trash items via ocs + [(reva/#1103)](https://github.com/cs3org/reva/pull/1103) - Ensure ignoring public + stray shares [(reva/#1090)](https://github.com/cs3org/reva/pull/1090) - Ensure + ignoring stray shares [(reva/#1064)](https://github.com/cs3org/reva/pull/1064) - + Minor fixes in reva cmd, gateway uploads and smtpclient + [(reva/#1082)](https://github.com/cs3org/reva/pull/1082) - Owncloud driver - + propagate mtime on RemoveGrant + [(reva/#1115)](https://github.com/cs3org/reva/pull/1115) - Handle redirection + prefixes when extracting destination from URL + [(reva/#1111)](https://github.com/cs3org/reva/pull/1111) - Add UID and GID in ldap auth + driver [(reva/#1101)](https://github.com/cs3org/reva/pull/1101) - Add calens check to + verify changelog entries in CI + [(reva/#1077)](https://github.com/cs3org/reva/pull/1077) - Refactor Reva CLI with + prompts [(reva/#1072)](https://github.com/cs3org/reva/pull/1072j) - Get file info + using fxids from EOS [(reva/#1079)](https://github.com/cs3org/reva/pull/1079) - Update + LDAP user driver [(reva/#1088)](https://github.com/cs3org/reva/pull/1088) - System + information metrics cleanup + [(reva/#1114)](https://github.com/cs3org/reva/pull/1114) - System information + included in Prometheus metrics + [(reva/#1071)](https://github.com/cs3org/reva/pull/1071) - Add logic for resolving + storage references over webdav + [(reva/#1094)](https://github.com/cs3org/reva/pull/1094) + + https://github.com/owncloud/ocis-reva/pull/454 + + +* Enhancement - Update reva to v1.2.1-0.20200911111727-51649e37df2d: [#466](https://github.com/owncloud/ocis-reva/pull/466) + + - Update reva to v1.2.1-0.20200911111727-51649e37df2d - Added new OCIS storage driver ocis + [(reva/#1155)](https://github.com/cs3org/reva/pull/1155) - App provider: fallback to + env. variable if 'iopsecret' unset + [(reva/#1146)](https://github.com/cs3org/reva/pull/1146) - Add switch to database + [(reva/#1135)](https://github.com/cs3org/reva/pull/1135) - Add the ocdav HTTP svc to the + standalone config [(reva/#1128)](https://github.com/cs3org/reva/pull/1128) + + https://github.com/owncloud/ocis-reva/pull/466 + +# Changelog for [0.13.0] (2020-08-27) + +The following sections list the changes in ocis-reva 0.13.0. + +[0.13.0]: https://github.com/owncloud/ocis-reva/compare/v0.12.0...v0.13.0 + +## Summary + +* Enhancement - Separate user and auth providers, add config for rest user: [#412](https://github.com/owncloud/ocis-reva/pull/412) +* Enhancement - Update reva to v1.1.1-0.20200819100654-dcbf0c8ea187: [#447](https://github.com/owncloud/ocis-reva/pull/447) + +## Details + +* Enhancement - Separate user and auth providers, add config for rest user: [#412](https://github.com/owncloud/ocis-reva/pull/412) + + Previously, the auth and user provider services used to have the same driver, which restricted + using separate drivers and configs for both. This PR separates the two and adds the config for + the rest user driver and the gatewaysvc parameter to EOS fs. + + https://github.com/owncloud/ocis-reva/pull/412 + https://github.com/cs3org/reva/pull/995 + + +* Enhancement - Update reva to v1.1.1-0.20200819100654-dcbf0c8ea187: [#447](https://github.com/owncloud/ocis-reva/pull/447) + + - Update reva to v1.1.1-0.20200819100654-dcbf0c8ea187 - fix restoring and deleting trash + items via ocs [(reva/#1103)](https://github.com/cs3org/reva/pull/1103) - Add UID and GID + in ldap auth driver [(reva/#1101)](https://github.com/cs3org/reva/pull/1101) - Allow + listing the trashbin [(reva/#1091)](https://github.com/cs3org/reva/pull/1091) - + Ignore Stray Public Shares [(reva/#1090)](https://github.com/cs3org/reva/pull/1090) - + Implement GetUserByClaim for LDAP user driver + [(reva/#1088)](https://github.com/cs3org/reva/pull/1088) - eosclient: get file info by + fxid [(reva/#1079)](https://github.com/cs3org/reva/pull/1079) - Ensure stray shares + get ignored [(reva/#1064)](https://github.com/cs3org/reva/pull/1064) - Improve + timestamp precision while logging + [(reva/#1059)](https://github.com/cs3org/reva/pull/1059) - Ocfs lookup userid + (update) [(reva/#1052)](https://github.com/cs3org/reva/pull/1052) - Disallow sharing + the shares directory [(reva/#1051)](https://github.com/cs3org/reva/pull/1051) - Local + storage provider: Fixed resolution of fileid + [(reva/#1046)](https://github.com/cs3org/reva/pull/1046) - List public shares only + created by the current user [(reva/#1042)](https://github.com/cs3org/reva/pull/1042) + + https://github.com/owncloud/ocis-reva/pull/447 + +# Changelog for [0.12.0] (2020-08-17) + +The following sections list the changes in ocis-reva 0.12.0. + +[0.12.0]: https://github.com/owncloud/ocis-reva/compare/v0.11.0...v0.12.0 + +## Summary + +* Bugfix - Update LDAP filters: [#399](https://github.com/owncloud/ocis-reva/pull/399) +* Change - Environment updates for the username userid split: [#420](https://github.com/owncloud/ocis-reva/pull/420) +* Enhancement - Update storage documentation: [#384](https://github.com/owncloud/ocis-reva/pull/384) +* Enhancement - Update reva to v0.1.1-0.20200724135750-b46288b375d6: [#399](https://github.com/owncloud/ocis-reva/pull/399) +* Enhancement - Update reva to v0.1.1-0.20200728071211-c948977dd3a0: [#407](https://github.com/owncloud/ocis-reva/pull/407) + +## Details + +* Bugfix - Update LDAP filters: [#399](https://github.com/owncloud/ocis-reva/pull/399) + + With the separation of use and find filters we can now use a filter that taken into account a users + uuid as well as his username. This is necessary to make sharing work with the new account service + which assigns accounts an immutable account id that is different from the username. + Furthermore, the separate find filters now allows searching users by their displayname or + email as well. + + ``` userfilter = + "(&(objectclass=posixAccount)(|(ownclouduuid={{.OpaqueId}})(cn={{.OpaqueId}})))" + findfilter = + "(&(objectclass=posixAccount)(|(cn={{query}}*)(displayname={{query}}*)(mail={{query}}*)))" + ``` + + https://github.com/owncloud/ocis-reva/pull/399 + https://github.com/cs3org/reva/pull/996 + + +* Change - Environment updates for the username userid split: [#420](https://github.com/owncloud/ocis-reva/pull/420) + + We updated the owncloud storage driver in reva to properly look up users by userid or username + using the userprovider instead of taking the path segment as is. This requires the user service + address as well as changing the default layout to the userid instead of the username. The latter + is not considered a stable and persistent identifier. + + https://github.com/owncloud/ocis-reva/pull/420 + https://github.com/cs3org/reva/pull/1033 + + +* Enhancement - Update storage documentation: [#384](https://github.com/owncloud/ocis-reva/pull/384) + + We added details to the documentation about storage requirements known from ownCloud 10, the + local storage driver and the ownCloud storage driver. + + https://github.com/owncloud/ocis-reva/pull/384 + https://github.com/owncloud/ocis-reva/pull/390 + + +* Enhancement - Update reva to v0.1.1-0.20200724135750-b46288b375d6: [#399](https://github.com/owncloud/ocis-reva/pull/399) + + - Update reva to v0.1.1-0.20200724135750-b46288b375d6 - Split LDAP user filters + (reva/#996) - meshdirectory: Add invite forward API to provider links (reva/#1000) - OCM: + Pass the link to the meshdirectory service in token mail (reva/#1002) - Update + github.com/go-ldap/ldap to v3 (reva/#1004) + + https://github.com/owncloud/ocis-reva/pull/399 + https://github.com/cs3org/reva/pull/996 + https://github.com/cs3org/reva/pull/1000 + https://github.com/cs3org/reva/pull/1002 + https://github.com/cs3org/reva/pull/1004 + + +* Enhancement - Update reva to v0.1.1-0.20200728071211-c948977dd3a0: [#407](https://github.com/owncloud/ocis-reva/pull/407) + + - Update reva to v0.1.1-0.20200728071211-c948977dd3a0 - Use proper logging for ldap auth + requests (reva/#1008) - Update github.com/eventials/go-tus to + v0.0.0-20200718001131-45c7ec8f5d59 (reva/#1007) - Check if SMTP credentials are nil + (reva/#1006) + + https://github.com/owncloud/ocis-reva/pull/407 + https://github.com/cs3org/reva/pull/1008 + https://github.com/cs3org/reva/pull/1007 + https://github.com/cs3org/reva/pull/1006 + +# Changelog for [0.11.0] (2020-07-23) + +The following sections list the changes in ocis-reva 0.11.0. + +[0.11.0]: https://github.com/owncloud/ocis-reva/compare/v0.10.0...v0.11.0 + +## Summary + +* Bugfix - Build docker images with alpine:latest instead of alpine:edge: [#393](https://github.com/owncloud/ocis-reva/pull/393) +* Enhancement - Update reva to v0.1.1-0.20200710143425-cf38a45220c5: [#371](https://github.com/owncloud/ocis-reva/pull/371) +* Enhancement - Update reva to v0.1.1-0.20200722125752-6dea7936f9d1: [#392](https://github.com/owncloud/ocis-reva/pull/392) + +## Details + +* Bugfix - Build docker images with alpine:latest instead of alpine:edge: [#393](https://github.com/owncloud/ocis-reva/pull/393) + + ARM builds were failing when built on alpine:edge, so we switched to alpine:latest instead. + + https://github.com/owncloud/ocis-reva/pull/393 + + +* Enhancement - Update reva to v0.1.1-0.20200710143425-cf38a45220c5: [#371](https://github.com/owncloud/ocis-reva/pull/371) + + - Update reva to v0.1.1-0.20200710143425-cf38a45220c5 (#371) - Add wopi open (reva/#920) - + Added a CS3API compliant data exporter to Mentix (reva/#955) - Read SMTP password from env if + not set in config (reva/#953) - OCS share fix including file info after update (reva/#958) - Add + flag to smtpclient for for unauthenticated SMTP (reva/#963) + + https://github.com/owncloud/ocis-reva/pull/371 + https://github.com/cs3org/reva/pull/920 + https://github.com/cs3org/reva/pull/953 + https://github.com/cs3org/reva/pull/955 + https://github.com/cs3org/reva/pull/958 + https://github.com/cs3org/reva/pull/963 + + +* Enhancement - Update reva to v0.1.1-0.20200722125752-6dea7936f9d1: [#392](https://github.com/owncloud/ocis-reva/pull/392) + + - Update reva to v0.1.1-0.20200722125752-6dea7936f9d1 - Added signing key capability + (reva/#986) - Add functionality to create webdav references for OCM shares (reva/#974) - + Added a site locations exporter to Mentix (reva/#972) - Add option to config to allow requests + to hosts with unverified certificates (reva/#969) + + https://github.com/owncloud/ocis-reva/pull/392 + https://github.com/cs3org/reva/pull/986 + https://github.com/cs3org/reva/pull/974 + https://github.com/cs3org/reva/pull/972 + https://github.com/cs3org/reva/pull/969 + +# Changelog for [0.10.0] (2020-07-10) + +The following sections list the changes in ocis-reva 0.10.0. + +[0.10.0]: https://github.com/owncloud/ocis-reva/compare/v0.9.1...v0.10.0 + +## Summary + +* Enhancement - Make frontend prefixes configurable: [#363](https://github.com/owncloud/ocis-reva/pull/363) +* Enhancement - Update reva to v0.1.1-0.20200701152626-2f6cc60e2f66: [#341](https://github.com/owncloud/ocis-reva/pull/341) +* Enhancement - Update reva to v0.1.1-0.20200709064551-91eed007038f: [#362](https://github.com/owncloud/ocis-reva/pull/362) + +## Details + +* Enhancement - Make frontend prefixes configurable: [#363](https://github.com/owncloud/ocis-reva/pull/363) + + We introduce three new environment variables and preconfigure them the following way: + + ``` REVA_FRONTEND_DATAGATEWAY_PREFIX="data" REVA_FRONTEND_OCDAV_PREFIX="" + REVA_FRONTEND_OCS_PREFIX="ocs" ``` + + This restores the reva defaults that were changed upstream. + + https://github.com/owncloud/ocis-reva/pull/363 + https://github.com/cs3org/reva/pull/936/files#diff-51bf4fb310f7362f5c4306581132fc3bR63 + + +* Enhancement - Update reva to v0.1.1-0.20200701152626-2f6cc60e2f66: [#341](https://github.com/owncloud/ocis-reva/pull/341) + + - Update reva to v0.1.1-0.20200701152626-2f6cc60e2f66 (#341) - Added country information + to Mentix (reva/#924) - Refactor metrics package to implement reader interface (reva/#934) - + Fix OCS public link share update values logic (#252, #288, reva/#930) + + https://github.com/owncloud/ocis-reva/issues/252 + https://github.com/owncloud/ocis-reva/issues/288 + https://github.com/owncloud/ocis-reva/pull/341 + https://github.com/cs3org/reva/pull/924 + https://github.com/cs3org/reva/pull/934 + https://github.com/cs3org/reva/pull/930 + + +* Enhancement - Update reva to v0.1.1-0.20200709064551-91eed007038f: [#362](https://github.com/owncloud/ocis-reva/pull/362) + + - Update reva to v0.1.1-0.20200709064551-91eed007038f (#362) - Fix config for uploads when + data server is not exposed (reva/#936) - Update OCM partners endpoints (reva/#937) - Update + Ailleron endpoint (reva/#938) - OCS: Fix initialization of shares json file (reva/#940) - + OCS: Fix returned public link URL (#336, reva/#945) - OCS: Share wrap resource id correctly + (#344, reva/#951) - OCS: Implement share handling for accepting and listing shares (#11, + reva/#929) - ocm: dynamically lookup IPs for provider check (reva/#946) - ocm: add + functionality to mail OCM invite tokens (reva/#944) - Change percentagused to + percentageused (reva/#903) - Fix file-descriptor leak (reva/#954) + + https://github.com/owncloud/ocis-reva/issues/344 + https://github.com/owncloud/ocis-reva/issues/336 + https://github.com/owncloud/ocis-reva/issues/11 + https://github.com/owncloud/ocis-reva/pull/362 + https://github.com/cs3org/reva/pull/936 + https://github.com/cs3org/reva/pull/937 + https://github.com/cs3org/reva/pull/938 + https://github.com/cs3org/reva/pull/940 + https://github.com/cs3org/reva/pull/951 + https://github.com/cs3org/reva/pull/945 + https://github.com/cs3org/reva/pull/929 + https://github.com/cs3org/reva/pull/946 + https://github.com/cs3org/reva/pull/944 + https://github.com/cs3org/reva/pull/903 + https://github.com/cs3org/reva/pull/954 + +# Changelog for [0.9.1] (2020-07-02) + +The following sections list the changes in ocis-reva 0.9.1. + +[0.9.1]: https://github.com/owncloud/ocis-reva/compare/v0.9.0...v0.9.1 + +## Summary + +* Enhancement - Add new config options for the http client: [#330](https://github.com/owncloud/ocis-reva/pull/330) + +## Details + +* Enhancement - Add new config options for the http client: [#330](https://github.com/owncloud/ocis-reva/pull/330) + + The internal certificates are checked for validity after + https://github.com/cs3org/reva/pull/914, which causes the acceptance tests to fail. This + change sets new hardcoded defaults. + + https://github.com/owncloud/ocis-reva/pull/330 + +# Changelog for [0.9.0] (2020-07-01) + +The following sections list the changes in ocis-reva 0.9.0. + +[0.9.0]: https://github.com/owncloud/ocis-reva/compare/v0.8.0...v0.9.0 + +## Summary + +* Enhancement - Allow datagateway transfers to take 24h: [#323](https://github.com/owncloud/ocis-reva/pull/323) +* Enhancement - Update reva to v0.1.1-0.20200630075923-39a90d431566: [#320](https://github.com/owncloud/ocis-reva/pull/320) +* Enhancement - Update reva to v0.1.1-0.20200701152626-2f6cc60e2f66: [#328](https://github.com/owncloud/ocis-reva/pull/328) + +## Details + +* Enhancement - Allow datagateway transfers to take 24h: [#323](https://github.com/owncloud/ocis-reva/pull/323) + + - Increase transfer token life time to 24h (PR #323) + + https://github.com/owncloud/ocis-reva/pull/323 + + +* Enhancement - Update reva to v0.1.1-0.20200630075923-39a90d431566: [#320](https://github.com/owncloud/ocis-reva/pull/320) + + - Update reva to v0.1.1-0.20200630075923-39a90d431566 (#320) - Return special value for + public link password (#294, reva/#904) - Fix public stat and listcontainer response to + contain the correct prefix (#310, reva/#902) + + https://github.com/owncloud/ocis-reva/issues/310 + https://github.com/owncloud/ocis-reva/issues/294 + https://github.com/owncloud/ocis-reva/pull/320 + https://github.com/cs3org/reva/pull/902 + https://github.com/cs3org/reva/pull/904 + + +* Enhancement - Update reva to v0.1.1-0.20200701152626-2f6cc60e2f66: [#328](https://github.com/owncloud/ocis-reva/pull/328) + + - Update reva to v0.1.1-0.20200701152626-2f6cc60e2f66 (#328) - Use sync.Map on pool package + (reva/#909) - Use mutex instead of sync.Map (reva/#915) - Use gatewayProviders instead of + storageProviders on conn pool (reva/#916) - Add logic to ls and stat to process arbitrary + metadata keys (reva/#905) - Preliminary implementation of Set/UnsetArbitraryMetadata + (reva/#912) - Make datagateway forward headers (reva/#913, reva/#926) - Add option to cmd + upload to disable tus (reva/#911) - OCS Share Allow date-only expiration for public shares + (#288, reva/#918) - OCS Share Remove array from OCS Share update response (#252, reva/#919) - + OCS Share Implement GET request for single shares (#249, reva/#921) + + https://github.com/owncloud/ocis-reva/issues/288 + https://github.com/owncloud/ocis-reva/issues/252 + https://github.com/owncloud/ocis-reva/issues/249 + https://github.com/owncloud/ocis-reva/pull/328 + https://github.com/cs3org/reva/pull/909 + https://github.com/cs3org/reva/pull/915 + https://github.com/cs3org/reva/pull/916 + https://github.com/cs3org/reva/pull/905 + https://github.com/cs3org/reva/pull/912 + https://github.com/cs3org/reva/pull/913 + https://github.com/cs3org/reva/pull/926 + https://github.com/cs3org/reva/pull/911 + https://github.com/cs3org/reva/pull/918 + https://github.com/cs3org/reva/pull/919 + https://github.com/cs3org/reva/pull/921 + +# Changelog for [0.8.0] (2020-06-29) + +The following sections list the changes in ocis-reva 0.8.0. + +[0.8.0]: https://github.com/owncloud/ocis-reva/compare/v0.7.0...v0.8.0 + +## Summary + +* Enhancement - Update reva to v0.1.1-0.20200629131207-04298ea1c088: [#309](https://github.com/owncloud/ocis-reva/pull/309) + +## Details + +* Enhancement - Update reva to v0.1.1-0.20200629131207-04298ea1c088: [#309](https://github.com/owncloud/ocis-reva/pull/309) + + - Update reva to v0.1.1-0.20200629094927-e33d65230abc (#309) - Fix public link file share + (#278, reva/#895, reva/#900) - Delete public share (reva/#899) - Updated reva to + v0.1.1-0.20200629131207-04298ea1c088 (#313) + + https://github.com/owncloud/ocis-reva/issues/278 + https://github.com/owncloud/ocis-reva/pull/309 + https://github.com/cs3org/reva/pull/895 + https://github.com/cs3org/reva/pull/899 + https://github.com/cs3org/reva/pull/900 + https://github.com/owncloud/ocis-reva/pull/313 + +# Changelog for [0.7.0] (2020-06-26) + +The following sections list the changes in ocis-reva 0.7.0. + +[0.7.0]: https://github.com/owncloud/ocis-reva/compare/v0.6.0...v0.7.0 + +## Summary + +* Enhancement - Update reva to v0.1.1-0.20200626111234-e21c32db9614: [#261](https://github.com/owncloud/ocis-reva/pull/261) + +## Details + +* Enhancement - Update reva to v0.1.1-0.20200626111234-e21c32db9614: [#261](https://github.com/owncloud/ocis-reva/pull/261) + + - Updated reva to v0.1.1-0.20200626111234-e21c32db9614 (#304) - TUS upload support through + datagateway (#261, reva/#878, reva/#888) - Added support for differing metrics path for + Prometheus to Mentix (reva/#875) - More data exported by Mentix (reva/#881) - Implementation + of file operations in public folder shares (#49, #293, reva/#877) - Make httpclient trust + local certificates for now (reva/#880) - EOS homes are not configured with an enable-flag + anymore, but with a dedicated storage driver. We're using it now and adapted default configs of + storages (reva/#891, #304) + + https://github.com/owncloud/ocis-reva/issues/49 + https://github.com/owncloud/ocis-reva/issues/293 + https://github.com/owncloud/ocis-reva/issues/261 + https://github.com/owncloud/ocis-reva/pull/261 + https://github.com/cs3org/reva/pull/875 + https://github.com/cs3org/reva/pull/877 + https://github.com/cs3org/reva/pull/878 + https://github.com/cs3org/reva/pull/881 + https://github.com/cs3org/reva/pull/880 + https://github.com/cs3org/reva/pull/888 + https://github.com/owncloud/ocis-reva/pull/304 + https://github.com/cs3org/reva/pull/891 + +# Changelog for [0.6.0] (2020-06-24) + +The following sections list the changes in ocis-reva 0.6.0. + +[0.6.0]: https://github.com/owncloud/ocis-reva/compare/v0.5.0...v0.6.0 + +## Summary + +* Enhancement - Update reva to v0.1.1-0.20200624063447-db5e6635d5f0: [#279](https://github.com/owncloud/ocis-reva/pull/279) + +## Details + +* Enhancement - Update reva to v0.1.1-0.20200624063447-db5e6635d5f0: [#279](https://github.com/owncloud/ocis-reva/pull/279) + + - Updated reva to v0.1.1-0.20200624063447-db5e6635d5f0 (#279) - Local storage: URL-encode + file ids to ease integration with other microservices like WOPI (reva/#799) - Mentix fixes + (reva/#803, reva/#817) - OCDAV: fix returned timestamp format (#116, reva/#805) - OCM: add + default prefix (#814) - add the content-length header to the responses (reva/#816) - Deps: + clean (reva/#818) - Fix trashbin listing (#112, #253, #254, reva/#819) - Make the json + publicshare driver configurable (reva/#820) - TUS: Return metadata headers after direct + upload (ocis/#216, reva/#813) - Set mtime to storage after simple upload (#174, reva/#823, + reva/#841) - Configure grpc client to allow for insecure conns and skip server certificate + verification (reva/#825) - Deployment: simplify config with more default values + (reva/#826, reva/#837, reva/#843, reva/#848, reva/#842) - Separate local fs into home and + with home disabled (reva/#829) - Register reflection after other services (reva/#831) - + Refactor EOS fs (reva/#830) - Add ocs-share-permissions to the propfind response (#47, + reva/#836) - OCS: Properly read permissions when creating public link (reva/#852) - localfs: + make normalize return associated error (reva/#850) - EOS grpc driver (reva/#664) - OCS: Add + support for legacy public link arg publicUpload (reva/#853) - Add cache layer to user REST + package (reva/#849) - Meshdirectory: pass query params to selected provider (reva/#863) - + Pass etag in quotes from the fs layer (#269, reva/#866, reva/#867) - OCM: use refactored + cs3apis provider definition (reva/#864) + + https://github.com/owncloud/ocis-reva/issues/116 + https://github.com/owncloud/ocis-reva/issues/112 + https://github.com/owncloud/ocis-reva/issues/253 + https://github.com/owncloud/ocis-reva/issues/254 + https://github.com/owncloud/ocis/issues/216 + https://github.com/owncloud/ocis-reva/issues/174 + https://github.com/owncloud/ocis-reva/issues/47 + https://github.com/owncloud/ocis-reva/issues/269 + https://github.com/owncloud/ocis-reva/pull/279 + https://github.com/owncloud/cs3org/reva/pull/799 + https://github.com/owncloud/cs3org/reva/pull/803 + https://github.com/owncloud/cs3org/reva/pull/817 + https://github.com/owncloud/cs3org/reva/pull/805 + https://github.com/owncloud/cs3org/reva/pull/814 + https://github.com/owncloud/cs3org/reva/pull/816 + https://github.com/owncloud/cs3org/reva/pull/818 + https://github.com/owncloud/cs3org/reva/pull/819 + https://github.com/owncloud/cs3org/reva/pull/820 + https://github.com/owncloud/cs3org/reva/pull/823 + https://github.com/owncloud/cs3org/reva/pull/841 + https://github.com/owncloud/cs3org/reva/pull/813 + https://github.com/owncloud/cs3org/reva/pull/825 + https://github.com/owncloud/cs3org/reva/pull/826 + https://github.com/owncloud/cs3org/reva/pull/837 + https://github.com/owncloud/cs3org/reva/pull/843 + https://github.com/owncloud/cs3org/reva/pull/848 + https://github.com/owncloud/cs3org/reva/pull/842 + https://github.com/owncloud/cs3org/reva/pull/829 + https://github.com/owncloud/cs3org/reva/pull/831 + https://github.com/owncloud/cs3org/reva/pull/830 + https://github.com/owncloud/cs3org/reva/pull/836 + https://github.com/owncloud/cs3org/reva/pull/852 + https://github.com/owncloud/cs3org/reva/pull/850 + https://github.com/owncloud/cs3org/reva/pull/664 + https://github.com/owncloud/cs3org/reva/pull/853 + https://github.com/owncloud/cs3org/reva/pull/849 + https://github.com/owncloud/cs3org/reva/pull/863 + https://github.com/owncloud/cs3org/reva/pull/866 + https://github.com/owncloud/cs3org/reva/pull/867 + https://github.com/owncloud/cs3org/reva/pull/864 + +# Changelog for [0.5.0] (2020-06-04) + +The following sections list the changes in ocis-reva 0.5.0. + +[0.5.0]: https://github.com/owncloud/ocis-reva/compare/v0.4.0...v0.5.0 + +## Summary + +* Enhancement - Add TUS global capability: [#177](https://github.com/owncloud/ocis-reva/issues/177) +* Enhancement - Update reva to v0.1.1-0.20200603071553-e05a87521618: [#244](https://github.com/owncloud/ocis-reva/issues/244) + +## Details + +* Enhancement - Add TUS global capability: [#177](https://github.com/owncloud/ocis-reva/issues/177) + + The TUS global capabilities from Reva are now exposed. + + The advertised max chunk size can be configured using the "--upload-max-chunk-size" CLI + switch or "REVA_FRONTEND_UPLOAD_MAX_CHUNK_SIZE" environment variable. The advertised + http method override can be configured using the "--upload-http-method-override" CLI + switch or "REVA_FRONTEND_UPLOAD_HTTP_METHOD_OVERRIDE" environment variable. + + https://github.com/owncloud/ocis-reva/issues/177 + https://github.com/owncloud/ocis-reva/pull/228 + + +* Enhancement - Update reva to v0.1.1-0.20200603071553-e05a87521618: [#244](https://github.com/owncloud/ocis-reva/issues/244) + + - Updated reva to v0.1.1-0.20200603071553-e05a87521618 (#244) - Add option to disable TUS on + OC layer (#177, reva/#791) - Dataprovider now supports method override (#177, reva/#792) - + OCS fixes for create public link (reva/#798) + + https://github.com/owncloud/ocis-reva/issues/244 + https://github.com/owncloud/ocis-reva/issues/177 + https://github.com/cs3org/reva/pull/791 + https://github.com/cs3org/reva/pull/792 + https://github.com/cs3org/reva/pull/798 + +# Changelog for [0.4.0] (2020-05-29) + +The following sections list the changes in ocis-reva 0.4.0. + +[0.4.0]: https://github.com/owncloud/ocis-reva/compare/v0.3.0...v0.4.0 + +## Summary + +* Enhancement - Add public shares service: [#49](https://github.com/owncloud/ocis-reva/issues/49) +* Enhancement - Update reva to v0.1.1-0.20200529120551-4f2d9c85d3c9: [#49](https://github.com/owncloud/ocis-reva/issues/49) + +## Details + +* Enhancement - Add public shares service: [#49](https://github.com/owncloud/ocis-reva/issues/49) + + Added Public Shares service with CRUD operations and File Public Shares Manager + + https://github.com/owncloud/ocis-reva/issues/49 + https://github.com/owncloud/ocis-reva/pull/232 + + +* Enhancement - Update reva to v0.1.1-0.20200529120551-4f2d9c85d3c9: [#49](https://github.com/owncloud/ocis-reva/issues/49) + + - Updated reva to v0.1.1-0.20200529120551 (#232) - Public Shares CRUD, File Public Shares + Manager (#49, #232, reva/#681, reva/#788) - Disable HTTP-KeepAlives to reduce fd count + (ocis/#268, reva/#787) - Fix trashbin listing (#229, reva/#782) - Create PUT wrapper for TUS + uploads (reva/#770) - Add security access headers for ocdav requests (#66, reva/#780) - Add + option to revad cmd to specify logging level (reva/#772) - New metrics package (reva/#740) - + Remove implicit data member from memory store (reva/#774) - Added TUS global capabilities + (#177, reva/#775) - Fix PROPFIND with Depth 1 for cross-storage operations (reva/#779) + + https://github.com/owncloud/ocis-reva/issues/49 + https://github.com/owncloud/ocis-reva/issues/229 + https://github.com/owncloud/ocis-reva/issues/66 + https://github.com/owncloud/ocis-reva/issues/177 + https://github.com/owncloud/ocis/issues/268 + https://github.com/owncloud/ocis-reva/pull/232 + https://github.com/cs3org/reva/pull/787 + https://github.com/cs3org/reva/pull/681 + https://github.com/cs3org/reva/pull/788 + https://github.com/cs3org/reva/pull/782 + https://github.com/cs3org/reva/pull/770 + https://github.com/cs3org/reva/pull/780 + https://github.com/cs3org/reva/pull/772 + https://github.com/cs3org/reva/pull/740 + https://github.com/cs3org/reva/pull/774 + https://github.com/cs3org/reva/pull/775 + https://github.com/cs3org/reva/pull/779 + +# Changelog for [0.3.0] (2020-05-20) + +The following sections list the changes in ocis-reva 0.3.0. + +[0.3.0]: https://github.com/owncloud/ocis-reva/compare/v0.2.1...v0.3.0 + +## Summary + +* Enhancement - Update reva to v0.1.1-0.20200520150229: [#161](https://github.com/owncloud/ocis-reva/pull/161) + +## Details + +* Enhancement - Update reva to v0.1.1-0.20200520150229: [#161](https://github.com/owncloud/ocis-reva/pull/161) + + - Update reva to v0.1.1-0.20200520150229 (#161, #180, #192, #207, #221) - Return arbitrary + metadata with stat, upload without TUS (reva/#766) - Stat file before returning datagateway + URL when initiating download (reva/#765) - REST driver for user package (reva/#747) - Sharing + behavior now consistent with the old backend (#20, #26, #43, #44, #46, #94 ,reva/#748) - Mentix + service (reva/#755) - meshdirectory: add mentix driver for gocdb sites integration + (reva/#754) - Add functionality to commit to storage for OCM shares (reva/#760) - Add option in + config to disable tus (reva/#759) - ocdav: fix custom property XML parsing in PROPPATCH + handler (#203, reva/#743) - ocdav: fix PROPPATCH response for removed properties (#186, + reva/#742) - ocdav: implement PROPFIND infinity depth (#212, reva/#758) - Local fs: Allow + setting of arbitrary metadata, minor bug fixes (reva/#764) - Local fs: metadata handling and + share persistence (reva/#732) - Local fs: return file owner info in stat (reva/#750) - Fixed + regression when uploading empty files to OCFS or EOS with PUT and TUS (#188, reva/#734) - On + delete move the file versions to the trashbin (#94, reva/#731) - Fix OCFS move operation (#182, + reva/#729) - Fix OCFS custom property / xattr removal (reva/#728) - Retry trashbin in case of + timestamp collision (reva/#730) - Disable chunking v1 by default (reva/#678) - Implement ocs + to http status code mapping (#26, reva/#696, reva/#707, reva/#711) - Handle the case if + directory already exists (reva/#695) - Added TUS upload support (reva/#674, reva/#725, + reva/#717) - Always return file sizes in Webdav PROPFIND (reva/#712) - Use default mime type + when none was detected (reva/#713) - Fixed Webdav shallow COPY (reva/#714) - Fixed arbitrary + namespace usage for custom properties in PROPFIND (#57, reva/#720) - Implement returning + Webdav custom properties from xattr (#57, reva/#721) - Minor fix in OCM share pkg (reva/#718) + + https://github.com/owncloud/ocis-reva/issues/20 + https://github.com/owncloud/ocis-reva/issues/26 + https://github.com/owncloud/ocis-reva/issues/43 + https://github.com/owncloud/ocis-reva/issues/44 + https://github.com/owncloud/ocis-reva/issues/46 + https://github.com/owncloud/ocis-reva/issues/94 + https://github.com/owncloud/ocis-reva/issues/26 + https://github.com/owncloud/ocis-reva/issues/67 + https://github.com/owncloud/ocis-reva/issues/57 + https://github.com/owncloud/ocis-reva/issues/94 + https://github.com/owncloud/ocis-reva/issues/188 + https://github.com/owncloud/ocis-reva/issues/182 + https://github.com/owncloud/ocis-reva/issues/212 + https://github.com/owncloud/ocis-reva/issues/186 + https://github.com/owncloud/ocis-reva/issues/203 + https://github.com/owncloud/ocis-reva/pull/161 + https://github.com/owncloud/ocis-reva/pull/180 + https://github.com/owncloud/ocis-reva/pull/192 + https://github.com/owncloud/ocis-reva/pull/207 + https://github.com/owncloud/ocis-reva/pull/221 + https://github.com/cs3org/reva/pull/766 + https://github.com/cs3org/reva/pull/765 + https://github.com/cs3org/reva/pull/755 + https://github.com/cs3org/reva/pull/754 + https://github.com/cs3org/reva/pull/747 + https://github.com/cs3org/reva/pull/748 + https://github.com/cs3org/reva/pull/760 + https://github.com/cs3org/reva/pull/759 + https://github.com/cs3org/reva/pull/678 + https://github.com/cs3org/reva/pull/696 + https://github.com/cs3org/reva/pull/707 + https://github.com/cs3org/reva/pull/711 + https://github.com/cs3org/reva/pull/695 + https://github.com/cs3org/reva/pull/674 + https://github.com/cs3org/reva/pull/725 + https://github.com/cs3org/reva/pull/717 + https://github.com/cs3org/reva/pull/712 + https://github.com/cs3org/reva/pull/713 + https://github.com/cs3org/reva/pull/720 + https://github.com/cs3org/reva/pull/718 + https://github.com/cs3org/reva/pull/731 + https://github.com/cs3org/reva/pull/734 + https://github.com/cs3org/reva/pull/729 + https://github.com/cs3org/reva/pull/728 + https://github.com/cs3org/reva/pull/730 + https://github.com/cs3org/reva/pull/758 + https://github.com/cs3org/reva/pull/742 + https://github.com/cs3org/reva/pull/764 + https://github.com/cs3org/reva/pull/743 + https://github.com/cs3org/reva/pull/732 + https://github.com/cs3org/reva/pull/750 + +# Changelog for [0.2.1] (2020-04-28) + +The following sections list the changes in ocis-reva 0.2.1. + +[0.2.1]: https://github.com/owncloud/ocis-reva/compare/v0.2.0...v0.2.1 + +## Summary + +* Bugfix - Stop advertising unsupported chunking v2: [#145](https://github.com/owncloud/ocis-reva/pull/145) +* Enhancement - Allow configuring the gateway for dataproviders: [#136](https://github.com/owncloud/ocis-reva/pull/136) +* Enhancement - Use a configured logger on reva runtime: [#153](https://github.com/owncloud/ocis-reva/pull/153) + +## Details + +* Bugfix - Stop advertising unsupported chunking v2: [#145](https://github.com/owncloud/ocis-reva/pull/145) + + Removed "chunking" attribute in the DAV capabilities. Please note that chunking v2 is + advertised as "chunking 1.0" while chunking v1 is the attribute "bigfilechunking" which is + already false. + + https://github.com/owncloud/ocis-reva/pull/145 + + +* Enhancement - Allow configuring the gateway for dataproviders: [#136](https://github.com/owncloud/ocis-reva/pull/136) + + This allows using basic or bearer auth when directly talking to dataproviders. + + https://github.com/owncloud/ocis-reva/pull/136 + + +* Enhancement - Use a configured logger on reva runtime: [#153](https://github.com/owncloud/ocis-reva/pull/153) + + For consistency reasons we need a configured logger that is inline with an ocis logger, so the + log cascade can be easily parsed by a human. + + https://github.com/owncloud/ocis-reva/pull/153 + +# Changelog for [0.2.0] (2020-04-15) + +The following sections list the changes in ocis-reva 0.2.0. + +[0.2.0]: https://github.com/owncloud/ocis-reva/compare/v0.1.1...v0.2.0 + +## Summary + +* Bugfix - Fix eos user sharing config: [#127](https://github.com/owncloud/ocis-reva/pull/127) +* Enhancement - Update reva to v1.1.0-20200414133413: [#127](https://github.com/owncloud/ocis-reva/pull/127) + +## Details + +* Bugfix - Fix eos user sharing config: [#127](https://github.com/owncloud/ocis-reva/pull/127) + + We have added missing config options for the user sharing manager and added a dedicated eos + storage command with pre configured settings for the eos-docker container. It configures a + `Shares` folder in a users home when using eos as the storage driver. + + https://github.com/owncloud/ocis-reva/pull/127 + + +* Enhancement - Update reva to v1.1.0-20200414133413: [#127](https://github.com/owncloud/ocis-reva/pull/127) + + Adds initial public sharing and ocm implementation. + + https://github.com/owncloud/ocis-reva/pull/127 + +# Changelog for [0.1.1] (2020-03-31) + +The following sections list the changes in ocis-reva 0.1.1. + +[0.1.1]: https://github.com/owncloud/ocis-reva/compare/v0.1.0...v0.1.1 + +## Summary + +* Bugfix - Fix eos config: [#125](https://github.com/owncloud/ocis-reva/pull/125) + +## Details + +* Bugfix - Fix eos config: [#125](https://github.com/owncloud/ocis-reva/pull/125) + + We have added missing config options for the home layout to the config struct that is passed to + eos. + + https://github.com/owncloud/ocis-reva/pull/125 + +# Changelog for [0.1.0] (2020-03-23) + +The following sections list the changes in ocis-reva 0.1.0. + +[0.1.0]: https://github.com/owncloud/ocis-reva/compare/6702be7f9045a382d40691a9bcd04f572203e9ed...v0.1.0 + +## Summary + +* Bugfix - Set correct flag type in the flagsets: [#75](https://github.com/owncloud/ocis-reva/issues/75) +* Bugfix - We fixed a typo in the `REVA_LDAP_SCHEMA_MAIL` environment variable: [#113](https://github.com/owncloud/ocis-reva/pull/113) +* Bugfix - Allow different namespaces for /webdav and /dav/files: [#68](https://github.com/owncloud/ocis-reva/pull/68) +* Change - Use /home as default namespace: [#68](https://github.com/owncloud/ocis-reva/pull/68) +* Change - Initial release of basic version: [#1](https://github.com/owncloud/ocis-reva/issues/1) +* Change - Start multiple services with dedicated commands: [#6](https://github.com/owncloud/ocis-reva/issues/6) +* Change - Storage providers now default to exposing data servers: [#89](https://github.com/owncloud/ocis-reva/issues/89) +* Change - Default to running behind ocis-proxy: [#113](https://github.com/owncloud/ocis-reva/pull/113) +* Enhancement - Expose owncloud storage driver config in flagset: [#87](https://github.com/owncloud/ocis-reva/issues/87) +* Enhancement - Update reva to v0.0.2-0.20200212114015-0dbce24f7e8b: [#91](https://github.com/owncloud/ocis-reva/pull/91) +* Enhancement - Allow configuring user sharing driver: [#115](https://github.com/owncloud/ocis-reva/pull/115) + +## Details + +* Bugfix - Set correct flag type in the flagsets: [#75](https://github.com/owncloud/ocis-reva/issues/75) + + While upgrading to the micro/cli version 2 there where two instances of `StringFlag` which had + not been changed to `StringSliceFlag`. This caused `ocis-reva users` and `ocis-reva + storage-root` to fail on startup. + + https://github.com/owncloud/ocis-reva/issues/75 + https://github.com/owncloud/ocis-reva/pull/76 + + +* Bugfix - We fixed a typo in the `REVA_LDAP_SCHEMA_MAIL` environment variable: [#113](https://github.com/owncloud/ocis-reva/pull/113) + + It was misspelled as `REVA_LDAP_SCHEMA_Mail`. + + https://github.com/owncloud/ocis-reva/pull/113 + + +* Bugfix - Allow different namespaces for /webdav and /dav/files: [#68](https://github.com/owncloud/ocis-reva/pull/68) + + After fbf131c the path for the "new" webdav path does not contain a username + `/remote.php/dav/files/textfile0.txt`. It used to be + `/remote.php/dav/files/oc/einstein/textfile0.txt` So it lost `oc/einstein`. + + This PR allows setting up different namespaces for `/webav` and `/dav/files`: + + `/webdav` is jailed into `/home` - which uses the home storage driver and uses the logged in user + to construct the path `/dav/files` is jailed into `/oc` - which uses the owncloud storage + driver and expects a username as the first path segment + + This mimics oc10 + + The `WEBDAV_NAMESPACE_JAIL` environment variable is split into - `WEBDAV_NAMESPACE` and - + `DAV_FILES_NAMESPACE` accordingly. + + https://github.com/owncloud/ocis-reva/pull/68 + related: + + +* Change - Use /home as default namespace: [#68](https://github.com/owncloud/ocis-reva/pull/68) + + Currently, cross storage etag propagation is not yet implemented, which prevents the desktop + client from detecting changes via the PROPFIND to /. / is managed by the root storage provider + which is independend of the home and oc storage providers. If a file changes in /home/foo, the + etag change will only be propagated to the root of the home storage provider. + + This change jails users into the `/home` namespace, and allows configuring the namespace to + use for the two webdav endpoints using the new environment variable `WEBDAV_NAMESPACE_JAIL` + which affects both endpoints `/dav/files` and `/webdav`. + + This will allow us to focus on getting a single storage driver like eos or owncloud tested and + better resembles what owncloud 10 does. + + To get back the global namespace, which ultimately is the goal, just set the above environment + variable to `/`. + + https://github.com/owncloud/ocis-reva/pull/68 + + +* Change - Initial release of basic version: [#1](https://github.com/owncloud/ocis-reva/issues/1) + + Just prepared an initial basic version to start a reva server and start integrating with the + go-micro base dextension framework of ownCloud Infinite Scale. + + https://github.com/owncloud/ocis-reva/issues/1 + + +* Change - Start multiple services with dedicated commands: [#6](https://github.com/owncloud/ocis-reva/issues/6) + + The initial version would only allow us to use a set of reva configurations to start multiple + services. We use a more opinionated set of commands to start dedicated services that allows us + to configure them individually. It allows us to switch eg. the user backend to LDAP and fully use + it on the cli. + + https://github.com/owncloud/ocis-reva/issues/6 + + +* Change - Storage providers now default to exposing data servers: [#89](https://github.com/owncloud/ocis-reva/issues/89) + + The flags that let reva storage providers announce that they expose a data server now defaults + to true: + + `REVA_STORAGE_HOME_EXPOSE_DATA_SERVER=1` `REVA_STORAGE_OC_EXPOSE_DATA_SERVER=1` + + https://github.com/owncloud/ocis-reva/issues/89 + + +* Change - Default to running behind ocis-proxy: [#113](https://github.com/owncloud/ocis-reva/pull/113) + + We changed the default configuration to integrate better with ocis. + + - We use ocis-glauth as the default ldap server on port 9125 with base `dc=example,dc=org`. - We + use a dedicated technical `reva` user to make ldap binds - Clients are supposed to use the + ocis-proxy endpoint `https://localhost:9200` - We removed unneeded ocis configuration + from the frontend which no longer serves an oidc provider. - We changed the default user + OpaqueID attribute from `sub` to `preferred_username`. The latter is a claim populated by + konnectd that can also be used by the reva ldap user manager to look up users by their OpaqueId + + https://github.com/owncloud/ocis-reva/pull/113 + + +* Enhancement - Expose owncloud storage driver config in flagset: [#87](https://github.com/owncloud/ocis-reva/issues/87) + + Three new flags are now available: + + - scan files on startup to generate missing fileids default: `true` env var: + `REVA_STORAGE_OWNCLOUD_SCAN` cli option: `--storage-owncloud-scan` + + - autocreate home path for new users default: `true` env var: + `REVA_STORAGE_OWNCLOUD_AUTOCREATE` cli option: `--storage-owncloud-autocreate` + + - the address of the redis server default: `:6379` env var: + `REVA_STORAGE_OWNCLOUD_REDIS_ADDR` cli option: `--storage-owncloud-redis` + + https://github.com/owncloud/ocis-reva/issues/87 + + +* Enhancement - Update reva to v0.0.2-0.20200212114015-0dbce24f7e8b: [#91](https://github.com/owncloud/ocis-reva/pull/91) + + Reva has seen a lot of changes that allow us to - reduce the configuration overhead - use the + autocreato home folder option - use the home folder path layout option - no longer start the root + storage + + https://github.com/owncloud/ocis-reva/pull/91 + related: + + +* Enhancement - Allow configuring user sharing driver: [#115](https://github.com/owncloud/ocis-reva/pull/115) + + We now default to `json` which persists shares in the sharing manager in a json file instead of an + in memory db. + + https://github.com/owncloud/ocis-reva/pull/115 + diff --git a/reva/LICENSE b/reva/LICENSE new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/reva/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/reva/Makefile b/reva/Makefile new file mode 100644 index 0000000000..3f90d955f2 --- /dev/null +++ b/reva/Makefile @@ -0,0 +1,179 @@ +SHELL := bash +NAME := ocis-reva +IMPORT := github.com/owncloud/$(NAME) +BIN := bin +DIST := dist +HUGO := hugo + +ifeq ($(OS), Windows_NT) + EXECUTABLE := $(NAME).exe + UNAME := Windows +else + EXECUTABLE := $(NAME) + UNAME := $(shell uname -s) +endif + +ifeq ($(UNAME), Darwin) + GOBUILD ?= go build -i +else + GOBUILD ?= go build +endif + +PACKAGES ?= $(shell go list ./...) +SOURCES ?= $(shell find . -name "*.go" -type f -not -path "./node_modules/*") +GENERATE ?= $(PACKAGES) + +TAGS ?= + +ifndef OUTPUT + ifneq ($(DRONE_TAG),) + OUTPUT ?= $(subst v,,$(DRONE_TAG)) + else + OUTPUT ?= testing + endif +endif + +ifndef VERSION + ifneq ($(DRONE_TAG),) + VERSION ?= $(subst v,,$(DRONE_TAG)) + else + VERSION ?= $(shell git rev-parse --short HEAD) + endif +endif + +ifndef DATE + DATE := $(shell date -u '+%Y%m%d') +endif + +LDFLAGS += -s -w -X "$(IMPORT)/pkg/version.String=$(VERSION)" -X "$(IMPORT)/pkg/version.Date=$(DATE)" +DEBUG_LDFLAGS += -X "$(IMPORT)/pkg/version.String=$(VERSION)" -X "$(IMPORT)/pkg/version.Date=$(DATE)" + +GCFLAGS += all=-N -l + +.PHONY: all +all: build + +.PHONY: sync +sync: + go mod download + +.PHONY: clean +clean: + go clean -i ./... + rm -rf $(BIN) $(DIST) $(HUGO) + +.PHONY: fmt +fmt: + gofmt -s -w $(SOURCES) + +.PHONY: vet +vet: + go vet $(PACKAGES) + +.PHONY: staticcheck +staticcheck: + go run honnef.co/go/tools/cmd/staticcheck -tags '$(TAGS)' $(PACKAGES) + +.PHONY: lint +lint: + for PKG in $(PACKAGES); do go run golang.org/x/lint/golint -set_exit_status $$PKG || exit 1; done; + +.PHONY: generate +generate: + go generate $(GENERATE) + +.PHONY: changelog +changelog: + go run github.com/restic/calens >| CHANGELOG.md + +.PHONY: test +test: + go run github.com/haya14busa/goverage -v -coverprofile coverage.out $(PACKAGES) + +.PHONY: install +install: $(SOURCES) + go install -v -tags '$(TAGS)' -ldflags '$(LDFLAGS)' ./cmd/$(NAME) + +.PHONY: build +build: $(BIN)/$(EXECUTABLE) $(BIN)/$(EXECUTABLE)-debug + +$(BIN)/$(EXECUTABLE): $(SOURCES) + $(GOBUILD) -v -tags '$(TAGS)' -ldflags '$(LDFLAGS)' -o $@ ./cmd/$(NAME) + +$(BIN)/$(EXECUTABLE)-debug: $(SOURCES) + $(GOBUILD) -v -tags '$(TAGS)' -ldflags '$(DEBUG_LDFLAGS)' -gcflags '$(GCFLAGS)' -o $@ ./cmd/$(NAME) + +.PHONY: release +release: release-dirs release-linux release-windows release-darwin release-copy release-check + +.PHONY: release-dirs +release-dirs: + mkdir -p $(DIST)/binaries $(DIST)/release + +.PHONY: release-linux +release-linux: release-dirs + go run github.com/mitchellh/gox -tags 'netgo $(TAGS)' -ldflags '-extldflags "-static" $(LDFLAGS)' -os 'linux' -arch 'amd64 386 arm64 arm' -output '$(DIST)/binaries/$(EXECUTABLE)-$(OUTPUT)-{{.OS}}-{{.Arch}}' ./cmd/$(NAME) + +.PHONY: release-windows +release-windows: release-dirs + go run github.com/mitchellh/gox -tags 'netgo $(TAGS)' -ldflags '-extldflags "-static" $(LDFLAGS)' -os 'windows' -arch 'amd64' -output '$(DIST)/binaries/$(EXECUTABLE)-$(OUTPUT)-{{.OS}}-{{.Arch}}' ./cmd/$(NAME) + +.PHONY: release-darwin +release-darwin: release-dirs + go run github.com/mitchellh/gox -tags 'netgo $(TAGS)' -ldflags '$(LDFLAGS)' -os 'darwin' -arch 'amd64' -output '$(DIST)/binaries/$(EXECUTABLE)-$(OUTPUT)-{{.OS}}-{{.Arch}}' ./cmd/$(NAME) + +.PHONY: release-copy +release-copy: + $(foreach file,$(wildcard $(DIST)/binaries/$(EXECUTABLE)-*),cp $(file) $(DIST)/release/$(notdir $(file));) + +.PHONY: release-check +release-check: + cd $(DIST)/release; $(foreach file,$(wildcard $(DIST)/release/$(EXECUTABLE)-*),sha256sum $(notdir $(file)) > $(notdir $(file)).sha256;) + +.PHONY: release-finish +release-finish: release-copy release-check + +.PHONY: docs-copy +docs-copy: + mkdir -p $(HUGO); \ + mkdir -p $(HUGO)/content/extensions; \ + cd $(HUGO); \ + git init; \ + git remote rm origin; \ + git remote add origin https://github.com/owncloud/owncloud.github.io; \ + git fetch; \ + git checkout origin/source -f; \ + rsync --delete -ax ../docs/ content/extensions/$(NAME) + +.PHONY: config-docs-generate +config-docs-generate: + go run github.com/owncloud/flaex >| docs/configuration.md + +.PHONY: docs-build +docs-build: + cd $(HUGO); hugo + +.PHONY: docs +docs: config-docs-generate docs-copy docs-build + +.PHONY: watch +watch: + go run github.com/cespare/reflex -c reflex.conf + +BEHAT_BIN=vendor-bin/behat/vendor/bin/behat + +.PHONY: test-acceptance-api +test-acceptance-api: vendor-bin/behat/vendor + BEHAT_BIN=$(BEHAT_BIN) $(PATH_TO_CORE)/tests/acceptance/run.sh --remote --type api + +vendor/bamarni/composer-bin-plugin: composer.lock + composer install + +vendor-bin/behat/vendor: vendor/bamarni/composer-bin-plugin vendor-bin/behat/composer.lock + composer bin behat install --no-progress + +vendor-bin/behat/composer.lock: vendor-bin/behat/composer.json + @echo behat composer.lock is not up to date. + +composer.lock: composer.json + @echo composer.lock is not up to date. diff --git a/reva/README.md b/reva/README.md new file mode 100644 index 0000000000..fe8880ae3f --- /dev/null +++ b/reva/README.md @@ -0,0 +1,86 @@ +# ownCloud Infinite Scale: Reva + +[![Build Status](https://cloud.drone.io/api/badges/owncloud/ocis-reva/status.svg)](https://cloud.drone.io/owncloud/ocis-reva) +[![Gitter chat](https://badges.gitter.im/cs3org/reva.svg)](https://gitter.im/cs3org/reva) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/6f1eaaa399294d959ef7b3b10deed41d)](https://www.codacy.com/manual/owncloud/ocis-reva?utm_source=github.com&utm_medium=referral&utm_content=owncloud/ocis-reva&utm_campaign=Badge_Grade) +[![Go Doc](https://godoc.org/github.com/owncloud/ocis-reva?status.svg)](http://godoc.org/github.com/owncloud/ocis-reva) +[![Go Report](http://goreportcard.com/badge/github.com/owncloud/ocis-reva)](http://goreportcard.com/report/github.com/owncloud/ocis-reva) +[![](https://images.microbadger.com/badges/image/owncloud/ocis-reva.svg)](http://microbadger.com/images/owncloud/ocis-reva "Get your own image badge on microbadger.com") + +**This project is under heavy development, it's not in a working state yet!** + +## Install + +You can download prebuilt binaries from the GitHub releases or from our [download mirrors](http://download.owncloud.com/ocis/reva/). For instructions how to install this on your platform you should take a look at our [documentation](https://owncloud.github.io/extensions/ocis_reva/) + +## Development + +Make sure you have a working Go environment, for further reference or a guide take a look at the [install instructions](http://golang.org/doc/install.html). + +```console +git clone https://github.com/owncloud/ocis-reva.git +cd ocis-reva + +make generate build + +./bin/ocis-reva -h +``` + +To run a demo installation you can use the preconfigured defaults and start all necessary services: +``` +export REVA_USERS_DRIVER=demo + +bin/ocis-reva frontend & \ +bin/ocis-reva gateway & \ +bin/ocis-reva users & \ +bin/ocis-reva auth-basic & \ +bin/ocis-reva auth-bearer & \ +bin/ocis-reva sharing & \ +bin/ocis-reva storage-root & \ +bin/ocis-reva storage-home & \ +bin/ocis-reva storage-home-data & \ +bin/ocis-reva storage-oc & \ +bin/ocis-reva storage-oc-data +``` + +The root storage serves the available namespaces from disk using the local storage driver. In order to be able to navigate into the `/home` and `/oc` storage providers you have to create these directories: +``` +mkdir /var/tmp/reva/root/home +mkdir /var/tmp/reva/root/oc +``` + +Note: the owncloud storage driver currently requires a redis server running on the local machine. + +You should now be able to get a file listing of a users home using +``` +curl -X PROPFIND http://localhost:9140/remote.php/dav/files/ -v -u einstein:relativity +``` + +## Users + +The default config uses the demo user backend, which contains three users: +``` +einstein:relativity +marie:radioactivty +richard:superfluidity +``` + +For details on the `json` and `ldap` backends see the [documentation](https://owncloud.github.io/extensions/ocis_reva/users/) + +## Security + +If you find a security issue please contact security@owncloud.com first. + +## Contributing + +Fork -> Patch -> Push -> Pull Request + +## License + +Apache-2.0 + +## Copyright + +```console +Copyright (c) 2019 ownCloud GmbH +``` diff --git a/reva/changelog/0.1.0_2020-03-23/76.md b/reva/changelog/0.1.0_2020-03-23/76.md new file mode 100644 index 0000000000..d32828f762 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/76.md @@ -0,0 +1,8 @@ +Bugfix: set correct flag type in the flagsets + +While upgrading to the micro/cli version 2 there where two instances of `StringFlag` +which had not been changed to `StringSliceFlag`. +This caused `ocis-reva users` and `ocis-reva storage-root` to fail on startup. + +https://github.com/owncloud/ocis-reva/issues/75 +https://github.com/owncloud/ocis-reva/pull/76 diff --git a/reva/changelog/0.1.0_2020-03-23/change-default-namespace.md b/reva/changelog/0.1.0_2020-03-23/change-default-namespace.md new file mode 100755 index 0000000000..c8f0625ec9 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/change-default-namespace.md @@ -0,0 +1,11 @@ +Change: use /home as default namespace + +Currently, cross storage etag propagation is not yet implemented, which prevents the desktop client from detecting changes via the PROPFIND to /. / is managed by the root storage provider which is independend of the home and oc storage providers. If a file changes in /home/foo, the etag change will only be propagated to the root of the home storage provider. + +This change jails users into the `/home` namespace, and allows configuring the namespace to use for the two webdav endpoints using the new environment variable `WEBDAV_NAMESPACE_JAIL` which affects both endpoints `/dav/files` and `/webdav`. + +This will allow us to focus on getting a single storage driver like eos or owncloud tested and better resembles what owncloud 10 does. + +To get back the global namespace, which ultimately is the goal, just set the above environment variable to `/`. + +https://github.com/owncloud/ocis-reva/pull/68 diff --git a/reva/changelog/0.1.0_2020-03-23/fix-typos.md b/reva/changelog/0.1.0_2020-03-23/fix-typos.md new file mode 100644 index 0000000000..c971099dd1 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/fix-typos.md @@ -0,0 +1,5 @@ +Bugfix: we fixed a typo in the `REVA_LDAP_SCHEMA_MAIL` environment variable + +It was misspelled as `REVA_LDAP_SCHEMA_Mail`. + +https://github.com/owncloud/ocis-reva/pull/113 \ No newline at end of file diff --git a/reva/changelog/0.1.0_2020-03-23/initial-release.md b/reva/changelog/0.1.0_2020-03-23/initial-release.md new file mode 100644 index 0000000000..d45d4408a4 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/initial-release.md @@ -0,0 +1,5 @@ +Change: Initial release of basic version + +Just prepared an initial basic version to start a reva server and start integrating with the go-micro base dextension framework of ownCloud Infinite Scale. + +https://github.com/owncloud/ocis-reva/issues/1 diff --git a/reva/changelog/0.1.0_2020-03-23/issue-6.md b/reva/changelog/0.1.0_2020-03-23/issue-6.md new file mode 100644 index 0000000000..567c4b3c96 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/issue-6.md @@ -0,0 +1,7 @@ +Change: start multiple services with dedicated commands + +The initial version would only allow us to use a set of reva configurations to start multiple services. +We use a more opinionated set of commands to start dedicated services that allows us to configure them individually. +It allows us to switch eg. the user backend to LDAP and fully use it on the cli. + +https://github.com/owncloud/ocis-reva/issues/6 \ No newline at end of file diff --git a/reva/changelog/0.1.0_2020-03-23/issue-87.md b/reva/changelog/0.1.0_2020-03-23/issue-87.md new file mode 100644 index 0000000000..61d2a5b6f3 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/issue-87.md @@ -0,0 +1,20 @@ +Enhancement: expose owncloud storage driver config in flagset + +Three new flags are now available: + +- scan files on startup to generate missing fileids + default: `true` + env var: `REVA_STORAGE_OWNCLOUD_SCAN` + cli option: `--storage-owncloud-scan` + +- autocreate home path for new users + default: `true` + env var: `REVA_STORAGE_OWNCLOUD_AUTOCREATE` + cli option: `--storage-owncloud-autocreate` + +- the address of the redis server + default: `:6379` + env var: `REVA_STORAGE_OWNCLOUD_REDIS_ADDR` + cli option: `--storage-owncloud-redis` + +https://github.com/owncloud/ocis-reva/issues/87 \ No newline at end of file diff --git a/reva/changelog/0.1.0_2020-03-23/issue-89.md b/reva/changelog/0.1.0_2020-03-23/issue-89.md new file mode 100644 index 0000000000..7631234735 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/issue-89.md @@ -0,0 +1,8 @@ +Change: storage providers now default to exposing data servers + +The flags that let reva storage providers announce that they expose a data server now defaults to true: + +`REVA_STORAGE_HOME_EXPOSE_DATA_SERVER=1` +`REVA_STORAGE_OC_EXPOSE_DATA_SERVER=1` + +https://github.com/owncloud/ocis-reva/issues/89 \ No newline at end of file diff --git a/reva/changelog/0.1.0_2020-03-23/new-ocis-config.md b/reva/changelog/0.1.0_2020-03-23/new-ocis-config.md new file mode 100644 index 0000000000..f703146a82 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/new-ocis-config.md @@ -0,0 +1,11 @@ +Change: default to running behind ocis-proxy + +We changed the default configuration to integrate better with ocis. + +- We use ocis-glauth as the default ldap server on port 9125 with base `dc=example,dc=org`. +- We use a dedicated technical `reva` user to make ldap binds +- Clients are supposed to use the ocis-proxy endpoint `https://localhost:9200` +- We removed unneeded ocis configuration from the frontend which no longer serves an oidc provider. +- We changed the default user OpaqueID attribute from `sub` to `preferred_username`. The latter is a claim populated by konnectd that can also be used by the reva ldap user manager to look up users by their OpaqueId + +https://github.com/owncloud/ocis-reva/pull/113 diff --git a/reva/changelog/0.1.0_2020-03-23/pull-77.md b/reva/changelog/0.1.0_2020-03-23/pull-77.md new file mode 100755 index 0000000000..fce0b1e652 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/pull-77.md @@ -0,0 +1,16 @@ +Bugfix: Allow different namespaces for /webdav and /dav/files + +After fbf131c the path for the "new" webdav path does not contain a username `/remote.php/dav/files/textfile0.txt`. It used to be `/remote.php/dav/files/oc/einstein/textfile0.txt` So it lost `oc/einstein`. + +This PR allows setting up different namespaces for `/webav` and `/dav/files`: + +`/webdav` is jailed into `/home` - which uses the home storage driver and uses the logged in user to construct the path +`/dav/files` is jailed into `/oc` - which uses the owncloud storage driver and expects a username as the first path segment + +This mimics oc10 + +The `WEBDAV_NAMESPACE_JAIL` environment variable is split into +- `WEBDAV_NAMESPACE` and +- `DAV_FILES_NAMESPACE` accordingly. + +Related: https://github.com/owncloud/ocis-reva/pull/68 diff --git a/reva/changelog/0.1.0_2020-03-23/pull-91.md b/reva/changelog/0.1.0_2020-03-23/pull-91.md new file mode 100755 index 0000000000..62cf7f720f --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/pull-91.md @@ -0,0 +1,9 @@ +Enhancement: update reva to v0.0.2-0.20200212114015-0dbce24f7e8b + +Reva has seen a lot of changes that allow us to +- reduce the configuration overhead +- use the autocreato home folder option +- use the home folder path layout option +- no longer start the root storage + +Related: https://github.com/owncloud/ocis-reva/pull/91 diff --git a/reva/changelog/0.1.0_2020-03-23/user-sharing-driver-json.md b/reva/changelog/0.1.0_2020-03-23/user-sharing-driver-json.md new file mode 100644 index 0000000000..b278da6939 --- /dev/null +++ b/reva/changelog/0.1.0_2020-03-23/user-sharing-driver-json.md @@ -0,0 +1,5 @@ +Enhancement: Allow configuring user sharing driver + +We now default to `json` which persists shares in the sharing manager in a json file instead of an in memory db. + +https://github.com/owncloud/ocis-reva/pull/115 diff --git a/reva/changelog/0.1.1_2020-03-31/fix-eos-config.md b/reva/changelog/0.1.1_2020-03-31/fix-eos-config.md new file mode 100644 index 0000000000..e0e9ed645d --- /dev/null +++ b/reva/changelog/0.1.1_2020-03-31/fix-eos-config.md @@ -0,0 +1,5 @@ +Bugfix: Fix eos config + +We have added missing config options for the home layout to the config struct that is passed to eos. + +https://github.com/owncloud/ocis-reva/pull/125 diff --git a/reva/changelog/0.10.0_2020-07-10/make-frontend-prefixes-configurable.md b/reva/changelog/0.10.0_2020-07-10/make-frontend-prefixes-configurable.md new file mode 100644 index 0000000000..becf695a3b --- /dev/null +++ b/reva/changelog/0.10.0_2020-07-10/make-frontend-prefixes-configurable.md @@ -0,0 +1,14 @@ +Enhancement: make frontend prefixes configurable + +We introduce three new environment variables and preconfigure them the following way: + +``` +REVA_FRONTEND_DATAGATEWAY_PREFIX="data" +REVA_FRONTEND_OCDAV_PREFIX="" +REVA_FRONTEND_OCS_PREFIX="ocs" +``` + +This restores the reva defaults that were changed upstream. + +https://github.com/owncloud/ocis-reva/pull/363 +https://github.com/cs3org/reva/pull/936/files#diff-51bf4fb310f7362f5c4306581132fc3bR63 \ No newline at end of file diff --git a/reva/changelog/0.10.0_2020-07-10/update-reva-to-20200703.md b/reva/changelog/0.10.0_2020-07-10/update-reva-to-20200703.md new file mode 100644 index 0000000000..0fbdc08808 --- /dev/null +++ b/reva/changelog/0.10.0_2020-07-10/update-reva-to-20200703.md @@ -0,0 +1,13 @@ +Enhancement: update reva to v0.1.1-0.20200701152626-2f6cc60e2f66 + +- Update reva to v0.1.1-0.20200701152626-2f6cc60e2f66 (#341) +- Added country information to Mentix (reva/#924) +- Refactor metrics package to implement reader interface (reva/#934) +- Fix OCS public link share update values logic (#252, #288, reva/#930) + +https://github.com/owncloud/ocis-reva/pull/341 +https://github.com/cs3org/reva/pull/924 +https://github.com/cs3org/reva/pull/934 +https://github.com/owncloud/ocis-reva/issues/252 +https://github.com/owncloud/ocis-reva/issues/288 +https://github.com/cs3org/reva/pull/930 diff --git a/reva/changelog/0.10.0_2020-07-10/update-reva-to-20200709.md b/reva/changelog/0.10.0_2020-07-10/update-reva-to-20200709.md new file mode 100644 index 0000000000..19af62ebd4 --- /dev/null +++ b/reva/changelog/0.10.0_2020-07-10/update-reva-to-20200709.md @@ -0,0 +1,32 @@ +Enhancement: update reva to v0.1.1-0.20200709064551-91eed007038f + +- Update reva to v0.1.1-0.20200709064551-91eed007038f (#362) +- Fix config for uploads when data server is not exposed (reva/#936) +- Update OCM partners endpoints (reva/#937) +- Update Ailleron endpoint (reva/#938) +- OCS: Fix initialization of shares json file (reva/#940) +- OCS: Fix returned public link URL (#336, reva/#945) +- OCS: Share wrap resource id correctly (#344, reva/#951) +- OCS: Implement share handling for accepting and listing shares (#11, reva/#929) +- ocm: dynamically lookup IPs for provider check (reva/#946) +- ocm: add functionality to mail OCM invite tokens (reva/#944) +- Change percentagused to percentageused (reva/#903) +- Fix file-descriptor leak (reva/#954) + +https://github.com/owncloud/ocis-reva/pull/362 +https://github.com/cs3org/reva/pull/936 +https://github.com/cs3org/reva/pull/937 +https://github.com/cs3org/reva/pull/938 +https://github.com/cs3org/reva/pull/940 +https://github.com/cs3org/reva/pull/951 +https://github.com/owncloud/ocis-reva/issues/344 +https://github.com/cs3org/reva/pull/945 +https://github.com/owncloud/ocis-reva/issues/336 +https://github.com/cs3org/reva/pull/929 +https://github.com/owncloud/ocis-reva/issues/11 +https://github.com/cs3org/reva/pull/946 +https://github.com/cs3org/reva/pull/944 +https://github.com/cs3org/reva/pull/903 +https://github.com/cs3org/reva/pull/954 + + diff --git a/reva/changelog/0.11.0_2020-07-23/update-reva-to-20200710.md b/reva/changelog/0.11.0_2020-07-23/update-reva-to-20200710.md new file mode 100644 index 0000000000..a75b4dfdbe --- /dev/null +++ b/reva/changelog/0.11.0_2020-07-23/update-reva-to-20200710.md @@ -0,0 +1,15 @@ +Enhancement: update reva to v0.1.1-0.20200710143425-cf38a45220c5 + +- Update reva to v0.1.1-0.20200710143425-cf38a45220c5 (#371) +- Add wopi open (reva/#920) +- Added a CS3API compliant data exporter to Mentix (reva/#955) +- Read SMTP password from env if not set in config (reva/#953) +- OCS share fix including file info after update (reva/#958) +- Add flag to smtpclient for for unauthenticated SMTP (reva/#963) + +https://github.com/owncloud/ocis-reva/pull/371 +https://github.com/cs3org/reva/pull/920 +https://github.com/cs3org/reva/pull/953 +https://github.com/cs3org/reva/pull/955 +https://github.com/cs3org/reva/pull/958 +https://github.com/cs3org/reva/pull/963 diff --git a/reva/changelog/0.11.0_2020-07-23/update-reva-to-20200722.md b/reva/changelog/0.11.0_2020-07-23/update-reva-to-20200722.md new file mode 100644 index 0000000000..018bf1f21b --- /dev/null +++ b/reva/changelog/0.11.0_2020-07-23/update-reva-to-20200722.md @@ -0,0 +1,13 @@ +Enhancement: update reva to v0.1.1-0.20200722125752-6dea7936f9d1 + +- Update reva to v0.1.1-0.20200722125752-6dea7936f9d1 +- Added signing key capability (reva/#986) +- Add functionality to create webdav references for OCM shares (reva/#974) +- Added a site locations exporter to Mentix (reva/#972) +- Add option to config to allow requests to hosts with unverified certificates (reva/#969) + +https://github.com/owncloud/ocis-reva/pull/392 +https://github.com/cs3org/reva/pull/986 +https://github.com/cs3org/reva/pull/974 +https://github.com/cs3org/reva/pull/972 +https://github.com/cs3org/reva/pull/969 diff --git a/reva/changelog/0.11.0_2020-07-23/use-alpine-latest.md b/reva/changelog/0.11.0_2020-07-23/use-alpine-latest.md new file mode 100644 index 0000000000..8ef4ea4c80 --- /dev/null +++ b/reva/changelog/0.11.0_2020-07-23/use-alpine-latest.md @@ -0,0 +1,5 @@ +Bugfix: build docker images with alpine:latest instead of alpine:edge + +ARM builds were failing when built on alpine:edge, so we switched to alpine:latest instead. + +https://github.com/owncloud/ocis-reva/pull/393 diff --git a/reva/changelog/0.12.0_2020-08-17/update-docs.md b/reva/changelog/0.12.0_2020-08-17/update-docs.md new file mode 100644 index 0000000000..9e01c402a3 --- /dev/null +++ b/reva/changelog/0.12.0_2020-08-17/update-docs.md @@ -0,0 +1,6 @@ +Enhancement: Update storage documentation + +We added details to the documentation about storage requirements known from ownCloud 10, the local storage driver and the ownCloud storage driver. + +https://github.com/owncloud/ocis-reva/pull/384 +https://github.com/owncloud/ocis-reva/pull/390 diff --git a/reva/changelog/0.12.0_2020-08-17/update-ldap-config.md b/reva/changelog/0.12.0_2020-08-17/update-ldap-config.md new file mode 100644 index 0000000000..201a2a1efb --- /dev/null +++ b/reva/changelog/0.12.0_2020-08-17/update-ldap-config.md @@ -0,0 +1,12 @@ +Bugfix: Update LDAP filters + +With the separation of use and find filters we can now use a filter that taken into account a users uuid as well as his username. This is necessary to make sharing work with the new account service which assigns accounts an immutable account id that is different from the username. Furthermore, the separate find filters now allows searching users by their displayname or email as well. + + +``` +userfilter = "(&(objectclass=posixAccount)(|(ownclouduuid={{.OpaqueId}})(cn={{.OpaqueId}})))" +findfilter = "(&(objectclass=posixAccount)(|(cn={{query}}*)(displayname={{query}}*)(mail={{query}}*)))" +``` + +https://github.com/owncloud/ocis-reva/pull/399 +https://github.com/cs3org/reva/pull/996 \ No newline at end of file diff --git a/reva/changelog/0.12.0_2020-08-17/update-reva-to-20200724.md b/reva/changelog/0.12.0_2020-08-17/update-reva-to-20200724.md new file mode 100644 index 0000000000..9f21964d58 --- /dev/null +++ b/reva/changelog/0.12.0_2020-08-17/update-reva-to-20200724.md @@ -0,0 +1,13 @@ +Enhancement: update reva to v0.1.1-0.20200724135750-b46288b375d6 + +- Update reva to v0.1.1-0.20200724135750-b46288b375d6 +- Split LDAP user filters (reva/#996) +- meshdirectory: Add invite forward API to provider links (reva/#1000) +- OCM: Pass the link to the meshdirectory service in token mail (reva/#1002) +- Update github.com/go-ldap/ldap to v3 (reva/#1004) + +https://github.com/owncloud/ocis-reva/pull/399 +https://github.com/cs3org/reva/pull/996 +https://github.com/cs3org/reva/pull/1000 +https://github.com/cs3org/reva/pull/1002 +https://github.com/cs3org/reva/pull/1004 \ No newline at end of file diff --git a/reva/changelog/0.12.0_2020-08-17/update-reva-to-20200728.md b/reva/changelog/0.12.0_2020-08-17/update-reva-to-20200728.md new file mode 100644 index 0000000000..132f0ee93f --- /dev/null +++ b/reva/changelog/0.12.0_2020-08-17/update-reva-to-20200728.md @@ -0,0 +1,11 @@ +Enhancement: update reva to v0.1.1-0.20200728071211-c948977dd3a0 + +- Update reva to v0.1.1-0.20200728071211-c948977dd3a0 +- Use proper logging for ldap auth requests (reva/#1008) +- Update github.com/eventials/go-tus to v0.0.0-20200718001131-45c7ec8f5d59 (reva/#1007) +- Check if SMTP credentials are nil (reva/#1006) + +https://github.com/owncloud/ocis-reva/pull/407 +https://github.com/cs3org/reva/pull/1008 +https://github.com/cs3org/reva/pull/1007 +https://github.com/cs3org/reva/pull/1006 \ No newline at end of file diff --git a/reva/changelog/0.12.0_2020-08-17/updates-for-username-userid-split.md b/reva/changelog/0.12.0_2020-08-17/updates-for-username-userid-split.md new file mode 100644 index 0000000000..027a87cc8c --- /dev/null +++ b/reva/changelog/0.12.0_2020-08-17/updates-for-username-userid-split.md @@ -0,0 +1,6 @@ +Change: environment updates for the username userid split + +We updated the owncloud storage driver in reva to properly look up users by userid or username using the userprovider instead of taking the path segment as is. This requires the user service address as well as changing the default layout to the userid instead of the username. The latter is not considered a stable and persistent identifier. + +https://github.com/owncloud/ocis-reva/pull/420 +https://github.com/cs3org/reva/pull/1033 \ No newline at end of file diff --git a/reva/changelog/0.13.0_2020-08-27/separate-auth-user-providers.md b/reva/changelog/0.13.0_2020-08-27/separate-auth-user-providers.md new file mode 100644 index 0000000000..3f7eec4240 --- /dev/null +++ b/reva/changelog/0.13.0_2020-08-27/separate-auth-user-providers.md @@ -0,0 +1,9 @@ +Enhancement: Separate user and auth providers, add config for rest user + +Previously, the auth and user provider services used to have the same driver, +which restricted using separate drivers and configs for both. This PR separates +the two and adds the config for the rest user driver and the gatewaysvc +parameter to EOS fs. + +https://github.com/owncloud/ocis-reva/pull/412 +https://github.com/cs3org/reva/pull/995 diff --git a/reva/changelog/0.13.0_2020-08-27/update-reva-to-20200728.md b/reva/changelog/0.13.0_2020-08-27/update-reva-to-20200728.md new file mode 100644 index 0000000000..a6ec4113f6 --- /dev/null +++ b/reva/changelog/0.13.0_2020-08-27/update-reva-to-20200728.md @@ -0,0 +1,17 @@ +Enhancement: update reva to v1.1.1-0.20200819100654-dcbf0c8ea187 + +- Update reva to v1.1.1-0.20200819100654-dcbf0c8ea187 +- fix restoring and deleting trash items via ocs [(reva/#1103)](https://github.com/cs3org/reva/pull/1103) +- Add UID and GID in ldap auth driver [(reva/#1101)](https://github.com/cs3org/reva/pull/1101) +- Allow listing the trashbin [(reva/#1091)](https://github.com/cs3org/reva/pull/1091) +- Ignore Stray Public Shares [(reva/#1090)](https://github.com/cs3org/reva/pull/1090) +- Implement GetUserByClaim for LDAP user driver [(reva/#1088)](https://github.com/cs3org/reva/pull/1088) +- eosclient: get file info by fxid [(reva/#1079)](https://github.com/cs3org/reva/pull/1079) +- Ensure stray shares get ignored [(reva/#1064)](https://github.com/cs3org/reva/pull/1064) +- Improve timestamp precision while logging [(reva/#1059)](https://github.com/cs3org/reva/pull/1059) +- Ocfs lookup userid (update) [(reva/#1052)](https://github.com/cs3org/reva/pull/1052) +- Disallow sharing the shares directory [(reva/#1051)](https://github.com/cs3org/reva/pull/1051) +- Local storage provider: Fixed resolution of fileid [(reva/#1046)](https://github.com/cs3org/reva/pull/1046) +- List public shares only created by the current user [(reva/#1042)](https://github.com/cs3org/reva/pull/1042) + +https://github.com/owncloud/ocis-reva/pull/447 \ No newline at end of file diff --git a/reva/changelog/0.14.0_2020-09-11/config-cleanup.md b/reva/changelog/0.14.0_2020-09-11/config-cleanup.md new file mode 100644 index 0000000000..f969a94278 --- /dev/null +++ b/reva/changelog/0.14.0_2020-09-11/config-cleanup.md @@ -0,0 +1,8 @@ +Bugfix: Fix default configuration for accessing shares + +The storage provider mounted at `/home` should always have EnableHome set to `true`. The other storage providers should have it set to `false`. + +https://github.com/owncloud/product/issues/205 +https://github.com/owncloud/ocis-reva/pull/461 + + diff --git a/reva/changelog/0.14.0_2020-09-11/storage-registry-rules.md b/reva/changelog/0.14.0_2020-09-11/storage-registry-rules.md new file mode 100644 index 0000000000..31260b8a51 --- /dev/null +++ b/reva/changelog/0.14.0_2020-09-11/storage-registry-rules.md @@ -0,0 +1,8 @@ +Enhancement: Allow configuring arbitrary storage registry rules + +We added a new config flag `storage-registry-rule` that can be given multiple times for the gateway to specify arbitrary storage registry rules. You can also use a comma separated list of rules in the `REVA_STORAGE_REGISTRY_RULES` environment variable. + +https://github.com/owncloud/product/issues/193 +https://github.com/owncloud/ocis-reva/pull/461 + + diff --git a/reva/changelog/0.14.0_2020-09-11/update-reva-to-20200826.md b/reva/changelog/0.14.0_2020-09-11/update-reva-to-20200826.md new file mode 100644 index 0000000000..9439a67fb0 --- /dev/null +++ b/reva/changelog/0.14.0_2020-09-11/update-reva-to-20200826.md @@ -0,0 +1,24 @@ +Enhancement: update reva to v1.2.1-0.20200826162318-c0f54e1f37ea + +- Update reva to v1.2.1-0.20200826162318-c0f54e1f37ea +- Do not swallow 'not found' errors in Stat [(reva/#1124)](https://github.com/cs3org/reva/pull/1124) +- Rewire dav files to the home storage [(reva/#1125)](https://github.com/cs3org/reva/pull/1125) +- Do not restore recycle entry on purge [(reva/#1099)](https://github.com/cs3org/reva/pull/1099) +- Allow listing the trashbin [(reva/#1091)](https://github.com/cs3org/reva/pull/1091) +- Restore and delete trash items via ocs [(reva/#1103)](https://github.com/cs3org/reva/pull/1103) +- Ensure ignoring public stray shares [(reva/#1090)](https://github.com/cs3org/reva/pull/1090) +- Ensure ignoring stray shares [(reva/#1064)](https://github.com/cs3org/reva/pull/1064) +- Minor fixes in reva cmd, gateway uploads and smtpclient [(reva/#1082)](https://github.com/cs3org/reva/pull/1082) +- Owncloud driver - propagate mtime on RemoveGrant [(reva/#1115)](https://github.com/cs3org/reva/pull/1115) +- Handle redirection prefixes when extracting destination from URL [(reva/#1111)](https://github.com/cs3org/reva/pull/1111) +- Add UID and GID in ldap auth driver [(reva/#1101)](https://github.com/cs3org/reva/pull/1101) +- Add calens check to verify changelog entries in CI [(reva/#1077)](https://github.com/cs3org/reva/pull/1077) +- Refactor Reva CLI with prompts [(reva/#1072)](https://github.com/cs3org/reva/pull/1072j) +- Get file info using fxids from EOS [(reva/#1079)](https://github.com/cs3org/reva/pull/1079) +- Update LDAP user driver [(reva/#1088)](https://github.com/cs3org/reva/pull/1088) +- System information metrics cleanup [(reva/#1114)](https://github.com/cs3org/reva/pull/1114) +- System information included in Prometheus metrics [(reva/#1071)](https://github.com/cs3org/reva/pull/1071) +- Add logic for resolving storage references over webdav [(reva/#1094)](https://github.com/cs3org/reva/pull/1094) + +https://github.com/owncloud/ocis-reva/pull/454 + diff --git a/reva/changelog/0.14.0_2020-09-11/update-reva-to-20200911.md b/reva/changelog/0.14.0_2020-09-11/update-reva-to-20200911.md new file mode 100644 index 0000000000..6f22b3a888 --- /dev/null +++ b/reva/changelog/0.14.0_2020-09-11/update-reva-to-20200911.md @@ -0,0 +1,10 @@ +Enhancement: update reva to v1.2.1-0.20200911111727-51649e37df2d + +- Update reva to v1.2.1-0.20200911111727-51649e37df2d +- Added new OCIS storage driver ocis [(reva/#1155)](https://github.com/cs3org/reva/pull/1155) +- App provider: fallback to env. variable if 'iopsecret' unset [(reva/#1146)](https://github.com/cs3org/reva/pull/1146) +- Add switch to database [(reva/#1135)](https://github.com/cs3org/reva/pull/1135) +- Add the ocdav HTTP svc to the standalone config [(reva/#1128)](https://github.com/cs3org/reva/pull/1128) + +https://github.com/owncloud/ocis-reva/pull/466 + diff --git a/reva/changelog/0.2.0_2020-04-15/fix-eos-config.md b/reva/changelog/0.2.0_2020-04-15/fix-eos-config.md new file mode 100644 index 0000000000..d328386ff4 --- /dev/null +++ b/reva/changelog/0.2.0_2020-04-15/fix-eos-config.md @@ -0,0 +1,5 @@ +Bugfix: Fix eos user sharing config + +We have added missing config options for the user sharing manager and added a dedicated eos storage command with pre configured settings for the eos-docker container. It configures a `Shares` folder in a users home when using eos as the storage driver. + +https://github.com/owncloud/ocis-reva/pull/127 diff --git a/reva/changelog/0.2.0_2020-04-15/update-reva-to-20200414133413.md b/reva/changelog/0.2.0_2020-04-15/update-reva-to-20200414133413.md new file mode 100644 index 0000000000..d0f5f96611 --- /dev/null +++ b/reva/changelog/0.2.0_2020-04-15/update-reva-to-20200414133413.md @@ -0,0 +1,5 @@ +Enhancement: update reva to v1.1.0-20200414133413 + +Adds initial public sharing and ocm implementation. + +https://github.com/owncloud/ocis-reva/pull/127 diff --git a/reva/changelog/0.2.1_2020-04-28/gatewayconfig.md b/reva/changelog/0.2.1_2020-04-28/gatewayconfig.md new file mode 100644 index 0000000000..003e865442 --- /dev/null +++ b/reva/changelog/0.2.1_2020-04-28/gatewayconfig.md @@ -0,0 +1,5 @@ +Enhancement: Allow configuring the gateway for dataproviders + +This allows using basic or bearer auth when directly talking to dataproviders. + +https://github.com/owncloud/ocis-reva/pull/136 diff --git a/reva/changelog/0.2.1_2020-04-28/reva-ocis-logger.md b/reva/changelog/0.2.1_2020-04-28/reva-ocis-logger.md new file mode 100644 index 0000000000..a4267710ee --- /dev/null +++ b/reva/changelog/0.2.1_2020-04-28/reva-ocis-logger.md @@ -0,0 +1,5 @@ +Enhancement: Use a configured logger on reva runtime + +For consistency reasons we need a configured logger that is inline with an ocis logger, so the log cascade can be easily parsed by a human. + +https://github.com/owncloud/ocis-reva/pull/153 diff --git a/reva/changelog/0.2.1_2020-04-28/unadvertise-chunking-v2.md b/reva/changelog/0.2.1_2020-04-28/unadvertise-chunking-v2.md new file mode 100644 index 0000000000..7b9a5b3a75 --- /dev/null +++ b/reva/changelog/0.2.1_2020-04-28/unadvertise-chunking-v2.md @@ -0,0 +1,7 @@ +Bugfix: Stop advertising unsupported chunking v2 + +Removed "chunking" attribute in the DAV capabilities. +Please note that chunking v2 is advertised as "chunking 1.0" while +chunking v1 is the attribute "bigfilechunking" which is already false. + +https://github.com/owncloud/ocis-reva/pull/145 diff --git a/reva/changelog/0.3.0_2020-05-20/update-reva-to-20200518061204.md b/reva/changelog/0.3.0_2020-05-20/update-reva-to-20200518061204.md new file mode 100644 index 0000000000..d3d68a402c --- /dev/null +++ b/reva/changelog/0.3.0_2020-05-20/update-reva-to-20200518061204.md @@ -0,0 +1,87 @@ +Enhancement: update reva to v0.1.1-0.20200520150229 + +- Update reva to v0.1.1-0.20200520150229 (#161, #180, #192, #207, #221) +- Return arbitrary metadata with stat, upload without TUS (reva/#766) +- Stat file before returning datagateway URL when initiating download (reva/#765) +- REST driver for user package (reva/#747) +- Sharing behavior now consistent with the old backend (#20, #26, #43, #44, #46, #94 ,reva/#748) +- Mentix service (reva/#755) +- meshdirectory: add mentix driver for gocdb sites integration (reva/#754) +- Add functionality to commit to storage for OCM shares (reva/#760) +- Add option in config to disable tus (reva/#759) +- ocdav: fix custom property XML parsing in PROPPATCH handler (#203, reva/#743) +- ocdav: fix PROPPATCH response for removed properties (#186, reva/#742) +- ocdav: implement PROPFIND infinity depth (#212, reva/#758) +- Local fs: Allow setting of arbitrary metadata, minor bug fixes (reva/#764) +- Local fs: metadata handling and share persistence (reva/#732) +- Local fs: return file owner info in stat (reva/#750) +- Fixed regression when uploading empty files to OCFS or EOS with PUT and TUS (#188, reva/#734) +- On delete move the file versions to the trashbin (#94, reva/#731) +- Fix OCFS move operation (#182, reva/#729) +- Fix OCFS custom property / xattr removal (reva/#728) +- Retry trashbin in case of timestamp collision (reva/#730) +- Disable chunking v1 by default (reva/#678) +- Implement ocs to http status code mapping (#26, reva/#696, reva/#707, reva/#711) +- Handle the case if directory already exists (reva/#695) +- Added TUS upload support (reva/#674, reva/#725, reva/#717) +- Always return file sizes in Webdav PROPFIND (reva/#712) +- Use default mime type when none was detected (reva/#713) +- Fixed Webdav shallow COPY (reva/#714) +- Fixed arbitrary namespace usage for custom properties in PROPFIND (#57, reva/#720) +- Implement returning Webdav custom properties from xattr (#57, reva/#721) +- Minor fix in OCM share pkg (reva/#718) + +https://github.com/owncloud/ocis-reva/pull/161 +https://github.com/owncloud/ocis-reva/pull/180 +https://github.com/owncloud/ocis-reva/pull/192 +https://github.com/owncloud/ocis-reva/pull/207 +https://github.com/owncloud/ocis-reva/pull/221 +https://github.com/cs3org/reva/pull/766 +https://github.com/cs3org/reva/pull/765 +https://github.com/cs3org/reva/pull/755 +https://github.com/cs3org/reva/pull/754 +https://github.com/owncloud/ocis-reva/issues/20 +https://github.com/owncloud/ocis-reva/issues/26 +https://github.com/owncloud/ocis-reva/issues/43 +https://github.com/owncloud/ocis-reva/issues/44 +https://github.com/owncloud/ocis-reva/issues/46 +https://github.com/owncloud/ocis-reva/issues/94 +https://github.com/cs3org/reva/pull/747 +https://github.com/cs3org/reva/pull/748 +https://github.com/cs3org/reva/pull/760 +https://github.com/cs3org/reva/pull/759 +https://github.com/cs3org/reva/pull/678 +https://github.com/owncloud/ocis-reva/issues/26 +https://github.com/cs3org/reva/pull/696 +https://github.com/cs3org/reva/pull/707 +https://github.com/cs3org/reva/pull/711 +https://github.com/cs3org/reva/pull/695 +https://github.com/cs3org/reva/pull/674 +https://github.com/cs3org/reva/pull/725 +https://github.com/cs3org/reva/pull/717 +https://github.com/owncloud/ocis-reva/issues/67 +https://github.com/cs3org/reva/pull/712 +https://github.com/cs3org/reva/pull/713 +https://github.com/owncloud/ocis-reva/issues/57 +https://github.com/cs3org/reva/pull/720 +https://github.com/cs3org/reva/pull/718 +https://github.com/owncloud/ocis-reva/issues/94 +https://github.com/cs3org/reva/pull/731 +https://github.com/owncloud/ocis-reva/issues/188 +https://github.com/cs3org/reva/pull/734 +https://github.com/owncloud/ocis-reva/issues/182 +https://github.com/cs3org/reva/pull/729 +https://github.com/cs3org/reva/pull/728 +https://github.com/cs3org/reva/pull/730 +https://github.com/owncloud/ocis-reva/issues/212 +https://github.com/cs3org/reva/pull/758 +https://github.com/owncloud/ocis-reva/issues/186 +https://github.com/cs3org/reva/pull/742 +https://github.com/cs3org/reva/pull/764 +https://github.com/owncloud/ocis-reva/issues/203 +https://github.com/cs3org/reva/pull/743 +https://github.com/cs3org/reva/pull/732 +https://github.com/cs3org/reva/pull/750 + + + diff --git a/reva/changelog/0.4.0_2020-05-29/public-shares.md b/reva/changelog/0.4.0_2020-05-29/public-shares.md new file mode 100644 index 0000000000..ee6736eecf --- /dev/null +++ b/reva/changelog/0.4.0_2020-05-29/public-shares.md @@ -0,0 +1,7 @@ +Enhancement: Add public shares service + +Added Public Shares service with CRUD operations and File Public Shares Manager + +https://github.com/owncloud/ocis-reva/issues/49 +https://github.com/owncloud/ocis-reva/pull/232 + diff --git a/reva/changelog/0.4.0_2020-05-29/update-reva-to-20200529120551.md b/reva/changelog/0.4.0_2020-05-29/update-reva-to-20200529120551.md new file mode 100644 index 0000000000..55801a5be3 --- /dev/null +++ b/reva/changelog/0.4.0_2020-05-29/update-reva-to-20200529120551.md @@ -0,0 +1,32 @@ +Enhancement: update reva to v0.1.1-0.20200529120551-4f2d9c85d3c9 + +- Updated reva to v0.1.1-0.20200529120551 (#232) +- Public Shares CRUD, File Public Shares Manager (#49, #232, reva/#681, reva/#788) +- Disable HTTP-KeepAlives to reduce fd count (ocis/#268, reva/#787) +- Fix trashbin listing (#229, reva/#782) +- Create PUT wrapper for TUS uploads (reva/#770) +- Add security access headers for ocdav requests (#66, reva/#780) +- Add option to revad cmd to specify logging level (reva/#772) +- New metrics package (reva/#740) +- Remove implicit data member from memory store (reva/#774) +- Added TUS global capabilities (#177, reva/#775) +- Fix PROPFIND with Depth 1 for cross-storage operations (reva/#779) + +https://github.com/owncloud/ocis-reva/issues/49 +https://github.com/owncloud/ocis-reva/pull/232 +https://github.com/cs3org/reva/pull/787 +https://github.com/cs3org/reva/pull/681 +https://github.com/cs3org/reva/pull/788 +https://github.com/owncloud/ocis-reva/issues/229 +https://github.com/cs3org/reva/pull/782 +https://github.com/cs3org/reva/pull/770 +https://github.com/owncloud/ocis-reva/issues/66 +https://github.com/cs3org/reva/pull/780 +https://github.com/cs3org/reva/pull/772 +https://github.com/cs3org/reva/pull/740 +https://github.com/cs3org/reva/pull/774 +https://github.com/owncloud/ocis-reva/issues/177 +https://github.com/cs3org/reva/pull/775 +https://github.com/cs3org/reva/pull/779 +https://github.com/owncloud/ocis/issues/268 + diff --git a/reva/changelog/0.5.0_2020-06-04/add-tus-global-capabilities.md b/reva/changelog/0.5.0_2020-06-04/add-tus-global-capabilities.md new file mode 100644 index 0000000000..8b825b07b8 --- /dev/null +++ b/reva/changelog/0.5.0_2020-06-04/add-tus-global-capabilities.md @@ -0,0 +1,9 @@ +Enhancement: Add TUS global capability + +The TUS global capabilities from Reva are now exposed. + +The advertised max chunk size can be configured using the "--upload-max-chunk-size" CLI switch or "REVA_FRONTEND_UPLOAD_MAX_CHUNK_SIZE" environment variable. +The advertised http method override can be configured using the "--upload-http-method-override" CLI switch or "REVA_FRONTEND_UPLOAD_HTTP_METHOD_OVERRIDE" environment variable. + +https://github.com/owncloud/ocis-reva/issues/177 +https://github.com/owncloud/ocis-reva/pull/228 diff --git a/reva/changelog/0.5.0_2020-06-04/update-reva-to-20200603071553.md b/reva/changelog/0.5.0_2020-06-04/update-reva-to-20200603071553.md new file mode 100644 index 0000000000..f59a6ac982 --- /dev/null +++ b/reva/changelog/0.5.0_2020-06-04/update-reva-to-20200603071553.md @@ -0,0 +1,12 @@ +Enhancement: update reva to v0.1.1-0.20200603071553-e05a87521618 + +- Updated reva to v0.1.1-0.20200603071553-e05a87521618 (#244) +- Add option to disable TUS on OC layer (#177, reva/#791) +- Dataprovider now supports method override (#177, reva/#792) +- OCS fixes for create public link (reva/#798) + +https://github.com/owncloud/ocis-reva/issues/244 +https://github.com/owncloud/ocis-reva/issues/177 +https://github.com/cs3org/reva/pull/791 +https://github.com/cs3org/reva/pull/792 +https://github.com/cs3org/reva/pull/798 diff --git a/reva/changelog/0.6.0_2020-06-24/update-reva-to-20200624.md b/reva/changelog/0.6.0_2020-06-24/update-reva-to-20200624.md new file mode 100644 index 0000000000..4d9bf5d04f --- /dev/null +++ b/reva/changelog/0.6.0_2020-06-24/update-reva-to-20200624.md @@ -0,0 +1,68 @@ +Enhancement: update reva to v0.1.1-0.20200624063447-db5e6635d5f0 + +- Updated reva to v0.1.1-0.20200624063447-db5e6635d5f0 (#279) +- Local storage: URL-encode file ids to ease integration with other microservices like WOPI (reva/#799) +- Mentix fixes (reva/#803, reva/#817) +- OCDAV: fix returned timestamp format (#116, reva/#805) +- OCM: add default prefix (#814) +- add the content-length header to the responses (reva/#816) +- Deps: clean (reva/#818) +- Fix trashbin listing (#112, #253, #254, reva/#819) +- Make the json publicshare driver configurable (reva/#820) +- TUS: Return metadata headers after direct upload (ocis/#216, reva/#813) +- Set mtime to storage after simple upload (#174, reva/#823, reva/#841) +- Configure grpc client to allow for insecure conns and skip server certificate verification (reva/#825) +- Deployment: simplify config with more default values (reva/#826, reva/#837, reva/#843, reva/#848, reva/#842) +- Separate local fs into home and with home disabled (reva/#829) +- Register reflection after other services (reva/#831) +- Refactor EOS fs (reva/#830) +- Add ocs-share-permissions to the propfind response (#47, reva/#836) +- OCS: Properly read permissions when creating public link (reva/#852) +- localfs: make normalize return associated error (reva/#850) +- EOS grpc driver (reva/#664) +- OCS: Add support for legacy public link arg publicUpload (reva/#853) +- Add cache layer to user REST package (reva/#849) +- Meshdirectory: pass query params to selected provider (reva/#863) +- Pass etag in quotes from the fs layer (#269, reva/#866, reva/#867) +- OCM: use refactored cs3apis provider definition (reva/#864) + +https://github.com/owncloud/ocis-reva/pull/279 +https://github.com/owncloud/cs3org/reva/pull/799 +https://github.com/owncloud/cs3org/reva/pull/803 +https://github.com/owncloud/cs3org/reva/pull/817 +https://github.com/owncloud/ocis-reva/issues/116 +https://github.com/owncloud/cs3org/reva/pull/805 +https://github.com/owncloud/cs3org/reva/pull/814 +https://github.com/owncloud/cs3org/reva/pull/816 +https://github.com/owncloud/cs3org/reva/pull/818 +https://github.com/owncloud/ocis-reva/issues/112 +https://github.com/owncloud/ocis-reva/issues/253 +https://github.com/owncloud/ocis-reva/issues/254 +https://github.com/owncloud/cs3org/reva/pull/819 +https://github.com/owncloud/cs3org/reva/pull/820 +https://github.com/owncloud/ocis/issues/216 +https://github.com/owncloud/ocis-reva/issues/174 +https://github.com/owncloud/cs3org/reva/pull/823 +https://github.com/owncloud/cs3org/reva/pull/841 +https://github.com/owncloud/cs3org/reva/pull/813 +https://github.com/owncloud/cs3org/reva/pull/825 +https://github.com/owncloud/cs3org/reva/pull/826 +https://github.com/owncloud/cs3org/reva/pull/837 +https://github.com/owncloud/cs3org/reva/pull/843 +https://github.com/owncloud/cs3org/reva/pull/848 +https://github.com/owncloud/cs3org/reva/pull/842 +https://github.com/owncloud/cs3org/reva/pull/829 +https://github.com/owncloud/cs3org/reva/pull/831 +https://github.com/owncloud/cs3org/reva/pull/830 +https://github.com/owncloud/ocis-reva/issues/47 +https://github.com/owncloud/cs3org/reva/pull/836 +https://github.com/owncloud/cs3org/reva/pull/852 +https://github.com/owncloud/cs3org/reva/pull/850 +https://github.com/owncloud/cs3org/reva/pull/664 +https://github.com/owncloud/cs3org/reva/pull/853 +https://github.com/owncloud/cs3org/reva/pull/849 +https://github.com/owncloud/cs3org/reva/pull/863 +https://github.com/owncloud/ocis-reva/issues/269 +https://github.com/owncloud/cs3org/reva/pull/866 +https://github.com/owncloud/cs3org/reva/pull/867 +https://github.com/owncloud/cs3org/reva/pull/864 diff --git a/reva/changelog/0.7.0_2020-06-26/update-reva-to-20200625.md b/reva/changelog/0.7.0_2020-06-26/update-reva-to-20200625.md new file mode 100644 index 0000000000..7ea17d01e8 --- /dev/null +++ b/reva/changelog/0.7.0_2020-06-26/update-reva-to-20200625.md @@ -0,0 +1,23 @@ +Enhancement: update reva to v0.1.1-0.20200626111234-e21c32db9614 + +- Updated reva to v0.1.1-0.20200626111234-e21c32db9614 (#304) +- TUS upload support through datagateway (#261, reva/#878, reva/#888) +- Added support for differing metrics path for Prometheus to Mentix (reva/#875) +- More data exported by Mentix (reva/#881) +- Implementation of file operations in public folder shares (#49, #293, reva/#877) +- Make httpclient trust local certificates for now (reva/#880) +- EOS homes are not configured with an enable-flag anymore, but with a dedicated storage driver. + We're using it now and adapted default configs of storages (reva/#891, #304) + +https://github.com/owncloud/ocis-reva/pull/261 +https://github.com/cs3org/reva/pull/875 +https://github.com/owncloud/ocis-reva/issues/49 +https://github.com/owncloud/ocis-reva/issues/293 +https://github.com/cs3org/reva/pull/877 +https://github.com/owncloud/ocis-reva/issues/261 +https://github.com/cs3org/reva/pull/878 +https://github.com/cs3org/reva/pull/881 +https://github.com/cs3org/reva/pull/880 +https://github.com/cs3org/reva/pull/888 +https://github.com/owncloud/ocis-reva/pull/304 +https://github.com/cs3org/reva/pull/891 diff --git a/reva/changelog/0.8.0_2020-06-29/update-reva-to-20200629.md b/reva/changelog/0.8.0_2020-06-29/update-reva-to-20200629.md new file mode 100644 index 0000000000..c1639afdd1 --- /dev/null +++ b/reva/changelog/0.8.0_2020-06-29/update-reva-to-20200629.md @@ -0,0 +1,13 @@ +Enhancement: update reva to v0.1.1-0.20200629131207-04298ea1c088 + +- Update reva to v0.1.1-0.20200629094927-e33d65230abc (#309) +- Fix public link file share (#278, reva/#895, reva/#900) +- Delete public share (reva/#899) +- Updated reva to v0.1.1-0.20200629131207-04298ea1c088 (#313) + +https://github.com/owncloud/ocis-reva/pull/309 +https://github.com/owncloud/ocis-reva/issues/278 +https://github.com/cs3org/reva/pull/895 +https://github.com/cs3org/reva/pull/899 +https://github.com/cs3org/reva/pull/900 +https://github.com/owncloud/ocis-reva/pull/313 diff --git a/reva/changelog/0.9.0_2020-07-01/allow-datagateway-transfers-24h.md b/reva/changelog/0.9.0_2020-07-01/allow-datagateway-transfers-24h.md new file mode 100644 index 0000000000..800e557f83 --- /dev/null +++ b/reva/changelog/0.9.0_2020-07-01/allow-datagateway-transfers-24h.md @@ -0,0 +1,5 @@ +Enhancement: Allow datagateway transfers to take 24h + +- Increase transfer token life time to 24h (PR #323) + +https://github.com/owncloud/ocis-reva/pull/323 diff --git a/reva/changelog/0.9.0_2020-07-01/update-reva-to-20200630.md b/reva/changelog/0.9.0_2020-07-01/update-reva-to-20200630.md new file mode 100644 index 0000000000..777390293a --- /dev/null +++ b/reva/changelog/0.9.0_2020-07-01/update-reva-to-20200630.md @@ -0,0 +1,11 @@ +Enhancement: update reva to v0.1.1-0.20200630075923-39a90d431566 + +- Update reva to v0.1.1-0.20200630075923-39a90d431566 (#320) +- Return special value for public link password (#294, reva/#904) +- Fix public stat and listcontainer response to contain the correct prefix (#310, reva/#902) + +https://github.com/owncloud/ocis-reva/pull/320 +https://github.com/owncloud/ocis-reva/issues/310 +https://github.com/cs3org/reva/pull/902 +https://github.com/owncloud/ocis-reva/issues/294 +https://github.com/cs3org/reva/pull/904 diff --git a/reva/changelog/0.9.0_2020-07-01/update-reva-to-20200701.md b/reva/changelog/0.9.0_2020-07-01/update-reva-to-20200701.md new file mode 100644 index 0000000000..ac104ea386 --- /dev/null +++ b/reva/changelog/0.9.0_2020-07-01/update-reva-to-20200701.md @@ -0,0 +1,30 @@ +Enhancement: update reva to v0.1.1-0.20200701152626-2f6cc60e2f66 + +- Update reva to v0.1.1-0.20200701152626-2f6cc60e2f66 (#328) +- Use sync.Map on pool package (reva/#909) +- Use mutex instead of sync.Map (reva/#915) +- Use gatewayProviders instead of storageProviders on conn pool (reva/#916) +- Add logic to ls and stat to process arbitrary metadata keys (reva/#905) +- Preliminary implementation of Set/UnsetArbitraryMetadata (reva/#912) +- Make datagateway forward headers (reva/#913, reva/#926) +- Add option to cmd upload to disable tus (reva/#911) +- OCS Share Allow date-only expiration for public shares (#288, reva/#918) +- OCS Share Remove array from OCS Share update response (#252, reva/#919) +- OCS Share Implement GET request for single shares (#249, reva/#921) + +https://github.com/owncloud/ocis-reva/pull/328 +https://github.com/cs3org/reva/pull/909 +https://github.com/cs3org/reva/pull/915 +https://github.com/cs3org/reva/pull/916 +https://github.com/cs3org/reva/pull/905 +https://github.com/cs3org/reva/pull/912 +https://github.com/cs3org/reva/pull/913 +https://github.com/cs3org/reva/pull/926 +https://github.com/cs3org/reva/pull/911 +https://github.com/owncloud/ocis-reva/issues/288 +https://github.com/cs3org/reva/pull/918 +https://github.com/owncloud/ocis-reva/issues/252 +https://github.com/cs3org/reva/pull/919 +https://github.com/owncloud/ocis-reva/issues/249 +https://github.com/cs3org/reva/pull/921 + diff --git a/reva/changelog/0.9.1_2020-07-02/new-config-options b/reva/changelog/0.9.1_2020-07-02/new-config-options new file mode 100644 index 0000000000..e11d65fb69 --- /dev/null +++ b/reva/changelog/0.9.1_2020-07-02/new-config-options @@ -0,0 +1,5 @@ +Enhancement: add new config options for the http client + +The internal certificates are checked for validity after https://github.com/cs3org/reva/pull/914, which causes the acceptance tests to fail. This change sets new hardcoded defaults. + +https://github.com/owncloud/ocis-reva/pull/330 \ No newline at end of file diff --git a/reva/changelog/CHANGELOG.tmpl b/reva/changelog/CHANGELOG.tmpl new file mode 100644 index 0000000000..0d11d225ca --- /dev/null +++ b/reva/changelog/CHANGELOG.tmpl @@ -0,0 +1,53 @@ +{{ $allVersions := . }} +{{- range $index, $changes := . }}{{ with $changes -}} +{{ if gt (len $allVersions) 1 -}} +# Changelog for [{{ .Version }}] ({{ .Date }}) + +The following sections list the changes in ocis-reva {{ .Version }}. + +{{/* creating version compare links */ -}} +{{ $next := add1 $index -}} +{{ if ne (len $allVersions) $next -}} +{{ $previousVersion := (index $allVersions $next).Version -}} +{{ if eq .Version "unreleased" -}} +[{{ .Version }}]: https://github.com/owncloud/ocis-reva/compare/v{{ $previousVersion }}...master + +{{ else -}} +[{{ .Version }}]: https://github.com/owncloud/ocis-reva/compare/v{{ $previousVersion }}...v{{ .Version }} + +{{ end -}} +{{ end -}} + +{{- /* last version managed by calens, end of the loop */ -}} +{{ if eq .Version "0.1.0" -}} +[{{ .Version }}]: https://github.com/owncloud/ocis-reva/compare/6702be7f9045a382d40691a9bcd04f572203e9ed...v{{ .Version }} + +{{ end -}} +{{ else -}} +# Changes in {{ .Version }} + +{{ end -}} + +## Summary +{{ range $entry := .Entries }}{{ with $entry }} +* {{ .Type }} - {{ .Title }}: [#{{ .PrimaryID }}]({{ .PrimaryURL }}) +{{- end }}{{ end }} + +## Details +{{ range $entry := .Entries }}{{ with $entry }} +* {{ .Type }} - {{ .Title }}: [#{{ .PrimaryID }}]({{ .PrimaryURL }}) +{{ range $par := .Paragraphs }} + {{ wrapIndent $par 80 3 }} +{{ end -}} +{{ range $url := .IssueURLs }} + {{ $url -}} +{{ end -}} +{{ range $url := .PRURLs }} + {{ $url -}} +{{ end -}} +{{ range $url := .OtherURLs }} + {{ $url -}} +{{ end }} + +{{ end }}{{ end -}} +{{ end }}{{ end -}} diff --git a/reva/changelog/README.md b/reva/changelog/README.md new file mode 100644 index 0000000000..0ae5d5b3e2 --- /dev/null +++ b/reva/changelog/README.md @@ -0,0 +1,6 @@ +# Changelog + +We are using [calens](https://github.com/restic/calens) to properly generate a +changelog before we are tagging a new release. To get an idea how this could +look like would be the +best reference. diff --git a/reva/changelog/TEMPLATE b/reva/changelog/TEMPLATE new file mode 100644 index 0000000000..1e00061fe0 --- /dev/null +++ b/reva/changelog/TEMPLATE @@ -0,0 +1,11 @@ +Bugfix: Fix behavior for foobar (in present tense) + +We've fixed the behavior for foobar, a long-standing annoyance for users. The +text should be wrapped at 80 characters length. + +The text in the paragraphs is written in past tense. The last section is a list +of issue URLs, PR URLs and other URLs. The first issue ID (or the first PR ID, +in case there aren't any issue links) is used as the primary ID. + +https://github.com/owncloud/ocis-reva/issues/1234 +https://github.com/owncloud/ocis-reva/pull/55555 diff --git a/reva/changelog/unreleased/.keep b/reva/changelog/unreleased/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/reva/cmd/ocis-reva/main.go b/reva/cmd/ocis-reva/main.go new file mode 100644 index 0000000000..fabad13dd1 --- /dev/null +++ b/reva/cmd/ocis-reva/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "os" + + "github.com/owncloud/ocis-reva/pkg/command" +) + +func main() { + if err := command.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/reva/composer.json b/reva/composer.json new file mode 100644 index 0000000000..53c0a9c219 --- /dev/null +++ b/reva/composer.json @@ -0,0 +1,18 @@ +{ + "name": "owncloud/ocis-reva", + "config" : { + "platform": { + "php": "7.2" + } + }, + "require": { + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4" + }, + "extra": { + "bamarni-bin": { + "bin-links": false + } + } +} diff --git a/reva/config/example.json b/reva/config/example.json new file mode 100644 index 0000000000..8076deb52c --- /dev/null +++ b/reva/config/example.json @@ -0,0 +1,24 @@ +{ + "debug": { + "addr": "0.0.0.0:9109", + "token": "", + "pprof": false, + "zpages": false + }, + "http": { + "addr": "0.0.0.0:9105" + }, + "grpc": { + "addr": "0.0.0.0:9106" + }, + "tracing": { + "enabled": false, + "type": "jaeger", + "endpoint": "localhost:6831", + "collector": "http://localhost:14268/api/traces", + "service": "reva" + }, + "asset": { + "path": "" + } +} diff --git a/reva/config/example.yml b/reva/config/example.yml new file mode 100644 index 0000000000..41c533d41d --- /dev/null +++ b/reva/config/example.yml @@ -0,0 +1,24 @@ +--- +debug: + addr: 0.0.0.0:9109 + token: + pprof: false + zpages: false + +http: + addr: 0.0.0.0:9105 + +grpc: + addr: 0.0.0.0:9106 + +tracing: + enabled: false + type: jaeger + endpoint: localhost:6831 + collector: http://localhost:14268/api/traces + service: reva + +asset: + path: + +... diff --git a/reva/docker/Dockerfile.linux.amd64 b/reva/docker/Dockerfile.linux.amd64 new file mode 100644 index 0000000000..231e033f2e --- /dev/null +++ b/reva/docker/Dockerfile.linux.amd64 @@ -0,0 +1,19 @@ +FROM amd64/alpine:latest + +RUN apk update && \ + apk upgrade && \ + apk add ca-certificates mailcap && \ + rm -rf /var/cache/apk/* && \ + echo 'hosts: files dns' >| /etc/nsswitch.conf + +LABEL maintainer="ownCloud GmbH " \ + org.label-schema.name="oCIS Reva" \ + org.label-schema.vendor="ownCloud GmbH" \ + org.label-schema.schema-version="1.0" + +EXPOSE 9140 9141 9142 9143 + +ENTRYPOINT ["/usr/bin/ocis-reva"] +CMD ["server"] + +COPY bin/ocis-reva /usr/bin/ocis-reva diff --git a/reva/docker/Dockerfile.linux.arm b/reva/docker/Dockerfile.linux.arm new file mode 100644 index 0000000000..af07021030 --- /dev/null +++ b/reva/docker/Dockerfile.linux.arm @@ -0,0 +1,19 @@ +FROM arm32v6/alpine:latest + +RUN apk update && \ + apk upgrade && \ + apk add ca-certificates mailcap && \ + rm -rf /var/cache/apk/* && \ + echo 'hosts: files dns' >| /etc/nsswitch.conf + +LABEL maintainer="ownCloud GmbH " \ + org.label-schema.name="oCIS Reva" \ + org.label-schema.vendor="ownCloud GmbH" \ + org.label-schema.schema-version="1.0" + +EXPOSE 9140 9141 9142 9143 + +ENTRYPOINT ["/usr/bin/ocis-reva"] +CMD ["server"] + +COPY bin/ocis-reva /usr/bin/ocis-reva diff --git a/reva/docker/Dockerfile.linux.arm64 b/reva/docker/Dockerfile.linux.arm64 new file mode 100644 index 0000000000..e8f5ac3626 --- /dev/null +++ b/reva/docker/Dockerfile.linux.arm64 @@ -0,0 +1,19 @@ +FROM arm64v8/alpine:latest + +RUN apk update && \ + apk upgrade && \ + apk add ca-certificates mailcap && \ + rm -rf /var/cache/apk/* && \ + echo 'hosts: files dns' >| /etc/nsswitch.conf + +LABEL maintainer="ownCloud GmbH " \ + org.label-schema.name="oCIS Reva" \ + org.label-schema.vendor="ownCloud GmbH" \ + org.label-schema.schema-version="1.0" + +EXPOSE 9140 9141 9142 9143 + +ENTRYPOINT ["/usr/bin/ocis-reva"] +CMD ["server"] + +COPY bin/ocis-reva /usr/bin/ocis-reva diff --git a/reva/docker/manifest.tmpl b/reva/docker/manifest.tmpl new file mode 100644 index 0000000000..ac5ae8e046 --- /dev/null +++ b/reva/docker/manifest.tmpl @@ -0,0 +1,22 @@ +image: owncloud/ocis-reva:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}} +{{#if build.tags}} +tags: +{{#each build.tags}} + - {{this}} +{{/each}} +{{/if}} +manifests: + - image: owncloud/ocis-reva:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-amd64 + platform: + architecture: amd64 + os: linux + - image: owncloud/ocis-reva:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm64 + platform: + architecture: arm64 + variant: v8 + os: linux + - image: owncloud/ocis-reva:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}linux-arm + platform: + architecture: arm + variant: v6 + os: linux diff --git a/reva/docs/_index.md b/reva/docs/_index.md new file mode 100644 index 0000000000..ab942240c0 --- /dev/null +++ b/reva/docs/_index.md @@ -0,0 +1,45 @@ +--- +title: "Reva" +date: 2018-05-02T00:00:00+00:00 +weight: 10 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: _index.md +--- + +This service provides an ocis extension that wraps [reva](https://github.com/cs3org/reva/) and adds an opinionated configuration to it. + +It uses the port range 9140-9179 to preconfigure several services. + +| port | service | ++------+---------+ +| 9109 | health? | +| 9140 | frontend | +| 9141 | frontend debug | +| 9142 | gateway | +| 9143 | gateway debug | +| 9144 | users | +| 9145 | users debug | +| 9146 | authbasic | +| 9147 | authbasic debug | +| 9148 | authbearer | +| 9149 | authbearer debug | +| 9150 | sharing | +| 9151 | sharing debug | +| 9152 | storage root | +| 9153 | storage root debug | +| 9154 | storage home | +| 9155 | storage home debug | +| 9156 | storage home data | +| 9157 | storage home data debug | +| 9158 | storage eos | +| 9159 | storage eos debug | +| 9160 | storage eos data | +| 9161 | storage eos data debug | +| 9162 | storage oc | +| 9163 | storage oc debug | +| 9164 | storage oc data | +| 9165 | storage oc data debug | +| 9166-9177 | reserved for s3, wnd, custom + data providers | +| 9178 | storage public link | +| 9179 | storage public link data | diff --git a/reva/docs/building.md b/reva/docs/building.md new file mode 100644 index 0000000000..cebab803f2 --- /dev/null +++ b/reva/docs/building.md @@ -0,0 +1,26 @@ +--- +title: "Building" +date: 2018-05-02T00:00:00+00:00 +weight: 30 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: building.md +--- + +As this project is built with Go, so you need to install that first. The installation of Go is out of the scope of this document, please follow the official documentation for [Go](https://golang.org/doc/install).To build this project you have to install Go >= v1.13. After the installation of the required tools you need to get the sources: + +{{< highlight txt >}} +git clone https://github.com/owncloud/ocis-reva.git +cd ocis-reva +{{< / highlight >}} + +All required tool besides Go itself and make are bundled or getting automatically installed within the `GOPATH`. All commands to build this project are part of our `Makefile`. + + +### Backend + +{{< highlight txt >}} +make build +{{< / highlight >}} + +The above command should produce the binary within the `bin/` folder now, give it a try with `./bin/ocis-reva -h` to see all available options. diff --git a/reva/docs/configuration.md b/reva/docs/configuration.md new file mode 100644 index 0000000000..792b5a5304 --- /dev/null +++ b/reva/docs/configuration.md @@ -0,0 +1,656 @@ +--- +title: "Configuration" +date: "2020-09-09T12:38:00+0200" +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: configuration.md +--- + +{{< toc >}} + +## Configuration + +oCIS Single Binary is not responsible for configuring extensions. Instead, each extension could either be configured by environment variables, cli flags or config files. + +Each extension has its dedicated documentation page (e.g. https://owncloud.github.io/extensions/ocis_proxy/configuration) which lists all possible configurations. Config files and environment variables are picked up if you use the `./bin/ocis server` command within the oCIS single binary. Command line flags must be set explicitly on the extensions subcommands. + +### Configuration using config files + +Out of the box extensions will attempt to read configuration details from: + +```console +/etc/ocis +$HOME/.ocis +./config +``` + +For this configuration to be picked up, have a look at your extension `root` command and look for which default config name it has assigned. *i.e: ocis-proxy reads `proxy.json | yaml | toml ...`*. + +So far we support the file formats `JSON` and `YAML`, if you want to get a full example configuration just take a look at [our repository](https://github.com/owncloud/ocis/tree/master/config), there you can always see the latest configuration format. These example configurations include all available options and the default values. The configuration file will be automatically loaded if it's placed at `/etc/ocis/ocis.yml`, `${HOME}/.ocis/ocis.yml` or `$(pwd)/config/ocis.yml`. + +### Envrionment variables + +If you prefer to configure the service with environment variables you can see the available variables below. + +### Commandline flags + +If you prefer to configure the service with commandline flags you can see the available variables below. Command line flags are only working when calling the subcommand directly. + +## Root Command + +Example service for Reva/oCIS + +Usage: `ocis-reva [global options] command [command options] [arguments...]` + +--config-file | $REVA_CONFIG_FILE +: Path to config file. + +--log-level | $REVA_LOG_LEVEL +: Set logging level. Default: `info`. + +--log-pretty | $REVA_LOG_PRETTY +: Enable pretty logging. + +--log-color | $REVA_LOG_COLOR +: Enable colored logging. + +## Sub Commands + +### ocis-reva frontend + +Start reva frontend service + +Usage: `ocis-reva frontend [command options] [arguments...]` + +--debug-addr | $REVA_FRONTEND_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9141`. + +--transfer-secret | $REVA_TRANSFER_SECRET +: Transfer secret for datagateway. Default: `replace-me-with-a-transfer-secret`. + +--webdav-namespace | $WEBDAV_NAMESPACE +: Namespace prefix for the /webdav endpoint. Default: `/home/`. + +--dav-files-namespace | $DAV_FILES_NAMESPACE +: Namespace prefix for the webdav /dav/files endpoint. Default: `/oc/`. + +--network | $REVA_FRONTEND_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_FRONTEND_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `http`. + +--addr | $REVA_FRONTEND_ADDR +: Address to bind reva service. Default: `0.0.0.0:9140`. + +--url | $REVA_FRONTEND_URL +: URL to use for the reva service. Default: `https://localhost:9200`. + +--datagateway-prefix | $REVA_FRONTEND_DATAGATEWAY_PREFIX +: datagateway prefix. Default: `data`. + +--ocdav-prefix | $REVA_FRONTEND_OCDAV_PREFIX +: owncloud webdav endpoint prefix. + +--ocs-prefix | $REVA_FRONTEND_OCS_PREFIX +: open collaboration services endpoint prefix. Default: `ocs`. + +--gateway-url | $REVA_GATEWAY_URL +: URL to use for the reva gateway service. Default: `localhost:9142`. + +--upload-disable-tus | $REVA_FRONTEND_UPLOAD_DISABLE_TUS +: Disables TUS upload mechanism. Default: `false`. + +--upload-http-method-override | $REVA_FRONTEND_UPLOAD_HTTP_METHOD_OVERRIDE +: Specify an HTTP method (ex: POST) that clients should to use when uploading instead of PATCH. + +### ocis-reva health + +Check health status + +Usage: `ocis-reva health [command options] [arguments...]` + +--debug-addr | $REVA_DEBUG_ADDR +: Address to debug endpoint. Default: `0.0.0.0:9109`. + +### ocis-reva storage-home-data + +Start reva storage-home-data service + +Usage: `ocis-reva storage-home-data [command options] [arguments...]` + +--debug-addr | $REVA_STORAGE_HOME_DATA_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9157`. + +--network | $REVA_STORAGE_HOME_DATA_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_STORAGE_HOME_DATA_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `http`. + +--addr | $REVA_STORAGE_HOME_DATA_ADDR +: Address to bind reva service. Default: `0.0.0.0:9156`. + +--url | $REVA_STORAGE_HOME_DATA_URL +: URL to use for the reva service. Default: `localhost:9156`. + +--driver | $REVA_STORAGE_HOME_DATA_DRIVER +: storage driver for home data mount: eg. local, eos, owncloud, ocis or s3. Default: `owncloud`. + +--prefix | $REVA_STORAGE_HOME_DATA_PREFIX +: prefix for the http endpoint, without leading slash. Default: `data`. + +--temp-folder | $REVA_STORAGE_HOME_DATA_TEMP_FOLDER +: temp folder. Default: `/var/tmp/`. + +--enable-home | $REVA_STORAGE_HOME_ENABLE_HOME +: enable the creation of home directories. Default: `true`. + +--gateway-url | $REVA_GATEWAY_URL +: URL to use for the reva gateway service. Default: `localhost:9142`. + +--users-url | $REVA_USERS_URL +: URL to use for the reva service. Default: `localhost:9144`. + +### ocis-reva storage-oc + +Start reva storage-oc service + +Usage: `ocis-reva storage-oc [command options] [arguments...]` + +--debug-addr | $REVA_STORAGE_OC_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9163`. + +--network | $REVA_STORAGE_OC_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_STORAGE_OC_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_STORAGE_OC_ADDR +: Address to bind reva service. Default: `0.0.0.0:9162`. + +--url | $REVA_STORAGE_OC_URL +: URL to use for the reva service. Default: `localhost:9162`. + +--driver | $REVA_STORAGE_OC_DRIVER +: storage driver for oc mount: eg. local, eos, owncloud, ocis or s3. Default: `owncloud`. + +--mount-path | $REVA_STORAGE_OC_MOUNT_PATH +: mount path. Default: `/oc`. + +--mount-id | $REVA_STORAGE_OC_MOUNT_ID +: mount id. Default: `1284d238-aa92-42ce-bdc4-0b0000009162`. + +--expose-data-server | $REVA_STORAGE_OC_EXPOSE_DATA_SERVER +: exposes a dedicated data server. Default: `false`. + +--data-server-url | $REVA_STORAGE_OC_DATA_SERVER_URL +: data server url. Default: `http://localhost:9164/data`. + +--users-url | $REVA_USERS_URL +: URL to use for the reva service. Default: `localhost:9144`. + +### ocis-reva auth-basic + +Start reva authprovider for basic auth + +Usage: `ocis-reva auth-basic [command options] [arguments...]` + +--debug-addr | $REVA_AUTH_BASIC_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9147`. + +--auth-driver | $REVA_AUTH_DRIVER +: auth driver: 'demo', 'json' or 'ldap'. Default: `ldap`. + +--auth-json | $REVA_AUTH_JSON +: Path to users.json file. + +--network | $REVA_AUTH_BASIC_NETWORK +: Network to use for the reva auth-basic service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_AUTH_BASIC_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_AUTH_BASIC_ADDR +: Address to bind reva service. Default: `0.0.0.0:9146`. + +--url | $REVA_AUTH_BASIC_URL +: URL to use for the reva service. Default: `localhost:9146`. + +### ocis-reva gateway + +Start reva gateway + +Usage: `ocis-reva gateway [command options] [arguments...]` + +--debug-addr | $REVA_GATEWAY_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9143`. + +--transfer-secret | $REVA_TRANSFER_SECRET +: Transfer secret for datagateway. Default: `replace-me-with-a-transfer-secret`. + +--network | $REVA_GATEWAY_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_GATEWAY_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_GATEWAY_ADDR +: Address to bind reva service. Default: `0.0.0.0:9142`. + +--url | $REVA_GATEWAY_URL +: URL to use for the reva service. Default: `localhost:9142`. + +--commit-share-to-storage-grant | $REVA_GATEWAY_COMMIT_SHARE_TO_STORAGE_GRANT +: Commit shares to the share manager. Default: `true`. + +--commit-share-to-storage-ref | $REVA_GATEWAY_COMMIT_SHARE_TO_STORAGE_REF +: Commit shares to the storage. Default: `true`. + +--share-folder | $REVA_GATEWAY_SHARE_FOLDER +: mount shares in this folder of the home storage provider. Default: `Shares`. + +--disable-home-creation-on-login | $REVA_GATEWAY_DISABLE_HOME_CREATION_ON_LOGIN +: Disable creation of home folder on login. + +--storage-registry-driver | $REVA_STORAGE_REGISTRY_DRIVER +: driver of the storage registry. Default: `static`. + +--storage-home-provider | $REVA_STORAGE_HOME_PROVIDER +: mount point of the storage provider for user homes in the global namespace. Default: `/home`. + +--frontend-url | $REVA_FRONTEND_URL +: URL to use for the reva service. Default: `https://localhost:9200`. + +--datagateway-url | $REVA_DATAGATEWAY_URL +: URL to use for the reva datagateway. Default: `https://localhost:9200/data`. + +--users-url | $REVA_USERS_URL +: URL to use for the reva service. Default: `localhost:9144`. + +--auth-basic-url | $REVA_AUTH_BASIC_URL +: URL to use for the reva service. Default: `localhost:9146`. + +--auth-bearer-url | $REVA_AUTH_BEARER_URL +: URL to use for the reva service. Default: `localhost:9148`. + +--sharing-url | $REVA_SHARING_URL +: URL to use for the reva service. Default: `localhost:9150`. + +--storage-root-url | $REVA_STORAGE_ROOT_URL +: URL to use for the reva service. Default: `localhost:9152`. + +--storage-root-mount-path | $REVA_STORAGE_ROOT_MOUNT_PATH +: mount path. Default: `/`. + +--storage-root-mount-id | $REVA_STORAGE_ROOT_MOUNT_ID +: mount id. Default: `1284d238-aa92-42ce-bdc4-0b0000009152`. + +--storage-home-url | $REVA_STORAGE_HOME_URL +: URL to use for the reva service. Default: `localhost:9154`. + +--storage-home-mount-path | $REVA_STORAGE_HOME_MOUNT_PATH +: mount path. Default: `/home`. + +--storage-home-mount-id | $REVA_STORAGE_HOME_MOUNT_ID +: mount id. Default: `1284d238-aa92-42ce-bdc4-0b0000009154`. + +--storage-eos-url | $REVA_STORAGE_EOS_URL +: URL to use for the reva service. Default: `localhost:9158`. + +--storage-eos-mount-path | $REVA_STORAGE_EOS_MOUNT_PATH +: mount path. Default: `/eos`. + +--storage-eos-mount-id | $REVA_STORAGE_EOS_MOUNT_ID +: mount id. Default: `1284d238-aa92-42ce-bdc4-0b0000009158`. + +--storage-oc-url | $REVA_STORAGE_OC_URL +: URL to use for the reva service. Default: `localhost:9162`. + +--storage-oc-mount-path | $REVA_STORAGE_OC_MOUNT_PATH +: mount path. Default: `/oc`. + +--storage-oc-mount-id | $REVA_STORAGE_OC_MOUNT_ID +: mount id. Default: `1284d238-aa92-42ce-bdc4-0b0000009162`. + +--public-link-url | $REVA_STORAGE_PUBLIC_LINK_URL +: URL to use for the public links service. Default: `localhost:9178`. + +--storage-public-link-mount-path | $REVA_STORAGE_PUBLIC_LINK_MOUNT_PATH +: mount path. Default: `/public/`. + +### ocis-reva sharing + +Start reva sharing service + +Usage: `ocis-reva sharing [command options] [arguments...]` + +--debug-addr | $REVA_SHARING_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9151`. + +--network | $REVA_SHARING_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_SHARING_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_SHARING_ADDR +: Address to bind reva service. Default: `0.0.0.0:9150`. + +--url | $REVA_SHARING_URL +: URL to use for the reva service. Default: `localhost:9150`. + +--user-driver | $REVA_SHARING_USER_DRIVER +: driver to use for the UserShareProvider. Default: `json`. + +--user-json-file | $REVA_SHARING_USER_JSON_FILE +: file used to persist shares for the UserShareProvider. Default: `/var/tmp/reva/shares.json`. + +--public-driver | $REVA_SHARING_PUBLIC_DRIVER +: driver to use for the PublicShareProvider. Default: `json`. + +### ocis-reva storage-eos-data + +Start reva storage-eos-data service + +Usage: `ocis-reva storage-eos-data [command options] [arguments...]` + +--debug-addr | $REVA_STORAGE_OC_DATA_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9161`. + +--network | $REVA_STORAGE_EOS_DATA_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_STORAGE_EOS_DATA_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `http`. + +--addr | $REVA_STORAGE_EOS_DATA_ADDR +: Address to bind reva service. Default: `0.0.0.0:9160`. + +--url | $REVA_STORAGE_EOS_DATA_URL +: URL to use for the reva service. Default: `localhost:9160`. + +--driver | $REVA_STORAGE_EOS_DATA_DRIVER +: storage driver for eos data mount: eg. local, eos, owncloud, ocis or s3. Default: `eos`. + +--prefix | $REVA_STORAGE_EOS_DATA_PREFIX +: prefix for the http endpoint, without leading slash. Default: `data`. + +--temp-folder | $REVA_STORAGE_EOS_DATA_TEMP_FOLDER +: temp folder. Default: `/var/tmp/`. + +--gateway-url | $REVA_GATEWAY_URL +: URL to use for the reva gateway service. Default: `localhost:9142`. + +--users-url | $REVA_USERS_URL +: URL to use for the reva service. Default: `localhost:9144`. + +### ocis-reva auth-bearer + +Start reva authprovider for bearer auth + +Usage: `ocis-reva auth-bearer [command options] [arguments...]` + +--debug-addr | $REVA_AUTH_BEARER_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9149`. + +--oidc-issuer | $REVA_OIDC_ISSUER +: OIDC issuer. Default: `https://localhost:9200`. + +--oidc-insecure | $REVA_OIDC_INSECURE +: OIDC allow insecure communication. Default: `true`. + +--oidc-id-claim | $REVA_OIDC_ID_CLAIM +: OIDC id claim. Default: `preferred_username`. + +--oidc-uid-claim | $REVA_OIDC_UID_CLAIM +: OIDC uid claim. + +--oidc-gid-claim | $REVA_OIDC_GID_CLAIM +: OIDC gid claim. + +--network | $REVA_AUTH_BEARER_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_AUTH_BEARER_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_AUTH_BEARER_ADDR +: Address to bind reva service. Default: `0.0.0.0:9148`. + +--url | $REVA_AUTH_BEARER_URL +: URL to use for the reva service. Default: `localhost:9148`. + +### ocis-reva storage-eos + +Start reva storage-eos service + +Usage: `ocis-reva storage-eos [command options] [arguments...]` + +--debug-addr | $REVA_STORAGE_EOS_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9159`. + +--network | $REVA_STORAGE_EOS_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_STORAGE_EOS_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_STORAGE_EOS_ADDR +: Address to bind reva service. Default: `0.0.0.0:9158`. + +--url | $REVA_STORAGE_EOS_URL +: URL to use for the reva service. Default: `localhost:9158`. + +--driver | $REVA_STORAGE_EOS_DRIVER +: storage driver for eos mount: eg. local, eos, owncloud, ocis or s3. Default: `eos`. + +--mount-path | $REVA_STORAGE_EOS_MOUNT_PATH +: mount path. Default: `/eos`. + +--mount-id | $REVA_STORAGE_EOS_MOUNT_ID +: mount id. Default: `1284d238-aa92-42ce-bdc4-0b0000009158`. + +--expose-data-server | $REVA_STORAGE_EOS_EXPOSE_DATA_SERVER +: exposes a dedicated data server. Default: `false`. + +--data-server-url | $REVA_STORAGE_EOS_DATA_SERVER_URL +: data server url. Default: `http://localhost:9160/data`. + +### ocis-reva storage-home + +Start reva storage-home service + +Usage: `ocis-reva storage-home [command options] [arguments...]` + +--debug-addr | $REVA_STORAGE_HOME_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9155`. + +--network | $REVA_STORAGE_HOME_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_STORAGE_HOME_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_STORAGE_HOME_ADDR +: Address to bind reva service. Default: `0.0.0.0:9154`. + +--url | $REVA_STORAGE_HOME_URL +: URL to use for the reva service. Default: `localhost:9154`. + +--driver | $REVA_STORAGE_HOME_DRIVER +: storage driver for home mount: eg. local, eos, owncloud, ocis or s3. Default: `owncloud`. + +--mount-path | $REVA_STORAGE_HOME_MOUNT_PATH +: mount path. Default: `/home`. + +--mount-id | $REVA_STORAGE_HOME_MOUNT_ID +: mount id. Default: `1284d238-aa92-42ce-bdc4-0b0000009162`. + +--expose-data-server | $REVA_STORAGE_HOME_EXPOSE_DATA_SERVER +: exposes a dedicated data server. Default: `false`. + +--data-server-url | $REVA_STORAGE_HOME_DATA_SERVER_URL +: data server url. Default: `http://localhost:9156/data`. + +--enable-home | $REVA_STORAGE_HOME_ENABLE_HOME +: enable the creation of home directories. Default: `true`. + +--users-url | $REVA_USERS_URL +: URL to use for the reva service. Default: `localhost:9144`. + +### ocis-reva storage-oc-data + +Start reva storage-oc-data service + +Usage: `ocis-reva storage-oc-data [command options] [arguments...]` + +--debug-addr | $REVA_STORAGE_OC_DATA_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9165`. + +--network | $REVA_STORAGE_OC_DATA_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_STORAGE_OC_DATA_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `http`. + +--addr | $REVA_STORAGE_OC_DATA_ADDR +: Address to bind reva service. Default: `0.0.0.0:9164`. + +--url | $REVA_STORAGE_OC_DATA_URL +: URL to use for the reva service. Default: `localhost:9164`. + +--driver | $REVA_STORAGE_OC_DATA_DRIVER +: storage driver for oc data mount: eg. local, eos, owncloud, ocis or s3. Default: `owncloud`. + +--prefix | $REVA_STORAGE_OC_DATA_PREFIX +: prefix for the http endpoint, without leading slash. Default: `data`. + +--temp-folder | $REVA_STORAGE_OC_DATA_TEMP_FOLDER +: temp folder. Default: `/var/tmp/`. + +--gateway-url | $REVA_GATEWAY_URL +: URL to use for the reva gateway service. Default: `localhost:9142`. + +--users-url | $REVA_USERS_URL +: URL to use for the reva service. Default: `localhost:9144`. + +### ocis-reva storage-root + +Start reva storage-root service + +Usage: `ocis-reva storage-root [command options] [arguments...]` + +--debug-addr | $REVA_STORAGE_ROOT_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9153`. + +--network | $REVA_STORAGE_ROOT_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_STORAGE_ROOT_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_STORAGE_ROOT_ADDR +: Address to bind reva service. Default: `0.0.0.0:9152`. + +--url | $REVA_STORAGE_ROOT_URL +: URL to use for the reva service. Default: `localhost:9152`. + +--driver | $REVA_STORAGE_ROOT_DRIVER +: storage driver for root mount: eg. local, eos, owncloud, ocis or s3. Default: `local`. + +--mount-path | $REVA_STORAGE_ROOT_MOUNT_PATH +: mount path. Default: `/`. + +--mount-id | $REVA_STORAGE_ROOT_MOUNT_ID +: mount id. Default: `123e4567-e89b-12d3-a456-426655440001`. + +--expose-data-server | $REVA_STORAGE_ROOT_EXPOSE_DATA_SERVER +: exposes a dedicated data server. + +--data-server-url | $REVA_STORAGE_ROOT_DATA_SERVER_URL +: data server url. + +### ocis-reva users + +Start reva users service + +Usage: `ocis-reva users [command options] [arguments...]` + +--debug-addr | $REVA_SHARING_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9145`. + +--network | $REVA_USERS_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_USERS_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_USERS_ADDR +: Address to bind reva service. Default: `0.0.0.0:9144`. + +--url | $REVA_USERS_URL +: URL to use for the reva service. Default: `localhost:9144`. + +--driver | $REVA_USERS_DRIVER +: user driver: 'demo', 'json', 'ldap', or 'rest'. Default: `ldap`. + +--json-config | $REVA_USERS_JSON +: Path to users.json file. + +--rest-client-id | $REVA_REST_CLIENT_ID +: User rest driver Client ID. + +--rest-client-secret | $REVA_REST_CLIENT_SECRET +: User rest driver Client Secret. + +--rest-redis-address | $REVA_REST_REDIS_ADDRESS +: Address for redis server. Default: `localhost:6379`. + +--rest-redis-username | $REVA_REST_REDIS_USERNAME +: Username for redis server. + +--rest-redis-password | $REVA_REST_REDIS_PASSWORD +: Password for redis server. + +--rest-id-provider | $REVA_REST_ID_PROVIDER +: The OIDC Provider. + +--rest-api-base-url | $REVA_REST_API_BASE_URL +: Base API Endpoint. + +--rest-oidc-token-endpoint | $REVA_REST_OIDC_TOKEN_ENDPOINT +: Endpoint to generate token to access the API. + +--rest-target-api | $REVA_REST_TARGET_API +: The target application. + +### ocis-reva reva-storage-public-link + +Start reva storage-public-link service + +Usage: `ocis-reva reva-storage-public-link [command options] [arguments...]` + +--debug-addr | $REVA_STORAGE_PUBLIC_LINK_DEBUG_ADDR +: Address to bind debug server. Default: `0.0.0.0:9179`. + +--network | $REVA_STORAGE_PUBLIC_LINK_NETWORK +: Network to use for the reva service, can be 'tcp', 'udp' or 'unix'. Default: `tcp`. + +--protocol | $REVA_STORAGE_PUBLIC_LINK_PROTOCOL +: protocol for reva service, can be 'http' or 'grpc'. Default: `grpc`. + +--addr | $REVA_STORAGE_PUBLIC_LINK_ADDR +: Address to bind reva service. Default: `0.0.0.0:9178`. + +--url | $REVA_STORAGE_PUBLIC_LINK_URL +: Address to bind reva service. Default: `localhost:9178`. + +--mount-path | $REVA_STORAGE_PUBLIC_LINK_MOUNT_PATH +: mount path. Default: `/public/`. + +--gateway-url | $REVA_GATEWAY_URL +: URL to use for the reva gateway service. Default: `localhost:9142`. + diff --git a/reva/docs/getting-started.md b/reva/docs/getting-started.md new file mode 100644 index 0000000000..e7140676e0 --- /dev/null +++ b/reva/docs/getting-started.md @@ -0,0 +1,56 @@ +--- +title: "Getting Started" +date: 2018-05-02T00:00:00+00:00 +weight: 15 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: getting-started.md +--- + +{{< toc >}} + +## Installation + +So far we are offering two different variants for the installation. You can choose between [Docker](https://www.docker.com/) or pre-built binaries which are stored on our download mirrors and GitHub releases. Maybe we will also provide system packages for the major distributions later if we see the need for it. + +### Docker + +Docker images for ocis-reva are hosted on https://hub.docker.com/r/owncloud/ocis-reva. + +The `latest` tag always reflects the current master branch. + +```console +docker pull owncloud/ocis-reva +``` + +#### Dependencies + +- Running ocis-reva currently needs a working Redis caching server +- The default storage location in the container is `/var/tmp/reva/data`. You may want to create a volume to persist the files in the primary storage + +### Binaries + +The pre-built binaries for different platforms are downloadable at https://download.owncloud.com/ocis/ocis-reva/ . Specific releases are organized in separate folders. They are in sync which every release tag on GitHub. The binaries from the current master branch can be found in https://download.owncloud.com/ocis/ocis-reva/testing/ + +```console +curl https://download.owncloud.com/ocis/ocis/1.0.0-beta1/ocis-reva-1.0.0-beta1-darwin-amd64 --output ocis-reva +chmod +x ocis +./ocis-reva sharing +``` + +#### Dependencies + +- Running ocis currently needs a working Redis caching server +- The default promary storage location is `/var/tmp/reva/data`. You can change that value by configuration. + +## Usage + +The program provides a few sub-commands on execution. The available configuration methods have already been mentioned above. Generally you can always see a formated help output if you execute the binary via `ocis-reva --help`. + +### Health + +The health command is used to execute a health check, if the exit code equals zero the service should be up and running, if the exist code is greater than zero the service is not in a healthy state. Generally this command is used within our Docker containers, it could also be used within Kubernetes. + +{{< highlight txt >}} +ocis-reva health --help +{{< / highlight >}} diff --git a/reva/docs/license.md b/reva/docs/license.md new file mode 100644 index 0000000000..682453354c --- /dev/null +++ b/reva/docs/license.md @@ -0,0 +1,10 @@ +--- +title: "License" +date: 2018-05-02T00:00:00+00:00 +weight: 40 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: license.md +--- + +This project is licensed under the [Apache 2.0](https://github.com/owncloud/ocis-reva/blob/master/LICENSE) license. For the license of the used libraries you have to check the respective sources. diff --git a/reva/docs/releasing.md b/reva/docs/releasing.md new file mode 100644 index 0000000000..b233ca59c6 --- /dev/null +++ b/reva/docs/releasing.md @@ -0,0 +1,47 @@ +--- +title: "Releasing" +date: 2020-05-22T00:00:00+00:00 +weight: 60 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: releasing.md +--- + +{{< toc >}} + +To release a new version of ocis-reva, you have to follow a few simple steps. + +## Preparation + +1. Before releasing, make sure that reva has been [updated to the desired version]({{< ref "updating.md" >}}) +2. Create a new branch e.g. `release-x.x.x` where `x.x.x` is the version you want to release. +3. Checkout the preparation branch. +4. Create a new changelog folder and move the unreleased snippets there. +{{< highlight txt >}} +mkdir changelog/x.x.x_yyyy-MM-dd/ # yyyy-MM-dd is the current date +mv changelog/unreleased/* changelog/x.x.x_yyyy-MM-dd/ +{{< / highlight >}} +5. Commit and push the changes +{{< highlight txt >}} +git add --all +git commit -m "prepare release x.x.x" +git push origin release-x.x.x +{{< / highlight >}} +6. Create a pull request to the master branch. + +## Release +1. After the preparation branch has been merged update your local master. +2. [Wait for CI](https://cloud.drone.io/owncloud/ocis-reva) to generate a commit for the changelog update +3. Check out master (or make sure to check out the generated changelog commit in case of subsequent merges) +{{< highlight txt >}} +git checkout master +git pull origin master +{{< / highlight >}} +4. Create a new tag (preferably signed) and replace the version number accordingly. +{{< highlight txt >}} +git tag -s vx.x.x -m "release vx.x.x" +git push origin vx.x.x +{{< / highlight >}} +5. Wait for CI and check that the GitHub release was published. + +Congratulations, you just released ocis-reva! diff --git a/reva/docs/storages.md b/reva/docs/storages.md new file mode 100644 index 0000000000..bc623d0650 --- /dev/null +++ b/reva/docs/storages.md @@ -0,0 +1,194 @@ +--- +title: "Storages" +date: 2020-04-27T18:46:00+01:00 +weight: 37 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: storages.md +--- + +## Storage commands + +`ocis-reva` has multiple storage provider commands to preconfigure different default configurations for the reva *storage provider* service. While you could rerun `ocis-reva storage-oc` multiple times with different flags to get multiple instances we are giving the different commands the necessary default configuration to allow the `ocis` binary to simply start them and not deal with configuration. + +## Storage providers + +To manage the file tree ocis uses reva *storage providers* that are accessing the underlying storage using a *storage driver*. The driver can be used to change the implementation of a storage aspect to better reflect the actual underlying storage capabilities. As an example a move operation on a POSIX filesystem ([theoretically](https://danluu.com/deconstruct-files/)) is an atomic operation. When trying to implement a file tree on top of S3 there is no native move operation that can be used. A naive implementation might fall back on a COPY and DELETE. Some S3 implementations provide a COPY operation that uses an existing key as the source, so the file at least does not need to be reuploaded. In the worst case scenario, which is renaming a folder with hundreds of thousands of objects, a reupload for every file has to be made. Instead of hiding this complexity a better choice might be to disable renaming of files or at least folders on S3. There are however implementations of filesystems on top of S3 that store the tree metadata in dedicated objects or use a completely different persistence mechanism like a distributed key value store to implement the file tree aspect of a storage. + + +{{< hint info >}} +While the *storage provider* is responsible for managing the tree, file up and download is delegated to a dedicated *data provider*. See below. +{{< /hint >}} + +## Storage aspects +A lot of different storage technologies exist, ranging from general purpose file systems with POSIX semantics to software defined storage with multiple APIs. Choosing any of them is making a tradeoff decision. Or, if a storage technology is already in place it automatically predetermines the capabilities that can be made available. *Not all storage systems are created equal.* + +Unfortunately, no POSIX filesystem natively supports all storage aspects that ownCloud 10 requires: + + +### A hierarchical file tree +An important aspect of a filesystem is organizing files and directories in a file hierarchy, or tree. It allows you to create, move and delete nodes. Beside the name a node also has well known metadata like size and mtime that are persisted in the tree as well. + +{{< hint info >}} +**Folders are not directories** +There is a difference between *folder* and *directory*: a *directory* is a file system concept. A *folder* is a metaphor for the concept of a physical file folder. There are also *virtual folders* or *smart folders* like the recent files folder which are no file system *directories*. So, every *directory* and every *virtual folder* is a *folder*, but not every *folder* is a *directory*. See [the folder metaphor in wikipedia](https://en.wikipedia.org/wiki/Directory_(computing)#Folder_metaphor). Also see the activity history below. +{{< /hint >}} + +#### Id based lookup +While traditionally nodes in the tree are reached by traversing the path the tree persistence should be prepared to look up a node by an id. Think of an inode in a POSIX filesystem. If this operation needs to be cached for performance reasons keep in mind that cache invalidation is hard and crawling all files to update the inode to path mapping takes O(n), not O(1). + +#### ETag propagation +For the state based sync a client can discover changes by recursively descending the tree and comparing the ETag for every node. If the storage technology supports propagating ETag changes up the tree, only the root node of a tree needs to be checked to determine if a discovery needs to be started and which nodes need to be traversed. This allows using the storage technology itself to persist all metadata that is necessary for sync, without additional services or caches. + +#### Subtree size accounting +The tree can keep track of how many bytes are stored in a folder. Similar to ETag propagation a change in file size is propagated up the hierarchy. + +{{< hint info >}} +**ETag and Size propagation** +When propagating the ETag (mtime) and size changes up the tree the question is where to stop. If all changes need to be propagated to the root of a storage then the root or busy folders will become a hotspot. There are two things to keep in mind: 1. propagation only happens up to the root of a single space (a user private drive or a single group drive), 2. no cross storage propagation. The latter was used in oc10 to let clients detect when a file in a received shared folder changed. This functionality is moving to the storage registry which caches the ETag for every root so clients can discover if and which storage changed. +{{< /hint >}} + +#### Rename +Depending on the underlying storage technology some operations may either be slow, up to a point where it makes more sense to disable them entirely. One example is a folder rename: on S3 a *simple* folder rename translates to a copy and delete operation for every child of the renamed folder. There is an exception though: this restriction only applies if the S3 storage is treated like a filesystem, where the keys are the path and the value is the file content. There are smarter ways to implement file systems on top of S3, but again: there is always a tradeoff. + +{{< hint info >}} +**S3 has no rename** +Technically, [S3 has no rename operation at all](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-s3-objects.html#copy-object). By design, the location of the value is determined by the key, so it always has to do a copy and delete. Another example is the [redis RENAME operation](https://redis.io/commands/rename): while being specified as O(1) it *executes an implicit DEL operation, so if the deleted key contains a very big value it may cause high latency...* +{{< /hint >}} + +#### Arbitrary metadata persistence +In addition to well known metadata like name size and mtime, users might be able to add arbitrary metadata like tags, comments or [dublin core](https://en.wikipedia.org/wiki/Dublin_Core). In POSIX filesystems this maps to extended attributes. + +### Grant persistence +The CS3 API uses grants to describe access permissions. Storage systems have a wide range of permissions granularity and not all grants may be supported by every storage driver. POSIX ACLs for example have no expiry. If the storage system does not support certain grant properties, e.g. expiry, then the storage driver may choose to implement them in a different way. Expiries could be persisted in a different way and checked periodically to remove the grants. Again: every decision is a tradeoff. + +### Trash persistence +After deleting a node the storage allows listing the deleted nodes and has an undo mechanism for them. + +### Versions persistence +A user can restore a previous version of a file. + +{{< hint info >}} +**Snapshots are not versions** +Modern POSIX filesystems support snapshotting of volumes. This is different from keeping track of versions to a file or folder, but might be another implementation strategy for a storage driver to allow users to restore content. +{{< /hint >}} + +### Activity History +The storage keeps an activity history, tracking the different actions that have been performed. This does not only include file changes but also metadata changes like renames and permission changes. + +## Storage drivers + +Reva currently has four storage driver implementations that can be used for *storage providers* an well as *data providers*. + +### Local Storage Driver + +The *minimal* storage driver for a POSIX based filesystem. It literally supports none of the storage aspect other than basic file tree management. Sharing can - to a degree - be implemented using POSIX ACLs. + +- tree provided by a POSIX filesystem + - inefficient path by id lookup, currently uses the file path as id, so ids are not stable + - can store a uuid in extended attributes and use a cache to look them up, similar to the ownCloud driver + - no native ETag propagation, five options are available: + - built in propagation (changes bypassing ocis are not picked up until a rescan) + - built in inotify (requires 48 bytes of RAM per file, needs to keep track of every file and folder) + - external inotify (same RAM requirement, but could be triggered by external tools, e.g. a workflow engine) + - kernel audit log (use the linux kernel audit to capture file events on the storage and offload them to a queue) + - fuse filesystem overlay + - no subtree accounting, same options as for ETag propagation + - efficient rename + - arbitrary metadata using extended attributes +- grant persistence + - using POSIX ACLs + - requires an LDAP server to make guest accounts available in the OS + - OCIS has glauth which contains all users + - an existing LDAP could be used if guests ar provisioned in another way + - using extended attributes to implement expiry or sharing that does not require OS level integration + - fuse filesystem overlay +- no native trash + - could use the [The FreeDesktop.org Trash specification](https://specifications.freedesktop.org/trash-spec/trashspec-latest.html) + - fuse filesystem overlay +- no native versions, multiple options possible + - git for folders + - rcs for single files + - rsnapshot for hourly / daily / weekly / monthly backups ... but this is not versioning as known from oc10 + - design new freedesktop spec, basically what is done in oc10 without the limitations or borrow ideas from the freedesktop trash spec + - fuse filesystem overlay + +To provide the other storage aspects we plan to implement a FUSE overlay filesystem which will add the different aspects on top of local filesystems like ext4, btrfs or xfs. It should work on NFSv45 as well, although NFSv4 supports RichACLs and we will explore how to leverage them to implement sharing at a future date. The idea is to use the storages native capabilities to deliver the best user experience. But again: that means making the right tradeoffs. + +### OwnCloud Storage Driver + +This is the current default storage driver. While it implements the file tree (using redis, including id based lookup), ETag propagation, trash, versions and sharing (including expiry) using the data directory layout of ownCloud 10 it has [known limitations](https://github.com/owncloud/core/issues/28095) that cannot be fixed without changing the actual layout on disk. + +To setup it up properly in a distributed fashion, the storage-home and the storage-oc need to share the same underlying FS. Their "data" counterparts also need access to the same shared FS. +For a simple docker-compose setup, you can create a volume which will be used by the "ocis-reva-storage-home", "ocis-reva-storage-home-data", "ocis-reva-storage-oc" and "ocis-reva-storage-oc-data" containers. Using the `owncloud/ocis-reva` docker image, the volume would need to be hooked in the `/var/tmp/reva` folder insde the containers. + +- tree provided by a POSIX filesystem + - file layout is mapped to the old ownCloud 10 layout + - the root of tree for a user on disk is prefixed with `/path/to/data//files/` + - efficient path by id lookup + - all files and folders get assigned a uuid in the extended attributes + - when starting the storage provider it will walk all files to populate a redis kv store for uuid to path lookup + - slow to boot trees with lots of nodes + - build in ETag propagation + - ETags are calculated based on mtime + - mtime is propagated by the storage driver + - changes bypassing ocis are not picked up until a restart of the storage provider + - no subtree accounting, same options as for local storage + - efficient rename + - TODO [update the kv store for path lookup](https://github.com/cs3org/reva/issues/985), this is an O(n) operation + - arbitrary metadata using extended attributes +- grant persistence + - using custom ACLs that are stored as extended attributes + - a grant corresponds to one extended attribute of 40-100 bytes, effectively limiting the number of shares to ~100-40 + - extended attributes have varying limitations, based on the underlying filesystem + - the linux kernel imposes a limit of 255bytes per name and 64KiB per value + - ext2/3/4: total bytes for all attributes of a file is limited to 4KiB (a filesystem block) + - xfs: limit of 64KiB per value + - btrfs: total bytes used for the name, value, and implementation overhead bytes 16KiB (the default filesystem nodesize value) + - does not require OS level integration +- built in trash + - trashed files are moved to `/path/to/data//files_trashbin/` + - trashed files are appended a timestamp `.d`, which [breaks trashing of files that reach the filesystems specific name limit](https://github.com/owncloud/core/issues/28095) +- built in versions + - file versions are stored in `/path/to/data//files_versions/` + - file versions are appended a timestamp `.d`, which [breaks versioning of files that reach the filesystems specific name limit](https://github.com/owncloud/core/issues/28095) + +### EOS Storage Driver + +The CERN eos storage has evolved with ownCloud and natively supports id based lookup, ETag propagation, subtree size accounting, sharing, trash and versions. To use it you need to change the default configuration of the `ocis-reva storage-home` command (or have a look at the Makefile ̀ eos-start` target): + +``` +export REVA_STORAGE_HOME_DRIVER=eos +export REVA_STORAGE_EOS_NAMESPACE=/eos +export REVA_STORAGE_EOS_MASTER_URL="root://eos-mgm1.eoscluster.cern.ch:1094" +export REVA_STORAGE_EOS_ENABLE_HOME=true +export REVA_STORAGE_EOS_LAYOUT="dockertest/{{.Username}}" +``` + +Running it locally also requires the `eos` and `xrootd` binaries. Running it using `make eos-start` will use CentOS based containers that already have the necessary packages installed. + +{{< hint info >}} +Pull requests to add explicit `reva storage-(s3|custom|...)` commands with working defaults are welcome. +{{< /hint >}} + +### S3 Storage Driver + +A naive driver that treats the keys in an S3 capable storage as `/` delimited path names. While it does not support MOVE or ETag propagation it can be used to read and write files. Better integration with native capabilities like versioning is possible but depends on the Use Case. Several storage solutions that provide an S3 interface also support some form of notifications that can be used to implement ETag propagation. + +## Data Providers + +Clients using the CS3 API use an [InitiateFileDownload](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.InitiateFileDownloadRequest) and ]InitiateUpload](https://cs3org.github.io/cs3apis/#cs3.storage.provider.v1beta1.InitiateFileUploadRequest) request at the [reva gateway](https://cs3org.github.io/cs3apis/#cs3.gateway.v1beta1.GatewayAPI) to obtain a URL endpoint that can be used to either GET the file content or upload content using the resumable [tus.io](https://tus.io) protocol. + +The *data provider* uses the same *storage driver* as the *storage provider* but can be scaled independently. + +The dataprovider allows uploading the file to a quarantine area where further data analysis may happen before making the file accessible again. One use case for this is anti virus scanning for files coming from untrusted sources. + +## Future work + +### FUSE overlay filesystem +We are planning to further separate the concerns and use a local storage provider with a FUSE filesystem overlaying the actual POSIX storage that can be used to capture deletes and writes that might happen outside of ocis/reva. + +It would allow us to extend the local storage driver with missing storage aspects while keeping a tree like filesystem that end users are used to see when sshing into the machine. + +### Upload to Quarantine area +Antivirus scanning of random files uploaded from untrusted sources and executing metadata extraction or thumbnail generation should happen in a sandboxed system to prevent malicious users from gaining any information about the system. By spawning a new container with access to only the uploaded data we can further limit the attack surface. diff --git a/reva/docs/testing.md b/reva/docs/testing.md new file mode 100644 index 0000000000..2c03fd2a18 --- /dev/null +++ b/reva/docs/testing.md @@ -0,0 +1,148 @@ +--- +title: "Testing" +date: 2018-05-02T00:00:00+00:00 +weight: 37 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: testing.md +--- + + +## API Acceptance tests + +We are using the ownCloud 10 API acceptance testsuite against ocis. To set this up you need the owncloud 10 core repo, a ldap server that the acceptance tests can use to manage users, a redis server for file-versions and the ocis-reva code. + +### Getting the tests + +All you need to do to get the acceptance tests is check out the core repo: +``` +git clone https://github.com/owncloud/core.git +``` + +### Run a ldap server in a docker container + +The ownCloud 10 acceptance tests will need write permission. You can start a suitable ldap server in a docker container with: + +``` +docker run --hostname ldap.my-company.com \ + -e LDAP_TLS_VERIFY_CLIENT=never \ + -e LDAP_DOMAIN=owncloud.com \ + -e LDAP_ORGANISATION=ownCloud \ + -e LDAP_ADMIN_PASSWORD=admin \ + --name docker-slapd \ + -p 127.0.0.1:389:389 \ + -p 636:636 -d osixia/openldap +``` +### Run a redis server in a docker container + +File versions need a redis server. Start one with docker by using: + +`docker run -e REDIS_DATABASES=1 -p 6379:6379 -d webhippie/redis:latest` + +### Run ocis-reva with that ldap server + +`ocis-reva` provides multiple subcommands. To configure them all via env vars you can export these environment variables. + +``` +export REVA_USERS_DRIVER=ldap +export REVA_LDAP_HOSTNAME=localhost +export REVA_LDAP_PORT=636 +export REVA_LDAP_BASE_DN='dc=owncloud,dc=com' +export REVA_LDAP_USERFILTER='(&(objectclass=posixAccount)(cn=%s))' +export REVA_LDAP_GROUPFILTER='(&(objectclass=posixGroup)(cn=%s))' +export REVA_LDAP_BIND_DN='cn=admin,dc=owncloud,dc=com' +export REVA_LDAP_BIND_PASSWORD=admin +export REVA_LDAP_SCHEMA_UID=uid +export REVA_LDAP_SCHEMA_MAIL=mail +export REVA_LDAP_SCHEMA_DISPLAYNAME=displayName +export REVA_LDAP_SCHEMA_CN=cn +export REVA_FRONTEND_URL=http://localhost:9140 # needed because the proxy is not started +export REVA_DATAGATEWAY_URL=http://localhost:9140/data # needed because the proxy is not started +``` + +Then you need to start the ocis-reva services +``` +bin/ocis-reva frontend & \ +bin/ocis-reva gateway & \ +bin/ocis-reva auth-basic & \ +bin/ocis-reva auth-bearer & \ +bin/ocis-reva sharing & \ +bin/ocis-reva storage-home & \ +bin/ocis-reva storage-home-data & \ +bin/ocis-reva storage-oc & \ +bin/ocis-reva storage-oc-data & \ +bin/ocis-reva users & +``` + +### Run the API acceptance tests + +In the ownCloud 10 core repo run + +``` +make test-acceptance-api \ +TEST_SERVER_URL=http://localhost:9140 \ +TEST_EXTERNAL_USER_BACKENDS=true \ +TEST_OCIS=true \ +OCIS_REVA_DATA_ROOT=/var/tmp/reva/ \ +BEHAT_FILTER_TAGS='~@notToImplementOnOCIS&&~@toImplementOnOCIS&&~@preview-extension-required' \ +SKELETON_DIR=apps/testing/data/apiSkeleton +``` + +Make sure to adjust the settings `TEST_SERVER_URL`,`OCIS_REVA_DATA_ROOT` and `SKELETON_DIR` according to your environment. + +This will run all tests that are relevant to OCIS. + +To run a single test add `BEHAT_FEATURE=` and specify the path to the feature file and an optional line number. For example: `BEHAT_FEATURE='tests/acceptance/features/apiWebdavUpload1/uploadFile.feature:12'` + +### use existing tests for BDD + +As a lot of scenarios are written for oC10, we can use those tests for Behaviour driven development in ocis. +Every scenario that does not work in OCIS with OC storage, is listed in `tests/acceptance/expected-failures-on-OC-storage.txt` with a link to the related issue. +Similarly, scenarios that do not work in OCIS with EOS storage are listed in `tests/acceptance/expected-failures-on-EOS-storage.txt`. +Scenarios from the oC10 API acceptance tests are run in the ordinary acceptance test pipeline in CI. The scenarios that fail are checked against the +expected failures. If there are any differences then the CI pipeline fails. + +Additionally, some issues have scenarios that demonstrate the current buggy behaviour in ocis(reva). +Those scenarios are in this ocis-reva repository in `tests/acceptance/features/apiOcisSpecific`. +Have a look into the [documentation](https://doc.owncloud.com/server/developer_manual/testing/acceptance-tests.html#writing-scenarios-for-bugs) to understand why we are writing those tests. +Also, ocis behaves partly differently with EOS-Storage and OC-Storage. There are scenarios that do not work in OCIS when run on EOS-storage, but works when on OC-Storage, and vice-versa. For those kind of scenarios, ` @skipOnOcis-EOS-Storage` and `@skipOnOcis-OC-Storage` tags are used. For instance, for a scenario that fails on EOS-Storage but passes on OC-Storage, we use `@skipOnOcis-EOS-Storage` tag to let it run on OC-Storage, where it works as expected, instead of skipping the test completely. + +If you want to work on a specific issue + +1. adjust the core commit id to the latest commit in core so that CI will run the latest test code and scenarios from core. + For that change `coreCommit` in the `config` section: + + config = { + 'apiTests': { + 'coreBranch': 'master', + 'coreCommit': 'a06b1bd5ba8e5244bfaf7fa04f441961e6fb0daa', + 'numberOfParts': 2 + } + } + +2. locally run each of the tests marked with that issue in the expected failures file: + + E.g.: + ``` + make test-acceptance-api \ + TEST_SERVER_URL=http://localhost:9140 \ + TEST_EXTERNAL_USER_BACKENDS=true \ + TEST_OCIS=true \ + OCIS_REVA_DATA_ROOT=/var/tmp/reva/ \ + BEHAT_FEATURE='tests/acceptance/features/apiComments/comments.feature:123' + ``` + +3. the tests will fail, try to understand how and why they are failing +4. fix the code +5. go back to 2. and repeat till the tests are passing. +6. remove those tests from the expected failures file. +7. run each of the local tests that were demonstrating the **buggy** behavior. They should fail. +8. delete each of the local tests that were demonstrating the **buggy** behavior. +9. make a PR that has the fixed code, relevant lines removed from the expected failures file and bug demonstration tests deleted. + + If the changes also affect the `ocis` repository make sure the changes get ported over there. + That will need the fixed code in `ocis-reva` to be applied to `ocis` along with the test-related changes. + +### Notes +- in a normal case the test-code cleans up users after the test-run, but if a test-run is interrupted (e.g. by CTRL+C) users might have been left on the LDAP server. In that case rerunning the tests requires wiping the users in the ldap server, otherwise the tests will fail when trying to populate the users. This can be done by simply running `docker stop docker-slapd && docker rm docker-slapd` and [restarting the LDAP server container](#run-a-ldap-server-in-a-docker-container) +- the tests usually create users in the OU `TestUsers` with usernames specified in the feature file. If not defined in the feature file, most users have the password `123456`, defined by `regularUserPassword` in `behat.yml`, but other passwords are also used, see [`\FeatureContext::getPasswordForUser()`](https://github.com/owncloud/core/blob/master/tests/acceptance/features/bootstrap/FeatureContext.php#L386) for mapping and [`\FeatureContext::__construct`](https://github.com/owncloud/core/blob/master/tests/acceptance/features/bootstrap/FeatureContext.php#L1668) for the password definitions. diff --git a/reva/docs/updating.md b/reva/docs/updating.md new file mode 100644 index 0000000000..569c646f35 --- /dev/null +++ b/reva/docs/updating.md @@ -0,0 +1,19 @@ +--- +title: "Updating reva" +date: 2020-05-22T00:00:00+00:00 +weight: 50 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: updating.md +--- + +{{< toc >}} + +## Updating reva + +1. Run `go get github.com/cs3org/reva@master` +2. Create a changelog entry containing changes that were done in [reva](https://github.com/cs3org/reva/commits/master) +3. Create a Pull Request to ocis-reva master with those changes +4. If test issues appear, you might need to [adjust the tests]({{< ref "testing.md" >}}) +5. After the PR is merged, consider doing a [release of ocis-reva]({{< ref "releasing.md" >}}) + diff --git a/reva/docs/users.md b/reva/docs/users.md new file mode 100644 index 0000000000..475c21290f --- /dev/null +++ b/reva/docs/users.md @@ -0,0 +1,52 @@ +--- +title: "Users" +date: 2020-01-16T00:00:00+00:00 +weight: 35 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: users.md +--- + +### Demo driver + +This is a simple user driver for testing. It contains three users: +``` +einstein:relativity +marie:radioactivty +richard:superfluidity +``` +In order to use the `demo` driver you need to export the relevant environment variable: +``` +export REVA_USERS_DRIVER=demo +``` + +### JSON driver + +In order to switch from the `ldap` driver to JSON based users you need to export the relevant environment variables: +``` +export REVA_USERS_DRIVER=json +export REVA_USERS_JSON=/path/to/users.json +``` + +For the format of the users.json have a look at the [reva examples](https://github.com/cs3org/reva/blob/master/examples/separate/users.demo.json) + +### LDAP driver + +This is the default user driver. + +If the below defaults don't match your environment change them accordingly: +``` +export REVA_LDAP_HOSTNAME=localhost +export REVA_LDAP_PORT=9126 +export REVA_LDAP_BASE_DN='dc=example,dc=org' +export REVA_LDAP_USERFILTER='(&(objectclass=posixAccount)(cn=%s))' +export REVA_LDAP_GROUPFILTER='(&(objectclass=posixGroup)(cn=%s))' +export REVA_LDAP_BIND_DN='cn=reva,ou=sysusers,dc=example,dc=org' +export REVA_LDAP_BIND_PASSWORD=reva +export REVA_LDAP_SCHEMA_UID=uid +export REVA_LDAP_SCHEMA_MAIL=mail +export REVA_LDAP_SCHEMA_DISPLAYNAME=sn +export REVA_LDAP_SCHEMA_CN=cn +``` + +Then restart the `bin/ocis-reva users` and `bin/ocis-reva auth-basic` services for the changes to take effect. diff --git a/reva/go.mod b/reva/go.mod new file mode 100644 index 0000000000..7c370a282c --- /dev/null +++ b/reva/go.mod @@ -0,0 +1,20 @@ +module github.com/owncloud/ocis-reva + +go 1.13 + +require ( + github.com/cs3org/reva v1.2.1-0.20200911111727-51649e37df2d + github.com/gofrs/uuid v3.3.0+incompatible + github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect + github.com/micro/cli/v2 v2.1.1 + github.com/micro/go-micro v1.18.0 + github.com/micro/go-micro/v2 v2.0.0 + github.com/oklog/run v1.0.0 + github.com/owncloud/flaex v0.0.0-20200411150708-dce59891a203 + github.com/owncloud/ocis-pkg/v2 v2.2.1 + github.com/pelletier/go-toml v1.6.0 // indirect + github.com/prometheus/client_golang v1.7.1 // indirect + github.com/restic/calens v0.2.0 + github.com/spf13/viper v1.6.1 + gopkg.in/ini.v1 v1.51.1 // indirect +) diff --git a/reva/go.sum b/reva/go.sum new file mode 100644 index 0000000000..631b23d222 --- /dev/null +++ b/reva/go.sum @@ -0,0 +1,1369 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.40.0/go.mod h1:Tk58MuI9rbLMKlAjeO/bDnteAx7tX2gJIXw4T5Jwlro= +cloud.google.com/go v0.41.0/go.mod h1:OauMR7DV8fzvZIl2qg6rkaIhD/vmgk4iwEw/h6ercmg= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +contrib.go.opencensus.io/exporter/jaeger v0.2.1 h1:yGBYzYMewVL0yO9qqJv3Z5+IRhPdU7e9o/2oKpX4YvI= +contrib.go.opencensus.io/exporter/jaeger v0.2.1/go.mod h1:Y8IsLgdxqh1QxYxPC5IgXVmBaeLUeQFfBeBi9PbeZd0= +contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= +contrib.go.opencensus.io/exporter/prometheus v0.2.0 h1:9PUk0/8V0LGoPqVCrf8fQZJkFGBxudu8jOjQSMwoD6w= +contrib.go.opencensus.io/exporter/prometheus v0.2.0/go.mod h1:TYmVAyE8Tn1lyPcltF5IYYfWp2KHu7lQGIZnj8iZMys= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= +github.com/Azure/go-autorest/autorest v0.5.0/go.mod h1:9HLKlQjVBH6U3oDfsXOeVc56THsLPw1L03yban4xThw= +github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= +github.com/Azure/go-autorest/autorest/adal v0.2.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E= +github.com/Azure/go-autorest/autorest/azure/auth v0.1.0/go.mod h1:Gf7/i2FUpyb/sGBLIFxTBzrNzBo7aPXXE3ZVeDRwdpM= +github.com/Azure/go-autorest/autorest/azure/cli v0.1.0/go.mod h1:Dk8CUAt/b/PzkfeRsWzVG9Yj3ps8mS8ECztu43rdU8U= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= +github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.0.2 h1:tRi7ENs+AaOUCH+j6qwNQgPYfV26dX3JNonq+V4mhqc= +github.com/Masterminds/semver/v3 v3.0.2/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig/v3 v3.0.1 h1:RuaOafp+8qOLUPX1lInLfUrLc1MEVbnz7a40RLoixKY= +github.com/Masterminds/sprig/v3 v3.0.1/go.mod h1:Cp7HwZjmqKrC+Y7XqSJOU2yRvAJRGLiohfgz5ZJj8+4= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20191101173118-65519b62243c/go.mod h1:7xhjOwRV2+0HXGmM0jxaEu+ZiXJFoVZOTfL/dmqbrD8= +github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OpenDNS/vegadns2client v0.0.0-20180418235048-a3fa4a771d87/go.mod h1:iGLljf5n9GjT6kc0HBvyI1nOKnGQbNB66VzSNbK5iks= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/akamai/AkamaiOPEN-edgegrid-golang v0.9.0/go.mod h1:zpDJeKyp9ScW4NNrbdr+Eyxvry3ilGPewKoXw3XGN1k= +github.com/alangpierce/go-forceexport v0.0.0-20160317203124-8f1d6941cd75/go.mod h1:uAXEEpARkRhCZfEvy/y0Jcc888f9tHCc1W7/UeEtreE= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190808125512-07798873deee/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= +github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/ascarter/requestid v0.0.0-20170313220838-5b76ab3d4aee h1:3T/l+vMotQ7cDSLWNAn2Vg1SAQ3mdyLgBWWBitSS3uU= +github.com/ascarter/requestid v0.0.0-20170313220838-5b76ab3d4aee/go.mod h1:u7Wtt4WATGGgae9mURNGQQqxAudPKrxfsbSDSGOso+g= +github.com/aws/aws-sdk-go v1.20.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.23.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.23.19/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.34.2/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.34.12 h1:7UbBEYDUa4uW0YmRnOd806MS1yoJMcaodBWDzvBShAI= +github.com/aws/aws-sdk-go v1.34.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-xray-sdk-go v0.9.4/go.mod h1:XtMKdBQfpVut+tJEwI7+dJFRxxRdxHDyVNp2tHXRq04= +github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= +github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40 h1:y4B3+GPxKlrigF1ha5FFErxK+sr6sWxQovRMzwMhejo= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/butonic/reva v0.0.0-20200910205656-164632b889fd h1:0r3nx/JU5/JspWWpLCGGacTHa4n/uTXiSIlc6wvaJqo= +github.com/butonic/reva v0.0.0-20200910205656-164632b889fd/go.mod h1:2nFeb46NQSd8MliTlPTc+ycYnPwmRFNqB7DXn++TYiY= +github.com/bwmarrin/discordgo v0.19.0/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= +github.com/bwmarrin/discordgo v0.20.1/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= +github.com/bwmarrin/discordgo v0.20.2/go.mod h1:O9S4p+ofTFwB02em7jkpkV8M3R0/PUVOwN61zSZ0r4Q= +github.com/c-bata/go-prompt v0.2.3/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= +github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +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.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/cloudflare-go v0.10.2/go.mod h1:qhVI5MKwBGhdNU89ZRz2plgYutcJ5PCekLxXn56w6SY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= +github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.18+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= +github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpu/goacmedns v0.0.1/go.mod h1:sesf/pNnCYwUevQEQfEwY0Y3DydlQWSGZbaMElOWxok= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cs3org/cato v0.0.0-20200626150132-28a40e643719/go.mod h1:XJEZ3/EQuI3BXTp/6DUzFr850vlxq11I6satRtz0YQ4= +github.com/cs3org/go-cs3apis v0.0.0-20200810113633-b00aca449666 h1:E7VsSSN/2YZLSwrDMJJdAWU11lP7W1qkcXbrslb0PM0= +github.com/cs3org/go-cs3apis v0.0.0-20200810113633-b00aca449666/go.mod h1:UXha4TguuB52H14EMoSsCqDj7k8a/t7g4gVP+bgY5LY= +github.com/cs3org/reva v1.2.1-0.20200826162318-c0f54e1f37ea/go.mod h1:FvYB+UPpuPCw0hH42qHVR1R2atZyy69METZI/zEaST8= +github.com/cs3org/reva v1.2.1-0.20200911111727-51649e37df2d h1:vohUfrOZVrbbzt7JUICBDX8rjcedLbuEsmuOJtx8mWY= +github.com/cs3org/reva v1.2.1-0.20200911111727-51649e37df2d/go.mod h1:Q1/JB40ZKtlhZUxz+ZqB/O/VlrnQX//NYdPPRPsP0UE= +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= +github.com/decker502/dnspod-go v0.2.0/go.mod h1:qsurYu1FgxcDwfSwXJdLt4kRsBLZeosEb9uq4Sy+08g= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dnaeon/go-vcr v0.0.0-20180814043457-aafff18a5cc2/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnsimple/dnsimple-go v0.30.0/go.mod h1:O5TJ0/U6r7AfT8niYNlmohpLbCSG+c71tQlGr9SeGrg= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.4.2-0.20190710153559-aa8249ae1b8b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20191101170500-ac7306503d23/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20180713052910-9f541cc9db5d/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/elazarl/goproxy v0.0.0-20181003060214-f58a169a71a5/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/eventials/go-tus v0.0.0-20200718001131-45c7ec8f5d59 h1:t2+zxJPT/jq/YOx/JRsoByAZI/GHOxYJ7MKeillEX4U= +github.com/eventials/go-tus v0.0.0-20200718001131-45c7ec8f5d59/go.mod h1:XYuK1S5+kS6FGhlIUFuZFPvWiSrOIoLk6+ro33Xce3Y= +github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structs v1.0.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/forestgiant/sliceutil v0.0.0-20160425183142-94783f95db6c/go.mod h1:pFdJbAhRf7rh6YYMUdIQGyzne6zYL1tCUW8QV2B3UfY= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsouza/go-dockerclient v1.4.4/go.mod h1:PrwszSL5fbmsESocROrOGq/NULMXRw+bajY0ltzD6MA= +github.com/fsouza/go-dockerclient v1.6.0/go.mod h1:YWwtNPuL4XTX1SKJQk86cWPmmqwx+4np9qfPbb+znGc= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-acme/lego/v3 v3.1.0/go.mod h1:074uqt+JS6plx+c9Xaiz6+L+GBb+7itGtzfcDM2AhEE= +github.com/go-acme/lego/v3 v3.3.0/go.mod h1:iGSY2vQrvQs3WezicSB/oVbO2eCrD88dpWPwb1qLqu0= +github.com/go-asn1-ber/asn1-ber v1.5.1 h1:pDbRAunXzIUXfx4CB2QJFv5IuPiuoW+sWvr/Us009o8= +github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +github.com/go-chi/chi v4.0.2+incompatible h1:maB6vn6FqCxrpz4FqWdh4+lwpyZIQS7YEAUcHlgXVRs= +github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-cmd/cmd v1.0.5/go.mod h1:y8q8qlK5wQibcw63djSl/ntiHUHXHGdCkPk0j4QeW4s= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.44.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-ldap/ldap/v3 v3.2.3 h1:FBt+5w3q/vPVPb4eYMQSn+pOiz4zewPamYhlGMmc7yM= +github.com/go-ldap/ldap/v3 v3.2.3/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= +github.com/go-log/log v0.1.0 h1:wudGTNsiGzrD5ZjgIkVZ517ugi2XRe9Q/xRCzwEO4/U= +github.com/go-log/log v0.1.0/go.mod h1:4mBwpdRMFLiuXZDCwU2lKQFsoSCo72j3HqBK9d81N2M= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= +github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= +github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM= +github.com/go-test/deep v1.0.1 h1:UQhStjbkDClarlmv0am7OXXO4/GaPdCGiUiMTvi28sg= +github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/gobuffalo/buffalo v0.12.8-0.20181004233540-fac9bb505aa8/go.mod h1:sLyT7/dceRXJUxSsE813JTQtA3Eb1vjxWfo/N//vXIY= +github.com/gobuffalo/buffalo v0.13.0/go.mod h1:Mjn1Ba9wpIbpbrD+lIDMy99pQ0H0LiddMIIDGse7qT4= +github.com/gobuffalo/buffalo-plugins v1.0.2/go.mod h1:pOp/uF7X3IShFHyobahTkTLZaeUXwb0GrUTb9ngJWTs= +github.com/gobuffalo/buffalo-plugins v1.0.4/go.mod h1:pWS1vjtQ6uD17MVFWf7i3zfThrEKWlI5+PYLw/NaDB4= +github.com/gobuffalo/buffalo-plugins v1.4.3/go.mod h1:uCzTY0woez4nDMdQjkcOYKanngeUVRO2HZi7ezmAjWY= +github.com/gobuffalo/buffalo-plugins v1.5.1/go.mod h1:jbmwSZK5+PiAP9cC09VQOrGMZFCa/P0UMlIS3O12r5w= +github.com/gobuffalo/buffalo-plugins v1.6.4/go.mod h1:/+N1aophkA2jZ1ifB2O3Y9yGwu6gKOVMtUmJnbg+OZI= +github.com/gobuffalo/buffalo-plugins v1.6.5/go.mod h1:0HVkbgrVs/MnPZ/FOseDMVanCTm2RNcdM0PuXcL1NNI= +github.com/gobuffalo/buffalo-plugins v1.6.7/go.mod h1:ZGZRkzz2PiKWHs0z7QsPBOTo2EpcGRArMEym6ghKYgk= +github.com/gobuffalo/buffalo-plugins v1.6.9/go.mod h1:yYlYTrPdMCz+6/+UaXg5Jm4gN3xhsvsQ2ygVatZV5vw= +github.com/gobuffalo/buffalo-plugins v1.6.11/go.mod h1:eAA6xJIL8OuynJZ8amXjRmHND6YiusVAaJdHDN1Lu8Q= +github.com/gobuffalo/buffalo-plugins v1.8.2/go.mod h1:9te6/VjEQ7pKp7lXlDIMqzxgGpjlKoAcAANdCgoR960= +github.com/gobuffalo/buffalo-plugins v1.8.3/go.mod h1:IAWq6vjZJVXebIq2qGTLOdlXzmpyTZ5iJG5b59fza5U= +github.com/gobuffalo/buffalo-plugins v1.9.4/go.mod h1:grCV6DGsQlVzQwk6XdgcL3ZPgLm9BVxlBmXPMF8oBHI= +github.com/gobuffalo/buffalo-plugins v1.10.0/go.mod h1:4osg8d9s60txLuGwXnqH+RCjPHj9K466cDFRl3PErHI= +github.com/gobuffalo/buffalo-plugins v1.11.0/go.mod h1:rtIvAYRjYibgmWhnjKmo7OadtnxuMG5ZQLr25ozAzjg= +github.com/gobuffalo/buffalo-pop v1.0.5/go.mod h1:Fw/LfFDnSmB/vvQXPvcXEjzP98Tc+AudyNWUBWKCwQ8= +github.com/gobuffalo/envy v1.6.4/go.mod h1:Abh+Jfw475/NWtYMEt+hnJWRiC8INKWibIMyNt1w2Mc= +github.com/gobuffalo/envy v1.6.5/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= +github.com/gobuffalo/envy v1.6.6/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= +github.com/gobuffalo/envy v1.6.7/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= +github.com/gobuffalo/envy v1.6.8/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= +github.com/gobuffalo/envy v1.6.9/go.mod h1:N+GkhhZ/93bGZc6ZKhJLP6+m+tCNPKwgSpH9kaifseQ= +github.com/gobuffalo/envy v1.6.10/go.mod h1:X0CFllQjTV5ogsnUrg+Oks2yTI+PU2dGYBJOEI2D1Uo= +github.com/gobuffalo/envy v1.6.11/go.mod h1:Fiq52W7nrHGDggFPhn2ZCcHw4u/rqXkqo+i7FB6EAcg= +github.com/gobuffalo/envy v1.6.12/go.mod h1:qJNrJhKkZpEW0glh5xP2syQHH5kgdmgsKss2Kk8PTP0= +github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= +github.com/gobuffalo/events v1.0.3/go.mod h1:Txo8WmqScapa7zimEQIwgiJBvMECMe9gJjsKNPN3uZw= +github.com/gobuffalo/events v1.0.7/go.mod h1:z8txf6H9jWhQ5Scr7YPLWg/cgXBRj8Q4uYI+rsVCCSQ= +github.com/gobuffalo/events v1.0.8/go.mod h1:A5KyqT1sA+3GJiBE4QKZibse9mtOcI9nw8gGrDdqYGs= +github.com/gobuffalo/events v1.1.3/go.mod h1:9yPGWYv11GENtzrIRApwQRMYSbUgCsZ1w6R503fCfrk= +github.com/gobuffalo/events v1.1.4/go.mod h1:09/YRRgZHEOts5Isov+g9X2xajxdvOAcUuAHIX/O//A= +github.com/gobuffalo/events v1.1.5/go.mod h1:3YUSzgHfYctSjEjLCWbkXP6djH2M+MLaVRzb4ymbAK0= +github.com/gobuffalo/events v1.1.7/go.mod h1:6fGqxH2ing5XMb3EYRq9LEkVlyPGs4oO/eLzh+S8CxY= +github.com/gobuffalo/events v1.1.8/go.mod h1:UFy+W6X6VbCWS8k2iT81HYX65dMtiuVycMy04cplt/8= +github.com/gobuffalo/events v1.1.9/go.mod h1:/0nf8lMtP5TkgNbzYxR6Bl4GzBy5s5TebgNTdRfRbPM= +github.com/gobuffalo/fizz v1.0.12/go.mod h1:C0sltPxpYK8Ftvf64kbsQa2yiCZY4RZviurNxXdAKwc= +github.com/gobuffalo/flect v0.0.0-20180907193754-dc14d8acaf9f/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= +github.com/gobuffalo/flect v0.0.0-20181002182613-4571df4b1daf/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= +github.com/gobuffalo/flect v0.0.0-20181007231023-ae7ed6bfe683/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= +github.com/gobuffalo/flect v0.0.0-20181018182602-fd24a256709f/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= +github.com/gobuffalo/flect v0.0.0-20181019110701-3d6f0b585514/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= +github.com/gobuffalo/flect v0.0.0-20181024204909-8f6be1a8c6c2/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= +github.com/gobuffalo/flect v0.0.0-20181104133451-1f6e9779237a/go.mod h1:rCiQgmAE4axgBNl3jZWzS5rETRYTGOsrixTRaCPzNdA= +github.com/gobuffalo/flect v0.0.0-20181114183036-47375f6d8328/go.mod h1:0HvNbHdfh+WOvDSIASqJOSxTOWSxCCUF++k/Y53v9rI= +github.com/gobuffalo/flect v0.0.0-20181210151238-24a2b68e0316/go.mod h1:en58vff74S9b99Eg42Dr+/9yPu437QjlNsO/hBYPuOk= +github.com/gobuffalo/flect v0.0.0-20190104192022-4af577e09bf2/go.mod h1:en58vff74S9b99Eg42Dr+/9yPu437QjlNsO/hBYPuOk= +github.com/gobuffalo/flect v0.0.0-20190117212819-a62e61d96794/go.mod h1:397QT6v05LkZkn07oJXXT6y9FCfwC8Pug0WA2/2mE9k= +github.com/gobuffalo/genny v0.0.0-20180924032338-7af3a40f2252/go.mod h1:tUTQOogrr7tAQnhajMSH6rv1BVev34H2sa1xNHMy94g= +github.com/gobuffalo/genny v0.0.0-20181003150629-3786a0744c5d/go.mod h1:WAd8HmjMVrnkAZbmfgH5dLBUchsZfqzp/WS5sQz+uTM= +github.com/gobuffalo/genny v0.0.0-20181005145118-318a41a134cc/go.mod h1:WAd8HmjMVrnkAZbmfgH5dLBUchsZfqzp/WS5sQz+uTM= +github.com/gobuffalo/genny v0.0.0-20181007153042-b8de7d566757/go.mod h1:+oG5Ljrw04czAHbPXREwaFojJbpUvcIy4DiOnbEJFTA= +github.com/gobuffalo/genny v0.0.0-20181012161047-33e5f43d83a6/go.mod h1:+oG5Ljrw04czAHbPXREwaFojJbpUvcIy4DiOnbEJFTA= +github.com/gobuffalo/genny v0.0.0-20181017160347-90a774534246/go.mod h1:+oG5Ljrw04czAHbPXREwaFojJbpUvcIy4DiOnbEJFTA= +github.com/gobuffalo/genny v0.0.0-20181024195656-51392254bf53/go.mod h1:o9GEH5gn5sCKLVB5rHFC4tq40rQ3VRUzmx6WwmaqISE= +github.com/gobuffalo/genny v0.0.0-20181025145300-af3f81d526b8/go.mod h1:uZ1fFYvdcP8mu0B/Ynarf6dsGvp7QFIpk/QACUuFUVI= +github.com/gobuffalo/genny v0.0.0-20181027191429-94d6cfb5c7fc/go.mod h1:x7SkrQQBx204Y+O9EwRXeszLJDTaWN0GnEasxgLrQTA= +github.com/gobuffalo/genny v0.0.0-20181027195209-3887b7171c4f/go.mod h1:JbKx8HSWICu5zyqWOa0dVV1pbbXOHusrSzQUprW6g+w= +github.com/gobuffalo/genny v0.0.0-20181106193839-7dcb0924caf1/go.mod h1:x61yHxvbDCgQ/7cOAbJCacZQuHgB0KMSzoYcw5debjU= +github.com/gobuffalo/genny v0.0.0-20181107223128-f18346459dbe/go.mod h1:utQD3aKKEsdb03oR+Vi/6ztQb1j7pO10N3OBoowRcSU= +github.com/gobuffalo/genny v0.0.0-20181114215459-0a4decd77f5d/go.mod h1:kN2KZ8VgXF9VIIOj/GM0Eo7YK+un4Q3tTreKOf0q1ng= +github.com/gobuffalo/genny v0.0.0-20181119162812-e8ff4adce8bb/go.mod h1:BA9htSe4bZwBDJLe8CUkoqkypq3hn3+CkoHqVOW718E= +github.com/gobuffalo/genny v0.0.0-20181127225641-2d959acc795b/go.mod h1:l54xLXNkteX/PdZ+HlgPk1qtcrgeOr3XUBBPDbH+7CQ= +github.com/gobuffalo/genny v0.0.0-20181128191930-77e34f71ba2a/go.mod h1:FW/D9p7cEEOqxYA71/hnrkOWm62JZ5ZNxcNIVJEaWBU= +github.com/gobuffalo/genny v0.0.0-20181203165245-fda8bcce96b1/go.mod h1:wpNSANu9UErftfiaAlz1pDZclrYzLtO5lALifODyjuM= +github.com/gobuffalo/genny v0.0.0-20181203201232-849d2c9534ea/go.mod h1:wpNSANu9UErftfiaAlz1pDZclrYzLtO5lALifODyjuM= +github.com/gobuffalo/genny v0.0.0-20181206121324-d6fb8a0dbe36/go.mod h1:wpNSANu9UErftfiaAlz1pDZclrYzLtO5lALifODyjuM= +github.com/gobuffalo/genny v0.0.0-20181207164119-84844398a37d/go.mod h1:y0ysCHGGQf2T3vOhCrGHheYN54Y/REj0ayd0Suf4C/8= +github.com/gobuffalo/genny v0.0.0-20181211165820-e26c8466f14d/go.mod h1:sHnK+ZSU4e2feXP3PA29ouij6PUEiN+RCwECjCTB3yM= +github.com/gobuffalo/genny v0.0.0-20190104222617-a71664fc38e7/go.mod h1:QPsQ1FnhEsiU8f+O0qKWXz2RE4TiDqLVChWkBuh1WaY= +github.com/gobuffalo/genny v0.0.0-20190112155932-f31a84fcacf5/go.mod h1:CIaHCrSIuJ4il6ka3Hub4DR4adDrGoXGEEt2FbBxoIo= +github.com/gobuffalo/github_flavored_markdown v1.0.4/go.mod h1:uRowCdK+q8d/RF0Kt3/DSalaIXbb0De/dmTqMQdkQ4I= +github.com/gobuffalo/github_flavored_markdown v1.0.5/go.mod h1:U0643QShPF+OF2tJvYNiYDLDGDuQmJZXsf/bHOJPsMY= +github.com/gobuffalo/github_flavored_markdown v1.0.7/go.mod h1:w93Pd9Lz6LvyQXEG6DktTPHkOtCbr+arAD5mkwMzXLI= +github.com/gobuffalo/httptest v1.0.2/go.mod h1:7T1IbSrg60ankme0aDLVnEY0h056g9M1/ZvpVThtB7E= +github.com/gobuffalo/licenser v0.0.0-20180924033006-eae28e638a42/go.mod h1:Ubo90Np8gpsSZqNScZZkVXXAo5DGhTb+WYFIjlnog8w= +github.com/gobuffalo/licenser v0.0.0-20181025145548-437d89de4f75/go.mod h1:x3lEpYxkRG/XtGCUNkio+6RZ/dlOvLzTI9M1auIwFcw= +github.com/gobuffalo/licenser v0.0.0-20181027200154-58051a75da95/go.mod h1:BzhaaxGd1tq1+OLKObzgdCV9kqVhbTulxOpYbvMQWS0= +github.com/gobuffalo/licenser v0.0.0-20181109171355-91a2a7aac9a7/go.mod h1:m+Ygox92pi9bdg+gVaycvqE8RVSjZp7mWw75+K5NPHk= +github.com/gobuffalo/licenser v0.0.0-20181128165715-cc7305f8abed/go.mod h1:oU9F9UCE+AzI/MueCKZamsezGOOHfSirltllOVeRTAE= +github.com/gobuffalo/licenser v0.0.0-20181203160806-fe900bbede07/go.mod h1:ph6VDNvOzt1CdfaWC+9XwcBnlSTBz2j49PBwum6RFaU= +github.com/gobuffalo/licenser v0.0.0-20181211173111-f8a311c51159/go.mod h1:ve/Ue99DRuvnTaLq2zKa6F4KtHiYf7W046tDjuGYPfM= +github.com/gobuffalo/logger v0.0.0-20181022175615-46cfb361fc27/go.mod h1:8sQkgyhWipz1mIctHF4jTxmJh1Vxhp7mP8IqbljgJZo= +github.com/gobuffalo/logger v0.0.0-20181027144941-73d08d2bb969/go.mod h1:7uGg2duHKpWnN4+YmyKBdLXfhopkAdVM6H3nKbyFbz8= +github.com/gobuffalo/logger v0.0.0-20181027193913-9cf4dd0efe46/go.mod h1:7uGg2duHKpWnN4+YmyKBdLXfhopkAdVM6H3nKbyFbz8= +github.com/gobuffalo/logger v0.0.0-20181109185836-3feeab578c17/go.mod h1:oNErH0xLe+utO+OW8ptXMSA5DkiSEDW1u3zGIt8F9Ew= +github.com/gobuffalo/logger v0.0.0-20181117211126-8e9b89b7c264/go.mod h1:5etB91IE0uBlw9k756fVKZJdS+7M7ejVhmpXXiSFj0I= +github.com/gobuffalo/logger v0.0.0-20181127160119-5b956e21995c/go.mod h1:+HxKANrR9VGw9yN3aOAppJKvhO05ctDi63w4mDnKv2U= +github.com/gobuffalo/makr v1.1.5/go.mod h1:Y+o0btAH1kYAMDJW/TX3+oAXEu0bmSLLoC9mIFxtzOw= +github.com/gobuffalo/mapi v1.0.0/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= +github.com/gobuffalo/meta v0.0.0-20181018155829-df62557efcd3/go.mod h1:XTTOhwMNryif3x9LkTTBO/Llrveezd71u3quLd0u7CM= +github.com/gobuffalo/meta v0.0.0-20181018192820-8c6cef77dab3/go.mod h1:E94EPzx9NERGCY69UWlcj6Hipf2uK/vnfrF4QD0plVE= +github.com/gobuffalo/meta v0.0.0-20181025145500-3a985a084b0a/go.mod h1:YDAKBud2FP7NZdruCSlmTmDOZbVSa6bpK7LJ/A/nlKg= +github.com/gobuffalo/meta v0.0.0-20181114191255-b130ebedd2f7/go.mod h1:K6cRZ29ozr4Btvsqkjvg5nDFTLOgTqf03KA70Ks0ypE= +github.com/gobuffalo/meta v0.0.0-20181127070345-0d7e59dd540b/go.mod h1:RLO7tMvE0IAKAM8wny1aN12pvEKn7EtkBLkUZR00Qf8= +github.com/gobuffalo/meta v0.0.0-20190120163247-50bbb1fa260d/go.mod h1:KKsH44nIK2gA8p0PJmRT9GvWJUdphkDUA8AJEvFWiqM= +github.com/gobuffalo/mw-basicauth v1.0.3/go.mod h1:dg7+ilMZOKnQFHDefUzUHufNyTswVUviCBgF244C1+0= +github.com/gobuffalo/mw-contenttype v0.0.0-20180802152300-74f5a47f4d56/go.mod h1:7EvcmzBbeCvFtQm5GqF9ys6QnCxz2UM1x0moiWLq1No= +github.com/gobuffalo/mw-csrf v0.0.0-20180802151833-446ff26e108b/go.mod h1:sbGtb8DmDZuDUQoxjr8hG1ZbLtZboD9xsn6p77ppcHo= +github.com/gobuffalo/mw-forcessl v0.0.0-20180802152810-73921ae7a130/go.mod h1:JvNHRj7bYNAMUr/5XMkZaDcw3jZhUZpsmzhd//FFWmQ= +github.com/gobuffalo/mw-i18n v0.0.0-20180802152014-e3060b7e13d6/go.mod h1:91AQfukc52A6hdfIfkxzyr+kpVYDodgAeT5cjX1UIj4= +github.com/gobuffalo/mw-paramlogger v0.0.0-20181005191442-d6ee392ec72e/go.mod h1:6OJr6VwSzgJMqWMj7TYmRUqzNe2LXu/W1rRW4MAz/ME= +github.com/gobuffalo/mw-tokenauth v0.0.0-20181001105134-8545f626c189/go.mod h1:UqBF00IfKvd39ni5+yI5MLMjAf4gX7cDKN/26zDOD6c= +github.com/gobuffalo/packd v0.0.0-20181027182251-01ad393492c8/go.mod h1:SmdBdhj6uhOsg1Ui4SFAyrhuc7U4VCildosO5IDJ3lc= +github.com/gobuffalo/packd v0.0.0-20181027190505-aafc0d02c411/go.mod h1:SmdBdhj6uhOsg1Ui4SFAyrhuc7U4VCildosO5IDJ3lc= +github.com/gobuffalo/packd v0.0.0-20181027194105-7ae579e6d213/go.mod h1:SmdBdhj6uhOsg1Ui4SFAyrhuc7U4VCildosO5IDJ3lc= +github.com/gobuffalo/packd v0.0.0-20181031195726-c82734870264/go.mod h1:Yf2toFaISlyQrr5TfO3h6DB9pl9mZRmyvBGQb/aQ/pI= +github.com/gobuffalo/packd v0.0.0-20181104210303-d376b15f8e96/go.mod h1:Yf2toFaISlyQrr5TfO3h6DB9pl9mZRmyvBGQb/aQ/pI= +github.com/gobuffalo/packd v0.0.0-20181111195323-b2e760a5f0ff/go.mod h1:Yf2toFaISlyQrr5TfO3h6DB9pl9mZRmyvBGQb/aQ/pI= +github.com/gobuffalo/packd v0.0.0-20181114190715-f25c5d2471d7/go.mod h1:Yf2toFaISlyQrr5TfO3h6DB9pl9mZRmyvBGQb/aQ/pI= +github.com/gobuffalo/packd v0.0.0-20181124090624-311c6248e5fb/go.mod h1:Foenia9ZvITEvG05ab6XpiD5EfBHPL8A6hush8SJ0o8= +github.com/gobuffalo/packd v0.0.0-20181207120301-c49825f8f6f4/go.mod h1:LYc0TGKFBBFTRC9dg2pcRcMqGCTMD7T2BIMP7OBuQAA= +github.com/gobuffalo/packd v0.0.0-20181212173646-eca3b8fd6687/go.mod h1:LYc0TGKFBBFTRC9dg2pcRcMqGCTMD7T2BIMP7OBuQAA= +github.com/gobuffalo/packr v1.13.7/go.mod h1:KkinLIn/n6+3tVXMwg6KkNvWwVsrRAz4ph+jgpk3Z24= +github.com/gobuffalo/packr v1.15.0/go.mod h1:t5gXzEhIviQwVlNx/+3SfS07GS+cZ2hn76WLzPp6MGI= +github.com/gobuffalo/packr v1.15.1/go.mod h1:IeqicJ7jm8182yrVmNbM6PR4g79SjN9tZLH8KduZZwE= +github.com/gobuffalo/packr v1.19.0/go.mod h1:MstrNkfCQhd5o+Ct4IJ0skWlxN8emOq8DsoT1G98VIU= +github.com/gobuffalo/packr v1.20.0/go.mod h1:JDytk1t2gP+my1ig7iI4NcVaXr886+N0ecUga6884zw= +github.com/gobuffalo/packr v1.21.0/go.mod h1:H00jGfj1qFKxscFJSw8wcL4hpQtPe1PfU2wa6sg/SR0= +github.com/gobuffalo/packr v1.22.0/go.mod h1:Qr3Wtxr3+HuQEwWqlLnNW4t1oTvK+7Gc/Rnoi/lDFvA= +github.com/gobuffalo/packr/v2 v2.0.0-rc.8/go.mod h1:y60QCdzwuMwO2R49fdQhsjCPv7tLQFR0ayzxxla9zes= +github.com/gobuffalo/packr/v2 v2.0.0-rc.9/go.mod h1:fQqADRfZpEsgkc7c/K7aMew3n4aF1Kji7+lIZeR98Fc= +github.com/gobuffalo/packr/v2 v2.0.0-rc.10/go.mod h1:4CWWn4I5T3v4c1OsJ55HbHlUEKNWMITG5iIkdr4Px4w= +github.com/gobuffalo/packr/v2 v2.0.0-rc.11/go.mod h1:JoieH/3h3U4UmatmV93QmqyPUdf4wVM9HELaHEu+3fk= +github.com/gobuffalo/packr/v2 v2.0.0-rc.12/go.mod h1:FV1zZTsVFi1DSCboO36Xgs4pzCZBjB/tDV9Cz/lSaR8= +github.com/gobuffalo/packr/v2 v2.0.0-rc.13/go.mod h1:2Mp7GhBFMdJlOK8vGfl7SYtfMP3+5roE39ejlfjw0rA= +github.com/gobuffalo/packr/v2 v2.0.0-rc.14/go.mod h1:06otbrNvDKO1eNQ3b8hst+1010UooI2MFg+B2Ze4MV8= +github.com/gobuffalo/packr/v2 v2.0.0-rc.15/go.mod h1:IMe7H2nJvcKXSF90y4X1rjYIRlNMJYCxEhssBXNZwWs= +github.com/gobuffalo/plush v3.7.16+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= +github.com/gobuffalo/plush v3.7.20+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= +github.com/gobuffalo/plush v3.7.21+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= +github.com/gobuffalo/plush v3.7.22+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= +github.com/gobuffalo/plush v3.7.23+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= +github.com/gobuffalo/plush v3.7.30+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= +github.com/gobuffalo/plush v3.7.31+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= +github.com/gobuffalo/plush v3.7.32+incompatible/go.mod h1:rQ4zdtUUyZNqULlc6bqd5scsPfLKfT0+TGMChgduDvI= +github.com/gobuffalo/plushgen v0.0.0-20181128164830-d29dcb966cb2/go.mod h1:r9QwptTFnuvSaSRjpSp4S2/4e2D3tJhARYbvEBcKSb4= +github.com/gobuffalo/plushgen v0.0.0-20181203163832-9fc4964505c2/go.mod h1:opEdT33AA2HdrIwK1aibqnTJDVVKXC02Bar/GT1YRVs= +github.com/gobuffalo/plushgen v0.0.0-20181207152837-eedb135bd51b/go.mod h1:Lcw7HQbEVm09sAQrCLzIxuhFbB3nAgp4c55E+UlynR0= +github.com/gobuffalo/plushgen v0.0.0-20190104222512-177cd2b872b3/go.mod h1:tYxCozi8X62bpZyKXYHw1ncx2ZtT2nFvG42kuLwYjoc= +github.com/gobuffalo/pop v4.8.2+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= +github.com/gobuffalo/pop v4.8.3+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= +github.com/gobuffalo/pop v4.8.4+incompatible/go.mod h1:DwBz3SD5SsHpTZiTubcsFWcVDpJWGsxjVjMPnkiThWg= +github.com/gobuffalo/release v1.0.35/go.mod h1:VtHFAKs61vO3wboCec5xr9JPTjYyWYcvaM3lclkc4x4= +github.com/gobuffalo/release v1.0.38/go.mod h1:VtHFAKs61vO3wboCec5xr9JPTjYyWYcvaM3lclkc4x4= +github.com/gobuffalo/release v1.0.42/go.mod h1:RPs7EtafH4oylgetOJpGP0yCZZUiO4vqHfTHJjSdpug= +github.com/gobuffalo/release v1.0.52/go.mod h1:RPs7EtafH4oylgetOJpGP0yCZZUiO4vqHfTHJjSdpug= +github.com/gobuffalo/release v1.0.53/go.mod h1:FdF257nd8rqhNaqtDWFGhxdJ/Ig4J7VcS3KL7n/a+aA= +github.com/gobuffalo/release v1.0.54/go.mod h1:Pe5/RxRa/BE8whDpGfRqSI7D1a0evGK1T4JDm339tJc= +github.com/gobuffalo/release v1.0.61/go.mod h1:mfIO38ujUNVDlBziIYqXquYfBF+8FDHUjKZgYC1Hj24= +github.com/gobuffalo/release v1.0.72/go.mod h1:NP5NXgg/IX3M5XmHmWR99D687/3Dt9qZtTK/Lbwc1hU= +github.com/gobuffalo/release v1.1.1/go.mod h1:Sluak1Xd6kcp6snkluR1jeXAogdJZpFFRzTYRs/2uwg= +github.com/gobuffalo/release v1.1.3/go.mod h1:CuXc5/m+4zuq8idoDt1l4va0AXAn/OSs08uHOfMVr8E= +github.com/gobuffalo/release v1.1.6/go.mod h1:18naWa3kBsqO0cItXZNJuefCKOENpbbUIqRL1g+p6z0= +github.com/gobuffalo/shoulders v1.0.1/go.mod h1:V33CcVmaQ4gRUmHKwq1fiTXuf8Gp/qjQBUL5tHPmvbA= +github.com/gobuffalo/syncx v0.0.0-20181120191700-98333ab04150/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gobuffalo/syncx v0.0.0-20181120194010-558ac7de985f/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/gobuffalo/tags v2.0.11+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= +github.com/gobuffalo/tags v2.0.14+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= +github.com/gobuffalo/tags v2.0.15+incompatible/go.mod h1:9XmhOkyaB7UzvuY4UoZO4s67q8/xRMVJEaakauVQYeY= +github.com/gobuffalo/uuid v2.0.3+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= +github.com/gobuffalo/uuid v2.0.4+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= +github.com/gobuffalo/uuid v2.0.5+incompatible/go.mod h1:ErhIzkRhm0FtRuiE/PeORqcw4cVi1RtSpnwYrxuvkfE= +github.com/gobuffalo/validate v2.0.3+incompatible/go.mod h1:N+EtDe0J8252BgfzQUChBgfd6L93m9weay53EWFVsMM= +github.com/gobuffalo/x v0.0.0-20181003152136-452098b06085/go.mod h1:WevpGD+5YOreDJznWevcn8NTmQEW5STSBgIkpkjzqXc= +github.com/gobuffalo/x v0.0.0-20181007152206-913e47c59ca7/go.mod h1:9rDPXaB3kXdKWzMc4odGQQdG2e2DIEmANy5aSJ9yesY= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/gofrs/uuid v3.1.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v3.3.0+incompatible h1:8K4tyRfvU1CYPgJsveYFQMhpFd/wXNM7iK6rR7UHz84= +github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang/gddo v0.0.0-20180828051604-96d2a289f41e/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= +github.com/golang/gddo v0.0.0-20190904175337-72a348e765d2/go.mod h1:xEhNfoBDX1hzLm2Nf80qUvZ2sVwoMZ8d6IE2SrsQfh4= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/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-20191002201903-404acd9df4cc/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k= +github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181004151105-1babbf986f6f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= +github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.0/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.1.2/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= +github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.1 h1:V59tBiPuMkySHwJkuq/OYkK0WnOLwCwD3UkTbEMr12U= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.1/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= +github.com/huandu/xstrings v1.3.0 h1:gvV6jG9dTgFEncxo+AF7PH6MZXi/vZl25owA/8Dg8Wo= +github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4= +github.com/ijc/Gotty v0.0.0-20170406111628-a8b993ba6abd/go.mod h1:3LVOLeyx9XVvwPgrt2be44XgSqndprz1G18rSk8KD84= +github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= +github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jedib0t/go-pretty v4.3.0+incompatible/go.mod h1:XemHduiw8R651AF9Pt4FwCTKeG3oo7hrHJAoznj9nag= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmoiron/sqlx v0.0.0-20180614180643-0dae4fefe7c0/go.mod h1:IiEW3SEiiErVyFdH8NTuWjSifiEQKUoyK3LNqr2kCHU= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/joho/godotenv v1.2.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/joncalhoun/qson v0.0.0-20170526102502-8a9cab3a62b1/go.mod h1:DFXrEwSRX0p/aSvxE21319menCBFeQO0jXpRj7LEZUA= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +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/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/justinas/alice v1.2.0 h1:+MHSA/vccVCF4Uq37S42jwlkvI2Xzl7zTPCN5BnZNVo= +github.com/justinas/alice v1.2.0/go.mod h1:fN5HRH/reO/zrUflLfTN43t3vXvKzvZIENsNEe7i7qA= +github.com/karrick/godirwalk v1.7.5/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= +github.com/karrick/godirwalk v1.7.7/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= +github.com/karrick/godirwalk v1.7.8/go.mod h1:2c9FRhkDxdIbgkOnCEvnSWs71Bhugbl46shStcFDJ34= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/kolo/xmlrpc v0.0.0-20190717152603-07c4ee3fd181/go.mod h1:o03bZfuBwAXHetKXuInt4S7omeXUu62/A845kiycsSQ= +github.com/konsorten/go-windows-terminal-sequences v0.0.0-20180402223658-b729f2633dfe/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labbsr0x/bindman-dns-webhook v1.0.2/go.mod h1:p6b+VCXIR8NYKpDr8/dg1HKfQoRHCdcsROXKvmoehKA= +github.com/labbsr0x/goh v1.0.1/go.mod h1:8K2UhVoaWXcCU7Lxoa2omWnC8gyW8px7/lmO61c027w= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/linode/linodego v0.10.0/go.mod h1:cziNP7pbvE3mXIPneHj0oRY8L1WtGEIKlZ8LANE4eXA= +github.com/liquidweb/liquidweb-go v1.6.0/go.mod h1:UDcVnAMDkZxpw4Y7NOHkqoeiGacVLEIG/i5J9cyixzQ= +github.com/lucas-clemente/quic-go v0.12.1/go.mod h1:UXJJPE4RfFef/xPO5wQm0tITK8gNfqwTxjbE7s3Vb8s= +github.com/lucas-clemente/quic-go v0.13.1/go.mod h1:Vn3/Fb0/77b02SGhQk36KzOUmXgVpFfizUfW5WMaqyU= +github.com/lucas-clemente/quic-go v0.14.1/go.mod h1:Vn3/Fb0/77b02SGhQk36KzOUmXgVpFfizUfW5WMaqyU= +github.com/luna-duclos/instrumentedsql v1.1.2/go.mod h1:4LGbEqDnopzNAiyxPPDXhLspyunZxgPTMJBKtC6U0BQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/markbates/deplist v1.0.4/go.mod h1:gRRbPbbuA8TmMiRvaOzUlRfzfjeCCBqX2A6arxN01MM= +github.com/markbates/deplist v1.0.5/go.mod h1:gRRbPbbuA8TmMiRvaOzUlRfzfjeCCBqX2A6arxN01MM= +github.com/markbates/going v1.0.2/go.mod h1:UWCk3zm0UKefHZ7l8BNqi26UyiEMniznk8naLdTcy6c= +github.com/markbates/grift v1.0.4/go.mod h1:wbmtW74veyx+cgfwFhlnnMWqhoz55rnHR47oMXzsyVs= +github.com/markbates/hmax v1.0.0/go.mod h1:cOkR9dktiESxIMu+65oc/r/bdY4bE8zZw3OLhLx0X2c= +github.com/markbates/inflect v1.0.0/go.mod h1:oTeZL2KHA7CUX6X+fovmK9OvIOFuqu0TwdQrZjLTh88= +github.com/markbates/inflect v1.0.1/go.mod h1:uv3UVNBe5qBIfCm8O8Q+DW+S1EopeyINj+Ikhc7rnCk= +github.com/markbates/inflect v1.0.3/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= +github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= +github.com/markbates/oncer v0.0.0-20180924031910-e862a676800b/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/oncer v0.0.0-20180924034138-723ad0170a46/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/oncer v0.0.0-20181014194634-05fccaae8fc4/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= +github.com/markbates/refresh v1.4.10/go.mod h1:NDPHvotuZmTmesXxr95C9bjlw1/0frJwtME2dzcVKhc= +github.com/markbates/safe v1.0.0/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= +github.com/markbates/sigtx v1.0.0/go.mod h1:QF1Hv6Ic6Ca6W+T+DL0Y/ypborFKyvUY9HmuCD4VeTc= +github.com/markbates/willie v1.0.9/go.mod h1:fsrFVWl91+gXpx/6dv715j7i11fYPfZ9ZGfH0DQzY7w= +github.com/marten-seemann/chacha20 v0.2.0/go.mod h1:HSdjFau7GzYRj+ahFNwsO3ouVJr1HFkWoEwNDb4TMtE= +github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= +github.com/marten-seemann/qtls v0.3.2/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= +github.com/marten-seemann/qtls v0.4.1/go.mod h1:pxVXcHHw1pNIt8Qo0pwSYQEoZ8yYOOPXTCZLQQunvRc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= +github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180219170247-931426f7535a/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/mattn/goveralls v0.0.5 h1:spfq8AyZ0cCk57Za6/juJ5btQxeE1FaEGMdfcI+XO48= +github.com/mattn/goveralls v0.0.5/go.mod h1:Xg2LHi51faXLyKXwsndxiW6uxEEQT9+3sjGzzwU4xy0= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mholt/certmagic v0.7.5/go.mod h1:91uJzK5K8IWtYQqTi5R2tsxV1pCde+wdGfaRaOZi6aQ= +github.com/mholt/certmagic v0.8.3/go.mod h1:91uJzK5K8IWtYQqTi5R2tsxV1pCde+wdGfaRaOZi6aQ= +github.com/mholt/certmagic v0.9.1/go.mod h1:nu8jbsbtwK4205EDH/ZUMTKsfYpJA1Q7MKXHfgTihNw= +github.com/micro/cli v0.2.0 h1:ut3rV5JWqZjsXIa2MvGF+qMUP8DAUTvHX9Br5gO4afA= +github.com/micro/cli v0.2.0/go.mod h1:jRT9gmfVKWSS6pkKcXQ8YhUyj6bzwxK8Fp5b0Y7qNnk= +github.com/micro/cli/v2 v2.1.1 h1:uFw0SMIKmGuyHIm8lXns/NOn7V62bM5y7DnlxUM+BEQ= +github.com/micro/cli/v2 v2.1.1/go.mod h1:EguNh6DAoWKm9nmk+k/Rg0H3lQnDxqzu5x5srOtGtYg= +github.com/micro/go-micro v1.16.0/go.mod h1:A0F58bHLh2m0LAI9QyhvmbN8c1cxhAZo3cM6s+iDsrM= +github.com/micro/go-micro v1.18.0 h1:gP70EZVHpJuUIT0YWth192JmlIci+qMOEByHm83XE9E= +github.com/micro/go-micro v1.18.0/go.mod h1:klwUJL1gkdY1MHFyz+fFJXn52dKcty4hoe95Mp571AA= +github.com/micro/go-micro/v2 v2.0.0 h1:bMx549RwJ9Yuiui8cDVlfYhVNP8I8KBJTMyLthEXpRw= +github.com/micro/go-micro/v2 v2.0.0/go.mod h1:v7QP5UhKRt37ixjJe8DouWmg0/eE6dltr5h0idJ9BpE= +github.com/micro/go-plugins/wrapper/trace/opencensus/v2 v2.0.1/go.mod h1:QrkcwcDtIs2hIJpIEhozekyf6Rfz5C36kFI8+zzCpX0= +github.com/micro/mdns v0.3.0 h1:bYycYe+98AXR3s8Nq5qvt6C573uFTDPIYzJemWON0QE= +github.com/micro/mdns v0.3.0/go.mod h1:KJ0dW7KmicXU2BV++qkLlmHYcVv7/hHnbtguSWt9Aoc= +github.com/micro/protoc-gen-micro v1.0.0/go.mod h1:C8ij4DJhapBmypcT00AXdb0cZ675/3PqUO02buWWqbE= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= +github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM= +github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed/go.mod h1:3rdaFaCv4AyBgu5ALFM0+tSuHrBh6v692nyQe3ikrq0= +github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= +github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.3.3 h1:SzB1nHZ2Xi+17FP0zVQBHIZqvwRN9408fJO8h+eeNA8= +github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/monoculum/formam v0.0.0-20180901015400-4e68be1d79ba/go.mod h1:RKgILGEJq24YyJ2ban8EO0RUVSJlF1pGsEvoLEACr/Q= +github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/moul/http2curl v0.0.0-20170919181001-9ac6cf4d929b/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/namedotcom/go v0.0.0-20180403034216-08470befbe04/go.mod h1:5sN+Lt1CaY4wsPvgQH/jsuJi4XO2ssZbdsIizr4CVC8= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.0/go.mod h1:r5y0WgCag0dTj/qiHkHrXAcKQ/f5GMOZaEGdoxxnJ4I= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= +github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nlopes/slack v0.6.0/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk= +github.com/nlopes/slack v0.6.1-0.20191106133607-d06c2a2b3249/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk= +github.com/nrdcg/auroradns v1.0.0/go.mod h1:6JPXKzIRzZzMqtTDgueIhTi6rFf1QvYE/HzqidhOhjw= +github.com/nrdcg/dnspod-go v0.3.0/go.mod h1:vZSoFSFeQVm2gWLMkyX61LZ8HI3BaqtHZWgPTGKr6KQ= +github.com/nrdcg/goinwx v0.6.1/go.mod h1:XPiut7enlbEdntAqalBIqcYcTEVhpv/dKWgDCX2SwKQ= +github.com/nrdcg/namesilo v0.2.1/go.mod h1:lwMvfQTyYq+BbjJd30ylEG4GPSS6PII0Tia4rRpRiyw= +github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/oleiade/reflections v1.0.0 h1:0ir4pc6v8/PJ0yw5AEtMddfXpWBXg9cnG7SgSoJuCgY= +github.com/oleiade/reflections v1.0.0/go.mod h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOBXunWTZKeL4w= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/oracle/oci-go-sdk v7.0.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= +github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= +github.com/ory/fosite v0.29.0/go.mod h1:0atSZmXO7CAcs6NPMI/Qtot8tmZYj04Nddoold4S2h0= +github.com/ory/fosite v0.32.2 h1:iRV495P/9EyoYQ8qEHYxFQeeYCdDFawqjAML+qiMF9s= +github.com/ory/fosite v0.32.2/go.mod h1:UeBhRgW6nAjTcd8S7kAo0IFsY/rTPyOXPq/t8N20Q8I= +github.com/ory/go-acc v0.0.0-20181118080137-ddc355013f90/go.mod h1:sxnvPCxChFuSmTJGj8FdMupeq1BezCiEpDjTUXQ4hf4= +github.com/ory/go-acc v0.2.1 h1:Pwcmwd/cSnwJsYN76+w3HU7oXeWFTkwj/KUj1qGDrVw= +github.com/ory/go-acc v0.2.1/go.mod h1:0omgy2aa3nDBJ45VAKeLHH8ccPBudxLeic4xiDRtug0= +github.com/ory/go-convenience v0.1.0 h1:zouLKfF2GoSGnJwGq+PE/nJAE6dj2Zj5QlTgmMTsTS8= +github.com/ory/go-convenience v0.1.0/go.mod h1:uEY/a60PL5c12nYz4V5cHY03IBmwIAEm8TWB0yn9KNs= +github.com/ory/gojsonreference v0.0.0-20190720135523-6b606c2d8ee8/go.mod h1:wsH1C4nIeeQClDtD5AH7kF1uTS6zWyqfjVDTmB0Em7A= +github.com/ory/gojsonschema v1.1.1-0.20190919112458-f254ca73d5e9/go.mod h1:BNZpdJgB74KOLSsWFvzw6roXg1I6O51WO8roMmW+T7Y= +github.com/ory/herodot v0.6.2/go.mod h1:3BOneqcyBsVybCPAJoi92KN2BpJHcmDqAMcAAaJiJow= +github.com/ory/viper v1.5.6/go.mod h1:TYmpFpKLxjQwvT4f0QPpkOn4sDXU1kDgAwJpgLYiQ28= +github.com/ory/x v0.0.85 h1:AslLr2Efv6f7AT1tzn0RuX+sOri6h74phSh5lSeMqC4= +github.com/ory/x v0.0.85/go.mod h1:s44V8t3xyjWZREcU+mWlp4h302rTuM4aLXcW+y5FbQ8= +github.com/ovh/go-ovh v0.0.0-20181109152953-ba5adb4cf014/go.mod h1:joRatxRJaZBsY3JAOEMcoOp05CnZzsx4scTxi95DHyQ= +github.com/owncloud/flaex v0.0.0-20200411150708-dce59891a203 h1:sXVTQ94GWeiBhlgN0kSbcyXQNmwzPuuhWyObxgTu/xE= +github.com/owncloud/flaex v0.0.0-20200411150708-dce59891a203/go.mod h1:jip86t4OVURJTf8CM/0e2qcji/Y4NG3l2lR8kex4JWw= +github.com/owncloud/ocis-pkg/v2 v2.2.1 h1:LK7WxHYugEFQ9NHTOz0EP8DRjbt51wXhyqruV03z6zI= +github.com/owncloud/ocis-pkg/v2 v2.2.1/go.mod h1:MXv7QzsYsu4YWuyJxhq1kLLmJa/r5gbqHe1FXulMHaw= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= +github.com/parnurzeal/gorequest v0.2.15/go.mod h1:3Kh2QUMJoqw3icWAecsyzkpY7UzRfDhbRdTjtNwNiUE= +github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/term v0.0.0-20200520122047-c3ffed290a03/go.mod h1:Z9+Ul5bCbBKnbCvdOWbLqTHhJiYV414CURZJba6L8qA= +github.com/pkg/xattr v0.4.1 h1:dhclzL6EqOXNaPDWqoeb9tIxATfBSmjqL0b4DpSjwRw= +github.com/pkg/xattr v0.4.1/go.mod h1:W2cGD0TBEus7MkUgv0tNZ9JutLtVO3cXu+IBRuHqnFs= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35 h1:J9b7z+QKAmPf4YLrFg6oQUotqHQeUNWwkvo7jZp1GLU= +github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= +github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.6/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/statsd_exporter v0.15.0 h1:UiwC1L5HkxEPeapXdm2Ye0u1vUJfTj7uwT5yydYpa1E= +github.com/prometheus/statsd_exporter v0.15.0/go.mod h1:Dv8HnkoLQkeEjkIE4/2ndAA7WL1zHKK7WMqFQqu72rw= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rainycape/memcache v0.0.0-20150622160815-1031fa0ce2f2/go.mod h1:7tZKcyumwBO6qip7RNQ5r77yrssm9bfCowcLEBcU5IA= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/restic/calens v0.2.0 h1:LVNAtmFc+Pb4ODX66qdX1T3Di1P0OTLyUsVyvM/xD7E= +github.com/restic/calens v0.2.0/go.mod h1:UXwyAKS4wsgUZGEc7NrzzygJbLsQZIo3wl+62Q1wvmU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/go-internal v1.0.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.17.2/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I= +github.com/rs/zerolog v1.19.0 h1:hYz4ZVdUgjXTBUmrkrw55j1nHx68LfOKIQk5IYtyScg= +github.com/rs/zerolog v1.19.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= +github.com/rubenv/sql-migrate v0.0.0-20190212093014-1007f53448d7/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sacloud/libsacloud v1.26.1/go.mod h1:79ZwATmHLIFZIMd7sxA3LwzVy/B77uj3LDoToVTxDoQ= +github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= +github.com/santhosh-tekuri/jsonschema/v2 v2.1.0/go.mod h1:yzJzKUGV4RbWqWIBBP4wSOBqavX5saE02yirLS0OTyg= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/segmentio/analytics-go v3.0.1+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48= +github.com/segmentio/backo-go v0.0.0-20160424052352-204274ad699c/go.mod h1:kJ9mm9YmoWSkk+oQ+5Cj8DEoRCX2JT6As4kEtIIOp1M= +github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sethgrid/pester v0.0.0-20190127155807-68a33a018ad0/go.mod h1:Ad7IjTpvzZO8Fl0vh9AzQ+j/jYZfyp2diGwI8m5q+ns= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= +github.com/shurcooL/highlight_go v0.0.0-20170515013102-78fb10f4a5f8/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= +github.com/shurcooL/octicon v0.0.0-20180602230221-c42b0e3b24d9/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= +github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.1.0/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8qsT7A+A= +github.com/sirupsen/logrus v1.1.1/go.mod h1:zrgwTnHtNr00buQ1vSptGe8m1f/BbgsPukg8qsT7A+A= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/skratchdot/open-golang v0.0.0-20160302144031-75fb7ed4208c/go.mod h1:sUM3LWHvSMaG192sy56D9F7CNvL7jUJVXoqM1QKLnog= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.0/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.2.1/go.mod h1:P4AexN0a+C9tGAnUFNwDMYYZv3pjFuvmeiMyKRaNVlI= +github.com/spf13/viper v1.3.1/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.6.1 h1:VPZzIkznI1YhVMRi6vNFLHSwhnhReBfgTxIPccpfdZk= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/studio-b12/gowebdav v0.0.0-20200303150724-9380631c29a1 h1:TPyHV/OgChqNcnYqCoCvIFjR9TU60gFXXBKnhOBzVEI= +github.com/studio-b12/gowebdav v0.0.0-20200303150724-9380631c29a1/go.mod h1:gCcfDlA1Y7GqOaeEKw5l9dOGx1VLdc/HuQSlQAaZ30s= +github.com/subosito/gotenv v1.1.1/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/technoweenie/multipartstreamer v1.0.1/go.mod h1:jNVxdtShOxzAsukZwTSw6MDx5eUJoiEBsSvzDU9uzog= +github.com/tidwall/gjson v1.3.2/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= +github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/sjson v1.0.4/go.mod h1:bURseu1nuBkFpIES5cz6zBtjmYeOQmEESshn7VpF15Y= +github.com/timewasted/linode v0.0.0-20160829202747-37e84520dcf7/go.mod h1:imsgLplxEC/etjIhdr3dNzV3JeT27LbVu5pYWm0JCBY= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce h1:fb190+cK2Xz/dvi9Hv8eCYJYvIGUTN2/KLq1pT6CjEc= +github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= +github.com/transip/gotransip v0.0.0-20190812104329-6d8d9179b66f/go.mod h1:i0f4R4o2HM0m3DZYQWsj6/MEowD57VzoH0v3d7igeFY= +github.com/tus/tusd v1.1.0/go.mod h1:3DWPOdeCnjBwKtv98y5dSws3itPqfce5TVa0s59LRiA= +github.com/tus/tusd v1.1.1-0.20200416115059-9deabf9d80c2 h1:rcji4q9wMuSrz0tZt3kgIr/3WsB5kUqFja6RrgeCGEo= +github.com/tus/tusd v1.1.1-0.20200416115059-9deabf9d80c2/go.mod h1:ygrT4B9ZSb27dx3uTnobX5nOFDnutBL6iWKLH4+KpA0= +github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/unrolled/secure v0.0.0-20180918153822-f340ee86eb8b/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= +github.com/unrolled/secure v0.0.0-20181005190816-ff9db2ff917f/go.mod h1:mnPT77IAdsi/kV7+Es7y+pXALeV3h7G6dQF6mNYjcLA= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/vimeo/go-util v1.2.0/go.mod h1:s13SMDTSO7AjH1nbgp707mfN5JFIWUFDU5MDDuRRtKs= +github.com/vultr/govultr v0.1.4/go.mod h1:9H008Uxr/C4vFNGLqKx232C206GL0PBHzOP0809bGNA= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xeipuuv/gojsonschema v1.1.0/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xtgo/uuid v0.0.0-20140804021211-a0b114877d4c/go.mod h1:UrdRz5enIKZ63MEE3IF9l2/ebyx59GyGgPi+tICQdmM= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.2.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/ratelimit v0.0.0-20180316092928-c15da0234277/go.mod h1:2X8KaoNd1J0lZV+PxJk/5+DGbO/tpwLR1m++a7FnB/Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180830192347-182538f80094/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180910181607-0e37d006457b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181001203147-e3636079e1a4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181024171144-74cb1d3d52f4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025113841-85e1b3f9139a/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181106171534-e4dc69e5b2fd/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181112202954-3d3f9f413869/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190102171810-8d7daa0c54b3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190130090550-b01c7a725664/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20190927123631-a832865fa7ad/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191108234033-bd318be0434a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200320181102-891825fb96df/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9 h1:vEg9joUBmeBcK9iSJftGNf3coIG4HqZElCPehJsfAYM= +golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180611182652-db08ff08e862/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180816102801-aaf60122140d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180921000356-2f5d2388922f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180926154720-4dfa2610cdf3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181017193950-04a2e542c03f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181102091132-c10e9556a7bc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181207154023-610586996380/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190930134127-c5a3c61f89f3/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191011234655-491137f69257/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191027093000-83d349e8ac1a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191109021931-daa7c04131f5/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd h1:QPwSajcTUrFriMF1nJ3XzgoqakqQEsnZf9LdXdi2nkI= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/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= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +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= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180622082034-63fc586f45fe/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/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-20180831094639-fa5fdf94c789/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180906133057-8cf3aee42992/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180921163948-d47a0f339242/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180927150500-dad3d9fb7b6e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181005133103-4497e2df6f9e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181011152604-fa43e7bc11ba/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181021155630-eda9bb28ed51/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181022134430-8a28ead16f52/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181024145615-5cd93ef61a7c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181025063200-d989b31c8746/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026064943-731415f00dce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181106135930-3a76605856fd/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181206074257-70b957f3b65e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190102155601-82a175fd1598/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190116161447-11f53e031339/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190129075346-302c3dd5f1cc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/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-20190403152447-81d4e9dc473e/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= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190710143415-6ec70d6a5542/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191110163157-d32e6e3b99c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191113165036-4c7a9d0fe056/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1 h1:ogLJMz+qpzav7lGMh10LMvAkM/fAoGlaiiHYiFYdm80= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +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= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +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= +golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181003024731-2f84ea8ef872/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181006002542-f60d9635b16a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181008205924-a2b3f7f249e9/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181013182035-5e66757b835f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181017214349-06f26fdaaa28/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181024171208-a2dc47679d30/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181026183834-f60e5f99f081/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181105230042-78dc5bac0cac/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181107215632-34b416bd17b3/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181114190951-94339b83286c/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181119130350-139d099f6620/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181127195227-b4e97c0ed882/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181127232545-e782529d0ddd/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181203210056-e5f3ab76ea4b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181205224935-3576414c54a4/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181206194817-bcd4e47d0288/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181207183836-8bc39b988060/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181212172921-837e80568c09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190102213336-ca9055ed7d04/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190104182027-498d95493402/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190111214448-fc1d57b08d7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190118193359-16909d206f00/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624190245-7f2218787638/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190711191110-9a621aea19f8/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200113040837-eac381796e91/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4 h1:kDtqNkeBrZb8B+atrj50B5XLHpzXXqcCdZPP/ApQ5NY= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.0/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.29.0 h1:BaiDisFir8O4IJxvAabCGGkQ6yCJegNQqSVoYUNAnbk= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/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= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190626174449-989357319d63/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190708153700-3bdd9d9f5532/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940 h1:MRHtG0U6SnaUb+s+LhNE1qt1FQ1wlhqr5E4usBKC0uA= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215 h1:0Uz5jLJQioKgVozXa1gzGbzYxbb/rhQEVvSWxzw5oUs= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +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.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.31.1 h1:SfXqXS5hkufcdZ/mHtYCh53P2b+92WQq/DZcKLgsFRs= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +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= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +gopkg.in/Acconut/lockfile.v1 v1.1.0/go.mod h1:6UCz3wJ8tSFUsPR6uP/j8uegEtDuEEqFxlpi0JI4Umw= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.30.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw= +gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= +gopkg.in/h2non/gock.v1 v1.0.14/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= +gopkg.in/h2non/gock.v1 v1.0.15/go.mod h1:sX4zAkdYX1TRGJ2JY156cFspQn4yRWn6p9EMdODlynE= +gopkg.in/ini.v1 v1.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.44.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.1 h1:GyboHr4UqMiLUybYjd22ZjQIKEJEpgtLXtuGbR21Oho= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mail.v2 v2.0.0-20180731213649-a0242b2233b4/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw= +gopkg.in/ns1/ns1-go.v2 v2.0.0-20190730140822-b51389932cbc/go.mod h1:VV+3haRsgDiVLxyifmMBrBIuCWFBPYKbRssXB9z67Hw= +gopkg.in/resty.v1 v1.9.1/go.mod h1:vo52Hzryw9PnPHcJfPsBiFW62XhNx5OczbV9y+IMpgc= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.1.9/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.0 h1:OZ4sdq+Y+SHfYB7vfthi1Ei8b0vkP8ZPQgUfUwdUSqo= +gopkg.in/square/go-jose.v2 v2.5.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= +gopkg.in/telegram-bot-api.v4 v4.6.4/go.mod h1:5DpGO5dbumb40px+dXcwCpcjmeHNYLpk0bp3XRNvWDM= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/reva/pkg/command/authbasic.go b/reva/pkg/command/authbasic.go new file mode 100644 index 0000000000..79471497dd --- /dev/null +++ b/reva/pkg/command/authbasic.go @@ -0,0 +1,191 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// AuthBasic is the entrypoint for the auth-basic command. +func AuthBasic(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "auth-basic", + Usage: "Start reva authprovider for basic auth", + Flags: flagset.AuthBasicWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.AuthBasic.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.Users.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "auth-basic", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.AuthBasic.Network, + "address": cfg.Reva.AuthBasic.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "authprovider": map[string]interface{}{ + "auth_manager": cfg.Reva.AuthProvider.Driver, + "auth_managers": map[string]interface{}{ + "json": map[string]interface{}{ + "users": cfg.Reva.AuthProvider.JSON, + }, + "ldap": map[string]interface{}{ + "hostname": cfg.Reva.LDAP.Hostname, + "port": cfg.Reva.LDAP.Port, + "base_dn": cfg.Reva.LDAP.BaseDN, + "loginfilter": cfg.Reva.LDAP.LoginFilter, + "bind_username": cfg.Reva.LDAP.BindDN, + "bind_password": cfg.Reva.LDAP.BindPassword, + "idp": cfg.Reva.LDAP.IDP, + "schema": map[string]interface{}{ + "dn": "dn", + "uid": cfg.Reva.LDAP.Schema.UID, + "mail": cfg.Reva.LDAP.Schema.Mail, + "displayName": cfg.Reva.LDAP.Schema.DisplayName, + "cn": cfg.Reva.LDAP.Schema.CN, + }, + }, + }, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.AuthBasic.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", "debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", "debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", "debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/authbearer.go b/reva/pkg/command/authbearer.go new file mode 100644 index 0000000000..d6baa566e4 --- /dev/null +++ b/reva/pkg/command/authbearer.go @@ -0,0 +1,179 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// AuthBearer is the entrypoint for the auth-bearer command. +func AuthBearer(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "auth-bearer", + Usage: "Start reva authprovider for bearer auth", + Flags: flagset.AuthBearerWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.AuthBearer.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.Users.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "auth-bearer", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.AuthBearer.Network, + "address": cfg.Reva.AuthBearer.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "authprovider": map[string]interface{}{ + "auth_manager": "oidc", + "auth_managers": map[string]interface{}{ + "oidc": map[string]interface{}{ + "issuer": cfg.Reva.OIDC.Issuer, + "insecure": cfg.Reva.OIDC.Insecure, + "id_claim": cfg.Reva.OIDC.IDClaim, + "uid_claim": cfg.Reva.OIDC.UIDClaim, + "gid_claim": cfg.Reva.OIDC.GIDClaim, + }, + }, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.AuthBearer.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", "debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", "debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", "debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/drivers.go b/reva/pkg/command/drivers.go new file mode 100644 index 0000000000..9a92b7996e --- /dev/null +++ b/reva/pkg/command/drivers.go @@ -0,0 +1,102 @@ +package command + +import ( + "github.com/owncloud/ocis-reva/pkg/config" +) + +func drivers(cfg *config.Config) map[string]interface{} { + return map[string]interface{}{ + "eos": map[string]interface{}{ + "namespace": cfg.Reva.Storages.EOS.Root, + "shadow_namespace": cfg.Reva.Storages.EOS.ShadowNamespace, + "uploads_namespace": cfg.Reva.Storages.EOS.UploadsNamespace, + "share_folder": cfg.Reva.Storages.EOS.ShareFolder, + "eos_binary": cfg.Reva.Storages.EOS.EosBinary, + "xrdcopy_binary": cfg.Reva.Storages.EOS.XrdcopyBinary, + "master_url": cfg.Reva.Storages.EOS.MasterURL, + "slave_url": cfg.Reva.Storages.EOS.SlaveURL, + "cache_directory": cfg.Reva.Storages.EOS.CacheDirectory, + "sec_protocol": cfg.Reva.Storages.EOS.SecProtocol, + "keytab": cfg.Reva.Storages.EOS.Keytab, + "single_username": cfg.Reva.Storages.EOS.SingleUsername, + "enable_logging": cfg.Reva.Storages.EOS.EnableLogging, + "show_hidden_sys_files": cfg.Reva.Storages.EOS.ShowHiddenSysFiles, + "force_single_user_mode": cfg.Reva.Storages.EOS.ForceSingleUserMode, + "use_keytab": cfg.Reva.Storages.EOS.UseKeytab, + "gatewaysvc": cfg.Reva.Storages.EOS.GatewaySVC, + }, + "eoshome": map[string]interface{}{ + "namespace": cfg.Reva.Storages.EOS.Root, + "shadow_namespace": cfg.Reva.Storages.EOS.ShadowNamespace, + "uploads_namespace": cfg.Reva.Storages.EOS.UploadsNamespace, + "share_folder": cfg.Reva.Storages.EOS.ShareFolder, + "eos_binary": cfg.Reva.Storages.EOS.EosBinary, + "xrdcopy_binary": cfg.Reva.Storages.EOS.XrdcopyBinary, + "master_url": cfg.Reva.Storages.EOS.MasterURL, + "slave_url": cfg.Reva.Storages.EOS.SlaveURL, + "cache_directory": cfg.Reva.Storages.EOS.CacheDirectory, + "sec_protocol": cfg.Reva.Storages.EOS.SecProtocol, + "keytab": cfg.Reva.Storages.EOS.Keytab, + "single_username": cfg.Reva.Storages.EOS.SingleUsername, + "user_layout": cfg.Reva.Storages.EOS.UserLayout, + "enable_logging": cfg.Reva.Storages.EOS.EnableLogging, + "show_hidden_sys_files": cfg.Reva.Storages.EOS.ShowHiddenSysFiles, + "force_single_user_mode": cfg.Reva.Storages.EOS.ForceSingleUserMode, + "use_keytab": cfg.Reva.Storages.EOS.UseKeytab, + "gatewaysvc": cfg.Reva.Storages.EOS.GatewaySVC, + }, + "eosgrpc": map[string]interface{}{ + "namespace": cfg.Reva.Storages.EOS.Root, + "shadow_namespace": cfg.Reva.Storages.EOS.ShadowNamespace, + "share_folder": cfg.Reva.Storages.EOS.ShareFolder, + "eos_binary": cfg.Reva.Storages.EOS.EosBinary, + "xrdcopy_binary": cfg.Reva.Storages.EOS.XrdcopyBinary, + "master_url": cfg.Reva.Storages.EOS.MasterURL, + "master_grpc_uri": cfg.Reva.Storages.EOS.GrpcURI, + "slave_url": cfg.Reva.Storages.EOS.SlaveURL, + "cache_directory": cfg.Reva.Storages.EOS.CacheDirectory, + "sec_protocol": cfg.Reva.Storages.EOS.SecProtocol, + "keytab": cfg.Reva.Storages.EOS.Keytab, + "single_username": cfg.Reva.Storages.EOS.SingleUsername, + "user_layout": cfg.Reva.Storages.EOS.UserLayout, + "enable_logging": cfg.Reva.Storages.EOS.EnableLogging, + "show_hidden_sys_files": cfg.Reva.Storages.EOS.ShowHiddenSysFiles, + "force_single_user_mode": cfg.Reva.Storages.EOS.ForceSingleUserMode, + "use_keytab": cfg.Reva.Storages.EOS.UseKeytab, + "enable_home": cfg.Reva.Storages.EOS.EnableHome, + "gatewaysvc": cfg.Reva.Storages.EOS.GatewaySVC, + }, + "local": map[string]interface{}{ + "root": cfg.Reva.Storages.Local.Root, + "share_folder": cfg.Reva.Storages.Local.ShareFolder, + }, + "localhome": map[string]interface{}{ + "root": cfg.Reva.Storages.Local.Root, + "share_folder": cfg.Reva.Storages.Local.ShareFolder, + "user_layout": cfg.Reva.Storages.Local.UserLayout, + }, + "owncloud": map[string]interface{}{ + "datadirectory": cfg.Reva.Storages.OwnCloud.Root, + "upload_info_dir": cfg.Reva.Storages.OwnCloud.UploadInfoDir, + "sharedirectory": cfg.Reva.Storages.OwnCloud.ShareFolder, + "user_layout": cfg.Reva.Storages.OwnCloud.UserLayout, + "redis": cfg.Reva.Storages.OwnCloud.Redis, + "enable_home": cfg.Reva.Storages.OwnCloud.EnableHome, + "scan": cfg.Reva.Storages.OwnCloud.Scan, + "userprovidersvc": cfg.Reva.Users.URL, + }, + "ocis": map[string]interface{}{ + "root": cfg.Reva.Storages.Common.Root, + "enable_home": cfg.Reva.Storages.Common.EnableHome, + "user_layout": cfg.Reva.Storages.Common.UserLayout, + }, + "s3": map[string]interface{}{ + "region": cfg.Reva.Storages.S3.Region, + "access_key": cfg.Reva.Storages.S3.AccessKey, + "secret_key": cfg.Reva.Storages.S3.SecretKey, + "endpoint": cfg.Reva.Storages.S3.Endpoint, + "bucket": cfg.Reva.Storages.S3.Bucket, + "prefix": cfg.Reva.Storages.S3.Root, + }, + } +} diff --git a/reva/pkg/command/frontend.go b/reva/pkg/command/frontend.go new file mode 100644 index 0000000000..815e0f3bf6 --- /dev/null +++ b/reva/pkg/command/frontend.go @@ -0,0 +1,310 @@ +package command + +import ( + "context" + "fmt" + "os" + "os/signal" + "path" + "strings" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// Frontend is the entrypoint for the frontend command. +func Frontend(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "frontend", + Usage: "Start reva frontend service", + Flags: flagset.FrontendWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.Frontend.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + // pregenerate list of valid localhost ports for the desktop redirect_uri + // TODO use custom scheme like "owncloud://localhost/user/callback" tracked in + var desktopRedirectURIs [65535 - 1024]string + for port := 0; port < len(desktopRedirectURIs); port++ { + desktopRedirectURIs[port] = fmt.Sprintf("http://localhost:%d", (port + 1024)) + } + + filesCfg := map[string]interface{}{ + "private_links": false, + "bigfilechunking": false, + "blacklisted_files": []string{}, + "undelete": true, + "versioning": true, + } + + if !cfg.Reva.UploadDisableTus { + filesCfg["tus_support"] = map[string]interface{}{ + "version": "1.0.0", + "resumable": "1.0.0", + "extension": "creation,creation-with-upload", + "http_method_override": cfg.Reva.UploadHTTPMethodOverride, + "max_chunk_size": int(cfg.Reva.UploadMaxChunkSize), + } + } + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.Users.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "frontend", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + "gatewaysvc": cfg.Reva.Gateway.URL, // Todo or address? + }, + "http": map[string]interface{}{ + "network": cfg.Reva.Frontend.Network, + "address": cfg.Reva.Frontend.Addr, + "middlewares": map[string]interface{}{ + "cors": map[string]interface{}{ + "allow_credentials": true, + }, + }, + // TODO build services dynamically + "services": map[string]interface{}{ + "datagateway": map[string]interface{}{ + "prefix": cfg.Reva.Frontend.DatagatewayPrefix, + "transfer_shared_secret": cfg.Reva.TransferSecret, + "timeout": 86400, + "insecure": true, + }, + "ocdav": map[string]interface{}{ + "prefix": cfg.Reva.Frontend.OCDavPrefix, + "chunk_folder": "/var/tmp/reva/chunks", + "files_namespace": cfg.Reva.OCDav.DavFilesNamespace, + "webdav_namespace": cfg.Reva.OCDav.WebdavNamespace, + "timeout": 86400, + "insecure": true, + "disable_tus": cfg.Reva.UploadDisableTus, + }, + "ocs": map[string]interface{}{ + "prefix": cfg.Reva.Frontend.OCSPrefix, + "config": map[string]interface{}{ + "version": "1.8", + "website": "reva", + "host": urlWithScheme(cfg.Reva.Frontend.URL), + "contact": "admin@localhost", + "ssl": "false", + }, + "disable_tus": cfg.Reva.UploadDisableTus, + "capabilities": map[string]interface{}{ + "capabilities": map[string]interface{}{ + "core": map[string]interface{}{ + "poll_interval": 60, + "webdav_root": "remote.php/webdav", + "status": map[string]interface{}{ + "installed": true, + "maintenance": false, + "needsDbUpgrade": false, + "version": "10.0.11.5", + "versionstring": "10.0.11", + "edition": "community", + "productname": "reva", + "hostname": "", + }, + "support_url_signing": true, + }, + "checksums": map[string]interface{}{ + "supported_types": []string{"SHA256"}, + "preferred_upload_type": "SHA256", + }, + "files": filesCfg, + "dav": map[string]interface{}{}, + "files_sharing": map[string]interface{}{ + "api_enabled": true, + "resharing": true, + "group_sharing": true, + "auto_accept_share": true, + "share_with_group_members_only": true, + "share_with_membership_groups_only": true, + "default_permissions": 22, + "search_min_length": 3, + "public": map[string]interface{}{ + "enabled": true, + "send_mail": true, + "social_share": true, + "upload": true, + "multiple": true, + "supports_upload_only": true, + "password": map[string]interface{}{ + "enforced": true, + "enforced_for": map[string]interface{}{ + "read_only": true, + "read_write": true, + "upload_only": true, + }, + }, + "expire_date": map[string]interface{}{ + "enabled": true, + }, + }, + "user": map[string]interface{}{ + "send_mail": true, + }, + "user_enumeration": map[string]interface{}{ + "enabled": true, + "group_members_only": true, + }, + "federation": map[string]interface{}{ + "outgoing": true, + "incoming": true, + }, + }, + "notifications": map[string]interface{}{ + "endpoints": []string{"disable"}, + }, + }, + "version": map[string]interface{}{ + "edition": "reva", + "major": 10, + "minor": 0, + "micro": 11, + "string": "10.0.11", + }, + }, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.Frontend.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", "debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", "debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", "debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} + +// urlWithScheme checks if the given string is prefixed with "http". If it is not, "http://" will be added as prefix. +// As we can't tell if http or https should be the preferred scheme, the correct approach would be to fail on urls +// without scheme. As long as we have default urls in our flagsets which don't have a scheme, this is a feasible workaround. +func urlWithScheme(str string) string { + if !strings.HasPrefix(str, "http") { + str = "http://" + str + } + return str +} diff --git a/reva/pkg/command/gateway.go b/reva/pkg/command/gateway.go new file mode 100644 index 0000000000..3eceec3408 --- /dev/null +++ b/reva/pkg/command/gateway.go @@ -0,0 +1,259 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "strings" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" + "github.com/owncloud/ocis-reva/pkg/service/external" +) + +// Gateway is the entrypoint for the gateway command. +func Gateway(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "gateway", + Usage: "Start reva gateway", + Flags: flagset.GatewayWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.Gateway.Services = c.StringSlice("service") + cfg.Reva.StorageRegistry.Rules = c.StringSlice("storage-registry-rule") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.Users.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "gateway", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + "gatewaysvc": cfg.Reva.Gateway.URL, // Todo or address? + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.Gateway.Network, + "address": cfg.Reva.Gateway.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "gateway": map[string]interface{}{ + // registries is located on the gateway + "authregistrysvc": cfg.Reva.Gateway.URL, + "storageregistrysvc": cfg.Reva.Gateway.URL, + "appregistrysvc": cfg.Reva.Gateway.URL, + // user metadata is located on the users services + "preferencessvc": cfg.Reva.Users.URL, + "userprovidersvc": cfg.Reva.Users.URL, + // sharing is located on the sharing service + "usershareprovidersvc": cfg.Reva.Sharing.URL, + "publicshareprovidersvc": cfg.Reva.Sharing.URL, + "ocmshareprovidersvc": cfg.Reva.Sharing.URL, + "commit_share_to_storage_grant": cfg.Reva.Gateway.CommitShareToStorageGrant, + "commit_share_to_storage_ref": cfg.Reva.Gateway.CommitShareToStorageRef, + "share_folder": cfg.Reva.Gateway.ShareFolder, // ShareFolder is the location where to create shares in the recipient's storage provider. + // other + "disable_home_creation_on_login": cfg.Reva.Gateway.DisableHomeCreationOnLogin, + "datagateway": urlWithScheme(cfg.Reva.DataGateway.URL), + "transfer_shared_secret": cfg.Reva.TransferSecret, + "transfer_expires": cfg.Reva.TransferExpires, + }, + "authregistry": map[string]interface{}{ + "driver": "static", + "drivers": map[string]interface{}{ + "static": map[string]interface{}{ + "rules": map[string]interface{}{ + "basic": cfg.Reva.AuthBasic.URL, + "bearer": cfg.Reva.AuthBearer.URL, + "publicshares": cfg.Reva.StoragePublicLink.URL, + }, + }, + }, + }, + "storageregistry": map[string]interface{}{ + "driver": cfg.Reva.StorageRegistry.Driver, + "drivers": map[string]interface{}{ + "static": map[string]interface{}{ + "home_provider": cfg.Reva.StorageRegistry.HomeProvider, + "rules": rules(cfg), + }, + }, + }, + }, + }, + } + + gr.Add(func() error { + err := external.RegisterGRPCEndpoint( + ctx, + "com.owncloud.reva", + uuid.String(), + cfg.Reva.Gateway.Addr, + logger, + ) + + if err != nil { + return err + } + + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.Gateway.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", "debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", "debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", "debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} + +func rules(cfg *config.Config) map[string]interface{} { + + // if a list of rules is given it overrides the generated rules from below + if len(cfg.Reva.StorageRegistry.Rules) > 0 { + rules := map[string]interface{}{} + for i := range cfg.Reva.StorageRegistry.Rules { + parts := strings.SplitN(cfg.Reva.StorageRegistry.Rules[i], "=", 2) + rules[parts[0]] = parts[1] + } + return rules + } + + // generate rules based on default config + return map[string]interface{}{ + cfg.Reva.StorageRoot.MountPath: cfg.Reva.StorageRoot.URL, + cfg.Reva.StorageRoot.MountID: cfg.Reva.StorageRoot.URL, + cfg.Reva.StorageHome.MountPath: cfg.Reva.StorageHome.URL, + cfg.Reva.StorageHome.MountID: cfg.Reva.StorageHome.URL, + cfg.Reva.StorageEOS.MountPath: cfg.Reva.StorageEOS.URL, + cfg.Reva.StorageEOS.MountID: cfg.Reva.StorageEOS.URL, + cfg.Reva.StorageOC.MountPath: cfg.Reva.StorageOC.URL, + cfg.Reva.StorageOC.MountID: cfg.Reva.StorageOC.URL, + cfg.Reva.StorageS3.MountPath: cfg.Reva.StorageS3.URL, + cfg.Reva.StorageS3.MountID: cfg.Reva.StorageS3.URL, + cfg.Reva.StorageWND.MountPath: cfg.Reva.StorageWND.URL, + cfg.Reva.StorageWND.MountID: cfg.Reva.StorageWND.URL, + cfg.Reva.StorageCustom.MountPath: cfg.Reva.StorageCustom.URL, + cfg.Reva.StorageCustom.MountID: cfg.Reva.StorageCustom.URL, + cfg.Reva.StoragePublicLink.MountPath: cfg.Reva.StoragePublicLink.URL, + // public link storage returns the mount id of the actual storage + } +} diff --git a/reva/pkg/command/health.go b/reva/pkg/command/health.go new file mode 100644 index 0000000000..36fe9f486d --- /dev/null +++ b/reva/pkg/command/health.go @@ -0,0 +1,49 @@ +package command + +import ( + "fmt" + "net/http" + + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" +) + +// Health is the entrypoint for the health command. +func Health(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "health", + Usage: "Check health status", + Flags: flagset.HealthWithConfig(cfg), + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + resp, err := http.Get( + fmt.Sprintf( + "http://%s/healthz", + cfg.Debug.Addr, + ), + ) + + if err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to request health check") + } + + defer resp.Body.Close() + + if resp.StatusCode != 200 { + logger.Fatal(). + Int("code", resp.StatusCode). + Msg("Health seems to be in bad state") + } + + logger.Debug(). + Int("code", resp.StatusCode). + Msg("Health got a good state") + + return nil + }, + } +} diff --git a/reva/pkg/command/root.go b/reva/pkg/command/root.go new file mode 100644 index 0000000000..8748cb0c17 --- /dev/null +++ b/reva/pkg/command/root.go @@ -0,0 +1,116 @@ +package command + +import ( + "os" + "strings" + + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-pkg/v2/log" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/version" + "github.com/spf13/viper" +) + +// Execute is the entry point for the ocis-reva command. +func Execute() error { + cfg := config.New() + + app := &cli.App{ + Name: "ocis-reva", + Version: version.String, + Usage: "Example service for Reva/oCIS", + Compiled: version.Compiled(), + + Authors: []*cli.Author{ + { + Name: "ownCloud GmbH", + Email: "support@owncloud.com", + }, + }, + + Flags: flagset.RootWithConfig(cfg), + + Before: func(c *cli.Context) error { + logger := NewLogger(cfg) + + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + viper.SetEnvPrefix("REVA") + viper.AutomaticEnv() + + if c.IsSet("config-file") { + viper.SetConfigFile(c.String("config-file")) + } else { + viper.SetConfigName("reva") + + viper.AddConfigPath("/etc/ocis") + viper.AddConfigPath("$HOME/.ocis") + viper.AddConfigPath("./config") + } + + if err := viper.ReadInConfig(); err != nil { + switch err.(type) { + case viper.ConfigFileNotFoundError: + logger.Info(). + Msg("Continue without config") + case viper.UnsupportedConfigError: + logger.Fatal(). + Err(err). + Msg("Unsupported config type") + default: + logger.Fatal(). + Err(err). + Msg("Failed to read config") + } + } + + if err := viper.Unmarshal(&cfg); err != nil { + logger.Fatal(). + Err(err). + Msg("Failed to parse config") + } + + return nil + }, + + Commands: []*cli.Command{ + Frontend(cfg), + Gateway(cfg), + Users(cfg), + AuthBasic(cfg), + AuthBearer(cfg), + Sharing(cfg), + StorageRoot(cfg), + StorageHome(cfg), + StorageHomeData(cfg), + StoragePublicLink(cfg), + StorageOC(cfg), + StorageOCData(cfg), + StorageEOS(cfg), + StorageEOSData(cfg), + Health(cfg), + }, + } + + cli.HelpFlag = &cli.BoolFlag{ + Name: "help,h", + Usage: "Show the help", + } + + cli.VersionFlag = &cli.BoolFlag{ + Name: "version,v", + Usage: "Print the version", + } + + return app.Run(os.Args) +} + +// NewLogger initializes a service-specific logger instance. +func NewLogger(cfg *config.Config) log.Logger { + return log.NewLogger( + log.Name("reva"), + log.Level(cfg.Log.Level), + log.Pretty(cfg.Log.Pretty), + log.Color(cfg.Log.Color), + ) +} diff --git a/reva/pkg/command/sharing.go b/reva/pkg/command/sharing.go new file mode 100644 index 0000000000..bcfd2428d4 --- /dev/null +++ b/reva/pkg/command/sharing.go @@ -0,0 +1,178 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// Sharing is the entrypoint for the sharing command. +func Sharing(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "sharing", + Usage: "Start reva sharing service", + Flags: flagset.SharingWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.Sharing.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.Users.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "sharing", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.Sharing.Network, + "address": cfg.Reva.Sharing.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "usershareprovider": map[string]interface{}{ + "driver": cfg.Reva.Sharing.UserDriver, + "drivers": map[string]interface{}{ + "json": map[string]interface{}{ + "file": cfg.Reva.Sharing.UserJSONFile, + }, + }, + }, + "publicshareprovider": map[string]interface{}{ + "driver": cfg.Reva.Sharing.PublicDriver, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.Sharing.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/storageeos.go b/reva/pkg/command/storageeos.go new file mode 100644 index 0000000000..67300247a1 --- /dev/null +++ b/reva/pkg/command/storageeos.go @@ -0,0 +1,175 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// StorageEOS is the entrypoint for the storage-eos command. +func StorageEOS(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "storage-eos", + Usage: "Start reva storage-eos service", + Flags: flagset.StorageEOSWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.StorageEOS.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.StorageEOS.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "storage-eos", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.StorageEOS.Network, + "address": cfg.Reva.StorageEOS.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "storageprovider": map[string]interface{}{ + "driver": cfg.Reva.StorageEOS.Driver, + "drivers": drivers(cfg), + "mount_path": cfg.Reva.StorageEOS.MountPath, + "mount_id": cfg.Reva.StorageEOS.MountID, + "expose_data_server": cfg.Reva.StorageEOS.ExposeDataServer, + // TODO use cfg.Reva.SStorageEOSData.URL, ? + "data_server_url": cfg.Reva.StorageEOS.DataServerURL, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.StorageEOS.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/storageeosdata.go b/reva/pkg/command/storageeosdata.go new file mode 100644 index 0000000000..e939e01274 --- /dev/null +++ b/reva/pkg/command/storageeosdata.go @@ -0,0 +1,175 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// StorageEOSData is the entrypoint for the storage-oc-data command. +func StorageEOSData(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "storage-eos-data", + Usage: "Start reva storage-eos-data service", + Flags: flagset.StorageEOSDataWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.StorageEOSData.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.StorageEOSData.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "storage-eos-data", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + "gatewaysvc": cfg.Reva.Gateway.URL, // Todo or address? + }, + "http": map[string]interface{}{ + "network": cfg.Reva.StorageEOSData.Network, + "address": cfg.Reva.StorageEOSData.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "dataprovider": map[string]interface{}{ + "prefix": cfg.Reva.StorageEOSData.Prefix, + "driver": cfg.Reva.StorageEOSData.Driver, + "drivers": drivers(cfg), + "timeout": 86400, + "insecure": true, + "disable_tus": false, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.StorageEOSData.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/storagehome.go b/reva/pkg/command/storagehome.go new file mode 100644 index 0000000000..e63b708d02 --- /dev/null +++ b/reva/pkg/command/storagehome.go @@ -0,0 +1,183 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// StorageHome is the entrypoint for the storage-home command. +func StorageHome(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "storage-home", + Usage: "Start reva storage-home service", + Flags: flagset.StorageHomeWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.StorageHome.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + // override driver enable home option with home config + if cfg.Reva.Storages.Home.EnableHome { + cfg.Reva.Storages.Common.EnableHome = true + cfg.Reva.Storages.EOS.EnableHome = true + cfg.Reva.Storages.Local.EnableHome = true + cfg.Reva.Storages.OwnCloud.EnableHome = true + cfg.Reva.Storages.S3.EnableHome = true + } + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.Users.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "storage-home", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.StorageHome.Network, + "address": cfg.Reva.StorageHome.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "storageprovider": map[string]interface{}{ + "driver": cfg.Reva.StorageHome.Driver, + "drivers": drivers(cfg), + "mount_path": cfg.Reva.StorageHome.MountPath, + "mount_id": cfg.Reva.StorageHome.MountID, + "expose_data_server": cfg.Reva.StorageHome.ExposeDataServer, + // TODO use cfg.Reva.StorageHomeData.URL, ? + "data_server_url": cfg.Reva.StorageHome.DataServerURL, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.StorageHome.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/storagehomedata.go b/reva/pkg/command/storagehomedata.go new file mode 100644 index 0000000000..3128fe0348 --- /dev/null +++ b/reva/pkg/command/storagehomedata.go @@ -0,0 +1,183 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// StorageHomeData is the entrypoint for the storage-home-data command. +func StorageHomeData(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "storage-home-data", + Usage: "Start reva storage-home-data service", + Flags: flagset.StorageHomeDataWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.StorageHomeData.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + // override driver enable home option with home config + if cfg.Reva.Storages.Home.EnableHome { + cfg.Reva.Storages.Common.EnableHome = true + cfg.Reva.Storages.EOS.EnableHome = true + cfg.Reva.Storages.Local.EnableHome = true + cfg.Reva.Storages.OwnCloud.EnableHome = true + cfg.Reva.Storages.S3.EnableHome = true + } + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.Users.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "storage-home-data", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + "gatewaysvc": cfg.Reva.Gateway.URL, // Todo or address? + }, + "http": map[string]interface{}{ + "network": cfg.Reva.StorageHomeData.Network, + "address": cfg.Reva.StorageHomeData.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "dataprovider": map[string]interface{}{ + "prefix": cfg.Reva.StorageHomeData.Prefix, + "driver": cfg.Reva.StorageHomeData.Driver, + "drivers": drivers(cfg), + "timeout": 86400, + "insecure": true, + "disable_tus": false, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.StorageHomeData.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/storageoc.go b/reva/pkg/command/storageoc.go new file mode 100644 index 0000000000..2ca35b67f6 --- /dev/null +++ b/reva/pkg/command/storageoc.go @@ -0,0 +1,175 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// StorageOC is the entrypoint for the storage-oc command. +func StorageOC(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "storage-oc", + Usage: "Start reva storage-oc service", + Flags: flagset.StorageOCWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.StorageOC.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.StorageOC.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "storage-oc", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.StorageOC.Network, + "address": cfg.Reva.StorageOC.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "storageprovider": map[string]interface{}{ + "driver": cfg.Reva.StorageOC.Driver, + "drivers": drivers(cfg), + "mount_path": cfg.Reva.StorageOC.MountPath, + "mount_id": cfg.Reva.StorageOC.MountID, + "expose_data_server": cfg.Reva.StorageOC.ExposeDataServer, + // TODO use cfg.Reva.SStorageOCData.URL, ? + "data_server_url": cfg.Reva.StorageOC.DataServerURL, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.StorageOC.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/storageocdata.go b/reva/pkg/command/storageocdata.go new file mode 100644 index 0000000000..414069d15c --- /dev/null +++ b/reva/pkg/command/storageocdata.go @@ -0,0 +1,175 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// StorageOCData is the entrypoint for the storage-oc-data command. +func StorageOCData(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "storage-oc-data", + Usage: "Start reva storage-oc-data service", + Flags: flagset.StorageOCDataWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.StorageOCData.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.StorageOCData.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "storage-oc-data", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + "gatewaysvc": cfg.Reva.Gateway.URL, // Todo or address? + }, + "http": map[string]interface{}{ + "network": cfg.Reva.StorageOCData.Network, + "address": cfg.Reva.StorageOCData.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "dataprovider": map[string]interface{}{ + "prefix": cfg.Reva.StorageOCData.Prefix, + "driver": cfg.Reva.StorageOCData.Driver, + "drivers": drivers(cfg), + "timeout": 86400, + "insecure": true, + "disable_tus": false, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.StorageOCData.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/storagepubliclink.go b/reva/pkg/command/storagepubliclink.go new file mode 100644 index 0000000000..21bcd6abd6 --- /dev/null +++ b/reva/pkg/command/storagepubliclink.go @@ -0,0 +1,176 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// StoragePublicLink is the entrypoint for the reva-storage-public-link command. +func StoragePublicLink(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "reva-storage-public-link", + Usage: "Start reva storage-public-link service", + Flags: flagset.StoragePublicLink(cfg), + Category: "Extensions", + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.StoragePublicLink.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "storage-public-link", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.StoragePublicLink.Network, + "address": cfg.Reva.StoragePublicLink.Addr, + "interceptors": map[string]interface{}{ + "log": map[string]interface{}{}, + }, + "services": map[string]interface{}{ + "publicstorageprovider": map[string]interface{}{ + "mount_path": cfg.Reva.StoragePublicLink.MountPath, + "gateway_addr": cfg.Reva.Gateway.URL, + }, + "authprovider": map[string]interface{}{ + "auth_manager": "publicshares", + "auth_managers": map[string]interface{}{ + "publicshares": map[string]interface{}{ + "gateway_addr": cfg.Reva.Gateway.URL, + }, + }, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.StoragePublicLink.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/storageroot.go b/reva/pkg/command/storageroot.go new file mode 100644 index 0000000000..b35c779dd9 --- /dev/null +++ b/reva/pkg/command/storageroot.go @@ -0,0 +1,174 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// StorageRoot is the entrypoint for the storage-root command. +func StorageRoot(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "storage-root", + Usage: "Start reva storage-root service", + Flags: flagset.StorageRootWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.StorageRoot.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.StorageRoot.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "storage-root", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.StorageRoot.Network, + "address": cfg.Reva.StorageRoot.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "storageprovider": map[string]interface{}{ + "driver": cfg.Reva.StorageRoot.Driver, + "drivers": drivers(cfg), + "mount_path": cfg.Reva.StorageRoot.MountPath, + "mount_id": cfg.Reva.StorageRoot.MountID, + "expose_data_server": cfg.Reva.StorageRoot.ExposeDataServer, + "data_server_url": cfg.Reva.StorageRoot.DataServerURL, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.StorageRoot.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/command/users.go b/reva/pkg/command/users.go new file mode 100644 index 0000000000..50558bf59a --- /dev/null +++ b/reva/pkg/command/users.go @@ -0,0 +1,207 @@ +package command + +import ( + "context" + "os" + "os/signal" + "path" + "time" + + "github.com/cs3org/reva/cmd/revad/runtime" + "github.com/gofrs/uuid" + "github.com/micro/cli/v2" + "github.com/oklog/run" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/flagset" + "github.com/owncloud/ocis-reva/pkg/server/debug" +) + +// Users is the entrypoint for the sharing command. +func Users(cfg *config.Config) *cli.Command { + return &cli.Command{ + Name: "users", + Usage: "Start reva users service", + Flags: flagset.UsersWithConfig(cfg), + Before: func(c *cli.Context) error { + cfg.Reva.Users.Services = c.StringSlice("service") + + return nil + }, + Action: func(c *cli.Context) error { + logger := NewLogger(cfg) + + if cfg.Tracing.Enabled { + switch t := cfg.Tracing.Type; t { + case "agent": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + case "jaeger": + logger.Info(). + Str("type", t). + Msg("configuring reva to use the jaeger tracing backend") + + case "zipkin": + logger.Error(). + Str("type", t). + Msg("Reva only supports the jaeger tracing backend") + + default: + logger.Warn(). + Str("type", t). + Msg("Unknown tracing backend") + } + + } else { + logger.Debug(). + Msg("Tracing is not enabled") + } + + var ( + gr = run.Group{} + ctx, cancel = context.WithCancel(context.Background()) + //metrics = metrics.New() + ) + + defer cancel() + + { + uuid := uuid.Must(uuid.NewV4()) + pidFile := path.Join(os.TempDir(), "revad-"+c.Command.Name+"-"+uuid.String()+".pid") + + rcfg := map[string]interface{}{ + "core": map[string]interface{}{ + "max_cpus": cfg.Reva.Users.MaxCPUs, + "tracing_enabled": cfg.Tracing.Enabled, + "tracing_endpoint": cfg.Tracing.Endpoint, + "tracing_collector": cfg.Tracing.Collector, + "tracing_service_name": "users", + }, + "shared": map[string]interface{}{ + "jwt_secret": cfg.Reva.JWTSecret, + }, + "grpc": map[string]interface{}{ + "network": cfg.Reva.Users.Network, + "address": cfg.Reva.Users.Addr, + // TODO build services dynamically + "services": map[string]interface{}{ + "userprovider": map[string]interface{}{ + "driver": cfg.Reva.Users.Driver, + "drivers": map[string]interface{}{ + "json": map[string]interface{}{ + "users": cfg.Reva.Users.JSON, + }, + "ldap": map[string]interface{}{ + "hostname": cfg.Reva.LDAP.Hostname, + "port": cfg.Reva.LDAP.Port, + "base_dn": cfg.Reva.LDAP.BaseDN, + "userfilter": cfg.Reva.LDAP.UserFilter, + "attributefilter": cfg.Reva.LDAP.AttributeFilter, + "findfilter": cfg.Reva.LDAP.FindFilter, + "groupfilter": cfg.Reva.LDAP.GroupFilter, + "bind_username": cfg.Reva.LDAP.BindDN, + "bind_password": cfg.Reva.LDAP.BindPassword, + "idp": cfg.Reva.LDAP.IDP, + "schema": map[string]interface{}{ + "dn": "dn", + "uid": cfg.Reva.LDAP.Schema.UID, + "mail": cfg.Reva.LDAP.Schema.Mail, + "displayName": cfg.Reva.LDAP.Schema.DisplayName, + "cn": cfg.Reva.LDAP.Schema.CN, + "uidNumber": cfg.Reva.LDAP.Schema.UIDNumber, + "gidNumber": cfg.Reva.LDAP.Schema.GIDNumber, + }, + }, + "rest": map[string]interface{}{ + "client_id": cfg.Reva.UserRest.ClientID, + "client_secret": cfg.Reva.UserRest.ClientSecret, + "redis_address": cfg.Reva.UserRest.RedisAddress, + "redis_username": cfg.Reva.UserRest.RedisUsername, + "redis_password": cfg.Reva.UserRest.RedisPassword, + "user_groups_cache_expiration": cfg.Reva.UserRest.UserGroupsCacheExpiration, + "id_provider": cfg.Reva.UserRest.IDProvider, + "api_base_url": cfg.Reva.UserRest.APIBaseURL, + "oidc_token_endpoint": cfg.Reva.UserRest.OIDCTokenEndpoint, + "target_api": cfg.Reva.UserRest.TargetAPI, + }, + }, + }, + }, + }, + } + + gr.Add(func() error { + runtime.RunWithOptions( + rcfg, + pidFile, + runtime.WithLogger(&logger.Logger), + ) + return nil + }, func(_ error) { + logger.Info(). + Str("server", c.Command.Name). + Msg("Shutting down server") + + cancel() + }) + } + + { + server, err := debug.Server( + debug.Name(c.Command.Name+"-debug"), + debug.Addr(cfg.Reva.Users.DebugAddr), + debug.Logger(logger), + debug.Context(ctx), + debug.Config(cfg), + ) + + if err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to initialize server") + + return err + } + + gr.Add(func() error { + return server.ListenAndServe() + }, func(_ error) { + ctx, timeout := context.WithTimeout(ctx, 5*time.Second) + + defer timeout() + defer cancel() + + if err := server.Shutdown(ctx); err != nil { + logger.Info(). + Err(err). + Str("server", c.Command.Name+"-debug"). + Msg("Failed to shutdown server") + } else { + logger.Info(). + Str("server", c.Command.Name+"-debug"). + Msg("Shutting down server") + } + }) + } + + { + stop := make(chan os.Signal, 1) + + gr.Add(func() error { + signal.Notify(stop, os.Interrupt) + + <-stop + + return nil + }, func(err error) { + close(stop) + cancel() + }) + } + + return gr.Run() + }, + } +} diff --git a/reva/pkg/config/config.go b/reva/pkg/config/config.go new file mode 100644 index 0000000000..aac373ac62 --- /dev/null +++ b/reva/pkg/config/config.go @@ -0,0 +1,336 @@ +package config + +// Log defines the available logging configuration. +type Log struct { + Level string + Pretty bool + Color bool +} + +// Debug defines the available debug configuration. +type Debug struct { + Addr string + Token string + Pprof bool + Zpages bool +} + +// Gateway defines the available gateway configuration. +type Gateway struct { + Port + CommitShareToStorageGrant bool + CommitShareToStorageRef bool + ShareFolder string + LinkGrants string + DisableHomeCreationOnLogin bool +} + +// StorageRegistry defines the available storage registry configuration +type StorageRegistry struct { + Driver string + // HomeProvider is the path in the global namespace that the static storage registry uses to determine the home storage + HomeProvider string + Rules []string +} + +// Sharing defines the available sharing configuration. +type Sharing struct { + Port + UserDriver string + UserJSONFile string + PublicDriver string +} + +// Port defines the available port configuration. +type Port struct { + // MaxCPUs can be a number or a percentage + MaxCPUs string + LogLevel string + // Network can be tcp, udp or unix + Network string + // Addr to listen on, hostname:port (0.0.0.0:9999 for all interfaces) or socket (/var/run/reva/sock) + Addr string + // Protocol can be grpc or http + Protocol string + // URL is used by the gateway and registries (eg http://localhost:9100 or https://cloud.example.com) + URL string + // DebugAddr for the debug endpoint to bind to + DebugAddr string + // Services can be used to give a list of services that should be started on this port + Services []string + // Config can be used to configure the reva instance. + // Services and Protocol will be ignored if this is used + Config map[string]interface{} +} + +// Users defines the available users configuration. +type Users struct { + Port + Driver string + JSON string +} + +// FrontendPort defines the available frontend configuration. +type FrontendPort struct { + Port + + DatagatewayPrefix string + OCDavPrefix string + OCSPrefix string +} + +// StoragePort defines the available storage configuration. +type StoragePort struct { + Port + Driver string + MountPath string + MountID string + ExposeDataServer bool + DataServerURL string + + // for HTTP ports with only one http service + Prefix string + TempFolder string +} + +// PublicStorage configures a public storage provider +type PublicStorage struct { + StoragePort + + PublicShareProviderAddr string + UserProviderAddr string +} + +// StorageConfig combines all available storage driver configuration parts. +type StorageConfig struct { + Home DriverCommon + EOS DriverEOS + Local DriverCommon + OwnCloud DriverOwnCloud + S3 DriverS3 + Common DriverCommon + // TODO checksums ... figure out what that is supposed to do +} + +// DriverCommon defines common driver configuration options. +type DriverCommon struct { + // Root is the absolute path to the location of the data + Root string + //ShareFolder defines the name of the folder jailing all shares + ShareFolder string + // UserLayout contains the template used to construct + // the internal path, eg: `{{substr 0 1 .Username}}/{{.Username}}` + UserLayout string + // EnableHome enables the creation of home directories. + EnableHome bool +} + +// DriverEOS defines the available EOS driver configuration. +type DriverEOS struct { + DriverCommon + + // ShadowNamespace for storing shadow data + ShadowNamespace string + + // UploadsNamespace for storing upload data + UploadsNamespace string + + // Location of the eos binary. + // Default is /usr/bin/eos. + EosBinary string + + // Location of the xrdcopy binary. + // Default is /usr/bin/xrdcopy. + XrdcopyBinary string + + // URL of the Master EOS MGM. + // Default is root://eos-example.org + MasterURL string + + // URI of the EOS MGM grpc server + // Default is empty + GrpcURI string + + // URL of the Slave EOS MGM. + // Default is root://eos-example.org + SlaveURL string + + // Location on the local fs where to store reads. + // Defaults to os.TempDir() + CacheDirectory string + + // Enables logging of the commands executed + // Defaults to false + EnableLogging bool + + // ShowHiddenSysFiles shows internal EOS files like + // .sys.v# and .sys.a# files. + ShowHiddenSysFiles bool + + // ForceSingleUserMode will force connections to EOS to use SingleUsername + ForceSingleUserMode bool + + // UseKeyTabAuth changes will authenticate requests by using an EOS keytab. + UseKeytab bool + + // SecProtocol specifies the xrootd security protocol to use between the server and EOS. + SecProtocol string + + // Keytab specifies the location of the keytab to use to authenticate to EOS. + Keytab string + + // SingleUsername is the username to use when SingleUserMode is enabled + SingleUsername string + + // gateway service to use for uid lookups + GatewaySVC string +} + +// DriverOwnCloud defines the available ownCloud storage driver configuration. +type DriverOwnCloud struct { + DriverCommon + + UploadInfoDir string + Redis string + Scan bool +} + +// DriverS3 defines the available S3 storage driver configuration. +type DriverS3 struct { + DriverCommon + + Region string + AccessKey string + SecretKey string + Endpoint string + Bucket string +} + +// OIDC defines the available OpenID Connect configuration. +type OIDC struct { + Issuer string + Insecure bool + IDClaim string + UIDClaim string + GIDClaim string +} + +// LDAP defines the available ldap configuration. +type LDAP struct { + Hostname string + Port int + BaseDN string + LoginFilter string + UserFilter string + AttributeFilter string + FindFilter string + GroupFilter string + BindDN string + BindPassword string + IDP string + Schema LDAPSchema +} + +// UserRest defines the user REST driver specification. +type UserRest struct { + ClientID string + ClientSecret string + RedisAddress string + RedisUsername string + RedisPassword string + IDProvider string + APIBaseURL string + OIDCTokenEndpoint string + TargetAPI string + UserGroupsCacheExpiration int +} + +// LDAPSchema defines the available ldap schema configuration. +type LDAPSchema struct { + UID string + Mail string + DisplayName string + CN string + UIDNumber string + GIDNumber string +} + +// OCDav defines the available ocdav configuration. +type OCDav struct { + WebdavNamespace string + DavFilesNamespace string +} + +// Reva defines the available reva configuration. +type Reva struct { + // JWTSecret used to sign jwt tokens between services + JWTSecret string + TransferSecret string + TransferExpires int + OIDC OIDC + LDAP LDAP + UserRest UserRest + OCDav OCDav + Storages StorageConfig + // Ports are used to configure which services to start on which port + Frontend FrontendPort + DataGateway Port + Gateway Gateway + StorageRegistry StorageRegistry + Users Users + AuthProvider Users + AuthBasic Port + AuthBearer Port + Sharing Sharing + StorageRoot StoragePort + StorageRootData StoragePort + StorageHome StoragePort + StorageHomeData StoragePort + StorageEOS StoragePort + StorageEOSData StoragePort + StorageOC StoragePort + StorageOCData StoragePort + StorageS3 StoragePort + StorageS3Data StoragePort + StorageWND StoragePort + StorageWNDData StoragePort + StorageCustom StoragePort + StorageCustomData StoragePort + StoragePublicLink PublicStorage + // Configs can be used to configure the reva instance. + // Services and Ports will be ignored if this is used + Configs map[string]interface{} + // chunking and resumable upload config (TUS) + UploadMaxChunkSize int + UploadHTTPMethodOverride string + UploadDisableTus bool +} + +// Tracing defines the available tracing configuration. +type Tracing struct { + Enabled bool + Type string + Endpoint string + Collector string + Service string +} + +// Asset defines the available asset configuration. +type Asset struct { + Path string +} + +// Config combines all available configuration parts. +type Config struct { + File string + Log Log + Debug Debug + Reva Reva + Tracing Tracing + Asset Asset +} + +// New initializes a new configuration with or without defaults. +func New() *Config { + return &Config{} +} diff --git a/reva/pkg/flagset/authbasic.go b/reva/pkg/flagset/authbasic.go new file mode 100644 index 0000000000..09ee616fbf --- /dev/null +++ b/reva/pkg/flagset/authbasic.go @@ -0,0 +1,84 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// AuthBasicWithConfig applies cfg to the root flagset +func AuthBasicWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9147", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_AUTH_BASIC_DEBUG_ADDR"}, + Destination: &cfg.Reva.AuthBasic.DebugAddr, + }, + + // Auth + + &cli.StringFlag{ + Name: "auth-driver", + Value: "ldap", + Usage: "auth driver: 'demo', 'json' or 'ldap'", + EnvVars: []string{"REVA_AUTH_DRIVER"}, + Destination: &cfg.Reva.AuthProvider.Driver, + }, + &cli.StringFlag{ + Name: "auth-json", + Value: "", + Usage: "Path to users.json file", + EnvVars: []string{"REVA_AUTH_JSON"}, + Destination: &cfg.Reva.AuthProvider.JSON, + }, + + // Services + + // AuthBasic + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva auth-basic service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_AUTH_BASIC_NETWORK"}, + Destination: &cfg.Reva.AuthBasic.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_AUTH_BASIC_PROTOCOL"}, + Destination: &cfg.Reva.AuthBasic.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9146", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_AUTH_BASIC_ADDR"}, + Destination: &cfg.Reva.AuthBasic.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9146", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_AUTH_BASIC_URL"}, + Destination: &cfg.Reva.AuthBasic.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("authprovider"), + Usage: "--service authprovider [--service otherservice]", + EnvVars: []string{"REVA_AUTH_BASIC_SERVICES"}, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + flags = append(flags, LDAPWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/authbearer.go b/reva/pkg/flagset/authbearer.go new file mode 100644 index 0000000000..181032c892 --- /dev/null +++ b/reva/pkg/flagset/authbearer.go @@ -0,0 +1,110 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// AuthBearerWithConfig applies cfg to the root flagset +func AuthBearerWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9149", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_AUTH_BEARER_DEBUG_ADDR"}, + Destination: &cfg.Reva.AuthBearer.DebugAddr, + }, + + // OIDC + + &cli.StringFlag{ + Name: "oidc-issuer", + Value: "https://localhost:9200", + Usage: "OIDC issuer", + EnvVars: []string{"REVA_OIDC_ISSUER"}, + Destination: &cfg.Reva.OIDC.Issuer, + }, + &cli.BoolFlag{ + Name: "oidc-insecure", + Value: true, + Usage: "OIDC allow insecure communication", + EnvVars: []string{"REVA_OIDC_INSECURE"}, + Destination: &cfg.Reva.OIDC.Insecure, + }, + &cli.StringFlag{ + Name: "oidc-id-claim", + // preferred_username is a workaround + // the user manager needs to take care of the sub to user metadata lookup, which ldap cannot do + // TODO sub is stable and defined as unique. + // AFAICT we want to use the account id from ocis-accounts + // TODO add an ocis middleware to reva that changes the users opaqueid? + // TODO add an ocis-accounts backed user manager + Value: "preferred_username", + Usage: "OIDC id claim", + EnvVars: []string{"REVA_OIDC_ID_CLAIM"}, + Destination: &cfg.Reva.OIDC.IDClaim, + }, + &cli.StringFlag{ + Name: "oidc-uid-claim", + Value: "", + Usage: "OIDC uid claim", + EnvVars: []string{"REVA_OIDC_UID_CLAIM"}, + Destination: &cfg.Reva.OIDC.UIDClaim, + }, + &cli.StringFlag{ + Name: "oidc-gid-claim", + Value: "", + Usage: "OIDC gid claim", + EnvVars: []string{"REVA_OIDC_GID_CLAIM"}, + Destination: &cfg.Reva.OIDC.GIDClaim, + }, + + // Services + + // AuthBearer + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_AUTH_BEARER_NETWORK"}, + Destination: &cfg.Reva.AuthBearer.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_AUTH_BEARER_PROTOCOL"}, + Destination: &cfg.Reva.AuthBearer.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9148", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_AUTH_BEARER_ADDR"}, + Destination: &cfg.Reva.AuthBearer.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9148", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_AUTH_BEARER_URL"}, + Destination: &cfg.Reva.AuthBearer.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("authprovider"), // TODO preferences + Usage: "--service authprovider [--service otherservice]", + EnvVars: []string{"REVA_AUTH_BEARER_SERVICES"}, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/debug.go b/reva/pkg/flagset/debug.go new file mode 100644 index 0000000000..0056942f5d --- /dev/null +++ b/reva/pkg/flagset/debug.go @@ -0,0 +1,31 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// DebugWithConfig applies common debug config cfg to the flagset +func DebugWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: "debug-token", + Value: "", + Usage: "Token to grant metrics access", + EnvVars: []string{"REVA_DEBUG_TOKEN"}, + Destination: &cfg.Debug.Token, + }, + &cli.BoolFlag{ + Name: "debug-pprof", + Usage: "Enable pprof debugging", + EnvVars: []string{"REVA_DEBUG_PPROF"}, + Destination: &cfg.Debug.Pprof, + }, + &cli.BoolFlag{ + Name: "debug-zpages", + Usage: "Enable zpages debugging", + EnvVars: []string{"REVA_DEBUG_ZPAGES"}, + Destination: &cfg.Debug.Zpages, + }, + } +} diff --git a/reva/pkg/flagset/drivereos.go b/reva/pkg/flagset/drivereos.go new file mode 100644 index 0000000000..3c2955d632 --- /dev/null +++ b/reva/pkg/flagset/drivereos.go @@ -0,0 +1,133 @@ +package flagset + +import ( + "os" + + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// DriverEOSWithConfig applies cfg to the root flagset +func DriverEOSWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + + &cli.StringFlag{ + Name: "storage-eos-namespace", + Value: "/eos/dockertest/reva", + Usage: "Namespace for metadata operations", + EnvVars: []string{"REVA_STORAGE_EOS_NAMESPACE"}, + Destination: &cfg.Reva.Storages.EOS.Root, + }, + &cli.StringFlag{ + Name: "storage-eos-shadow-namespace", + // Defaults to path.Join(c.Namespace, ".shadow") + Usage: "Shadow namespace where share references are stored", + EnvVars: []string{"REVA_STORAGE_EOS_SHADOW_NAMESPACE"}, + Destination: &cfg.Reva.Storages.EOS.ShadowNamespace, + }, + &cli.StringFlag{ + Name: "storage-eos-share-folder", + Value: "/Shares", + Usage: "name of the share folder", + EnvVars: []string{"REVA_STORAGE_EOS_SHARE_FOLDER"}, + Destination: &cfg.Reva.Storages.EOS.ShareFolder, + }, + &cli.StringFlag{ + Name: "storage-eos-binary", + Value: "/usr/bin/eos", + Usage: "Location of the eos binary", + EnvVars: []string{"REVA_STORAGE_EOS_BINARY"}, + Destination: &cfg.Reva.Storages.EOS.EosBinary, + }, + &cli.StringFlag{ + Name: "storage-eos-xrdcopy-binary", + Value: "/usr/bin/xrdcopy", + Usage: "Location of the xrdcopy binary", + EnvVars: []string{"REVA_STORAGE_EOS_XRDCOPY_BINARY"}, + Destination: &cfg.Reva.Storages.EOS.XrdcopyBinary, + }, + &cli.StringFlag{ + Name: "storage-eos-master-url", + Value: "root://eos-mgm1.eoscluster.cern.ch:1094", + Usage: "URL of the Master EOS MGM", + EnvVars: []string{"REVA_STORAGE_EOS_MASTER_URL"}, + Destination: &cfg.Reva.Storages.EOS.MasterURL, + }, + &cli.StringFlag{ + Name: "storage-eos-slave-url", + Value: "root://eos-mgm1.eoscluster.cern.ch:1094", + Usage: "URL of the Slave EOS MGM", + EnvVars: []string{"REVA_STORAGE_EOS_SLAVE_URL"}, + Destination: &cfg.Reva.Storages.EOS.SlaveURL, + }, + &cli.StringFlag{ + Name: "storage-eos-cache-directory", + Value: os.TempDir(), + Usage: "Location on the local fs where to store reads", + EnvVars: []string{"REVA_STORAGE_EOS_CACHE_DIRECTORY"}, + Destination: &cfg.Reva.Storages.EOS.CacheDirectory, + }, + &cli.BoolFlag{ + Name: "storage-eos-enable-logging", + Usage: "Enables logging of the commands executed", + EnvVars: []string{"REVA_STORAGE_EOS_ENABLE_LOGGING"}, + Destination: &cfg.Reva.Storages.EOS.EnableLogging, + }, + &cli.BoolFlag{ + Name: "storage-eos-show-hidden-sysfiles", + Usage: "show internal EOS files like .sys.v# and .sys.a# files.", + EnvVars: []string{"REVA_STORAGE_EOS_SHOW_HIDDEN_SYSFILES"}, + Destination: &cfg.Reva.Storages.EOS.ShowHiddenSysFiles, + }, + &cli.BoolFlag{ + Name: "storage-eos-force-singleuser-mode", + Usage: "force connections to EOS to use SingleUsername", + EnvVars: []string{"REVA_STORAGE_EOS_FORCE_SINGLEUSER_MODE"}, + Destination: &cfg.Reva.Storages.EOS.ForceSingleUserMode, + }, + &cli.BoolFlag{ + Name: "storage-eos-use-keytab", + Usage: "authenticate requests by using an EOS keytab", + EnvVars: []string{"REVA_STORAGE_EOS_USE_KEYTAB"}, + Destination: &cfg.Reva.Storages.EOS.UseKeytab, + }, + &cli.BoolFlag{ + Name: "storage-eos-enable-home", + Usage: "enable the creation of home directories", + EnvVars: []string{"REVA_STORAGE_EOS_ENABLE_HOME"}, + Destination: &cfg.Reva.Storages.EOS.EnableHome, + }, + &cli.StringFlag{ + Name: "storage-eos-sec-protocol", + Usage: "the xrootd security protocol to use between the server and EOS", + EnvVars: []string{"REVA_STORAGE_EOS_SEC_PROTOCOL"}, + Destination: &cfg.Reva.Storages.EOS.SecProtocol, + }, + &cli.StringFlag{ + Name: "storage-eos-keytab", + Usage: "the location of the keytab to use to authenticate to EOS", + EnvVars: []string{"REVA_STORAGE_EOS_KEYTAB"}, + Destination: &cfg.Reva.Storages.EOS.Keytab, + }, + &cli.StringFlag{ + Name: "storage-eos-single-username", + Usage: "the username to use when SingleUserMode is enabled", + EnvVars: []string{"REVA_STORAGE_EOS_SINGLE_USERNAME"}, + Destination: &cfg.Reva.Storages.EOS.SingleUsername, + }, + &cli.StringFlag{ + Name: "storage-eos-layout", + Value: "{{substr 0 1 .Username}}/{{.Username}}", + Usage: `"layout of the users home dir path on disk, in addition to {{.Username}}, {{.UsernameLower}} and {{.Provider}} also supports prefixing dirs: "{{.UsernamePrefixCount.2}}/{{.UsernameLower}}" will turn "Einstein" into "Ei/Einstein" `, + EnvVars: []string{"REVA_STORAGE_EOS_LAYOUT"}, + Destination: &cfg.Reva.Storages.EOS.UserLayout, + }, + &cli.StringFlag{ + Name: "storage-eos-gatewaysvc", + Value: "localhost:9142", + Usage: "URL to use for the reva gateway service", + EnvVars: []string{"REVA_STORAGE_EOS_GATEWAYSVC"}, + Destination: &cfg.Reva.Storages.EOS.GatewaySVC, + }, + } +} diff --git a/reva/pkg/flagset/driverlocal.go b/reva/pkg/flagset/driverlocal.go new file mode 100644 index 0000000000..ba8eda4da6 --- /dev/null +++ b/reva/pkg/flagset/driverlocal.go @@ -0,0 +1,19 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// DriverLocalWithConfig applies cfg to the root flagset +func DriverLocalWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: "storage-local-root", + Value: "/var/tmp/reva/root", + Usage: "the path to the local storage root", + EnvVars: []string{"REVA_STORAGE_LOCAL_ROOT"}, + Destination: &cfg.Reva.Storages.Local.Root, + }, + } +} diff --git a/reva/pkg/flagset/driverocis.go b/reva/pkg/flagset/driverocis.go new file mode 100644 index 0000000000..6338bf0811 --- /dev/null +++ b/reva/pkg/flagset/driverocis.go @@ -0,0 +1,33 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// DriverOCISWithConfig applies cfg to the root flagset +func DriverOCISWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: "storage-ocis-root", + Value: "/var/tmp/ocis/root", + Usage: "the path to the local storage root", + EnvVars: []string{"REVA_STORAGE_OCIS_ROOT"}, + Destination: &cfg.Reva.Storages.Common.Root, + }, + &cli.BoolFlag{ + Name: "storage-ocis-enable-home", + Value: false, + Usage: "enable the creation of home storages", + EnvVars: []string{"REVA_STORAGE_OCIS_ENABLE_HOME"}, + Destination: &cfg.Reva.Storages.Common.EnableHome, + }, + &cli.StringFlag{ + Name: "storage-ocis-layout", + Value: "{{.Id.OpaqueId}}", + Usage: `"layout of the users home dir path on disk, in addition to {{.Username}}, {{.Mail}}, {{.Id.OpaqueId}}, {{.Id.Idp}} also supports prefixing dirs: "{{substr 0 1 .Username}}/{{.Username}}" will turn "Einstein" into "Ei/Einstein" `, + EnvVars: []string{"REVA_STORAGE_OCIS_LAYOUT"}, + Destination: &cfg.Reva.Storages.Common.UserLayout, + }, + } +} diff --git a/reva/pkg/flagset/driverowncloud.go b/reva/pkg/flagset/driverowncloud.go new file mode 100644 index 0000000000..8d5f0b5ab5 --- /dev/null +++ b/reva/pkg/flagset/driverowncloud.go @@ -0,0 +1,61 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// DriverOwnCloudWithConfig applies cfg to the root flagset +func DriverOwnCloudWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: "storage-owncloud-datadir", + Value: "/var/tmp/reva/data", + Usage: "the path to the owncloud data directory", + EnvVars: []string{"REVA_STORAGE_OWNCLOUD_DATADIR"}, + Destination: &cfg.Reva.Storages.OwnCloud.Root, + }, + &cli.StringFlag{ + Name: "storage-owncloud-uploadinfo-dir", + Value: "/var/tmp/reva/uploadinfo", + Usage: "the path to the tus upload info directory", + EnvVars: []string{"REVA_STORAGE_OWNCLOUD_UPLOADINFO_DIR"}, + Destination: &cfg.Reva.Storages.OwnCloud.UploadInfoDir, + }, + &cli.StringFlag{ + Name: "storage-owncloud-share-folder", + Value: "/Shares", + Usage: "name of the shares folder", + EnvVars: []string{"REVA_STORAGE_OWNCLOUD_SHARE_FOLDER"}, + Destination: &cfg.Reva.Storages.OwnCloud.ShareFolder, + }, + &cli.BoolFlag{ + Name: "storage-owncloud-scan", + Value: true, + Usage: "scan files on startup to add fileids", + EnvVars: []string{"REVA_STORAGE_OWNCLOUD_SCAN"}, + Destination: &cfg.Reva.Storages.OwnCloud.Scan, + }, + &cli.StringFlag{ + Name: "storage-owncloud-redis", + Value: ":6379", + Usage: "the address of the redis server", + EnvVars: []string{"REVA_STORAGE_OWNCLOUD_REDIS_ADDR"}, + Destination: &cfg.Reva.Storages.OwnCloud.Redis, + }, + &cli.BoolFlag{ + Name: "storage-owncloud-enable-home", + Value: false, + Usage: "enable the creation of home storages", + EnvVars: []string{"REVA_STORAGE_OWNCLOUD_ENABLE_HOME"}, + Destination: &cfg.Reva.Storages.OwnCloud.EnableHome, + }, + &cli.StringFlag{ + Name: "storage-owncloud-layout", + Value: "{{.Id.OpaqueId}}", + Usage: `"layout of the users home dir path on disk, in addition to {{.Username}}, {{.Mail}}, {{.Id.OpaqueId}}, {{.Id.Idp}} also supports prefixing dirs: "{{substr 0 1 .Username}}/{{.Username}}" will turn "Einstein" into "Ei/Einstein" `, + EnvVars: []string{"REVA_STORAGE_OWNCLOUD_LAYOUT"}, + Destination: &cfg.Reva.Storages.OwnCloud.UserLayout, + }, + } +} diff --git a/reva/pkg/flagset/frontend.go b/reva/pkg/flagset/frontend.go new file mode 100644 index 0000000000..5dbd7b2220 --- /dev/null +++ b/reva/pkg/flagset/frontend.go @@ -0,0 +1,150 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// FrontendWithConfig applies cfg to the root flagset +func FrontendWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9141", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_FRONTEND_DEBUG_ADDR"}, + Destination: &cfg.Reva.Frontend.DebugAddr, + }, + + // REVA + + &cli.StringFlag{ + Name: "transfer-secret", + Value: "replace-me-with-a-transfer-secret", + Usage: "Transfer secret for datagateway", + EnvVars: []string{"REVA_TRANSFER_SECRET"}, + Destination: &cfg.Reva.TransferSecret, + }, + + // OCDav + + &cli.StringFlag{ + Name: "webdav-namespace", + Value: "/home/", + Usage: "Namespace prefix for the /webdav endpoint", + EnvVars: []string{"WEBDAV_NAMESPACE"}, + Destination: &cfg.Reva.OCDav.WebdavNamespace, + }, + + // the /dav/files endpoint expects a username as the first path segment + // this can eg. be set to /eos/users + &cli.StringFlag{ + Name: "dav-files-namespace", + Value: "/oc/", + Usage: "Namespace prefix for the webdav /dav/files endpoint", + EnvVars: []string{"DAV_FILES_NAMESPACE"}, + Destination: &cfg.Reva.OCDav.DavFilesNamespace, + }, + + // Services + + // Frontend + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_FRONTEND_NETWORK"}, + Destination: &cfg.Reva.Frontend.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "http", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_FRONTEND_PROTOCOL"}, + Destination: &cfg.Reva.Frontend.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9140", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_FRONTEND_ADDR"}, + Destination: &cfg.Reva.Frontend.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "https://localhost:9200", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_FRONTEND_URL"}, + Destination: &cfg.Reva.Frontend.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("datagateway", "ocdav", "ocs"), + Usage: "--service ocdav [--service ocs]", + EnvVars: []string{"REVA_FRONTEND_SERVICES"}, + }, + &cli.StringFlag{ + Name: "datagateway-prefix", + Value: "data", + Usage: "datagateway prefix", + EnvVars: []string{"REVA_FRONTEND_DATAGATEWAY_PREFIX"}, + Destination: &cfg.Reva.Frontend.DatagatewayPrefix, + }, + &cli.StringFlag{ + Name: "ocdav-prefix", + Value: "", + Usage: "owncloud webdav endpoint prefix", + EnvVars: []string{"REVA_FRONTEND_OCDAV_PREFIX"}, + Destination: &cfg.Reva.Frontend.OCDavPrefix, + }, + &cli.StringFlag{ + Name: "ocs-prefix", + Value: "ocs", + Usage: "open collaboration services endpoint prefix", + EnvVars: []string{"REVA_FRONTEND_OCS_PREFIX"}, + Destination: &cfg.Reva.Frontend.OCSPrefix, + }, + + // Gateway + + &cli.StringFlag{ + Name: "gateway-url", + Value: "localhost:9142", + Usage: "URL to use for the reva gateway service", + EnvVars: []string{"REVA_GATEWAY_URL"}, + Destination: &cfg.Reva.Gateway.URL, + }, + + // Chunking + &cli.BoolFlag{ + Name: "upload-disable-tus", + Value: false, + Usage: "Disables TUS upload mechanism", + EnvVars: []string{"REVA_FRONTEND_UPLOAD_DISABLE_TUS"}, + Destination: &cfg.Reva.UploadDisableTus, + }, + &cli.IntFlag{ + Name: "upload-max-chunk-size", + Value: 0, + Usage: "Max chunk size in bytes to advertise to clients through capabilities, or 0 for unlimited", + EnvVars: []string{"REVA_FRONTEND_UPLOAD_MAX_CHUNK_SIZE"}, + Destination: &cfg.Reva.UploadMaxChunkSize, + }, + &cli.StringFlag{ + Name: "upload-http-method-override", + Value: "", + Usage: "Specify an HTTP method (ex: POST) that clients should to use when uploading instead of PATCH", + EnvVars: []string{"REVA_FRONTEND_UPLOAD_HTTP_METHOD_OVERRIDE"}, + Destination: &cfg.Reva.UploadHTTPMethodOverride, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/gateway.go b/reva/pkg/flagset/gateway.go new file mode 100644 index 0000000000..a579b615b0 --- /dev/null +++ b/reva/pkg/flagset/gateway.go @@ -0,0 +1,287 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// GatewayWithConfig applies cfg to the root flagset +func GatewayWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9143", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_GATEWAY_DEBUG_ADDR"}, + Destination: &cfg.Reva.Gateway.DebugAddr, + }, + + // REVA + + &cli.StringFlag{ + Name: "transfer-secret", + Value: "replace-me-with-a-transfer-secret", + Usage: "Transfer secret for datagateway", + EnvVars: []string{"REVA_TRANSFER_SECRET"}, + Destination: &cfg.Reva.TransferSecret, + }, + &cli.IntFlag{ + Name: "transfer-expires", + Value: 24 * 60 * 60, // one day + Usage: "Transfer token ttl in seconds", + EnvVars: []string{"REVA_TRANSFER_EXPIRES"}, + Destination: &cfg.Reva.TransferExpires, + }, + + // TODO allow configuring clients + + // Services + + // Gateway + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_GATEWAY_NETWORK"}, + Destination: &cfg.Reva.Gateway.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_GATEWAY_PROTOCOL"}, + Destination: &cfg.Reva.Gateway.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9142", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_GATEWAY_ADDR"}, + Destination: &cfg.Reva.Gateway.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9142", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_GATEWAY_URL"}, + Destination: &cfg.Reva.Gateway.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("gateway", "authregistry", "storageregistry"), // TODO appregistry + Usage: "--service gateway [--service authregistry]", + EnvVars: []string{"REVA_GATEWAY_SERVICES"}, + }, + &cli.BoolFlag{ + Name: "commit-share-to-storage-grant", + Value: true, + // TODO clarify + Usage: "Commit shares to the share manager", + EnvVars: []string{"REVA_GATEWAY_COMMIT_SHARE_TO_STORAGE_GRANT"}, + Destination: &cfg.Reva.Gateway.CommitShareToStorageGrant, + }, + &cli.BoolFlag{ + Name: "commit-share-to-storage-ref", + Value: true, + // TODO clarify + Usage: "Commit shares to the storage", + EnvVars: []string{"REVA_GATEWAY_COMMIT_SHARE_TO_STORAGE_REF"}, + Destination: &cfg.Reva.Gateway.CommitShareToStorageRef, + }, + &cli.StringFlag{ + Name: "share-folder", + Value: "Shares", + Usage: "mount shares in this folder of the home storage provider", + EnvVars: []string{"REVA_GATEWAY_SHARE_FOLDER"}, + Destination: &cfg.Reva.Gateway.ShareFolder, + }, + &cli.BoolFlag{ + Name: "disable-home-creation-on-login", + Usage: "Disable creation of home folder on login", + EnvVars: []string{"REVA_GATEWAY_DISABLE_HOME_CREATION_ON_LOGIN"}, + Destination: &cfg.Reva.Gateway.DisableHomeCreationOnLogin, + }, + + // other services + + // storage registry + + &cli.StringFlag{ + Name: "storage-registry-driver", + Value: "static", + Usage: "driver of the storage registry", + EnvVars: []string{"REVA_STORAGE_REGISTRY_DRIVER"}, + Destination: &cfg.Reva.StorageRegistry.Driver, + }, + &cli.StringSliceFlag{ + Name: "storage-registry-rule", + Value: cli.NewStringSlice(), + Usage: `Replaces the generated storage registry rules with this set: --storage-registry-rule "/eos=localhost:9158" [--storage-registry-rule "1284d238-aa92-42ce-bdc4-0b0000009162=localhost:9162"]`, + EnvVars: []string{"REVA_STORAGE_REGISTRY_RULES"}, + }, + + &cli.StringFlag{ + Name: "storage-home-provider", + Value: "/home", + Usage: "mount point of the storage provider for user homes in the global namespace", + EnvVars: []string{"REVA_STORAGE_HOME_PROVIDER"}, + Destination: &cfg.Reva.StorageRegistry.HomeProvider, + }, + + &cli.StringFlag{ + Name: "frontend-url", + Value: "https://localhost:9200", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_FRONTEND_URL"}, + Destination: &cfg.Reva.Frontend.URL, + }, + &cli.StringFlag{ + Name: "datagateway-url", + Value: "https://localhost:9200/data", + Usage: "URL to use for the reva datagateway", + EnvVars: []string{"REVA_DATAGATEWAY_URL"}, + Destination: &cfg.Reva.DataGateway.URL, + }, + &cli.StringFlag{ + Name: "users-url", + Value: "localhost:9144", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_USERS_URL"}, + Destination: &cfg.Reva.Users.URL, + }, + &cli.StringFlag{ + Name: "auth-basic-url", + Value: "localhost:9146", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_AUTH_BASIC_URL"}, + Destination: &cfg.Reva.AuthBasic.URL, + }, + &cli.StringFlag{ + Name: "auth-bearer-url", + Value: "localhost:9148", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_AUTH_BEARER_URL"}, + Destination: &cfg.Reva.AuthBearer.URL, + }, + &cli.StringFlag{ + Name: "sharing-url", + Value: "localhost:9150", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_SHARING_URL"}, + Destination: &cfg.Reva.Sharing.URL, + }, + + &cli.StringFlag{ + Name: "storage-root-url", + Value: "localhost:9152", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_ROOT_URL"}, + Destination: &cfg.Reva.StorageRoot.URL, + }, + &cli.StringFlag{ + Name: "storage-root-mount-path", + Value: "/", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_ROOT_MOUNT_PATH"}, + Destination: &cfg.Reva.StorageRoot.MountPath, + }, + &cli.StringFlag{ + Name: "storage-root-mount-id", + Value: "1284d238-aa92-42ce-bdc4-0b0000009152", + Usage: "mount id", + EnvVars: []string{"REVA_STORAGE_ROOT_MOUNT_ID"}, + Destination: &cfg.Reva.StorageRoot.MountID, + }, + + &cli.StringFlag{ + Name: "storage-home-url", + Value: "localhost:9154", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_HOME_URL"}, + Destination: &cfg.Reva.StorageHome.URL, + }, + &cli.StringFlag{ + Name: "storage-home-mount-path", + Value: "/home", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_HOME_MOUNT_PATH"}, + Destination: &cfg.Reva.StorageHome.MountPath, + }, + &cli.StringFlag{ + Name: "storage-home-mount-id", + Value: "1284d238-aa92-42ce-bdc4-0b0000009154", + Usage: "mount id", + EnvVars: []string{"REVA_STORAGE_HOME_MOUNT_ID"}, + Destination: &cfg.Reva.StorageHome.MountID, + }, + + &cli.StringFlag{ + Name: "storage-eos-url", + Value: "localhost:9158", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_EOS_URL"}, + Destination: &cfg.Reva.StorageEOS.URL, + }, + &cli.StringFlag{ + Name: "storage-eos-mount-path", + Value: "/eos", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_EOS_MOUNT_PATH"}, + Destination: &cfg.Reva.StorageEOS.MountPath, + }, + &cli.StringFlag{ + Name: "storage-eos-mount-id", + Value: "1284d238-aa92-42ce-bdc4-0b0000009158", + Usage: "mount id", + EnvVars: []string{"REVA_STORAGE_EOS_MOUNT_ID"}, + Destination: &cfg.Reva.StorageEOS.MountID, + }, + + &cli.StringFlag{ + Name: "storage-oc-url", + Value: "localhost:9162", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_OC_URL"}, + Destination: &cfg.Reva.StorageOC.URL, + }, + &cli.StringFlag{ + Name: "storage-oc-mount-path", + Value: "/oc", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_OC_MOUNT_PATH"}, + Destination: &cfg.Reva.StorageOC.MountPath, + }, + &cli.StringFlag{ + Name: "storage-oc-mount-id", + Value: "1284d238-aa92-42ce-bdc4-0b0000009162", + Usage: "mount id", + EnvVars: []string{"REVA_STORAGE_OC_MOUNT_ID"}, + Destination: &cfg.Reva.StorageOC.MountID, + }, + + &cli.StringFlag{ + Name: "public-link-url", + Value: "localhost:9178", + Usage: "URL to use for the public links service", + EnvVars: []string{"REVA_STORAGE_PUBLIC_LINK_URL"}, + Destination: &cfg.Reva.StoragePublicLink.URL, + }, + &cli.StringFlag{ + Name: "storage-public-link-mount-path", + Value: "/public/", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_PUBLIC_LINK_MOUNT_PATH"}, + Destination: &cfg.Reva.StoragePublicLink.MountPath, + }, + // public-link has no mount id + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/health.go b/reva/pkg/flagset/health.go new file mode 100644 index 0000000000..145d9b3e7f --- /dev/null +++ b/reva/pkg/flagset/health.go @@ -0,0 +1,19 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// HealthWithConfig applies cfg to the health flagset +func HealthWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9109", + Usage: "Address to debug endpoint", + EnvVars: []string{"REVA_DEBUG_ADDR"}, + Destination: &cfg.Debug.Addr, + }, + } +} diff --git a/reva/pkg/flagset/ldap.go b/reva/pkg/flagset/ldap.go new file mode 100644 index 0000000000..0aa54693f9 --- /dev/null +++ b/reva/pkg/flagset/ldap.go @@ -0,0 +1,134 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// LDAPWithConfig applies LDAP cfg to the flagset +func LDAPWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: "ldap-hostname", + Value: "localhost", + Usage: "LDAP hostname", + EnvVars: []string{"REVA_LDAP_HOSTNAME"}, + Destination: &cfg.Reva.LDAP.Hostname, + }, + &cli.IntFlag{ + Name: "ldap-port", + Value: 9126, + Usage: "LDAP port", + EnvVars: []string{"REVA_LDAP_PORT"}, + Destination: &cfg.Reva.LDAP.Port, + }, + &cli.StringFlag{ + Name: "ldap-base-dn", + Value: "dc=example,dc=org", + Usage: "LDAP basedn", + EnvVars: []string{"REVA_LDAP_BASE_DN"}, + Destination: &cfg.Reva.LDAP.BaseDN, + }, + &cli.StringFlag{ + Name: "ldap-loginfilter", + Value: "(&(objectclass=posixAccount)(|(cn={{login}})(mail={{login}})))", + Usage: "LDAP login filter", + EnvVars: []string{"REVA_LDAP_LOGINFILTER"}, + Destination: &cfg.Reva.LDAP.LoginFilter, + }, + &cli.StringFlag{ + Name: "ldap-userfilter", + Value: "(&(objectclass=posixAccount)(|(ownclouduuid={{.OpaqueId}})(cn={{.OpaqueId}})))", + Usage: "LDAP filter used when getting a user. The CS3 userid properties {{.OpaqueId}} and {{.Idp}} are available.", + EnvVars: []string{"REVA_LDAP_USERFILTER"}, + Destination: &cfg.Reva.LDAP.UserFilter, + }, + &cli.StringFlag{ + Name: "ldap-attributefilter", + Value: "(&(objectclass=posixAccount)({{attr}}={{value}}))", + Usage: "LDAP filter used when searching for a user by claim/attribute. {{attr}} will be replaced with the attribute, {{value}} with the value.", + EnvVars: []string{"REVA_LDAP_ATTRIBUTEFILTER"}, + Destination: &cfg.Reva.LDAP.AttributeFilter, + }, + &cli.StringFlag{ + Name: "ldap-findfilter", + Value: "(&(objectclass=posixAccount)(|(cn={{query}}*)(displayname={{query}}*)(mail={{query}}*)))", + Usage: "LDAP filter used when searching for recipients. {{query}} will be replaced with the search query", + EnvVars: []string{"REVA_LDAP_FINDFILTER"}, + Destination: &cfg.Reva.LDAP.FindFilter, + }, + &cli.StringFlag{ + Name: "ldap-groupfilter", + // FIXME the reva implementation needs to use the memberof overlay to get the cn when it only has the uuid, + // because the ldap schema either uses the dn or the member(of) attributes to establish membership + Value: "(&(objectclass=posixGroup)(ownclouduuid={{.OpaqueId}}*))", // This filter will never work + Usage: "LDAP filter used when getting the groups of a user. The CS3 userid properties {{.OpaqueId}} and {{.Idp}} are available.", + EnvVars: []string{"REVA_LDAP_GROUPFILTER"}, + Destination: &cfg.Reva.LDAP.GroupFilter, + }, + &cli.StringFlag{ + Name: "ldap-bind-dn", + Value: "cn=reva,ou=sysusers,dc=example,dc=org", + Usage: "LDAP bind dn", + EnvVars: []string{"REVA_LDAP_BIND_DN"}, + Destination: &cfg.Reva.LDAP.BindDN, + }, + &cli.StringFlag{ + Name: "ldap-bind-password", + Value: "reva", + Usage: "LDAP bind password", + EnvVars: []string{"REVA_LDAP_BIND_PASSWORD"}, + Destination: &cfg.Reva.LDAP.BindPassword, + }, + &cli.StringFlag{ + Name: "ldap-idp", + Value: "https://localhost:9200", + Usage: "Identity provider to use for users", + EnvVars: []string{"REVA_LDAP_IDP"}, + Destination: &cfg.Reva.LDAP.IDP, + }, + // ldap dn is always the dn + &cli.StringFlag{ + Name: "ldap-schema-uid", + Value: "ownclouduuid", + Usage: "LDAP schema uid", + EnvVars: []string{"REVA_LDAP_SCHEMA_UID"}, + Destination: &cfg.Reva.LDAP.Schema.UID, + }, + &cli.StringFlag{ + Name: "ldap-schema-mail", + Value: "mail", + Usage: "LDAP schema mail", + EnvVars: []string{"REVA_LDAP_SCHEMA_MAIL"}, + Destination: &cfg.Reva.LDAP.Schema.Mail, + }, + &cli.StringFlag{ + Name: "ldap-schema-displayName", + Value: "displayname", + Usage: "LDAP schema displayName", + EnvVars: []string{"REVA_LDAP_SCHEMA_DISPLAYNAME"}, + Destination: &cfg.Reva.LDAP.Schema.DisplayName, + }, + &cli.StringFlag{ + Name: "ldap-schema-cn", + Value: "cn", + Usage: "LDAP schema cn", + EnvVars: []string{"REVA_LDAP_SCHEMA_CN"}, + Destination: &cfg.Reva.LDAP.Schema.CN, + }, + &cli.StringFlag{ + Name: "ldap-schema-uidnumber", + Value: "uidnumber", + Usage: "LDAP schema uidnumber", + EnvVars: []string{"REVA_LDAP_SCHEMA_UID_NUMBER"}, + Destination: &cfg.Reva.LDAP.Schema.UIDNumber, + }, + &cli.StringFlag{ + Name: "ldap-schema-gidnumber", + Value: "gidnumber", + Usage: "LDAP schema gidnumber", + EnvVars: []string{"REVA_LDAP_SCHEMA_GIDNUMBER"}, + Destination: &cfg.Reva.LDAP.Schema.GIDNumber, + }, + } +} diff --git a/reva/pkg/flagset/root.go b/reva/pkg/flagset/root.go new file mode 100644 index 0000000000..85d6436f98 --- /dev/null +++ b/reva/pkg/flagset/root.go @@ -0,0 +1,38 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// RootWithConfig applies cfg to the root flagset +func RootWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: "config-file", + Value: "", + Usage: "Path to config file", + EnvVars: []string{"REVA_CONFIG_FILE"}, + Destination: &cfg.File, + }, + &cli.StringFlag{ + Name: "log-level", + Value: "info", + Usage: "Set logging level", + EnvVars: []string{"REVA_LOG_LEVEL"}, + Destination: &cfg.Log.Level, + }, + &cli.BoolFlag{ + Name: "log-pretty", + Usage: "Enable pretty logging", + EnvVars: []string{"REVA_LOG_PRETTY"}, + Destination: &cfg.Log.Pretty, + }, + &cli.BoolFlag{ + Name: "log-color", + Usage: "Enable colored logging", + EnvVars: []string{"REVA_LOG_COLOR"}, + Destination: &cfg.Log.Color, + }, + } +} diff --git a/reva/pkg/flagset/secret.go b/reva/pkg/flagset/secret.go new file mode 100644 index 0000000000..deaa83aa74 --- /dev/null +++ b/reva/pkg/flagset/secret.go @@ -0,0 +1,19 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// SecretWithConfig applies cfg to the root flagset +func SecretWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + &cli.StringFlag{ + Name: "jwt-secret", + Value: "Pive-Fumkiu4", + Usage: "Shared jwt secret for reva service communication", + EnvVars: []string{"REVA_JWT_SECRET"}, + Destination: &cfg.Reva.JWTSecret, + }, + } +} diff --git a/reva/pkg/flagset/sharing.go b/reva/pkg/flagset/sharing.go new file mode 100644 index 0000000000..34252bf976 --- /dev/null +++ b/reva/pkg/flagset/sharing.go @@ -0,0 +1,87 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// SharingWithConfig applies cfg to the root flagset +func SharingWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9151", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_SHARING_DEBUG_ADDR"}, + Destination: &cfg.Reva.Sharing.DebugAddr, + }, + + // Services + + // Sharing + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_SHARING_NETWORK"}, + Destination: &cfg.Reva.Sharing.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_SHARING_PROTOCOL"}, + Destination: &cfg.Reva.Sharing.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9150", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_SHARING_ADDR"}, + Destination: &cfg.Reva.Sharing.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9150", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_SHARING_URL"}, + Destination: &cfg.Reva.Sharing.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("usershareprovider", "publicshareprovider"), // TODO osmshareprovider + Usage: "--service usershareprovider [--service publicshareprovider]", + EnvVars: []string{"REVA_SHARING_SERVICES"}, + }, + &cli.StringFlag{ + Name: "user-driver", + Value: "json", + Usage: "driver to use for the UserShareProvider", + EnvVars: []string{"REVA_SHARING_USER_DRIVER"}, + Destination: &cfg.Reva.Sharing.UserDriver, + }, + &cli.StringFlag{ + Name: "user-json-file", + Value: "/var/tmp/reva/shares.json", + Usage: "file used to persist shares for the UserShareProvider", + EnvVars: []string{"REVA_SHARING_USER_JSON_FILE"}, + Destination: &cfg.Reva.Sharing.UserJSONFile, + }, + &cli.StringFlag{ + Name: "public-driver", + Value: "json", + Usage: "driver to use for the PublicShareProvider", + EnvVars: []string{"REVA_SHARING_PUBLIC_DRIVER"}, + Destination: &cfg.Reva.Sharing.PublicDriver, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/storageeos.go b/reva/pkg/flagset/storageeos.go new file mode 100644 index 0000000000..a11a18e75a --- /dev/null +++ b/reva/pkg/flagset/storageeos.go @@ -0,0 +1,104 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// StorageEOSWithConfig applies cfg to the root flagset +func StorageEOSWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9159", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_STORAGE_EOS_DEBUG_ADDR"}, + Destination: &cfg.Reva.StorageEOS.DebugAddr, + }, + + // Storage eos + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_STORAGE_EOS_NETWORK"}, + Destination: &cfg.Reva.StorageEOS.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_STORAGE_EOS_PROTOCOL"}, + Destination: &cfg.Reva.StorageEOS.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9158", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_STORAGE_EOS_ADDR"}, + Destination: &cfg.Reva.StorageEOS.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9158", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_EOS_URL"}, + Destination: &cfg.Reva.StorageEOS.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("storageprovider"), + Usage: "--service storageprovider [--service otherservice]", + EnvVars: []string{"REVA_STORAGE_EOS_SERVICES"}, + }, + + &cli.StringFlag{ + Name: "driver", + Value: "eos", + Usage: "storage driver for eos mount: eg. local, eos, owncloud, ocis or s3", + EnvVars: []string{"REVA_STORAGE_EOS_DRIVER"}, + Destination: &cfg.Reva.StorageEOS.Driver, + }, + &cli.StringFlag{ + Name: "mount-path", + Value: "/eos", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_EOS_MOUNT_PATH"}, + Destination: &cfg.Reva.StorageEOS.MountPath, + }, + &cli.StringFlag{ + Name: "mount-id", + Value: "1284d238-aa92-42ce-bdc4-0b0000009158", + Usage: "mount id", + EnvVars: []string{"REVA_STORAGE_EOS_MOUNT_ID"}, + Destination: &cfg.Reva.StorageEOS.MountID, + }, + &cli.BoolFlag{ + Name: "expose-data-server", + Value: false, + Usage: "exposes a dedicated data server", + EnvVars: []string{"REVA_STORAGE_EOS_EXPOSE_DATA_SERVER"}, + Destination: &cfg.Reva.StorageEOS.ExposeDataServer, + }, + &cli.StringFlag{ + Name: "data-server-url", + Value: "http://localhost:9160/data", + Usage: "data server url", + EnvVars: []string{"REVA_STORAGE_EOS_DATA_SERVER_URL"}, + Destination: &cfg.Reva.StorageEOS.DataServerURL, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + flags = append(flags, DriverEOSWithConfig(cfg)...) + flags = append(flags, DriverLocalWithConfig(cfg)...) + flags = append(flags, DriverOwnCloudWithConfig(cfg)...) + flags = append(flags, DriverOCISWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/storageeosdata.go b/reva/pkg/flagset/storageeosdata.go new file mode 100644 index 0000000000..1ba2a46a43 --- /dev/null +++ b/reva/pkg/flagset/storageeosdata.go @@ -0,0 +1,111 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// StorageEOSDataWithConfig applies cfg to the root flagset +func StorageEOSDataWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9161", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_STORAGE_OC_DATA_DEBUG_ADDR"}, + Destination: &cfg.Reva.StorageEOSData.DebugAddr, + }, + + // Services + + // Storage eos data + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_STORAGE_EOS_DATA_NETWORK"}, + Destination: &cfg.Reva.StorageEOSData.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "http", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_STORAGE_EOS_DATA_PROTOCOL"}, + Destination: &cfg.Reva.StorageEOSData.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9160", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_STORAGE_EOS_DATA_ADDR"}, + Destination: &cfg.Reva.StorageEOSData.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9160", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_EOS_DATA_URL"}, + Destination: &cfg.Reva.StorageEOSData.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("dataprovider"), + Usage: "--service dataprovider [--service otherservice]", + EnvVars: []string{"REVA_STORAGE_EOS_DATA_SERVICES"}, + }, + &cli.StringFlag{ + Name: "driver", + Value: "eos", + Usage: "storage driver for eos data mount: eg. local, eos, owncloud, ocis or s3", + EnvVars: []string{"REVA_STORAGE_EOS_DATA_DRIVER"}, + Destination: &cfg.Reva.StorageEOSData.Driver, + }, + &cli.StringFlag{ + Name: "prefix", + Value: "data", + Usage: "prefix for the http endpoint, without leading slash", + EnvVars: []string{"REVA_STORAGE_EOS_DATA_PREFIX"}, + Destination: &cfg.Reva.StorageEOSData.Prefix, + }, + &cli.StringFlag{ + Name: "temp-folder", + Value: "/var/tmp/", + Usage: "temp folder", + EnvVars: []string{"REVA_STORAGE_EOS_DATA_TEMP_FOLDER"}, + Destination: &cfg.Reva.StorageEOSData.TempFolder, + }, + + // Gateway + + &cli.StringFlag{ + Name: "gateway-url", + Value: "localhost:9142", + Usage: "URL to use for the reva gateway service", + EnvVars: []string{"REVA_GATEWAY_URL"}, + Destination: &cfg.Reva.Gateway.URL, + }, + + // User provider + + &cli.StringFlag{ + Name: "users-url", + Value: "localhost:9144", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_USERS_URL"}, + Destination: &cfg.Reva.Users.URL, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + flags = append(flags, DriverEOSWithConfig(cfg)...) + flags = append(flags, DriverLocalWithConfig(cfg)...) + flags = append(flags, DriverOwnCloudWithConfig(cfg)...) + flags = append(flags, DriverOCISWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/storagehome.go b/reva/pkg/flagset/storagehome.go new file mode 100644 index 0000000000..49fd4bed08 --- /dev/null +++ b/reva/pkg/flagset/storagehome.go @@ -0,0 +1,127 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// StorageHomeWithConfig applies cfg to the root flagset +func StorageHomeWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9155", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_STORAGE_HOME_DEBUG_ADDR"}, + Destination: &cfg.Reva.StorageHome.DebugAddr, + }, + + // Services + + // Storage home + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_STORAGE_HOME_NETWORK"}, + Destination: &cfg.Reva.StorageHome.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_STORAGE_HOME_PROTOCOL"}, + Destination: &cfg.Reva.StorageHome.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9154", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_STORAGE_HOME_ADDR"}, + Destination: &cfg.Reva.StorageHome.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9154", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_HOME_URL"}, + Destination: &cfg.Reva.StorageHome.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("storageprovider"), + Usage: "--service storageprovider [--service otherservice]", + EnvVars: []string{"REVA_STORAGE_HOME_SERVICES"}, + }, + + &cli.StringFlag{ + Name: "driver", + Value: "owncloud", + Usage: "storage driver for home mount: eg. local, eos, owncloud, ocis or s3", + EnvVars: []string{"REVA_STORAGE_HOME_DRIVER"}, + Destination: &cfg.Reva.StorageHome.Driver, + }, + &cli.StringFlag{ + Name: "mount-path", + Value: "/home", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_HOME_MOUNT_PATH"}, + Destination: &cfg.Reva.StorageHome.MountPath, + }, + &cli.StringFlag{ + Name: "mount-id", + // This is the mount id of the storage provider using the same storage driver + // as /home but withoud home enabled. Set it to + // 1284d238-aa92-42ce-bdc4-0b0000009158 for /eos + // 1284d238-aa92-42ce-bdc4-0b0000009162 for /oc + Value: "1284d238-aa92-42ce-bdc4-0b0000009162", // /oc + Usage: "mount id", + EnvVars: []string{"REVA_STORAGE_HOME_MOUNT_ID"}, + Destination: &cfg.Reva.StorageHome.MountID, + }, + &cli.BoolFlag{ + Name: "expose-data-server", + Value: false, + Usage: "exposes a dedicated data server", + EnvVars: []string{"REVA_STORAGE_HOME_EXPOSE_DATA_SERVER"}, + Destination: &cfg.Reva.StorageHome.ExposeDataServer, + }, + &cli.StringFlag{ + Name: "data-server-url", + Value: "http://localhost:9156/data", + Usage: "data server url", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_SERVER_URL"}, + Destination: &cfg.Reva.StorageHome.DataServerURL, + }, + &cli.BoolFlag{ + Name: "enable-home", + Value: true, + Usage: "enable the creation of home directories", + EnvVars: []string{"REVA_STORAGE_HOME_ENABLE_HOME"}, + Destination: &cfg.Reva.Storages.Home.EnableHome, + }, + + // User provider + + &cli.StringFlag{ + Name: "users-url", + Value: "localhost:9144", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_USERS_URL"}, + Destination: &cfg.Reva.Users.URL, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + flags = append(flags, DriverEOSWithConfig(cfg)...) + flags = append(flags, DriverLocalWithConfig(cfg)...) + flags = append(flags, DriverOwnCloudWithConfig(cfg)...) + flags = append(flags, DriverOCISWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/storagehomedata.go b/reva/pkg/flagset/storagehomedata.go new file mode 100644 index 0000000000..d6672bef20 --- /dev/null +++ b/reva/pkg/flagset/storagehomedata.go @@ -0,0 +1,118 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// StorageHomeDataWithConfig applies cfg to the root flagset +func StorageHomeDataWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9157", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_DEBUG_ADDR"}, + Destination: &cfg.Reva.StorageHomeData.DebugAddr, + }, + + // Services + + // Storage home data + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_NETWORK"}, + Destination: &cfg.Reva.StorageHomeData.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "http", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_PROTOCOL"}, + Destination: &cfg.Reva.StorageHomeData.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9156", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_ADDR"}, + Destination: &cfg.Reva.StorageHomeData.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9156", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_URL"}, + Destination: &cfg.Reva.StorageHomeData.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("dataprovider"), + Usage: "--service dataprovider [--service otherservice]", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_SERVICES"}, + }, + &cli.StringFlag{ + Name: "driver", + Value: "owncloud", + Usage: "storage driver for home data mount: eg. local, eos, owncloud, ocis or s3", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_DRIVER"}, + Destination: &cfg.Reva.StorageHomeData.Driver, + }, + &cli.StringFlag{ + Name: "prefix", + Value: "data", + Usage: "prefix for the http endpoint, without leading slash", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_PREFIX"}, + Destination: &cfg.Reva.StorageHomeData.Prefix, + }, + &cli.StringFlag{ + Name: "temp-folder", + Value: "/var/tmp/", + Usage: "temp folder", + EnvVars: []string{"REVA_STORAGE_HOME_DATA_TEMP_FOLDER"}, + Destination: &cfg.Reva.StorageHomeData.TempFolder, + }, + &cli.BoolFlag{ + Name: "enable-home", + Value: true, + Usage: "enable the creation of home directories", + EnvVars: []string{"REVA_STORAGE_HOME_ENABLE_HOME"}, + Destination: &cfg.Reva.Storages.Home.EnableHome, + }, + + // Gateway + + &cli.StringFlag{ + Name: "gateway-url", + Value: "localhost:9142", + Usage: "URL to use for the reva gateway service", + EnvVars: []string{"REVA_GATEWAY_URL"}, + Destination: &cfg.Reva.Gateway.URL, + }, + + // User provider + + &cli.StringFlag{ + Name: "users-url", + Value: "localhost:9144", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_USERS_URL"}, + Destination: &cfg.Reva.Users.URL, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + flags = append(flags, DriverEOSWithConfig(cfg)...) + flags = append(flags, DriverLocalWithConfig(cfg)...) + flags = append(flags, DriverOwnCloudWithConfig(cfg)...) + flags = append(flags, DriverOCISWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/storageoc.go b/reva/pkg/flagset/storageoc.go new file mode 100644 index 0000000000..718970a223 --- /dev/null +++ b/reva/pkg/flagset/storageoc.go @@ -0,0 +1,116 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// StorageOCWithConfig applies cfg to the root flagset +func StorageOCWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9163", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_STORAGE_OC_DEBUG_ADDR"}, + Destination: &cfg.Reva.StorageOC.DebugAddr, + }, + + // Services + + // Storage oc + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_STORAGE_OC_NETWORK"}, + Destination: &cfg.Reva.StorageOC.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_STORAGE_OC_PROTOCOL"}, + Destination: &cfg.Reva.StorageOC.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9162", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_STORAGE_OC_ADDR"}, + Destination: &cfg.Reva.StorageOC.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9162", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_OC_URL"}, + Destination: &cfg.Reva.StorageOC.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("storageprovider"), + Usage: "--service storageprovider [--service otherservice]", + EnvVars: []string{"REVA_STORAGE_OC_SERVICES"}, + }, + + &cli.StringFlag{ + Name: "driver", + Value: "owncloud", + Usage: "storage driver for oc mount: eg. local, eos, owncloud, ocis or s3", + EnvVars: []string{"REVA_STORAGE_OC_DRIVER"}, + Destination: &cfg.Reva.StorageOC.Driver, + }, + &cli.StringFlag{ + Name: "mount-path", + Value: "/oc", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_OC_MOUNT_PATH"}, + Destination: &cfg.Reva.StorageOC.MountPath, + }, + &cli.StringFlag{ + Name: "mount-id", + Value: "1284d238-aa92-42ce-bdc4-0b0000009162", + Usage: "mount id", + EnvVars: []string{"REVA_STORAGE_OC_MOUNT_ID"}, + Destination: &cfg.Reva.StorageOC.MountID, + }, + &cli.BoolFlag{ + Name: "expose-data-server", + Value: false, + Usage: "exposes a dedicated data server", + EnvVars: []string{"REVA_STORAGE_OC_EXPOSE_DATA_SERVER"}, + Destination: &cfg.Reva.StorageOC.ExposeDataServer, + }, + &cli.StringFlag{ + Name: "data-server-url", + Value: "http://localhost:9164/data", + Usage: "data server url", + EnvVars: []string{"REVA_STORAGE_OC_DATA_SERVER_URL"}, + Destination: &cfg.Reva.StorageOC.DataServerURL, + }, + + // User provider + + &cli.StringFlag{ + Name: "users-url", + Value: "localhost:9144", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_USERS_URL"}, + Destination: &cfg.Reva.Users.URL, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + flags = append(flags, DriverEOSWithConfig(cfg)...) + flags = append(flags, DriverLocalWithConfig(cfg)...) + flags = append(flags, DriverOwnCloudWithConfig(cfg)...) + flags = append(flags, DriverOCISWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/storageocdata.go b/reva/pkg/flagset/storageocdata.go new file mode 100644 index 0000000000..ebf3ae02bf --- /dev/null +++ b/reva/pkg/flagset/storageocdata.go @@ -0,0 +1,111 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// StorageOCDataWithConfig applies cfg to the root flagset +func StorageOCDataWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9165", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_STORAGE_OC_DATA_DEBUG_ADDR"}, + Destination: &cfg.Reva.StorageOCData.DebugAddr, + }, + + // Services + + // Storage oc data + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_STORAGE_OC_DATA_NETWORK"}, + Destination: &cfg.Reva.StorageOCData.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "http", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_STORAGE_OC_DATA_PROTOCOL"}, + Destination: &cfg.Reva.StorageOCData.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9164", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_STORAGE_OC_DATA_ADDR"}, + Destination: &cfg.Reva.StorageOCData.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9164", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_OC_DATA_URL"}, + Destination: &cfg.Reva.StorageOCData.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("dataprovider"), + Usage: "--service dataprovider [--service otherservice]", + EnvVars: []string{"REVA_STORAGE_OC_DATA_SERVICES"}, + }, + &cli.StringFlag{ + Name: "driver", + Value: "owncloud", + Usage: "storage driver for oc data mount: eg. local, eos, owncloud, ocis or s3", + EnvVars: []string{"REVA_STORAGE_OC_DATA_DRIVER"}, + Destination: &cfg.Reva.StorageOCData.Driver, + }, + &cli.StringFlag{ + Name: "prefix", + Value: "data", + Usage: "prefix for the http endpoint, without leading slash", + EnvVars: []string{"REVA_STORAGE_OC_DATA_PREFIX"}, + Destination: &cfg.Reva.StorageOCData.Prefix, + }, + &cli.StringFlag{ + Name: "temp-folder", + Value: "/var/tmp/", + Usage: "temp folder", + EnvVars: []string{"REVA_STORAGE_OC_DATA_TEMP_FOLDER"}, + Destination: &cfg.Reva.StorageOCData.TempFolder, + }, + + // Gateway + + &cli.StringFlag{ + Name: "gateway-url", + Value: "localhost:9142", + Usage: "URL to use for the reva gateway service", + EnvVars: []string{"REVA_GATEWAY_URL"}, + Destination: &cfg.Reva.Gateway.URL, + }, + + // User provider + + &cli.StringFlag{ + Name: "users-url", + Value: "localhost:9144", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_USERS_URL"}, + Destination: &cfg.Reva.Users.URL, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + flags = append(flags, DriverEOSWithConfig(cfg)...) + flags = append(flags, DriverLocalWithConfig(cfg)...) + flags = append(flags, DriverOwnCloudWithConfig(cfg)...) + flags = append(flags, DriverOCISWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/storagepubliclink.go b/reva/pkg/flagset/storagepubliclink.go new file mode 100644 index 0000000000..ebe429d539 --- /dev/null +++ b/reva/pkg/flagset/storagepubliclink.go @@ -0,0 +1,71 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// StoragePublicLink applies cfg to the root flagset +func StoragePublicLink(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9179", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_STORAGE_PUBLIC_LINK_DEBUG_ADDR"}, + Destination: &cfg.Reva.StoragePublicLink.DebugAddr, + }, + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_STORAGE_PUBLIC_LINK_NETWORK"}, + Destination: &cfg.Reva.StoragePublicLink.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_STORAGE_PUBLIC_LINK_PROTOCOL"}, + Destination: &cfg.Reva.StoragePublicLink.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9178", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_STORAGE_PUBLIC_LINK_ADDR"}, + Destination: &cfg.Reva.StoragePublicLink.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9178", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_STORAGE_PUBLIC_LINK_URL"}, + Destination: &cfg.Reva.StoragePublicLink.URL, + }, + + &cli.StringFlag{ + Name: "mount-path", + Value: "/public/", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_PUBLIC_LINK_MOUNT_PATH"}, + Destination: &cfg.Reva.StoragePublicLink.MountPath, + }, + + &cli.StringFlag{ + Name: "gateway-url", + Value: "localhost:9142", + Usage: "URL to use for the reva gateway service", + EnvVars: []string{"REVA_GATEWAY_URL"}, + Destination: &cfg.Reva.Gateway.URL, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/storageroot.go b/reva/pkg/flagset/storageroot.go new file mode 100644 index 0000000000..55cda67bd4 --- /dev/null +++ b/reva/pkg/flagset/storageroot.go @@ -0,0 +1,105 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// StorageRootWithConfig applies cfg to the root flagset +func StorageRootWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9153", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_STORAGE_ROOT_DEBUG_ADDR"}, + Destination: &cfg.Reva.StorageRoot.DebugAddr, + }, + + // Services + + // Storage root + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_STORAGE_ROOT_NETWORK"}, + Destination: &cfg.Reva.StorageRoot.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_STORAGE_ROOT_PROTOCOL"}, + Destination: &cfg.Reva.StorageRoot.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9152", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_STORAGE_ROOT_ADDR"}, + Destination: &cfg.Reva.StorageRoot.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9152", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_STORAGE_ROOT_URL"}, + Destination: &cfg.Reva.StorageRoot.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("storageprovider"), + Usage: "--service storageprovider [--service otherservice]", + EnvVars: []string{"REVA_STORAGE_ROOT_SERVICES"}, + }, + + &cli.StringFlag{ + Name: "driver", + Value: "local", + Usage: "storage driver for root mount: eg. local, eos, owncloud, ocis or s3", + EnvVars: []string{"REVA_STORAGE_ROOT_DRIVER"}, + Destination: &cfg.Reva.StorageRoot.Driver, + }, + &cli.StringFlag{ + Name: "mount-path", + Value: "/", + Usage: "mount path", + EnvVars: []string{"REVA_STORAGE_ROOT_MOUNT_PATH"}, + Destination: &cfg.Reva.StorageRoot.MountPath, + }, + &cli.StringFlag{ + Name: "mount-id", + Value: "123e4567-e89b-12d3-a456-426655440001", + Usage: "mount id", + EnvVars: []string{"REVA_STORAGE_ROOT_MOUNT_ID"}, + Destination: &cfg.Reva.StorageRoot.MountID, + }, + &cli.BoolFlag{ + Name: "expose-data-server", + Usage: "exposes a dedicated data server", + EnvVars: []string{"REVA_STORAGE_ROOT_EXPOSE_DATA_SERVER"}, + Destination: &cfg.Reva.StorageRoot.ExposeDataServer, + }, + &cli.StringFlag{ + Name: "data-server-url", + Value: "", + Usage: "data server url", + EnvVars: []string{"REVA_STORAGE_ROOT_DATA_SERVER_URL"}, + Destination: &cfg.Reva.StorageRoot.DataServerURL, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + flags = append(flags, DriverEOSWithConfig(cfg)...) + flags = append(flags, DriverLocalWithConfig(cfg)...) + flags = append(flags, DriverOwnCloudWithConfig(cfg)...) + flags = append(flags, DriverOCISWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/flagset/tracing.go b/reva/pkg/flagset/tracing.go new file mode 100644 index 0000000000..5c39832a8c --- /dev/null +++ b/reva/pkg/flagset/tracing.go @@ -0,0 +1,47 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// TracingWithConfig applies cfg to the root flagset +func TracingWithConfig(cfg *config.Config) []cli.Flag { + return []cli.Flag{ + + &cli.BoolFlag{ + Name: "tracing-enabled", + Usage: "Enable sending traces", + EnvVars: []string{"REVA_TRACING_ENABLED"}, + Destination: &cfg.Tracing.Enabled, + }, + &cli.StringFlag{ + Name: "tracing-type", + Value: "jaeger", + Usage: "Tracing backend type", + EnvVars: []string{"REVA_TRACING_TYPE"}, + Destination: &cfg.Tracing.Type, + }, + &cli.StringFlag{ + Name: "tracing-endpoint", + Value: "", + Usage: "Endpoint for the agent", + EnvVars: []string{"REVA_TRACING_ENDPOINT"}, + Destination: &cfg.Tracing.Endpoint, + }, + &cli.StringFlag{ + Name: "tracing-collector", + Value: "", + Usage: "Endpoint for the collector", + EnvVars: []string{"REVA_TRACING_COLLECTOR"}, + Destination: &cfg.Tracing.Collector, + }, + &cli.StringFlag{ + Name: "tracing-service", + Value: "reva", + Usage: "Service name for tracing", + EnvVars: []string{"REVA_TRACING_SERVICE"}, + Destination: &cfg.Tracing.Service, + }, + } +} diff --git a/reva/pkg/flagset/users.go b/reva/pkg/flagset/users.go new file mode 100644 index 0000000000..b54df06338 --- /dev/null +++ b/reva/pkg/flagset/users.go @@ -0,0 +1,155 @@ +package flagset + +import ( + "github.com/micro/cli/v2" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// UsersWithConfig applies cfg to the root flagset +func UsersWithConfig(cfg *config.Config) []cli.Flag { + flags := []cli.Flag{ + + // debug ports are the odd ports + &cli.StringFlag{ + Name: "debug-addr", + Value: "0.0.0.0:9145", + Usage: "Address to bind debug server", + EnvVars: []string{"REVA_SHARING_DEBUG_ADDR"}, + Destination: &cfg.Reva.Users.DebugAddr, + }, + + // Services + + // Users + + &cli.StringFlag{ + Name: "network", + Value: "tcp", + Usage: "Network to use for the reva service, can be 'tcp', 'udp' or 'unix'", + EnvVars: []string{"REVA_USERS_NETWORK"}, + Destination: &cfg.Reva.Users.Network, + }, + &cli.StringFlag{ + Name: "protocol", + Value: "grpc", + Usage: "protocol for reva service, can be 'http' or 'grpc'", + EnvVars: []string{"REVA_USERS_PROTOCOL"}, + Destination: &cfg.Reva.Users.Protocol, + }, + &cli.StringFlag{ + Name: "addr", + Value: "0.0.0.0:9144", + Usage: "Address to bind reva service", + EnvVars: []string{"REVA_USERS_ADDR"}, + Destination: &cfg.Reva.Users.Addr, + }, + &cli.StringFlag{ + Name: "url", + Value: "localhost:9144", + Usage: "URL to use for the reva service", + EnvVars: []string{"REVA_USERS_URL"}, + Destination: &cfg.Reva.Users.URL, + }, + &cli.StringSliceFlag{ + Name: "service", + Value: cli.NewStringSlice("userprovider"), // TODO preferences + Usage: "--service userprovider [--service otherservice]", + EnvVars: []string{"REVA_USERS_SERVICES"}, + }, + + &cli.StringFlag{ + Name: "driver", + Value: "ldap", + Usage: "user driver: 'demo', 'json', 'ldap', or 'rest'", + EnvVars: []string{"REVA_USERS_DRIVER"}, + Destination: &cfg.Reva.Users.Driver, + }, + &cli.StringFlag{ + Name: "json-config", + Value: "", + Usage: "Path to users.json file", + EnvVars: []string{"REVA_USERS_JSON"}, + Destination: &cfg.Reva.Users.JSON, + }, + + // rest driver + + &cli.StringFlag{ + Name: "rest-client-id", + Value: "", + Usage: "User rest driver Client ID", + EnvVars: []string{"REVA_REST_CLIENT_ID"}, + Destination: &cfg.Reva.UserRest.ClientID, + }, + &cli.StringFlag{ + Name: "rest-client-secret", + Value: "", + Usage: "User rest driver Client Secret", + EnvVars: []string{"REVA_REST_CLIENT_SECRET"}, + Destination: &cfg.Reva.UserRest.ClientSecret, + }, + &cli.StringFlag{ + Name: "rest-redis-address", + Value: "localhost:6379", + Usage: "Address for redis server", + EnvVars: []string{"REVA_REST_REDIS_ADDRESS"}, + Destination: &cfg.Reva.UserRest.RedisAddress, + }, + &cli.StringFlag{ + Name: "rest-redis-username", + Value: "", + Usage: "Username for redis server", + EnvVars: []string{"REVA_REST_REDIS_USERNAME"}, + Destination: &cfg.Reva.UserRest.RedisUsername, + }, + &cli.StringFlag{ + Name: "rest-redis-password", + Value: "", + Usage: "Password for redis server", + EnvVars: []string{"REVA_REST_REDIS_PASSWORD"}, + Destination: &cfg.Reva.UserRest.RedisPassword, + }, + &cli.IntFlag{ + Name: "rest-user-groups-cache-expiration", + Value: 5, + Usage: "Time in minutes for redis cache expiration.", + EnvVars: []string{"REVA_REST_CACHE_EXPIRATION"}, + Destination: &cfg.Reva.UserRest.UserGroupsCacheExpiration, + }, + &cli.StringFlag{ + Name: "rest-id-provider", + Value: "", + Usage: "The OIDC Provider", + EnvVars: []string{"REVA_REST_ID_PROVIDER"}, + Destination: &cfg.Reva.UserRest.IDProvider, + }, + &cli.StringFlag{ + Name: "rest-api-base-url", + Value: "", + Usage: "Base API Endpoint", + EnvVars: []string{"REVA_REST_API_BASE_URL"}, + Destination: &cfg.Reva.UserRest.APIBaseURL, + }, + &cli.StringFlag{ + Name: "rest-oidc-token-endpoint", + Value: "", + Usage: "Endpoint to generate token to access the API", + EnvVars: []string{"REVA_REST_OIDC_TOKEN_ENDPOINT"}, + Destination: &cfg.Reva.UserRest.OIDCTokenEndpoint, + }, + &cli.StringFlag{ + Name: "rest-target-api", + Value: "", + Usage: "The target application", + EnvVars: []string{"REVA_REST_TARGET_API"}, + Destination: &cfg.Reva.UserRest.TargetAPI, + }, + } + + flags = append(flags, TracingWithConfig(cfg)...) + flags = append(flags, DebugWithConfig(cfg)...) + flags = append(flags, SecretWithConfig(cfg)...) + flags = append(flags, LDAPWithConfig(cfg)...) + + return flags +} diff --git a/reva/pkg/server/debug/option.go b/reva/pkg/server/debug/option.go new file mode 100644 index 0000000000..df4218c34f --- /dev/null +++ b/reva/pkg/server/debug/option.go @@ -0,0 +1,66 @@ +package debug + +import ( + "context" + + "github.com/owncloud/ocis-pkg/v2/log" + "github.com/owncloud/ocis-reva/pkg/config" +) + +// Option defines a single option function. +type Option func(o *Options) + +// Options defines the available options for this package. +type Options struct { + Name string + Addr string + Logger log.Logger + Context context.Context + Config *config.Config +} + +// newOptions initializes the available default options. +func newOptions(opts ...Option) Options { + opt := Options{} + + for _, o := range opts { + o(&opt) + } + + return opt +} + +// Name provides a function to set the name option. +func Name(val string) Option { + return func(o *Options) { + o.Name = val + } +} + +// Addr provides a function to set the addr option. +func Addr(val string) Option { + return func(o *Options) { + o.Addr = val + } +} + +// Logger provides a function to set the logger option. +func Logger(val log.Logger) Option { + return func(o *Options) { + o.Logger = val + } +} + +// Context provides a function to set the context option. +func Context(val context.Context) Option { + return func(o *Options) { + o.Context = val + } +} + +// Config provides a function to set the config option. +func Config(val *config.Config) Option { + return func(o *Options) { + o.Config = val + } +} diff --git a/reva/pkg/server/debug/server.go b/reva/pkg/server/debug/server.go new file mode 100644 index 0000000000..e9c16e65f2 --- /dev/null +++ b/reva/pkg/server/debug/server.go @@ -0,0 +1,51 @@ +package debug + +import ( + "io" + "net/http" + + "github.com/owncloud/ocis-pkg/v2/service/debug" + "github.com/owncloud/ocis-reva/pkg/config" + "github.com/owncloud/ocis-reva/pkg/version" +) + +// Server initializes the debug service and server. +func Server(opts ...Option) (*http.Server, error) { + options := newOptions(opts...) + + return debug.NewService( + debug.Logger(options.Logger), + debug.Name(options.Name), + debug.Version(version.String), + debug.Address(options.Addr), + debug.Token(options.Config.Debug.Token), + debug.Pprof(options.Config.Debug.Pprof), + debug.Zpages(options.Config.Debug.Zpages), + debug.Health(health(options.Config)), + debug.Ready(ready(options.Config)), + ), nil +} + +// health implements the health check. +func health(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO(tboerger): check if services are up and running + + io.WriteString(w, http.StatusText(http.StatusOK)) + } +} + +// ready implements the ready check. +func ready(cfg *config.Config) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + // TODO(tboerger): check if services are up and running + + io.WriteString(w, http.StatusText(http.StatusOK)) + } +} diff --git a/reva/pkg/service/external/external.go b/reva/pkg/service/external/external.go new file mode 100644 index 0000000000..bcd7b5cab7 --- /dev/null +++ b/reva/pkg/service/external/external.go @@ -0,0 +1,66 @@ +package external + +import ( + "context" + "time" + + "github.com/micro/go-micro/broker" + "github.com/micro/go-micro/v2/registry" + "github.com/owncloud/ocis-pkg/v2/log" +) + +// RegisterGRPCEndpoint publishes an arbitrary endpoint to the service-registry. This allows to query nodes of +// non-micro GRPC-services like reva. No health-checks are done, thus the caller is responsible for canceling. +// +func RegisterGRPCEndpoint(ctx context.Context, serviceID string, uuid string, addr string, logger log.Logger) error { + node := ®istry.Node{ + Id: serviceID + "-" + uuid, + Address: addr, + Metadata: make(map[string]string), + } + node.Metadata["broker"] = broker.String() + node.Metadata["registry"] = registry.String() + node.Metadata["server"] = "grpc" + node.Metadata["transport"] = "grpc" + node.Metadata["protocol"] = "grpc" + + service := ®istry.Service{ + Name: serviceID, + Version: "", + Nodes: []*registry.Node{node}, + Endpoints: make([]*registry.Endpoint, 0), + } + + rOpts := []registry.RegisterOption{registry.RegisterTTL(time.Minute)} + + logger.Info().Msgf("Registering external service %v@%v", node.Id, node.Address) + + if err := registry.Register(service, rOpts...); err != nil { + logger.Fatal().Err(err).Msgf("Registration error for external service %v", serviceID) + } + + t := time.NewTicker(time.Second * 30) + + go func() { + for { + select { + case <-t.C: + logger.Debug().Interface("service", service).Msg("Refreshing external service-registration") + err := registry.Register(service, rOpts...) + if err != nil { + logger.Error().Err(err).Msgf("Registration error for external service %v", serviceID) + } + case <-ctx.Done(): + logger.Debug().Interface("service", service).Msg("Unregistering") + t.Stop() + err := registry.Deregister(service) + if err != nil { + logger.Err(err).Msgf("Error unregistering external service %v", serviceID) + } + + } + } + }() + + return nil +} diff --git a/reva/pkg/service/external/external_test.go b/reva/pkg/service/external/external_test.go new file mode 100644 index 0000000000..7c212e1ef4 --- /dev/null +++ b/reva/pkg/service/external/external_test.go @@ -0,0 +1,56 @@ +package external + +import ( + "context" + "testing" + + "github.com/micro/go-micro/v2/registry" + "github.com/owncloud/ocis-pkg/v2/log" +) + +func TestRegisterGRPCEndpoint(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + err := RegisterGRPCEndpoint(ctx, "test", "1234", "192.168.0.1:777", log.Logger{}) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + s, err := registry.GetService("test") + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + if len(s) != 1 { + t.Errorf("Expected exactly one service to be returned got %v", len(s)) + } + + if len(s[0].Nodes) != 1 { + t.Errorf("Expected exactly one node to be returned got %v", len(s[0].Nodes)) + } + + testSvc := s[0] + if testSvc.Name != "test" { + t.Errorf("Expected service name to be 'test' got %v", s[0].Name) + } + + testNode := testSvc.Nodes[0] + + if testNode.Address != "192.168.0.1:777" { + t.Errorf("Expected node address to be '192.168.0.1:777' got %v", testNode.Address) + } + + if testNode.Id != "test-1234" { + t.Errorf("Expected node id to be 'test-1234' got %v", testNode.Id) + } + + cancel() + + s, err = registry.GetService("test") + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + if len(s) != 0 { + t.Errorf("Deregister on cancelation failed. Result-length should be zero, got %v", len(s)) + } +} diff --git a/reva/pkg/version/version.go b/reva/pkg/version/version.go new file mode 100644 index 0000000000..81e81815f4 --- /dev/null +++ b/reva/pkg/version/version.go @@ -0,0 +1,19 @@ +package version + +import ( + "time" +) + +var ( + // String gets defined by the build system. + String = "0.0.0" + + // Date indicates the build date. + Date = "00000000" +) + +// Compiled returns the compile time of this service. +func Compiled() time.Time { + t, _ := time.Parse("20060102", Date) + return t +} diff --git a/reva/reflex.conf b/reva/reflex.conf new file mode 100644 index 0000000000..1035f881c5 --- /dev/null +++ b/reva/reflex.conf @@ -0,0 +1,5 @@ +# backend +-r '^(cmd|pkg)/.*\.go$' -R '^node_modules/' -s -- sh -c 'make bin/ocis-reva-debug && bin/ocis-reva-debug --log-level debug server --debug-pprof --debug-zpages --asset-path assets/' + +# frontend +-r '^ui/.*\.(vue|js)$' -R '^node_modules/' -- sh -c 'yarn build' diff --git a/reva/templates/CONFIGURATION.tmpl b/reva/templates/CONFIGURATION.tmpl new file mode 100644 index 0000000000..060c8024fe --- /dev/null +++ b/reva/templates/CONFIGURATION.tmpl @@ -0,0 +1,78 @@ +--- +title: "Configuration" +date: "{{ date "2006-01-02T15:04:05-0700" now }}" +weight: 20 +geekdocRepo: https://github.com/owncloud/ocis-reva +geekdocEditPath: edit/master/docs +geekdocFilePath: configuration.md +--- +{{- define "options"}} +{{ $fnName := (last . ).Flags -}} +{{ range $opt := first . }}{{ with list $fnName $opt -}} +{{ $o := last . -}} +{{ if eq $o.FnName $fnName -}} +--{{ $o.Name }} | ${{ index $o.Env 0 }} +: {{ $o.Usage }}. {{- if $o.Default }} Default: `{{ $o.Default }}`.{{ end }} + +{{ end -}} +{{ end -}} +{{ end -}} +{{ end }} + +{{`{{< toc >}}`}} + +## Configuration + +oCIS Single Binary is not responsible for configuring extensions. Instead, each extension could either be configured by environment variables, cli flags or config files. + +Each extension has its dedicated documentation page (e.g. https://owncloud.github.io/extensions/ocis_proxy/configuration) which lists all possible configurations. Config files and environment variables are picked up if you use the `./bin/ocis server` command within the oCIS single binary. Command line flags must be set explicitly on the extensions subcommands. + +### Configuration using config files + +Out of the box extensions will attempt to read configuration details from: + +```console +/etc/ocis +$HOME/.ocis +./config +``` + +For this configuration to be picked up, have a look at your extension `root` command and look for which default config name it has assigned. *i.e: ocis-proxy reads `proxy.json | yaml | toml ...`*. + +So far we support the file formats `JSON` and `YAML`, if you want to get a full example configuration just take a look at [our repository](https://github.com/owncloud/ocis/tree/master/config), there you can always see the latest configuration format. These example configurations include all available options and the default values. The configuration file will be automatically loaded if it's placed at `/etc/ocis/ocis.yml`, `${HOME}/.ocis/ocis.yml` or `$(pwd)/config/ocis.yml`. + +### Envrionment variables + +If you prefer to configure the service with environment variables you can see the available variables below. + +### Commandline flags + +If you prefer to configure the service with commandline flags you can see the available variables below. Command line flags are only working when calling the subcommand directly. + +{{ $options := .Options -}} +{{ range $com := .Commands }}{{ with (list $options $com) -}} +{{ $c := last . -}} +{{ if eq $c.Name "ocis-reva" -}} +## Root Command + +{{ $c.Usage }} + +Usage: `ocis-reva [global options] command [command options] [arguments...]` +{{ template "options" . -}} +## Sub Commands + +{{ end -}} +{{ end -}} +{{ end -}} +{{- range $com := .Commands }}{{ with (list $options $com) -}} +{{- $c := last . }} +{{- if ne $c.Name "ocis-reva" -}} +### ocis-reva {{ $c.Name }} + +{{ $c.Usage }} + +Usage: `ocis-reva {{ $c.Name }} [command options] [arguments...]` +{{ template "options" . }} +{{- end -}} +{{- end -}} +{{- end -}} \ No newline at end of file diff --git a/reva/tests/acceptance/config/behat.yml b/reva/tests/acceptance/config/behat.yml new file mode 100644 index 0000000000..1e3eb22291 --- /dev/null +++ b/reva/tests/acceptance/config/behat.yml @@ -0,0 +1,37 @@ +default: + autoload: + '': '%paths.base%/../features/bootstrap' + + suites: + apiOcisSpecific: + paths: + - '%paths.base%/../features/apiOcisSpecific' + context: &common_ldap_suite_context + parameters: + ldapAdminPassword: admin + ldapUsersOU: TestUsers + ldapGroupsOU: TestGroups + ldapInitialUserFilePath: /../../config/ldap-users.ldif + contexts: + - RevaContext: + - OccContext: + - FeatureContext: &common_feature_context_params + baseUrl: http://localhost:8080 + adminUsername: admin + adminPassword: admin + regularUserPassword: 123456 + ocPath: apps/testing/api/v1/occ + - CapabilitiesContext: + - ChecksumContext: + - FavoritesContext: + - FilesVersionsContext: + - PublicWebDavContext: + - TrashbinContext: + - WebDavPropertiesContext: + + extensions: + jarnaiz\JUnitFormatter\JUnitFormatterExtension: + filename: report.xml + outputDir: '%paths.base%/../output/' + + Cjm\Behat\StepThroughExtension: ~ diff --git a/reva/tests/acceptance/expected-failures-on-EOS-storage.txt b/reva/tests/acceptance/expected-failures-on-EOS-storage.txt new file mode 100644 index 0000000000..20eac85c40 --- /dev/null +++ b/reva/tests/acceptance/expected-failures-on-EOS-storage.txt @@ -0,0 +1,918 @@ +# this file contains the scenarios from ownCloud10 core API tests that are currently expected to fail +# when run with EOS storage +# +# ToDo: enable testing with EOS in CI and adjust this list to match what actually fails +# +# test scenarios that fail with OC storage (that were tagged skipOnOcis-OC-Storage in core) +# +apiShareManagementBasic/createShare.feature:336 +apiShareManagementBasic/createShare.feature:357 +apiShareManagementBasic/createShare.feature:478 +apiShareManagementBasic/createShare.feature:493 +apiShareManagementBasic/createShare.feature:508 +apiShareOperations/gettingShares.feature:155 +apiShareOperations/gettingShares.feature:156 +apiSharePublicLink2/multilinkSharing.feature:181 +apiWebdavProperties1/setFileProperties.feature:32 +apiWebdavProperties1/setFileProperties.feature:33 +# +# https://github.com/owncloud/ocis-reva/issues/196 Checksum feature +apiMain/checksums.feature:24 +apiMain/checksums.feature:25 +apiMain/checksums.feature:35 +apiMain/checksums.feature:36 +apiMain/checksums.feature:46 +apiMain/checksums.feature:47 +apiMain/checksums.feature:50 +apiMain/checksums.feature:58 +apiMain/checksums.feature:67 +apiMain/checksums.feature:99 +apiMain/checksums.feature:100 +apiMain/checksums.feature:103 +apiMain/checksums.feature:110 +apiMain/checksums.feature:119 +apiMain/checksums.feature:129 +apiMain/checksums.feature:138 +apiMain/checksums.feature:147 +apiMain/checksums.feature:158 +apiMain/checksums.feature:174 +apiMain/checksums.feature:192 +apiMain/checksums.feature:217 +apiMain/checksums.feature:218 +apiMain/checksums.feature:239 +apiMain/checksums.feature:240 +apiMain/checksums.feature:258 +apiMain/checksums.feature:279 +apiMain/checksums.feature:280 +apiMain/checksums.feature:295 +apiMain/checksums.feature:296 +apiMain/checksums.feature:308 +apiMain/checksums.feature:309 +apiMain/checksums.feature:312 +apiMain/checksums.feature:324 +# +# https://github.com/owncloud/ocis-reva/issues/100 no robots.txt available +apiMain/main.feature:5 +# +# https://github.com/owncloud/ocis-reva/issues/101 quota query +apiMain/quota.feature:9 +apiMain/quota.feature:16 +apiMain/quota.feature:23 +apiMain/quota.feature:30 +apiMain/quota.feature:41 +apiMain/quota.feature:54 +apiMain/quota.feature:68 +apiMain/quota.feature:82 +apiMain/quota.feature:99 +apiMain/quota.feature:112 +# +# https://github.com/owncloud/ocis-reva/issues/65 There is no such thing like a "super-user" +# https://github.com/owncloud/ocis-reva/issues/97 no command equivalent to occ +apiMain/status.feature:5 +# +# https://github.com/owncloud/ocis-reva/issues/29 ocs config endpoint only accessible by authorized users +# https://github.com/owncloud/ocis-reva/issues/30 HTTP 401 Unauthorized responses don't contain a body +apiAuthOcs/ocsDELETEAuth.feature:9 +apiAuthOcs/ocsGETAuth.feature:10 +apiAuthOcs/ocsGETAuth.feature:33 +apiAuthOcs/ocsGETAuth.feature:53 +apiAuthOcs/ocsGETAuth.feature:88 +apiAuthOcs/ocsGETAuth.feature:121 +apiAuthOcs/ocsGETAuth.feature:139 +apiAuthOcs/ocsPOSTAuth.feature:10 +apiAuthOcs/ocsPUTAuth.feature:10 +# +# https://github.com/owncloud/ocis-reva/issues/13 server returns 500 when trying to access a not existing file +apiAuthWebDav/webDavDELETEAuth.feature:36 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavLOCKAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavMKCOLAuth.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiAuthWebDav/webDavMOVEAuth.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/179 send POST requests to another user's webDav endpoints as normal user +apiAuthWebDav/webDavPOSTAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavPROPFINDAuth.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavPROPPATCHAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavPUTAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/175 Default capabilities for normal user not same as in oC-core +# https://github.com/owncloud/ocis-reva/issues/176 Difference in response content of status.php and default capabilities +apiCapabilities/capabilitiesWithNormalUser.feature:11 +# +# https://github.com/owncloud/ocis-reva/issues/39 REPORT request not implemented +apiFavorites/favorites.feature:228 +apiFavorites/favorites.feature:229 +# +# https://github.com/owncloud/ocis-reva/issues/34 groups endpoint does not exist +apiSharees/sharees.feature:32 +apiSharees/sharees.feature:33 +apiSharees/sharees.feature:53 +apiSharees/sharees.feature:54 +apiSharees/sharees.feature:74 +apiSharees/sharees.feature:75 +apiSharees/sharees.feature:98 +apiSharees/sharees.feature:99 +apiSharees/sharees.feature:118 +apiSharees/sharees.feature:119 +apiSharees/sharees.feature:137 +apiSharees/sharees.feature:138 +apiSharees/sharees.feature:157 +apiSharees/sharees.feature:158 +apiSharees/sharees.feature:177 +apiSharees/sharees.feature:178 +apiSharees/sharees.feature:198 +apiSharees/sharees.feature:199 +apiSharees/sharees.feature:217 +apiSharees/sharees.feature:218 +apiSharees/sharees.feature:237 +apiSharees/sharees.feature:238 +apiSharees/sharees.feature:257 +apiSharees/sharees.feature:258 +apiSharees/sharees.feature:277 +apiSharees/sharees.feature:278 +apiSharees/sharees.feature:297 +apiSharees/sharees.feature:298 +apiSharees/sharees.feature:317 +apiSharees/sharees.feature:318 +apiSharees/sharees.feature:336 +apiSharees/sharees.feature:337 +apiSharees/sharees.feature:355 +apiSharees/sharees.feature:356 +apiSharees/sharees.feature:374 +apiSharees/sharees.feature:375 +apiSharees/sharees.feature:393 +apiSharees/sharees.feature:394 +apiSharees/sharees.feature:412 +apiSharees/sharees.feature:413 +apiSharees/sharees.feature:430 +apiSharees/sharees.feature:431 +apiSharees/sharees.feature:450 +apiSharees/sharees.feature:451 +apiSharees/sharees.feature:475 +apiSharees/sharees.feature:476 +apiSharees/sharees.feature:495 +apiSharees/sharees.feature:496 +apiSharees/sharees.feature:515 +apiSharees/sharees.feature:516 +apiSharees/sharees.feature:537 +apiSharees/sharees.feature:538 +# +# https://github.com/owncloud/ocis-reva/issues/34 groups endpoint does not exist +apiShareManagementBasic/createShare.feature:169 +apiShareManagementBasic/createShare.feature:170 +apiShareManagementBasic/createShare.feature:194 +apiShareManagementBasic/createShare.feature:195 +apiShareManagementBasic/createShare.feature:417 +apiShareManagementBasic/createShare.feature:418 +# +# https://github.com/owncloud/ocis-reva/issues/243 Sharing seems to work but does not work +# https://github.com/owncloud/ocis-reva/issues/372 Listing shares via ocs API does not show path for parent folders +apiShareManagementBasic/createShare.feature:269 +apiShareManagementBasic/createShare.feature:270 +# +# https://github.com/owncloud/ocis-reva/issues/356 Fields missing in delete share OCS response +apiShareManagementBasic/deleteShare.feature:36 +apiShareManagementBasic/deleteShare.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/260 Sharee retrieves the information about a share -but gets response containing all the shares +apiShareOperations/accessToShare.feature:48 +apiShareOperations/accessToShare.feature:49 +# +# https://github.com/owncloud/ocis-reva/issues/34 groups endpoint does not exist +# https://github.com/owncloud/ocis-reva/issues/194 Group shares support +apiShareOperations/accessToShare.feature:63 +apiShareOperations/accessToShare.feature:64 +# +# https://github.com/owncloud/ocis-reva/issues/262 Shares are not deleted when user is deleted +apiShareOperations/gettingShares.feature:21 +apiShareOperations/gettingShares.feature:22 +# +# https://github.com/owncloud/ocis-reva/issues/65 There is no such thing like a "super-user" +apiShareOperations/gettingShares.feature:34 +apiShareOperations/gettingShares.feature:35 +# +# https://github.com/owncloud/ocis-reva/issues/357 Delete shares from user when user is deleted +# https://github.com/owncloud/ocis-reva/issues/301 no displayname_owner shown when creating a share +# https://github.com/owncloud/ocis-reva/issues/302 when sharing a file mime-type field is set to application/octet-stream +apiShareOperations/gettingShares.feature:124 +apiShareOperations/gettingShares.feature:125 +# +# https://github.com/owncloud/ocis-reva/issues/374 OCS error message for attempting to access share via share id as an unauthorized user is not informative +apiShareOperations/gettingShares.feature:168 +apiShareOperations/gettingShares.feature:169 +# +# https://github.com/owncloud/ocis-reva/issues/194 Group shares support +apiShareOperations/gettingShares.feature:172 +# +# https://github.com/owncloud/ocis-reva/issues/372 Listing shares via ocs API does not show path for parent folders +apiShareOperations/gettingShares.feature:204 +apiShareOperations/gettingShares.feature:205 +# +# https://github.com/owncloud/ocis-reva/issues/47 cannot get ocs:share-permissions via WebDAV +apiShareOperations/getWebDAVSharePermissions.feature:21 +apiShareOperations/getWebDAVSharePermissions.feature:22 +apiShareOperations/getWebDAVSharePermissions.feature:134 +apiShareOperations/getWebDAVSharePermissions.feature:135 +# +# https://github.com/owncloud/ocis-reva/issues/282 Split old public API webdav tests from new public webdav tests +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/accessToPublicLinkShare.feature:10 +apiSharePublicLink1/accessToPublicLinkShare.feature:20 +apiSharePublicLink1/accessToPublicLinkShare.feature:30 +apiSharePublicLink1/accessToPublicLinkShare.feature:43 +apiSharePublicLink1/changingPublicLinkShare.feature:22 +apiSharePublicLink1/changingPublicLinkShare.feature:23 +apiSharePublicLink1/changingPublicLinkShare.feature:37 +apiSharePublicLink1/changingPublicLinkShare.feature:41 +apiSharePublicLink1/changingPublicLinkShare.feature:52 +apiSharePublicLink1/changingPublicLinkShare.feature:63 +apiSharePublicLink1/changingPublicLinkShare.feature:85 +apiSharePublicLink1/changingPublicLinkShare.feature:96 +apiSharePublicLink1/changingPublicLinkShare.feature:107 +apiSharePublicLink1/changingPublicLinkShare.feature:151 +apiSharePublicLink1/changingPublicLinkShare.feature:197 +apiSharePublicLink1/changingPublicLinkShare.feature:244 +apiSharePublicLink1/changingPublicLinkShare.feature:267 +apiSharePublicLink1/changingPublicLinkShare.feature:278 +apiSharePublicLink1/changingPublicLinkShare.feature:289 +apiSharePublicLink1/changingPublicLinkShare.feature:300 +apiSharePublicLink1/createPublicLinkShare.feature:34 +apiSharePublicLink1/createPublicLinkShare.feature:35 +# +# https://github.com/owncloud/ocis-reva/issues/12 Range Header is not obeyed when downloading a file +apiSharePublicLink1/createPublicLinkShare.feature:63 +apiSharePublicLink1/createPublicLinkShare.feature:64 +# +apiSharePublicLink1/createPublicLinkShare.feature:95 +apiSharePublicLink1/createPublicLinkShare.feature:96 +# +# https://github.com/owncloud/ocis-reva/issues/199 Ability to return error messages in Webdav response bodies +apiSharePublicLink1/createPublicLinkShare.feature:127 +apiSharePublicLink1/createPublicLinkShare.feature:128 +# +apiSharePublicLink1/createPublicLinkShare.feature:155 +apiSharePublicLink1/createPublicLinkShare.feature:156 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/createPublicLinkShare.feature:183 +apiSharePublicLink1/createPublicLinkShare.feature:184 +# +apiSharePublicLink1/createPublicLinkShare.feature:214 +apiSharePublicLink1/createPublicLinkShare.feature:215 +# +# https://github.com/owncloud/ocis-reva/issues/12 Range Header is not obeyed when downloading a file +apiSharePublicLink1/createPublicLinkShare.feature:245 +apiSharePublicLink1/createPublicLinkShare.feature:246 +# +apiSharePublicLink1/createPublicLinkShare.feature:276 +apiSharePublicLink1/createPublicLinkShare.feature:277 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/createPublicLinkShare.feature:307 +apiSharePublicLink1/createPublicLinkShare.feature:308 +# +apiSharePublicLink1/createPublicLinkShare.feature:370 +apiSharePublicLink1/createPublicLinkShare.feature:371 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:389 +apiSharePublicLink1/createPublicLinkShare.feature:390 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:411 +apiSharePublicLink1/createPublicLinkShare.feature:413 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:435 +apiSharePublicLink1/createPublicLinkShare.feature:437 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:461 +apiSharePublicLink1/createPublicLinkShare.feature:463 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:487 +apiSharePublicLink1/createPublicLinkShare.feature:489 +apiSharePublicLink1/createPublicLinkShare.feature:491 +apiSharePublicLink1/createPublicLinkShare.feature:493 +apiSharePublicLink1/createPublicLinkShare.feature:495 +apiSharePublicLink1/createPublicLinkShare.feature:497 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:518 +apiSharePublicLink1/createPublicLinkShare.feature:519 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:534 +apiSharePublicLink1/createPublicLinkShare.feature:535 +# +apiSharePublicLink1/createPublicLinkShare.feature:553 +apiSharePublicLink1/createPublicLinkShare.feature:554 +# +apiSharePublicLink1/createPublicLinkShare.feature:590 +apiSharePublicLink1/createPublicLinkShare.feature:591 +# +# https://github.com/owncloud/ocis-reva/issues/283 Prevent creating public share for the home root folder +apiSharePublicLink1/createPublicLinkShare.feature:620 +apiSharePublicLink1/createPublicLinkShare.feature:621 +# +apiSharePublicLink1/createPublicLinkShare.feature:634 +apiSharePublicLink1/createPublicLinkShare.feature:635 +# +apiSharePublicLink1/createPublicLinkShare.feature:663 +apiSharePublicLink1/createPublicLinkShare.feature:664 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:714 +apiSharePublicLink1/createPublicLinkShare.feature:715 +# +# https://github.com/owncloud/ocis-reva/issues/199 Ability to return error messages in Webdav response bodies +apiSharePublicLink1/createPublicLinkShare.feature:718 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/createPublicLinkShare.feature:727 +# +# https://github.com/owncloud/core/issues/37605 Public cannot upload file with mtime set on a public link share with new version of WebDAV API +apiSharePublicLink1/createPublicLinkShare.feature:779 +# +# https://github.com/owncloud/core/issues/37605 Public cannot upload file with mtime set on a public link share with new version of WebDAV API +apiSharePublicLink1/createPublicLinkShare.feature:793 +# +# https://github.com/owncloud/ocis-reva/issues/311 Deleting a public link after renaming a file +apiSharePublicLink1/deletePublicLinkShare.feature:37 +apiSharePublicLink1/deletePublicLinkShare.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/373 copying a folder within a public link folder to folder with same name as an already existing file overwrites the parent file +apiSharePublicLink2/copyFromPublicLink.feature:60 +# +# https://github.com/owncloud/ocis-reva/issues/368 copying a file from within a public link folder to "/" overwrites the parent folder +apiSharePublicLink2/copyFromPublicLink.feature:167 +apiSharePublicLink2/copyFromPublicLink.feature:168 +# +# https://github.com/owncloud/ocis-reva/issues/368 copying a file from within a public link folder to "/" overwrites the parent folder +apiSharePublicLink2/copyFromPublicLink.feature:183 +apiSharePublicLink2/copyFromPublicLink.feature:184 +# +apiSharePublicLink2/updatePublicLinkShare.feature:94 +apiSharePublicLink2/updatePublicLinkShare.feature:95 +# +apiSharePublicLink2/updatePublicLinkShare.feature:285 +apiSharePublicLink2/updatePublicLinkShare.feature:286 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:304 +apiSharePublicLink2/updatePublicLinkShare.feature:305 +# +apiSharePublicLink2/updatePublicLinkShare.feature:323 +apiSharePublicLink2/updatePublicLinkShare.feature:324 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:342 +apiSharePublicLink2/updatePublicLinkShare.feature:343 +# +apiSharePublicLink2/updatePublicLinkShare.feature:361 +apiSharePublicLink2/updatePublicLinkShare.feature:362 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:380 +apiSharePublicLink2/updatePublicLinkShare.feature:381 +# +apiSharePublicLink2/updatePublicLinkShare.feature:399 +apiSharePublicLink2/updatePublicLinkShare.feature:400 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:418 +apiSharePublicLink2/updatePublicLinkShare.feature:419 +# +apiSharePublicLink2/updatePublicLinkShare.feature:440 +apiSharePublicLink2/updatePublicLinkShare.feature:441 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink2/updatePublicLinkShare.feature:462 +apiSharePublicLink2/updatePublicLinkShare.feature:463 +# +apiSharePublicLink2/updatePublicLinkShare.feature:487 +apiSharePublicLink2/updatePublicLinkShare.feature:488 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:9 +# +# https://github.com/owncloud/ocis-reva/issues/286 Upload-only shares must not overwrite but create a separate file +apiSharePublicLink2/uploadToPublicLinkShare.feature:23 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:48 +apiSharePublicLink2/uploadToPublicLinkShare.feature:49 +# +# https://github.com/owncloud/ocis-reva/issues/290 Accessing non-existing public link should return 404, not 500 +apiSharePublicLink2/uploadToPublicLinkShare.feature:62 +apiSharePublicLink2/uploadToPublicLinkShare.feature:63 +# +# https://github.com/owncloud/ocis-reva/issues/290 Accessing non-existing public link should return 404, not 500 +apiSharePublicLink2/uploadToPublicLinkShare.feature:66 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink2/uploadToPublicLinkShare.feature:74 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:83 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:103 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:121 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:139 +# +# https://github.com/owncloud/ocis-reva/issues/195 Set quota over settings +apiSharePublicLink2/uploadToPublicLinkShare.feature:148 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:158 +# +# https://github.com/owncloud/ocis-reva/issues/195 Set quota over settings +apiSharePublicLink2/uploadToPublicLinkShare.feature:167 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:177 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink2/uploadToPublicLinkShare.feature:186 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:196 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink2/uploadToPublicLinkShare.feature:206 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:217 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink2/uploadToPublicLinkShare.feature:227 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:238 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:255 +# +# https://github.com/owncloud/ocis-reva/issues/286 Upload-only shares must not overwrite but create a separate file +apiSharePublicLink2/uploadToPublicLinkShare.feature:273 +# +# https://github.com/owncloud/ocis-reva/issues/17 uploading with old-chunking does not work +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiVersions/fileVersions.feature:15 +apiVersions/fileVersions.feature:23 +apiVersions/fileVersions.feature:36 +apiVersions/fileVersions.feature:45 +apiVersions/fileVersions.feature:88 +apiVersions/fileVersions.feature:89 +apiVersions/fileVersions.feature:93 +apiVersions/fileVersions.feature:104 +apiVersions/fileVersions.feature:288 +apiVersions/fileVersions.feature:362 +apiVersions/fileVersions.feature:373 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFileAsync.feature:26 +apiWebdavMove1/moveFileAsync.feature:27 +apiWebdavMove1/moveFileAsync.feature:28 +apiWebdavMove1/moveFileAsync.feature:29 +apiWebdavMove1/moveFileAsync.feature:30 +apiWebdavMove1/moveFileAsync.feature:31 +apiWebdavMove1/moveFileAsync.feature:33 +apiWebdavMove1/moveFileAsync.feature:46 +apiWebdavMove1/moveFileAsync.feature:59 +apiWebdavMove1/moveFileAsync.feature:73 +apiWebdavMove1/moveFileAsync.feature:88 +apiWebdavMove1/moveFileAsync.feature:107 +apiWebdavMove1/moveFileAsync.feature:125 +apiWebdavMove1/moveFileAsync.feature:135 +apiWebdavMove1/moveFileAsync.feature:141 +apiWebdavMove1/moveFileAsync.feature:156 +apiWebdavMove1/moveFileAsync.feature:173 +apiWebdavMove1/moveFileAsync.feature:174 +apiWebdavMove1/moveFileAsync.feature:184 +apiWebdavMove1/moveFileAsync.feature:185 +apiWebdavMove1/moveFileAsync.feature:204 +apiWebdavMove1/moveFileAsync.feature:205 +apiWebdavMove1/moveFileAsync.feature:224 +apiWebdavMove1/moveFileAsync.feature:225 +apiWebdavMove1/moveFileAsync.feature:234 +apiWebdavMove1/moveFileAsync.feature:235 +apiWebdavMove1/moveFileAsync.feature:240 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:12 +apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:18 +apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:26 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:12 +apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:19 +apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:27 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFolder.feature:21 +apiWebdavMove1/moveFolder.feature:22 +apiWebdavMove1/moveFolder.feature:34 +apiWebdavMove1/moveFolder.feature:35 +apiWebdavMove1/moveFolder.feature:47 +apiWebdavMove1/moveFolder.feature:48 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFolderToBlacklistedName.feature:21 +apiWebdavMove1/moveFolderToBlacklistedName.feature:22 +apiWebdavMove1/moveFolderToBlacklistedName.feature:35 +apiWebdavMove1/moveFolderToBlacklistedName.feature:36 +apiWebdavMove1/moveFolderToBlacklistedName.feature:70 +apiWebdavMove1/moveFolderToBlacklistedName.feature:71 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFolderToExcludedDirectory.feature:21 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:22 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:34 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:35 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:70 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:71 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove2/moveFile.feature:89 +apiWebdavMove2/moveFile.feature:90 +apiWebdavMove2/moveFile.feature:91 +apiWebdavMove2/moveFile.feature:92 +apiWebdavMove2/moveFile.feature:112 +apiWebdavMove2/moveFile.feature:113 +apiWebdavMove2/moveFile.feature:136 +apiWebdavMove2/moveFile.feature:137 +apiWebdavMove2/moveFile.feature:138 +apiWebdavMove2/moveFile.feature:139 +apiWebdavMove2/moveFile.feature:160 +apiWebdavMove2/moveFile.feature:161 +apiWebdavMove2/moveFile.feature:181 +apiWebdavMove2/moveFile.feature:182 +apiWebdavMove2/moveFile.feature:200 +apiWebdavMove2/moveFile.feature:201 +apiWebdavMove2/moveFile.feature:219 +apiWebdavMove2/moveFile.feature:220 +apiWebdavMove2/moveFile.feature:255 +apiWebdavMove2/moveFile.feature:256 +apiWebdavMove2/moveFile.feature:272 +apiWebdavMove2/moveFile.feature:273 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove2/moveFileToBlacklistedName.feature:18 +apiWebdavMove2/moveFileToBlacklistedName.feature:19 +apiWebdavMove2/moveFileToBlacklistedName.feature:29 +apiWebdavMove2/moveFileToBlacklistedName.feature:30 +apiWebdavMove2/moveFileToBlacklistedName.feature:62 +apiWebdavMove2/moveFileToBlacklistedName.feature:63 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove2/moveFileToExcludedDirectory.feature:18 +apiWebdavMove2/moveFileToExcludedDirectory.feature:19 +apiWebdavMove2/moveFileToExcludedDirectory.feature:28 +apiWebdavMove2/moveFileToExcludedDirectory.feature:29 +apiWebdavMove2/moveFileToExcludedDirectory.feature:63 +apiWebdavMove2/moveFileToExcludedDirectory.feature:64 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavOperations/deleteFolder.feature:67 +apiWebdavOperations/deleteFolder.feature:68 +apiWebdavOperations/deleteFolder.feature:69 +apiWebdavOperations/deleteFolder.feature:70 +apiWebdavOperations/deleteFolder.feature:91 +apiWebdavOperations/deleteFolder.feature:92 +# +# https://github.com/owncloud/ocis-reva/issues/12 Range Header is not obeyed when downloading a file +apiWebdavOperations/downloadFile.feature:29 +apiWebdavOperations/downloadFile.feature:30 +# +apiWebdavOperations/downloadFile.feature:72 +apiWebdavOperations/downloadFile.feature:73 +# +apiWebdavOperations/downloadFile.feature:84 +apiWebdavOperations/downloadFile.feature:85 +# +apiWebdavOperations/refuseAccess.feature:21 +apiWebdavOperations/refuseAccess.feature:22 +# +apiWebdavOperations/refuseAccess.feature:33 +apiWebdavOperations/refuseAccess.feature:34 +# +# https://github.com/owncloud/ocis-reva/issues/39 REPORT request not implemented +apiWebdavOperations/search.feature:42 +apiWebdavOperations/search.feature:43 +apiWebdavOperations/search.feature:57 +apiWebdavOperations/search.feature:58 +apiWebdavOperations/search.feature:74 +apiWebdavOperations/search.feature:75 +apiWebdavOperations/search.feature:83 +apiWebdavOperations/search.feature:84 +apiWebdavOperations/search.feature:101 +apiWebdavOperations/search.feature:102 +apiWebdavOperations/search.feature:119 +apiWebdavOperations/search.feature:120 +apiWebdavOperations/search.feature:138 +apiWebdavOperations/search.feature:139 +apiWebdavOperations/search.feature:165 +apiWebdavOperations/search.feature:166 +apiWebdavOperations/search.feature:191 +apiWebdavOperations/search.feature:192 +apiWebdavOperations/search.feature:210 +apiWebdavOperations/search.feature:211 +apiWebdavOperations/search.feature:213 +apiWebdavOperations/search.feature:229 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties1/copyFile.feature:65 +apiWebdavProperties1/copyFile.feature:66 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties1/copyFile.feature:85 +apiWebdavProperties1/copyFile.feature:86 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavProperties1/copyFile.feature:102 +apiWebdavProperties1/copyFile.feature:103 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:116 +apiWebdavProperties1/copyFile.feature:117 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:129 +apiWebdavProperties1/copyFile.feature:130 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:146 +apiWebdavProperties1/copyFile.feature:147 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:165 +apiWebdavProperties1/copyFile.feature:166 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:202 +apiWebdavProperties1/copyFile.feature:203 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:350 +apiWebdavProperties1/copyFile.feature:351 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:370 +apiWebdavProperties1/copyFile.feature:371 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:395 +apiWebdavProperties1/copyFile.feature:396 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:422 +apiWebdavProperties1/copyFile.feature:423 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:448 +apiWebdavProperties1/copyFile.feature:449 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:474 +apiWebdavProperties1/copyFile.feature:475 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavProperties1/createFolder.feature:71 +apiWebdavProperties1/createFolder.feature:72 +# +# https://github.com/owncloud/ocis-reva/issues/168 creating a folder that already exists returns an empty body +apiWebdavProperties1/createFolder.feature:85 +apiWebdavProperties1/createFolder.feature:86 +# +# https://github.com/owncloud/ocis-reva/issues/168 creating a folder that already exists returns an empty body +apiWebdavProperties1/createFolder.feature:99 +apiWebdavProperties1/createFolder.feature:100 +# +# https://github.com/owncloud/ocis-reva/issues/101 quota query +apiWebdavProperties1/getQuota.feature:17 +apiWebdavProperties1/getQuota.feature:18 +apiWebdavProperties1/getQuota.feature:27 +apiWebdavProperties1/getQuota.feature:28 +apiWebdavProperties1/getQuota.feature:48 +apiWebdavProperties1/getQuota.feature:49 +apiWebdavProperties1/getQuota.feature:61 +apiWebdavProperties1/getQuota.feature:62 +apiWebdavProperties1/getQuota.feature:77 +apiWebdavProperties1/getQuota.feature:78 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties1/setFileProperties.feature:63 +apiWebdavProperties1/setFileProperties.feature:64 +# +# https://github.com/owncloud/ocis-reva/issues/214 XML properties in webdav response not properly encoded +apiWebdavProperties2/getFileProperties.feature:37 +apiWebdavProperties2/getFileProperties.feature:39 +apiWebdavProperties2/getFileProperties.feature:40 +apiWebdavProperties2/getFileProperties.feature:41 +apiWebdavProperties2/getFileProperties.feature:43 +apiWebdavProperties2/getFileProperties.feature:44 +# +# https://github.com/owncloud/ocis-reva/issues/214 XML properties in webdav response not properly encoded +apiWebdavProperties2/getFileProperties.feature:59 +apiWebdavProperties2/getFileProperties.feature:60 +apiWebdavProperties2/getFileProperties.feature:61 +apiWebdavProperties2/getFileProperties.feature:63 +apiWebdavProperties2/getFileProperties.feature:64 +apiWebdavProperties2/getFileProperties.feature:66 +apiWebdavProperties2/getFileProperties.feature:67 +apiWebdavProperties2/getFileProperties.feature:68 +apiWebdavProperties2/getFileProperties.feature:70 +apiWebdavProperties2/getFileProperties.feature:71 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:135 +apiWebdavProperties2/getFileProperties.feature:136 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:156 +apiWebdavProperties2/getFileProperties.feature:157 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:174 +apiWebdavProperties2/getFileProperties.feature:175 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:206 +apiWebdavProperties2/getFileProperties.feature:207 +# +apiWebdavProperties2/getFileProperties.feature:218 +apiWebdavProperties2/getFileProperties.feature:219 +# +# https://github.com/owncloud/ocis-reva/issues/216 Private link support +apiWebdavProperties2/getFileProperties.feature:232 +apiWebdavProperties2/getFileProperties.feature:233 +# +# https://github.com/owncloud/ocis-reva/issues/163 trying to access a non-existing resource returns an empty body +apiWebdavProperties2/getFileProperties.feature:242 +apiWebdavProperties2/getFileProperties.feature:243 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:246 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:266 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:301 +apiWebdavProperties2/getFileProperties.feature:302 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:314 +apiWebdavProperties2/getFileProperties.feature:315 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:327 +apiWebdavProperties2/getFileProperties.feature:328 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:376 +apiWebdavProperties2/getFileProperties.feature:377 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:389 +apiWebdavProperties2/getFileProperties.feature:390 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:402 +apiWebdavProperties2/getFileProperties.feature:403 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:415 +apiWebdavProperties2/getFileProperties.feature:416 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:428 +apiWebdavProperties2/getFileProperties.feature:429 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:441 +apiWebdavProperties2/getFileProperties.feature:442 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:454 +apiWebdavProperties2/getFileProperties.feature:455 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload1/uploadFile.feature:112 +apiWebdavUpload1/uploadFile.feature:113 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:14 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:31 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:48 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:65 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:83 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:92 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:106 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:143 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:144 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:146 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:159 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload1/uploadFileToBlacklistedName.feature:19 +apiWebdavUpload1/uploadFileToBlacklistedName.feature:20 +# +# https://github.com/owncloud/ocis-reva/issues/54 system configuration options missing +apiWebdavUpload1/uploadFileToBlacklistedName.feature:31 +apiWebdavUpload1/uploadFileToBlacklistedName.feature:32 +# +# https://github.com/owncloud/ocis-reva/issues/54 system configuration options missing +apiWebdavUpload1/uploadFileToBlacklistedName.feature:65 +apiWebdavUpload1/uploadFileToBlacklistedName.feature:66 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:14 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:23 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:47 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:48 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:49 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:52 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:20 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:21 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:33 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:34 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:69 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:70 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:14 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:24 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:49 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:50 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:51 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:54 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:12 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:21 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:45 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:46 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:47 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:50 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:13 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:20 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:37 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:38 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:39 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:42 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:12 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:22 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:47 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:48 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:49 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:52 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:13 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:21 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:39 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:40 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:41 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:44 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload2/uploadFileUsingNewChunking.feature:12 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:29 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:43 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:57 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:79 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:85 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:94 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:98 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:106 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:135 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:136 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:137 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:157 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:158 +# +# https://github.com/owncloud/ocis-reva/issues/17 uploading with old-chunking does not work +apiWebdavUpload2/uploadFileUsingOldChunking.feature:13 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:26 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:35 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:44 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:76 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:77 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:97 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:98 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:99 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:100 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:101 diff --git a/reva/tests/acceptance/expected-failures-on-OCIS-storage.txt b/reva/tests/acceptance/expected-failures-on-OCIS-storage.txt new file mode 100644 index 0000000000..64dea60a07 --- /dev/null +++ b/reva/tests/acceptance/expected-failures-on-OCIS-storage.txt @@ -0,0 +1,1205 @@ +# this file contains the scenarios from ownCloud10 core API tests that are currently expected to fail +# when run with OCIS storage +# +# test scenarios that specifically fail with OCIS storage +# +apiShareOperations/gettingShares.feature:155 +apiShareOperations/gettingShares.feature:156 +apiSharePublicLink2/multilinkSharing.feature:181 +apiWebdavProperties1/setFileProperties.feature:32 +apiWebdavProperties1/setFileProperties.feature:33 +# +# https://github.com/owncloud/ocis-reva/issues/196 Checksum feature +apiMain/checksums.feature:24 +apiMain/checksums.feature:25 +apiMain/checksums.feature:35 +apiMain/checksums.feature:36 +apiMain/checksums.feature:46 +apiMain/checksums.feature:47 +apiMain/checksums.feature:50 +apiMain/checksums.feature:58 +apiMain/checksums.feature:67 +apiMain/checksums.feature:99 +apiMain/checksums.feature:100 +apiMain/checksums.feature:103 +apiMain/checksums.feature:110 +apiMain/checksums.feature:119 +apiMain/checksums.feature:129 +apiMain/checksums.feature:138 +apiMain/checksums.feature:147 +apiMain/checksums.feature:158 +apiMain/checksums.feature:174 +apiMain/checksums.feature:192 +apiMain/checksums.feature:217 +apiMain/checksums.feature:218 +apiMain/checksums.feature:239 +apiMain/checksums.feature:240 +apiMain/checksums.feature:258 +apiMain/checksums.feature:279 +apiMain/checksums.feature:280 +apiMain/checksums.feature:295 +apiMain/checksums.feature:296 +apiMain/checksums.feature:308 +apiMain/checksums.feature:309 +apiMain/checksums.feature:312 +apiMain/checksums.feature:324 +# +# https://github.com/owncloud/ocis-reva/issues/100 no robots.txt available +apiMain/main.feature:5 +# +# https://github.com/owncloud/ocis-reva/issues/101 quota query +apiMain/quota.feature:9 +apiMain/quota.feature:16 +apiMain/quota.feature:23 +apiMain/quota.feature:30 +apiMain/quota.feature:41 +apiMain/quota.feature:54 +apiMain/quota.feature:68 +apiMain/quota.feature:82 +apiMain/quota.feature:99 +apiMain/quota.feature:112 +# +# https://github.com/owncloud/ocis-reva/issues/65 There is no such thing like a "super-user" +# https://github.com/owncloud/ocis-reva/issues/97 no command equivalent to occ +apiMain/status.feature:5 +# +# https://github.com/owncloud/ocis-reva/issues/29 ocs config endpoint only accessible by authorized users +# https://github.com/owncloud/ocis-reva/issues/30 HTTP 401 Unauthorized responses don't contain a body +apiAuthOcs/ocsDELETEAuth.feature:9 +apiAuthOcs/ocsGETAuth.feature:10 +apiAuthOcs/ocsGETAuth.feature:33 +apiAuthOcs/ocsGETAuth.feature:53 +apiAuthOcs/ocsGETAuth.feature:88 +apiAuthOcs/ocsGETAuth.feature:121 +apiAuthOcs/ocsGETAuth.feature:139 +apiAuthOcs/ocsPOSTAuth.feature:10 +apiAuthOcs/ocsPUTAuth.feature:10 +# +# https://github.com/owncloud/ocis-reva/issues/13 server returns 500 when trying to access a not existing file +apiAuthWebDav/webDavDELETEAuth.feature:36 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavLOCKAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavMKCOLAuth.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiAuthWebDav/webDavMOVEAuth.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/179 send POST requests to another user's webDav endpoints as normal user +apiAuthWebDav/webDavPOSTAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavPROPFINDAuth.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavPROPPATCHAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavPUTAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/175 Default capabilities for normal user not same as in oC-core +# https://github.com/owncloud/ocis-reva/issues/176 Difference in response content of status.php and default capabilities +apiCapabilities/capabilitiesWithNormalUser.feature:11 +# +# https://github.com/owncloud/ocis-reva/issues/39 REPORT request not implemented +apiFavorites/favorites.feature:228 +apiFavorites/favorites.feature:229 +# +# https://github.com/owncloud/ocis-reva/issues/34 groups endpoint does not exist +apiSharees/sharees.feature:32 +apiSharees/sharees.feature:33 +apiSharees/sharees.feature:53 +apiSharees/sharees.feature:54 +apiSharees/sharees.feature:74 +apiSharees/sharees.feature:75 +apiSharees/sharees.feature:98 +apiSharees/sharees.feature:99 +apiSharees/sharees.feature:118 +apiSharees/sharees.feature:119 +apiSharees/sharees.feature:137 +apiSharees/sharees.feature:138 +apiSharees/sharees.feature:157 +apiSharees/sharees.feature:158 +apiSharees/sharees.feature:177 +apiSharees/sharees.feature:178 +apiSharees/sharees.feature:198 +apiSharees/sharees.feature:199 +apiSharees/sharees.feature:217 +apiSharees/sharees.feature:218 +apiSharees/sharees.feature:237 +apiSharees/sharees.feature:238 +apiSharees/sharees.feature:257 +apiSharees/sharees.feature:258 +apiSharees/sharees.feature:277 +apiSharees/sharees.feature:278 +apiSharees/sharees.feature:297 +apiSharees/sharees.feature:298 +apiSharees/sharees.feature:317 +apiSharees/sharees.feature:318 +apiSharees/sharees.feature:336 +apiSharees/sharees.feature:337 +apiSharees/sharees.feature:355 +apiSharees/sharees.feature:356 +apiSharees/sharees.feature:374 +apiSharees/sharees.feature:375 +apiSharees/sharees.feature:393 +apiSharees/sharees.feature:394 +apiSharees/sharees.feature:412 +apiSharees/sharees.feature:413 +apiSharees/sharees.feature:430 +apiSharees/sharees.feature:431 +apiSharees/sharees.feature:450 +apiSharees/sharees.feature:451 +apiSharees/sharees.feature:475 +apiSharees/sharees.feature:476 +apiSharees/sharees.feature:495 +apiSharees/sharees.feature:496 +apiSharees/sharees.feature:515 +apiSharees/sharees.feature:516 +apiSharees/sharees.feature:537 +apiSharees/sharees.feature:538 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set (shareapi_auto_accept_share) +apiShareManagement/acceptShares.feature:333 +apiShareManagement/acceptShares.feature:415 +apiShareManagement/acceptShares.feature:416 +apiShareManagement/acceptShares.feature:417 +apiShareManagement/acceptShares.feature:418 +apiShareManagement/acceptShares.feature:419 +apiShareManagement/acceptShares.feature:421 +apiShareManagement/acceptShares.feature:436 +apiShareManagement/acceptShares.feature:458 +apiShareManagement/acceptShares.feature:477 +apiShareManagement/acceptShares.feature:511 +apiShareManagement/acceptShares.feature:542 +apiShareManagement/acceptShares.feature:561 +apiShareManagement/acceptShares.feature:582 +apiShareManagement/acceptShares.feature:652 +apiShareManagement/acceptShares.feature:696 +# +# https://github.com/owncloud/product/issues/208 After accepting a share data in the received file cannot be downloaded +apiShareManagement/acceptSharesToSharesFolder.feature:15 +# +# https://github.com/owncloud/product/issues/207 Response is empty when accepting a share +apiShareManagement/acceptSharesToSharesFolder.feature:30 +apiShareManagement/acceptSharesToSharesFolder.feature:52 +# +# https://github.com/owncloud/ocis-reva/issues/34 groups endpoint does not exist +# https://github.com/owncloud/ocis-reva/issues/243 Sharing seems to work but does not work +# https://github.com/owncloud/ocis-reva/issues/372 Listing shares via ocs API does not show path for parent folders +# https://github.com/owncloud/ocis-reva/issues/356 Fields missing in delete share OCS response +# https://github.com/owncloud/product/issues/203 file_target in share response +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:36 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:37 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:66 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:67 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:91 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:92 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:94 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:95 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:97 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:98 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:100 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:101 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:115 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:116 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:130 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:131 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:155 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:156 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:179 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:180 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:204 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:205 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:234 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:235 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:254 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:255 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:284 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:285 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:299 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:300 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:316 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:317 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:332 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:333 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:350 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:351 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:355 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:380 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:445 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:446 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:481 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:482 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:485 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:513 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:531 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:549 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:28 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:29 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:43 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:44 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:46 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:58 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:72 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:89 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:107 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:118 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:130 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:163 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:164 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:165 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:166 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:181 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:182 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:183 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:184 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:42 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:43 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:69 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:70 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:97 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:98 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:135 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:136 +# +# https://github.com/owncloud/ocis-reva/issues/260 Sharee retrieves the information about a share -but gets response containing all the shares +apiShareOperations/accessToShare.feature:48 +apiShareOperations/accessToShare.feature:49 +# +# https://github.com/owncloud/ocis-reva/issues/262 Shares are not deleted when user is deleted +apiShareOperations/gettingShares.feature:21 +apiShareOperations/gettingShares.feature:22 +# +# https://github.com/owncloud/ocis-reva/issues/65 There is no such thing like a "super-user" +apiShareOperations/gettingShares.feature:34 +apiShareOperations/gettingShares.feature:35 +# +# https://github.com/owncloud/ocis-reva/issues/357 Delete shares from user when user is deleted +# https://github.com/owncloud/ocis-reva/issues/301 no displayname_owner shown when creating a share +# https://github.com/owncloud/ocis-reva/issues/302 when sharing a file mime-type field is set to application/octet-stream +apiShareOperations/gettingShares.feature:124 +apiShareOperations/gettingShares.feature:125 +# +# https://github.com/owncloud/ocis-reva/issues/374 OCS error message for attempting to access share via share id as an unauthorized user is not informative +apiShareOperations/gettingShares.feature:168 +apiShareOperations/gettingShares.feature:169 +# +# https://github.com/owncloud/ocis-reva/issues/372 Listing shares via ocs API does not show path for parent folders +apiShareOperations/gettingShares.feature:204 +apiShareOperations/gettingShares.feature:205 +# +# https://github.com/owncloud/ocis-reva/issues/47 cannot get ocs:share-permissions via WebDAV +apiShareOperations/getWebDAVSharePermissions.feature:21 +apiShareOperations/getWebDAVSharePermissions.feature:22 +apiShareOperations/getWebDAVSharePermissions.feature:134 +apiShareOperations/getWebDAVSharePermissions.feature:135 +# +# https://github.com/owncloud/ocis-reva/issues/282 Split old public API webdav tests from new public webdav tests +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/accessToPublicLinkShare.feature:10 +apiSharePublicLink1/accessToPublicLinkShare.feature:20 +apiSharePublicLink1/accessToPublicLinkShare.feature:30 +apiSharePublicLink1/accessToPublicLinkShare.feature:43 +apiSharePublicLink1/changingPublicLinkShare.feature:22 +apiSharePublicLink1/changingPublicLinkShare.feature:23 +apiSharePublicLink1/changingPublicLinkShare.feature:37 +apiSharePublicLink1/changingPublicLinkShare.feature:41 +apiSharePublicLink1/changingPublicLinkShare.feature:52 +apiSharePublicLink1/changingPublicLinkShare.feature:63 +apiSharePublicLink1/changingPublicLinkShare.feature:85 +apiSharePublicLink1/changingPublicLinkShare.feature:96 +apiSharePublicLink1/changingPublicLinkShare.feature:107 +apiSharePublicLink1/changingPublicLinkShare.feature:151 +apiSharePublicLink1/changingPublicLinkShare.feature:197 +apiSharePublicLink1/changingPublicLinkShare.feature:244 +apiSharePublicLink1/changingPublicLinkShare.feature:267 +apiSharePublicLink1/changingPublicLinkShare.feature:278 +apiSharePublicLink1/changingPublicLinkShare.feature:289 +apiSharePublicLink1/changingPublicLinkShare.feature:300 +apiSharePublicLink1/createPublicLinkShare.feature:34 +apiSharePublicLink1/createPublicLinkShare.feature:35 +# +# https://github.com/owncloud/ocis-reva/issues/12 Range Header is not obeyed when downloading a file +apiSharePublicLink1/createPublicLinkShare.feature:63 +apiSharePublicLink1/createPublicLinkShare.feature:64 +# +apiSharePublicLink1/createPublicLinkShare.feature:95 +apiSharePublicLink1/createPublicLinkShare.feature:96 +# +# https://github.com/owncloud/ocis-reva/issues/199 Ability to return error messages in Webdav response bodies +apiSharePublicLink1/createPublicLinkShare.feature:127 +apiSharePublicLink1/createPublicLinkShare.feature:128 +# +apiSharePublicLink1/createPublicLinkShare.feature:155 +apiSharePublicLink1/createPublicLinkShare.feature:156 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/createPublicLinkShare.feature:183 +apiSharePublicLink1/createPublicLinkShare.feature:184 +# +apiSharePublicLink1/createPublicLinkShare.feature:214 +apiSharePublicLink1/createPublicLinkShare.feature:215 +# +# https://github.com/owncloud/ocis-reva/issues/12 Range Header is not obeyed when downloading a file +apiSharePublicLink1/createPublicLinkShare.feature:245 +apiSharePublicLink1/createPublicLinkShare.feature:246 +# +apiSharePublicLink1/createPublicLinkShare.feature:276 +apiSharePublicLink1/createPublicLinkShare.feature:277 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/createPublicLinkShare.feature:307 +apiSharePublicLink1/createPublicLinkShare.feature:308 +# +apiSharePublicLink1/createPublicLinkShare.feature:370 +apiSharePublicLink1/createPublicLinkShare.feature:371 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:389 +apiSharePublicLink1/createPublicLinkShare.feature:390 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:411 +apiSharePublicLink1/createPublicLinkShare.feature:413 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:435 +apiSharePublicLink1/createPublicLinkShare.feature:437 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:461 +apiSharePublicLink1/createPublicLinkShare.feature:463 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:487 +apiSharePublicLink1/createPublicLinkShare.feature:489 +apiSharePublicLink1/createPublicLinkShare.feature:491 +apiSharePublicLink1/createPublicLinkShare.feature:493 +apiSharePublicLink1/createPublicLinkShare.feature:495 +apiSharePublicLink1/createPublicLinkShare.feature:497 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:518 +apiSharePublicLink1/createPublicLinkShare.feature:519 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:534 +apiSharePublicLink1/createPublicLinkShare.feature:535 +# +apiSharePublicLink1/createPublicLinkShare.feature:553 +apiSharePublicLink1/createPublicLinkShare.feature:554 +# +apiSharePublicLink1/createPublicLinkShare.feature:590 +apiSharePublicLink1/createPublicLinkShare.feature:591 +# +# https://github.com/owncloud/ocis-reva/issues/283 Prevent creating public share for the home root folder +apiSharePublicLink1/createPublicLinkShare.feature:620 +apiSharePublicLink1/createPublicLinkShare.feature:621 +# +apiSharePublicLink1/createPublicLinkShare.feature:634 +apiSharePublicLink1/createPublicLinkShare.feature:635 +# +apiSharePublicLink1/createPublicLinkShare.feature:663 +apiSharePublicLink1/createPublicLinkShare.feature:664 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:714 +apiSharePublicLink1/createPublicLinkShare.feature:715 +# +# https://github.com/owncloud/ocis-reva/issues/199 Ability to return error messages in Webdav response bodies +apiSharePublicLink1/createPublicLinkShare.feature:718 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/createPublicLinkShare.feature:727 +# +# https://github.com/owncloud/core/issues/37605 Public cannot upload file with mtime set on a public link share with new version of WebDAV API +apiSharePublicLink1/createPublicLinkShare.feature:779 +# +# https://github.com/owncloud/core/issues/37605 Public cannot upload file with mtime set on a public link share with new version of WebDAV API +apiSharePublicLink1/createPublicLinkShare.feature:793 +# +# https://github.com/owncloud/ocis-reva/issues/311 Deleting a public link after renaming a file +apiSharePublicLink1/deletePublicLinkShare.feature:37 +apiSharePublicLink1/deletePublicLinkShare.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/373 copying a folder within a public link folder to folder with same name as an already existing file overwrites the parent file +apiSharePublicLink2/copyFromPublicLink.feature:60 +# +# https://github.com/owncloud/ocis-reva/issues/368 copying a file from within a public link folder to "/" overwrites the parent folder +apiSharePublicLink2/copyFromPublicLink.feature:167 +apiSharePublicLink2/copyFromPublicLink.feature:168 +# +# https://github.com/owncloud/ocis-reva/issues/368 copying a file from within a public link folder to "/" overwrites the parent folder +apiSharePublicLink2/copyFromPublicLink.feature:183 +apiSharePublicLink2/copyFromPublicLink.feature:184 +# +apiSharePublicLink2/updatePublicLinkShare.feature:94 +apiSharePublicLink2/updatePublicLinkShare.feature:95 +# +apiSharePublicLink2/updatePublicLinkShare.feature:285 +apiSharePublicLink2/updatePublicLinkShare.feature:286 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:304 +apiSharePublicLink2/updatePublicLinkShare.feature:305 +# +apiSharePublicLink2/updatePublicLinkShare.feature:323 +apiSharePublicLink2/updatePublicLinkShare.feature:324 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:342 +apiSharePublicLink2/updatePublicLinkShare.feature:343 +# +apiSharePublicLink2/updatePublicLinkShare.feature:361 +apiSharePublicLink2/updatePublicLinkShare.feature:362 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:380 +apiSharePublicLink2/updatePublicLinkShare.feature:381 +# +apiSharePublicLink2/updatePublicLinkShare.feature:399 +apiSharePublicLink2/updatePublicLinkShare.feature:400 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:418 +apiSharePublicLink2/updatePublicLinkShare.feature:419 +# +apiSharePublicLink2/updatePublicLinkShare.feature:440 +apiSharePublicLink2/updatePublicLinkShare.feature:441 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink2/updatePublicLinkShare.feature:462 +apiSharePublicLink2/updatePublicLinkShare.feature:463 +# +apiSharePublicLink2/updatePublicLinkShare.feature:487 +apiSharePublicLink2/updatePublicLinkShare.feature:488 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:9 +# +# https://github.com/owncloud/ocis-reva/issues/286 Upload-only shares must not overwrite but create a separate file +apiSharePublicLink2/uploadToPublicLinkShare.feature:23 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:48 +apiSharePublicLink2/uploadToPublicLinkShare.feature:49 +# +# https://github.com/owncloud/ocis-reva/issues/290 Accessing non-existing public link should return 404, not 500 +apiSharePublicLink2/uploadToPublicLinkShare.feature:62 +apiSharePublicLink2/uploadToPublicLinkShare.feature:63 +# +# https://github.com/owncloud/ocis-reva/issues/290 Accessing non-existing public link should return 404, not 500 +apiSharePublicLink2/uploadToPublicLinkShare.feature:66 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink2/uploadToPublicLinkShare.feature:74 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:83 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:103 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:121 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:139 +# +# https://github.com/owncloud/ocis-reva/issues/195 Set quota over settings +apiSharePublicLink2/uploadToPublicLinkShare.feature:148 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:158 +# +# https://github.com/owncloud/ocis-reva/issues/195 Set quota over settings +apiSharePublicLink2/uploadToPublicLinkShare.feature:167 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:177 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink2/uploadToPublicLinkShare.feature:186 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:196 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink2/uploadToPublicLinkShare.feature:206 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:217 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:238 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:255 +# +# https://github.com/owncloud/ocis-reva/issues/286 Upload-only shares must not overwrite but create a separate file +apiSharePublicLink2/uploadToPublicLinkShare.feature:273 +# +# https://github.com/owncloud/ocis-reva/issues/286 Upload-only shares must not overwrite but create a separate file +apiSharePublicLink2/uploadToPublicLinkShare.feature:273 +# +# https://github.com/owncloud/product/issues/179 Propfind to trashbin endpoint requires UUID +# https://github.com/owncloud/product/issues/178 File deletion using dav gives unique string in filename in the trashbin +apiTrashbin/trashbinDelete.feature:31 +apiTrashbin/trashbinDelete.feature:32 +apiTrashbin/trashbinDelete.feature:33 +apiTrashbin/trashbinDelete.feature:34 +apiTrashbin/trashbinDelete.feature:37 +apiTrashbin/trashbinDelete.feature:50 +apiTrashbin/trashbinDelete.feature:67 +# +# https://github.com/owncloud/product/issues/179 Propfind to trashbin endpoint requires UUID +# https://github.com/owncloud/product/issues/178 File deletion using dav gives unique string in filename in the trashbin +apiTrashbin/trashbinFilesFolders.feature:44 +apiTrashbin/trashbinFilesFolders.feature:45 +apiTrashbin/trashbinFilesFolders.feature:60 +apiTrashbin/trashbinFilesFolders.feature:61 +apiTrashbin/trashbinFilesFolders.feature:89 +apiTrashbin/trashbinFilesFolders.feature:90 +apiTrashbin/trashbinFilesFolders.feature:104 +apiTrashbin/trashbinFilesFolders.feature:105 +apiTrashbin/trashbinFilesFolders.feature:217 +apiTrashbin/trashbinFilesFolders.feature:218 +apiTrashbin/trashbinFilesFolders.feature:235 +apiTrashbin/trashbinFilesFolders.feature:236 +apiTrashbin/trashbinFilesFolders.feature:259 +apiTrashbin/trashbinFilesFolders.feature:260 +apiTrashbin/trashbinFilesFolders.feature:273 +apiTrashbin/trashbinFilesFolders.feature:274 +apiTrashbin/trashbinFilesFolders.feature:287 +apiTrashbin/trashbinFilesFolders.feature:288 +# +# https://github.com/owncloud/product/issues/179 Propfind to trashbin endpoint requires UUID +# https://github.com/owncloud/product/issues/178 File deletion using dav gives unique string in filename in the trashbin +apiTrashbin/trashbinRestore.feature:31 +apiTrashbin/trashbinRestore.feature:32 +apiTrashbin/trashbinRestore.feature:62 +apiTrashbin/trashbinRestore.feature:63 +apiTrashbin/trashbinRestore.feature:76 +apiTrashbin/trashbinRestore.feature:77 +apiTrashbin/trashbinRestore.feature:92 +apiTrashbin/trashbinRestore.feature:93 +apiTrashbin/trashbinRestore.feature:112 +apiTrashbin/trashbinRestore.feature:113 +apiTrashbin/trashbinRestore.feature:114 +apiTrashbin/trashbinRestore.feature:115 +apiTrashbin/trashbinRestore.feature:116 +apiTrashbin/trashbinRestore.feature:117 +apiTrashbin/trashbinRestore.feature:141 +apiTrashbin/trashbinRestore.feature:142 +apiTrashbin/trashbinRestore.feature:143 +apiTrashbin/trashbinRestore.feature:144 +apiTrashbin/trashbinRestore.feature:165 +apiTrashbin/trashbinRestore.feature:166 +apiTrashbin/trashbinRestore.feature:188 +apiTrashbin/trashbinRestore.feature:189 +apiTrashbin/trashbinRestore.feature:206 +apiTrashbin/trashbinRestore.feature:207 +apiTrashbin/trashbinRestore.feature:279 +apiTrashbin/trashbinRestore.feature:280 +apiTrashbin/trashbinRestore.feature:323 +apiTrashbin/trashbinRestore.feature:324 +apiTrashbin/trashbinRestore.feature:325 +apiTrashbin/trashbinRestore.feature:326 +apiTrashbin/trashbinRestore.feature:327 +apiTrashbin/trashbinRestore.feature:328 +apiTrashbin/trashbinRestore.feature:343 +apiTrashbin/trashbinRestore.feature:344 +# +# https://github.com/owncloud/ocis-reva/issues/17 uploading with old-chunking does not work +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiVersions/fileVersions.feature:15 +apiVersions/fileVersions.feature:23 +apiVersions/fileVersions.feature:36 +apiVersions/fileVersions.feature:45 +apiVersions/fileVersions.feature:88 +apiVersions/fileVersions.feature:89 +apiVersions/fileVersions.feature:93 +apiVersions/fileVersions.feature:104 +apiVersions/fileVersions.feature:288 +apiVersions/fileVersions.feature:362 +apiVersions/fileVersions.feature:373 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFileAsync.feature:26 +apiWebdavMove1/moveFileAsync.feature:27 +apiWebdavMove1/moveFileAsync.feature:28 +apiWebdavMove1/moveFileAsync.feature:29 +apiWebdavMove1/moveFileAsync.feature:30 +apiWebdavMove1/moveFileAsync.feature:31 +apiWebdavMove1/moveFileAsync.feature:33 +apiWebdavMove1/moveFileAsync.feature:46 +apiWebdavMove1/moveFileAsync.feature:59 +apiWebdavMove1/moveFileAsync.feature:73 +apiWebdavMove1/moveFileAsync.feature:88 +apiWebdavMove1/moveFileAsync.feature:107 +apiWebdavMove1/moveFileAsync.feature:125 +apiWebdavMove1/moveFileAsync.feature:135 +apiWebdavMove1/moveFileAsync.feature:141 +apiWebdavMove1/moveFileAsync.feature:156 +apiWebdavMove1/moveFileAsync.feature:173 +apiWebdavMove1/moveFileAsync.feature:174 +apiWebdavMove1/moveFileAsync.feature:184 +apiWebdavMove1/moveFileAsync.feature:185 +apiWebdavMove1/moveFileAsync.feature:204 +apiWebdavMove1/moveFileAsync.feature:205 +apiWebdavMove1/moveFileAsync.feature:224 +apiWebdavMove1/moveFileAsync.feature:225 +apiWebdavMove1/moveFileAsync.feature:234 +apiWebdavMove1/moveFileAsync.feature:235 +apiWebdavMove1/moveFileAsync.feature:240 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:12 +apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:18 +apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:26 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:12 +apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:19 +apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:27 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFolder.feature:21 +apiWebdavMove1/moveFolder.feature:22 +apiWebdavMove1/moveFolder.feature:34 +apiWebdavMove1/moveFolder.feature:35 +apiWebdavMove1/moveFolder.feature:47 +apiWebdavMove1/moveFolder.feature:48 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFolderToBlacklistedName.feature:21 +apiWebdavMove1/moveFolderToBlacklistedName.feature:22 +apiWebdavMove1/moveFolderToBlacklistedName.feature:35 +apiWebdavMove1/moveFolderToBlacklistedName.feature:36 +apiWebdavMove1/moveFolderToBlacklistedName.feature:70 +apiWebdavMove1/moveFolderToBlacklistedName.feature:71 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFolderToExcludedDirectory.feature:21 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:22 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:34 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:35 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:70 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:71 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove2/moveFile.feature:89 +apiWebdavMove2/moveFile.feature:90 +apiWebdavMove2/moveFile.feature:91 +apiWebdavMove2/moveFile.feature:92 +apiWebdavMove2/moveFile.feature:112 +apiWebdavMove2/moveFile.feature:113 +apiWebdavMove2/moveFile.feature:136 +apiWebdavMove2/moveFile.feature:137 +apiWebdavMove2/moveFile.feature:138 +apiWebdavMove2/moveFile.feature:139 +apiWebdavMove2/moveFile.feature:160 +apiWebdavMove2/moveFile.feature:161 +apiWebdavMove2/moveFile.feature:181 +apiWebdavMove2/moveFile.feature:182 +apiWebdavMove2/moveFile.feature:200 +apiWebdavMove2/moveFile.feature:201 +apiWebdavMove2/moveFile.feature:219 +apiWebdavMove2/moveFile.feature:220 +apiWebdavMove2/moveFile.feature:255 +apiWebdavMove2/moveFile.feature:256 +apiWebdavMove2/moveFile.feature:272 +apiWebdavMove2/moveFile.feature:273 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove2/moveFileToBlacklistedName.feature:18 +apiWebdavMove2/moveFileToBlacklistedName.feature:19 +apiWebdavMove2/moveFileToBlacklistedName.feature:29 +apiWebdavMove2/moveFileToBlacklistedName.feature:30 +apiWebdavMove2/moveFileToBlacklistedName.feature:62 +apiWebdavMove2/moveFileToBlacklistedName.feature:63 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove2/moveFileToExcludedDirectory.feature:18 +apiWebdavMove2/moveFileToExcludedDirectory.feature:19 +apiWebdavMove2/moveFileToExcludedDirectory.feature:28 +apiWebdavMove2/moveFileToExcludedDirectory.feature:29 +apiWebdavMove2/moveFileToExcludedDirectory.feature:63 +apiWebdavMove2/moveFileToExcludedDirectory.feature:64 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavOperations/deleteFolder.feature:67 +apiWebdavOperations/deleteFolder.feature:68 +apiWebdavOperations/deleteFolder.feature:69 +apiWebdavOperations/deleteFolder.feature:70 +apiWebdavOperations/deleteFolder.feature:91 +apiWebdavOperations/deleteFolder.feature:92 +# +# https://github.com/owncloud/ocis-reva/issues/12 Range Header is not obeyed when downloading a file +apiWebdavOperations/downloadFile.feature:29 +apiWebdavOperations/downloadFile.feature:30 +# +apiWebdavOperations/downloadFile.feature:72 +apiWebdavOperations/downloadFile.feature:73 +# +apiWebdavOperations/downloadFile.feature:84 +apiWebdavOperations/downloadFile.feature:85 +# +apiWebdavOperations/refuseAccess.feature:21 +apiWebdavOperations/refuseAccess.feature:22 +# +apiWebdavOperations/refuseAccess.feature:33 +apiWebdavOperations/refuseAccess.feature:34 +# +# https://github.com/owncloud/ocis-reva/issues/39 REPORT request not implemented +apiWebdavOperations/search.feature:42 +apiWebdavOperations/search.feature:43 +apiWebdavOperations/search.feature:57 +apiWebdavOperations/search.feature:58 +apiWebdavOperations/search.feature:74 +apiWebdavOperations/search.feature:75 +apiWebdavOperations/search.feature:83 +apiWebdavOperations/search.feature:84 +apiWebdavOperations/search.feature:101 +apiWebdavOperations/search.feature:102 +apiWebdavOperations/search.feature:119 +apiWebdavOperations/search.feature:120 +apiWebdavOperations/search.feature:138 +apiWebdavOperations/search.feature:139 +apiWebdavOperations/search.feature:165 +apiWebdavOperations/search.feature:166 +apiWebdavOperations/search.feature:191 +apiWebdavOperations/search.feature:192 +apiWebdavOperations/search.feature:210 +apiWebdavOperations/search.feature:211 +apiWebdavOperations/search.feature:213 +apiWebdavOperations/search.feature:229 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties1/copyFile.feature:65 +apiWebdavProperties1/copyFile.feature:66 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties1/copyFile.feature:85 +apiWebdavProperties1/copyFile.feature:86 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavProperties1/copyFile.feature:102 +apiWebdavProperties1/copyFile.feature:103 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:116 +apiWebdavProperties1/copyFile.feature:117 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:129 +apiWebdavProperties1/copyFile.feature:130 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:146 +apiWebdavProperties1/copyFile.feature:147 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:165 +apiWebdavProperties1/copyFile.feature:166 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:202 +apiWebdavProperties1/copyFile.feature:203 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:350 +apiWebdavProperties1/copyFile.feature:351 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:370 +apiWebdavProperties1/copyFile.feature:371 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:395 +apiWebdavProperties1/copyFile.feature:396 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:422 +apiWebdavProperties1/copyFile.feature:423 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:448 +apiWebdavProperties1/copyFile.feature:449 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:474 +apiWebdavProperties1/copyFile.feature:475 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavProperties1/createFolder.feature:71 +apiWebdavProperties1/createFolder.feature:72 +# +# https://github.com/owncloud/ocis-reva/issues/168 creating a folder that already exists returns an empty body +apiWebdavProperties1/createFolder.feature:85 +apiWebdavProperties1/createFolder.feature:86 +# +# https://github.com/owncloud/ocis-reva/issues/168 creating a folder that already exists returns an empty body +apiWebdavProperties1/createFolder.feature:99 +apiWebdavProperties1/createFolder.feature:100 +# +# https://github.com/owncloud/ocis-reva/issues/101 quota query +apiWebdavProperties1/getQuota.feature:17 +apiWebdavProperties1/getQuota.feature:18 +apiWebdavProperties1/getQuota.feature:27 +apiWebdavProperties1/getQuota.feature:28 +apiWebdavProperties1/getQuota.feature:48 +apiWebdavProperties1/getQuota.feature:49 +apiWebdavProperties1/getQuota.feature:61 +apiWebdavProperties1/getQuota.feature:62 +apiWebdavProperties1/getQuota.feature:77 +apiWebdavProperties1/getQuota.feature:78 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties1/setFileProperties.feature:63 +apiWebdavProperties1/setFileProperties.feature:64 +# +# https://github.com/owncloud/ocis-reva/issues/214 XML properties in webdav response not properly encoded +apiWebdavProperties2/getFileProperties.feature:37 +apiWebdavProperties2/getFileProperties.feature:39 +apiWebdavProperties2/getFileProperties.feature:40 +apiWebdavProperties2/getFileProperties.feature:41 +apiWebdavProperties2/getFileProperties.feature:43 +apiWebdavProperties2/getFileProperties.feature:44 +# +# https://github.com/owncloud/ocis-reva/issues/214 XML properties in webdav response not properly encoded +apiWebdavProperties2/getFileProperties.feature:59 +apiWebdavProperties2/getFileProperties.feature:60 +apiWebdavProperties2/getFileProperties.feature:61 +apiWebdavProperties2/getFileProperties.feature:63 +apiWebdavProperties2/getFileProperties.feature:64 +apiWebdavProperties2/getFileProperties.feature:66 +apiWebdavProperties2/getFileProperties.feature:67 +apiWebdavProperties2/getFileProperties.feature:68 +apiWebdavProperties2/getFileProperties.feature:70 +apiWebdavProperties2/getFileProperties.feature:71 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:135 +apiWebdavProperties2/getFileProperties.feature:136 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:156 +apiWebdavProperties2/getFileProperties.feature:157 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:174 +apiWebdavProperties2/getFileProperties.feature:175 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:206 +apiWebdavProperties2/getFileProperties.feature:207 +# +apiWebdavProperties2/getFileProperties.feature:218 +apiWebdavProperties2/getFileProperties.feature:219 +# +# https://github.com/owncloud/ocis-reva/issues/216 Private link support +apiWebdavProperties2/getFileProperties.feature:232 +apiWebdavProperties2/getFileProperties.feature:233 +# +# https://github.com/owncloud/ocis-reva/issues/163 trying to access a non-existing resource returns an empty body +apiWebdavProperties2/getFileProperties.feature:242 +apiWebdavProperties2/getFileProperties.feature:243 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:246 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:266 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:301 +apiWebdavProperties2/getFileProperties.feature:302 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:314 +apiWebdavProperties2/getFileProperties.feature:315 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:327 +apiWebdavProperties2/getFileProperties.feature:328 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:376 +apiWebdavProperties2/getFileProperties.feature:377 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:389 +apiWebdavProperties2/getFileProperties.feature:390 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:402 +apiWebdavProperties2/getFileProperties.feature:403 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:415 +apiWebdavProperties2/getFileProperties.feature:416 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:428 +apiWebdavProperties2/getFileProperties.feature:429 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:441 +apiWebdavProperties2/getFileProperties.feature:442 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:454 +apiWebdavProperties2/getFileProperties.feature:455 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload1/uploadFile.feature:112 +apiWebdavUpload1/uploadFile.feature:113 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:14 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:31 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:48 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:65 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:83 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:92 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:106 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:143 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:144 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:146 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:159 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload1/uploadFileToBlacklistedName.feature:19 +apiWebdavUpload1/uploadFileToBlacklistedName.feature:20 +# +# https://github.com/owncloud/ocis-reva/issues/54 system configuration options missing +apiWebdavUpload1/uploadFileToBlacklistedName.feature:31 +apiWebdavUpload1/uploadFileToBlacklistedName.feature:32 +# +# https://github.com/owncloud/ocis-reva/issues/54 system configuration options missing +apiWebdavUpload1/uploadFileToBlacklistedName.feature:65 +apiWebdavUpload1/uploadFileToBlacklistedName.feature:66 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:14 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:23 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:47 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:48 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:49 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:52 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:20 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:21 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:33 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:34 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:69 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:70 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:14 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:24 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:49 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:50 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:51 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:54 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:12 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:21 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:45 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:46 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:47 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:50 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:13 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:20 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:37 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:38 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:39 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:42 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:12 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:22 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:47 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:48 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:49 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:52 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:13 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:21 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:39 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:40 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:41 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:44 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload2/uploadFileUsingNewChunking.feature:12 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:29 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:43 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:57 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:79 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:85 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:94 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:98 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:106 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:135 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:136 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:137 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:157 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:158 +# +# https://github.com/owncloud/ocis-reva/issues/17 uploading with old-chunking does not work +apiWebdavUpload2/uploadFileUsingOldChunking.feature:13 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:26 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:35 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:44 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:76 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:77 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:97 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:98 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:99 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:100 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:101 +# +# Failures that need to be investigated +apiShareManagementBasic/createShare.feature:85 +apiShareManagementBasic/createShare.feature:86 +apiShareManagementBasic/createShare.feature:88 +apiShareManagementBasic/createShare.feature:89 +apiShareManagementBasic/createShare.feature:91 +apiShareManagementBasic/createShare.feature:92 +apiShareManagementBasic/createShare.feature:94 +apiShareManagementBasic/createShare.feature:95 +apiShareManagementBasic/createShare.feature:107 +apiShareManagementBasic/createShare.feature:108 +apiShareManagementBasic/createShare.feature:120 +apiShareManagementBasic/createShare.feature:121 +apiShareManagementBasic/createShare.feature:145 +apiShareManagementBasic/createShare.feature:146 +apiShareManagementBasic/deleteShare.feature:39 +apiSharePublicLink1/changingPublicLinkShare.feature:74 +apiSharePublicLink1/changingPublicLinkShare.feature:128 +apiSharePublicLink1/changingPublicLinkShare.feature:139 +apiSharePublicLink1/changingPublicLinkShare.feature:174 +apiSharePublicLink1/changingPublicLinkShare.feature:185 +apiSharePublicLink1/changingPublicLinkShare.feature:209 +apiSharePublicLink1/changingPublicLinkShare.feature:255 +apiSharePublicLink1/createPublicLinkShare.feature:760 +apiSharePublicLink1/createPublicLinkShare.feature:761 +apiSharePublicLink1/createPublicLinkShare.feature:774 +apiSharePublicLink1/createPublicLinkShare.feature:775 +apiSharePublicLink1/deletePublicLinkShare.feature:20 +apiSharePublicLink1/deletePublicLinkShare.feature:21 +apiSharePublicLink1/deletePublicLinkShare.feature:53 +apiSharePublicLink1/deletePublicLinkShare.feature:54 +apiSharePublicLink1/deletePublicLinkShare.feature:70 +apiSharePublicLink1/deletePublicLinkShare.feature:71 +apiSharePublicLink2/copyFromPublicLink.feature:9 +apiSharePublicLink2/copyFromPublicLink.feature:21 +apiSharePublicLink2/copyFromPublicLink.feature:34 +apiSharePublicLink2/copyFromPublicLink.feature:47 +apiSharePublicLink2/copyFromPublicLink.feature:86 +apiSharePublicLink2/copyFromPublicLink.feature:113 +apiSharePublicLink2/copyFromPublicLink.feature:114 +apiSharePublicLink2/copyFromPublicLink.feature:115 +apiSharePublicLink2/copyFromPublicLink.feature:116 +apiSharePublicLink2/copyFromPublicLink.feature:131 +apiSharePublicLink2/copyFromPublicLink.feature:132 +apiSharePublicLink2/copyFromPublicLink.feature:133 +apiSharePublicLink2/copyFromPublicLink.feature:134 +apiSharePublicLink2/copyFromPublicLink.feature:150 +apiSharePublicLink2/copyFromPublicLink.feature:151 +apiSharePublicLink2/copyFromPublicLink.feature:152 +apiSharePublicLink2/copyFromPublicLink.feature:153 +apiSharePublicLink2/multilinkSharing.feature:108 +apiSharePublicLink2/uploadToPublicLinkShare.feature:92 +apiWebdavMove2/moveFile.feature:21 +apiWebdavMove2/moveFile.feature:22 +apiWebdavMove2/moveFile.feature:34 +apiWebdavMove2/moveFile.feature:35 +apiWebdavMove2/moveFile.feature:303 +apiWebdavMove2/moveFile.feature:304 +apiWebdavMove2/moveFile.feature:305 +apiWebdavMove2/moveFile.feature:306 +apiWebdavMove2/moveFile.feature:307 +apiWebdavMove2/moveFile.feature:308 +apiWebdavMove2/moveFile.feature:309 +apiWebdavMove2/moveFile.feature:310 +apiWebdavMove2/moveFile.feature:311 +apiWebdavMove2/moveFile.feature:312 +apiWebdavMove2/moveFile.feature:313 +apiWebdavMove2/moveFile.feature:314 +apiWebdavOperations/deleteFile.feature:33 +apiWebdavOperations/deleteFile.feature:34 +apiWebdavOperations/deleteFolder.feature:32 +apiWebdavOperations/deleteFolder.feature:33 +apiWebdavOperations/deleteFolder.feature:47 +apiWebdavOperations/deleteFolder.feature:48 +apiWebdavProperties1/copyFile.feature:183 +apiWebdavProperties1/copyFile.feature:184 +apiWebdavProperties1/createFolder.feature:18 +apiWebdavProperties1/createFolder.feature:19 +apiWebdavProperties1/createFolder.feature:20 +apiWebdavProperties1/createFolder.feature:21 +apiWebdavProperties1/createFolder.feature:22 +apiWebdavProperties1/createFolder.feature:23 +apiWebdavProperties1/createFolder.feature:24 +apiWebdavProperties1/createFolder.feature:25 +apiWebdavProperties1/createFolder.feature:26 +apiWebdavProperties1/createFolder.feature:27 +apiWebdavProperties1/createFolder.feature:28 +apiWebdavProperties1/createFolder.feature:29 +apiWebdavProperties1/createFolder.feature:30 +apiWebdavProperties1/createFolder.feature:31 +apiWebdavProperties1/createFolder.feature:32 +apiWebdavProperties2/getFileProperties.feature:19 +apiWebdavProperties2/getFileProperties.feature:20 +apiWebdavProperties2/getFileProperties.feature:21 +apiWebdavProperties2/getFileProperties.feature:22 +apiWebdavProperties2/getFileProperties.feature:23 +apiWebdavProperties2/getFileProperties.feature:24 +apiWebdavProperties2/getFileProperties.feature:25 +apiWebdavProperties2/getFileProperties.feature:26 +apiWebdavProperties2/getFileProperties.feature:38 +apiWebdavProperties2/getFileProperties.feature:42 +apiWebdavProperties2/getFileProperties.feature:81 +apiWebdavProperties2/getFileProperties.feature:82 +apiWebdavProperties2/getFileProperties.feature:83 +apiWebdavProperties2/getFileProperties.feature:84 +apiWebdavProperties2/getFileProperties.feature:85 +apiWebdavProperties2/getFileProperties.feature:86 +apiWebdavProperties2/getFileProperties.feature:87 +apiWebdavProperties2/getFileProperties.feature:88 +apiWebdavProperties2/getFileProperties.feature:89 +apiWebdavProperties2/getFileProperties.feature:90 +apiWebdavProperties2/getFileProperties.feature:102 +apiWebdavProperties2/getFileProperties.feature:103 +apiWebdavProperties2/getFileProperties.feature:339 +apiWebdavProperties2/getFileProperties.feature:340 +apiWebdavUpload1/uploadFile.feature:20 +apiWebdavUpload1/uploadFile.feature:21 +apiWebdavUpload1/uploadFile.feature:22 +apiWebdavUpload1/uploadFile.feature:23 +apiWebdavUpload1/uploadFile.feature:24 +apiWebdavUpload1/uploadFile.feature:25 +apiWebdavUpload1/uploadFile.feature:26 +apiWebdavUpload1/uploadFile.feature:27 +apiWebdavUpload1/uploadFile.feature:123 +apiWebdavUpload1/uploadFile.feature:124 +apiWebdavUpload1/uploadFile.feature:125 +apiWebdavUpload1/uploadFile.feature:126 +apiWebdavUpload1/uploadFile.feature:127 +apiWebdavUpload1/uploadFile.feature:128 +apiWebdavUpload1/uploadFile.feature:129 +apiWebdavUpload1/uploadFile.feature:130 +apiWebdavUpload1/uploadFile.feature:131 +apiWebdavUpload1/uploadFile.feature:132 +apiWebdavUpload1/uploadFile.feature:133 +apiWebdavUpload1/uploadFile.feature:144 +apiWebdavUpload1/uploadFile.feature:145 +apiWebdavUpload1/uploadFile.feature:157 +apiWebdavUpload1/uploadFile.feature:158 +apiWebdavUpload1/uploadFile.feature:171 +apiWebdavUpload1/uploadFile.feature:172 +apiWebdavUpload1/uploadFile.feature:184 +apiWebdavUpload1/uploadFile.feature:185 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:115 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:116 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:153 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:154 diff --git a/reva/tests/acceptance/expected-failures-on-OWNCLOUD-storage.txt b/reva/tests/acceptance/expected-failures-on-OWNCLOUD-storage.txt new file mode 100644 index 0000000000..03c43582d4 --- /dev/null +++ b/reva/tests/acceptance/expected-failures-on-OWNCLOUD-storage.txt @@ -0,0 +1,1060 @@ +# this file contains the scenarios from ownCloud10 core API tests that are currently expected to fail +# when run with OC storage +# +# test scenarios that specifically fail with OC storage (that were tagged skipOnOcis-OC-Storage in core) +# +apiShareOperations/gettingShares.feature:155 +apiShareOperations/gettingShares.feature:156 +apiSharePublicLink2/multilinkSharing.feature:181 +apiWebdavProperties1/setFileProperties.feature:32 +apiWebdavProperties1/setFileProperties.feature:33 +# +# https://github.com/owncloud/ocis-reva/issues/196 Checksum feature +apiMain/checksums.feature:24 +apiMain/checksums.feature:25 +apiMain/checksums.feature:35 +apiMain/checksums.feature:36 +apiMain/checksums.feature:46 +apiMain/checksums.feature:47 +apiMain/checksums.feature:50 +apiMain/checksums.feature:58 +apiMain/checksums.feature:67 +apiMain/checksums.feature:99 +apiMain/checksums.feature:100 +apiMain/checksums.feature:103 +apiMain/checksums.feature:110 +apiMain/checksums.feature:119 +apiMain/checksums.feature:129 +apiMain/checksums.feature:138 +apiMain/checksums.feature:147 +apiMain/checksums.feature:158 +apiMain/checksums.feature:174 +apiMain/checksums.feature:192 +apiMain/checksums.feature:217 +apiMain/checksums.feature:218 +apiMain/checksums.feature:239 +apiMain/checksums.feature:240 +apiMain/checksums.feature:258 +apiMain/checksums.feature:279 +apiMain/checksums.feature:280 +apiMain/checksums.feature:295 +apiMain/checksums.feature:296 +apiMain/checksums.feature:308 +apiMain/checksums.feature:309 +apiMain/checksums.feature:312 +apiMain/checksums.feature:324 +# +# https://github.com/owncloud/ocis-reva/issues/100 no robots.txt available +apiMain/main.feature:5 +# +# https://github.com/owncloud/ocis-reva/issues/101 quota query +apiMain/quota.feature:9 +apiMain/quota.feature:16 +apiMain/quota.feature:23 +apiMain/quota.feature:30 +apiMain/quota.feature:41 +apiMain/quota.feature:54 +apiMain/quota.feature:68 +apiMain/quota.feature:82 +apiMain/quota.feature:99 +apiMain/quota.feature:112 +# +# https://github.com/owncloud/ocis-reva/issues/65 There is no such thing like a "super-user" +# https://github.com/owncloud/ocis-reva/issues/97 no command equivalent to occ +apiMain/status.feature:5 +# +# https://github.com/owncloud/ocis-reva/issues/29 ocs config endpoint only accessible by authorized users +# https://github.com/owncloud/ocis-reva/issues/30 HTTP 401 Unauthorized responses don't contain a body +apiAuthOcs/ocsDELETEAuth.feature:9 +apiAuthOcs/ocsGETAuth.feature:10 +apiAuthOcs/ocsGETAuth.feature:33 +apiAuthOcs/ocsGETAuth.feature:53 +apiAuthOcs/ocsGETAuth.feature:88 +apiAuthOcs/ocsGETAuth.feature:121 +apiAuthOcs/ocsGETAuth.feature:139 +apiAuthOcs/ocsPOSTAuth.feature:10 +apiAuthOcs/ocsPUTAuth.feature:10 +# +# https://github.com/owncloud/ocis-reva/issues/13 server returns 500 when trying to access a not existing file +apiAuthWebDav/webDavDELETEAuth.feature:36 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavLOCKAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavMKCOLAuth.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiAuthWebDav/webDavMOVEAuth.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/179 send POST requests to another user's webDav endpoints as normal user +apiAuthWebDav/webDavPOSTAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavPROPFINDAuth.feature:37 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavPROPPATCHAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/9 users can access each-others data using the new webdav API +apiAuthWebDav/webDavPUTAuth.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/175 Default capabilities for normal user not same as in oC-core +# https://github.com/owncloud/ocis-reva/issues/176 Difference in response content of status.php and default capabilities +apiCapabilities/capabilitiesWithNormalUser.feature:11 +# +# https://github.com/owncloud/ocis-reva/issues/39 REPORT request not implemented +apiFavorites/favorites.feature:228 +apiFavorites/favorites.feature:229 +# +# https://github.com/owncloud/ocis-reva/issues/34 groups endpoint does not exist +apiSharees/sharees.feature:32 +apiSharees/sharees.feature:33 +apiSharees/sharees.feature:53 +apiSharees/sharees.feature:54 +apiSharees/sharees.feature:74 +apiSharees/sharees.feature:75 +apiSharees/sharees.feature:98 +apiSharees/sharees.feature:99 +apiSharees/sharees.feature:118 +apiSharees/sharees.feature:119 +apiSharees/sharees.feature:137 +apiSharees/sharees.feature:138 +apiSharees/sharees.feature:157 +apiSharees/sharees.feature:158 +apiSharees/sharees.feature:177 +apiSharees/sharees.feature:178 +apiSharees/sharees.feature:198 +apiSharees/sharees.feature:199 +apiSharees/sharees.feature:217 +apiSharees/sharees.feature:218 +apiSharees/sharees.feature:237 +apiSharees/sharees.feature:238 +apiSharees/sharees.feature:257 +apiSharees/sharees.feature:258 +apiSharees/sharees.feature:277 +apiSharees/sharees.feature:278 +apiSharees/sharees.feature:297 +apiSharees/sharees.feature:298 +apiSharees/sharees.feature:317 +apiSharees/sharees.feature:318 +apiSharees/sharees.feature:336 +apiSharees/sharees.feature:337 +apiSharees/sharees.feature:355 +apiSharees/sharees.feature:356 +apiSharees/sharees.feature:374 +apiSharees/sharees.feature:375 +apiSharees/sharees.feature:393 +apiSharees/sharees.feature:394 +apiSharees/sharees.feature:412 +apiSharees/sharees.feature:413 +apiSharees/sharees.feature:430 +apiSharees/sharees.feature:431 +apiSharees/sharees.feature:450 +apiSharees/sharees.feature:451 +apiSharees/sharees.feature:475 +apiSharees/sharees.feature:476 +apiSharees/sharees.feature:495 +apiSharees/sharees.feature:496 +apiSharees/sharees.feature:515 +apiSharees/sharees.feature:516 +apiSharees/sharees.feature:537 +apiSharees/sharees.feature:538 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set (shareapi_auto_accept_share) +apiShareManagement/acceptShares.feature:333 +apiShareManagement/acceptShares.feature:415 +apiShareManagement/acceptShares.feature:416 +apiShareManagement/acceptShares.feature:417 +apiShareManagement/acceptShares.feature:418 +apiShareManagement/acceptShares.feature:419 +apiShareManagement/acceptShares.feature:421 +apiShareManagement/acceptShares.feature:436 +apiShareManagement/acceptShares.feature:458 +apiShareManagement/acceptShares.feature:477 +apiShareManagement/acceptShares.feature:511 +apiShareManagement/acceptShares.feature:542 +apiShareManagement/acceptShares.feature:561 +apiShareManagement/acceptShares.feature:582 +apiShareManagement/acceptShares.feature:652 +apiShareManagement/acceptShares.feature:696 +# +# https://github.com/owncloud/product/issues/208 After accepting a share data in the received file cannot be downloaded +apiShareManagement/acceptSharesToSharesFolder.feature:15 +# +# https://github.com/owncloud/product/issues/207 Response is empty when accepting a share +apiShareManagement/acceptSharesToSharesFolder.feature:30 +apiShareManagement/acceptSharesToSharesFolder.feature:52 +# +# https://github.com/owncloud/ocis-reva/issues/34 groups endpoint does not exist +# https://github.com/owncloud/ocis-reva/issues/243 Sharing seems to work but does not work +# https://github.com/owncloud/ocis-reva/issues/372 Listing shares via ocs API does not show path for parent folders +# https://github.com/owncloud/ocis-reva/issues/356 Fields missing in delete share OCS response +# https://github.com/owncloud/product/issues/203 file_target in share response +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:36 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:37 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:66 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:67 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:91 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:92 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:94 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:95 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:97 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:98 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:100 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:101 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:115 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:116 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:130 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:131 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:155 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:156 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:179 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:180 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:204 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:205 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:234 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:235 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:254 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:255 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:284 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:285 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:299 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:300 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:316 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:317 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:332 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:333 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:350 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:351 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:355 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:380 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:445 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:446 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:481 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:482 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:485 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:513 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:531 +apiShareToSharesManagementBasic/createShareToSharesFolder.feature:549 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:28 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:29 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:43 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:44 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:46 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:58 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:72 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:89 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:107 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:118 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:130 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:163 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:164 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:165 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:166 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:181 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:182 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:183 +apiShareToSharesManagementBasic/deleteShareFromShares.feature:184 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:42 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:43 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:69 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:70 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:97 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:98 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:135 +apiShareToSharesManagementBasic/excludeGroupFromReceivingSharesToSharesFolder.feature:136 +# +# https://github.com/owncloud/ocis-reva/issues/260 Sharee retrieves the information about a share -but gets response containing all the shares +apiShareOperations/accessToShare.feature:48 +apiShareOperations/accessToShare.feature:49 +# +# https://github.com/owncloud/ocis-reva/issues/262 Shares are not deleted when user is deleted +apiShareOperations/gettingShares.feature:21 +apiShareOperations/gettingShares.feature:22 +# +# https://github.com/owncloud/ocis-reva/issues/65 There is no such thing like a "super-user" +apiShareOperations/gettingShares.feature:34 +apiShareOperations/gettingShares.feature:35 +# +# https://github.com/owncloud/ocis-reva/issues/357 Delete shares from user when user is deleted +# https://github.com/owncloud/ocis-reva/issues/301 no displayname_owner shown when creating a share +# https://github.com/owncloud/ocis-reva/issues/302 when sharing a file mime-type field is set to application/octet-stream +apiShareOperations/gettingShares.feature:124 +apiShareOperations/gettingShares.feature:125 +# +# https://github.com/owncloud/ocis-reva/issues/374 OCS error message for attempting to access share via share id as an unauthorized user is not informative +apiShareOperations/gettingShares.feature:168 +apiShareOperations/gettingShares.feature:169 +# +# https://github.com/owncloud/ocis-reva/issues/372 Listing shares via ocs API does not show path for parent folders +apiShareOperations/gettingShares.feature:204 +apiShareOperations/gettingShares.feature:205 +# +# https://github.com/owncloud/ocis-reva/issues/47 cannot get ocs:share-permissions via WebDAV +apiShareOperations/getWebDAVSharePermissions.feature:21 +apiShareOperations/getWebDAVSharePermissions.feature:22 +apiShareOperations/getWebDAVSharePermissions.feature:134 +apiShareOperations/getWebDAVSharePermissions.feature:135 +# +# https://github.com/owncloud/ocis-reva/issues/282 Split old public API webdav tests from new public webdav tests +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/accessToPublicLinkShare.feature:10 +apiSharePublicLink1/accessToPublicLinkShare.feature:20 +apiSharePublicLink1/accessToPublicLinkShare.feature:30 +apiSharePublicLink1/accessToPublicLinkShare.feature:43 +apiSharePublicLink1/changingPublicLinkShare.feature:22 +apiSharePublicLink1/changingPublicLinkShare.feature:23 +apiSharePublicLink1/changingPublicLinkShare.feature:37 +apiSharePublicLink1/changingPublicLinkShare.feature:41 +apiSharePublicLink1/changingPublicLinkShare.feature:52 +apiSharePublicLink1/changingPublicLinkShare.feature:63 +apiSharePublicLink1/changingPublicLinkShare.feature:85 +apiSharePublicLink1/changingPublicLinkShare.feature:96 +apiSharePublicLink1/changingPublicLinkShare.feature:107 +apiSharePublicLink1/changingPublicLinkShare.feature:151 +apiSharePublicLink1/changingPublicLinkShare.feature:197 +apiSharePublicLink1/changingPublicLinkShare.feature:244 +apiSharePublicLink1/changingPublicLinkShare.feature:267 +apiSharePublicLink1/changingPublicLinkShare.feature:278 +apiSharePublicLink1/changingPublicLinkShare.feature:289 +apiSharePublicLink1/changingPublicLinkShare.feature:300 +apiSharePublicLink1/createPublicLinkShare.feature:34 +apiSharePublicLink1/createPublicLinkShare.feature:35 +# +# https://github.com/owncloud/ocis-reva/issues/12 Range Header is not obeyed when downloading a file +apiSharePublicLink1/createPublicLinkShare.feature:63 +apiSharePublicLink1/createPublicLinkShare.feature:64 +# +apiSharePublicLink1/createPublicLinkShare.feature:95 +apiSharePublicLink1/createPublicLinkShare.feature:96 +# +# https://github.com/owncloud/ocis-reva/issues/199 Ability to return error messages in Webdav response bodies +apiSharePublicLink1/createPublicLinkShare.feature:127 +apiSharePublicLink1/createPublicLinkShare.feature:128 +# +apiSharePublicLink1/createPublicLinkShare.feature:155 +apiSharePublicLink1/createPublicLinkShare.feature:156 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/createPublicLinkShare.feature:183 +apiSharePublicLink1/createPublicLinkShare.feature:184 +# +apiSharePublicLink1/createPublicLinkShare.feature:214 +apiSharePublicLink1/createPublicLinkShare.feature:215 +# +# https://github.com/owncloud/ocis-reva/issues/12 Range Header is not obeyed when downloading a file +apiSharePublicLink1/createPublicLinkShare.feature:245 +apiSharePublicLink1/createPublicLinkShare.feature:246 +# +apiSharePublicLink1/createPublicLinkShare.feature:276 +apiSharePublicLink1/createPublicLinkShare.feature:277 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/createPublicLinkShare.feature:307 +apiSharePublicLink1/createPublicLinkShare.feature:308 +# +apiSharePublicLink1/createPublicLinkShare.feature:370 +apiSharePublicLink1/createPublicLinkShare.feature:371 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:389 +apiSharePublicLink1/createPublicLinkShare.feature:390 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:411 +apiSharePublicLink1/createPublicLinkShare.feature:413 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:435 +apiSharePublicLink1/createPublicLinkShare.feature:437 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:461 +apiSharePublicLink1/createPublicLinkShare.feature:463 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:487 +apiSharePublicLink1/createPublicLinkShare.feature:489 +apiSharePublicLink1/createPublicLinkShare.feature:491 +apiSharePublicLink1/createPublicLinkShare.feature:493 +apiSharePublicLink1/createPublicLinkShare.feature:495 +apiSharePublicLink1/createPublicLinkShare.feature:497 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:518 +apiSharePublicLink1/createPublicLinkShare.feature:519 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:534 +apiSharePublicLink1/createPublicLinkShare.feature:535 +# +apiSharePublicLink1/createPublicLinkShare.feature:553 +apiSharePublicLink1/createPublicLinkShare.feature:554 +# +apiSharePublicLink1/createPublicLinkShare.feature:590 +apiSharePublicLink1/createPublicLinkShare.feature:591 +# +# https://github.com/owncloud/ocis-reva/issues/283 Prevent creating public share for the home root folder +apiSharePublicLink1/createPublicLinkShare.feature:620 +apiSharePublicLink1/createPublicLinkShare.feature:621 +# +apiSharePublicLink1/createPublicLinkShare.feature:634 +apiSharePublicLink1/createPublicLinkShare.feature:635 +# +apiSharePublicLink1/createPublicLinkShare.feature:663 +apiSharePublicLink1/createPublicLinkShare.feature:664 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink1/createPublicLinkShare.feature:714 +apiSharePublicLink1/createPublicLinkShare.feature:715 +# +# https://github.com/owncloud/ocis-reva/issues/199 Ability to return error messages in Webdav response bodies +apiSharePublicLink1/createPublicLinkShare.feature:718 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink1/createPublicLinkShare.feature:727 +# +# https://github.com/owncloud/core/issues/37605 Public cannot upload file with mtime set on a public link share with new version of WebDAV API +apiSharePublicLink1/createPublicLinkShare.feature:779 +# +# https://github.com/owncloud/core/issues/37605 Public cannot upload file with mtime set on a public link share with new version of WebDAV API +apiSharePublicLink1/createPublicLinkShare.feature:793 +# +# https://github.com/owncloud/ocis-reva/issues/311 Deleting a public link after renaming a file +apiSharePublicLink1/deletePublicLinkShare.feature:37 +apiSharePublicLink1/deletePublicLinkShare.feature:38 +# +# https://github.com/owncloud/ocis-reva/issues/373 copying a folder within a public link folder to folder with same name as an already existing file overwrites the parent file +apiSharePublicLink2/copyFromPublicLink.feature:60 +# +# https://github.com/owncloud/ocis-reva/issues/368 copying a file from within a public link folder to "/" overwrites the parent folder +apiSharePublicLink2/copyFromPublicLink.feature:167 +apiSharePublicLink2/copyFromPublicLink.feature:168 +# +# https://github.com/owncloud/ocis-reva/issues/368 copying a file from within a public link folder to "/" overwrites the parent folder +apiSharePublicLink2/copyFromPublicLink.feature:183 +apiSharePublicLink2/copyFromPublicLink.feature:184 +# +apiSharePublicLink2/updatePublicLinkShare.feature:94 +apiSharePublicLink2/updatePublicLinkShare.feature:95 +# +apiSharePublicLink2/updatePublicLinkShare.feature:285 +apiSharePublicLink2/updatePublicLinkShare.feature:286 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:304 +apiSharePublicLink2/updatePublicLinkShare.feature:305 +# +apiSharePublicLink2/updatePublicLinkShare.feature:323 +apiSharePublicLink2/updatePublicLinkShare.feature:324 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:342 +apiSharePublicLink2/updatePublicLinkShare.feature:343 +# +apiSharePublicLink2/updatePublicLinkShare.feature:361 +apiSharePublicLink2/updatePublicLinkShare.feature:362 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:380 +apiSharePublicLink2/updatePublicLinkShare.feature:381 +# +apiSharePublicLink2/updatePublicLinkShare.feature:399 +apiSharePublicLink2/updatePublicLinkShare.feature:400 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiSharePublicLink2/updatePublicLinkShare.feature:418 +apiSharePublicLink2/updatePublicLinkShare.feature:419 +# +apiSharePublicLink2/updatePublicLinkShare.feature:440 +apiSharePublicLink2/updatePublicLinkShare.feature:441 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink2/updatePublicLinkShare.feature:462 +apiSharePublicLink2/updatePublicLinkShare.feature:463 +# +apiSharePublicLink2/updatePublicLinkShare.feature:487 +apiSharePublicLink2/updatePublicLinkShare.feature:488 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:9 +# +# https://github.com/owncloud/ocis-reva/issues/286 Upload-only shares must not overwrite but create a separate file +apiSharePublicLink2/uploadToPublicLinkShare.feature:23 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:48 +apiSharePublicLink2/uploadToPublicLinkShare.feature:49 +# +# https://github.com/owncloud/ocis-reva/issues/290 Accessing non-existing public link should return 404, not 500 +apiSharePublicLink2/uploadToPublicLinkShare.feature:62 +apiSharePublicLink2/uploadToPublicLinkShare.feature:63 +# +# https://github.com/owncloud/ocis-reva/issues/290 Accessing non-existing public link should return 404, not 500 +apiSharePublicLink2/uploadToPublicLinkShare.feature:66 +# +# https://github.com/owncloud/ocis-reva/issues/292 Public link enforce permissions +apiSharePublicLink2/uploadToPublicLinkShare.feature:74 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:83 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:103 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:121 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:139 +# +# https://github.com/owncloud/ocis-reva/issues/195 Set quota over settings +apiSharePublicLink2/uploadToPublicLinkShare.feature:148 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:158 +# +# https://github.com/owncloud/ocis-reva/issues/195 Set quota over settings +apiSharePublicLink2/uploadToPublicLinkShare.feature:167 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:177 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink2/uploadToPublicLinkShare.feature:186 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:196 +# +# https://github.com/owncloud/ocis-reva/issues/41 various sharing settings cannot be set +apiSharePublicLink2/uploadToPublicLinkShare.feature:206 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:217 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:238 +# +apiSharePublicLink2/uploadToPublicLinkShare.feature:255 +# +# https://github.com/owncloud/ocis-reva/issues/286 Upload-only shares must not overwrite but create a separate file +apiSharePublicLink2/uploadToPublicLinkShare.feature:273 +# +# https://github.com/owncloud/ocis-reva/issues/286 Upload-only shares must not overwrite but create a separate file +apiSharePublicLink2/uploadToPublicLinkShare.feature:273 +# +# https://github.com/owncloud/product/issues/179 Propfind to trashbin endpoint requires UUID +# https://github.com/owncloud/product/issues/178 File deletion using dav gives unique string in filename in the trashbin +apiTrashbin/trashbinDelete.feature:31 +apiTrashbin/trashbinDelete.feature:32 +apiTrashbin/trashbinDelete.feature:33 +apiTrashbin/trashbinDelete.feature:34 +apiTrashbin/trashbinDelete.feature:37 +apiTrashbin/trashbinDelete.feature:50 +apiTrashbin/trashbinDelete.feature:67 +# +# https://github.com/owncloud/product/issues/179 Propfind to trashbin endpoint requires UUID +# https://github.com/owncloud/product/issues/178 File deletion using dav gives unique string in filename in the trashbin +apiTrashbin/trashbinFilesFolders.feature:44 +apiTrashbin/trashbinFilesFolders.feature:45 +apiTrashbin/trashbinFilesFolders.feature:60 +apiTrashbin/trashbinFilesFolders.feature:61 +apiTrashbin/trashbinFilesFolders.feature:89 +apiTrashbin/trashbinFilesFolders.feature:90 +apiTrashbin/trashbinFilesFolders.feature:104 +apiTrashbin/trashbinFilesFolders.feature:105 +apiTrashbin/trashbinFilesFolders.feature:136 +apiTrashbin/trashbinFilesFolders.feature:137 +apiTrashbin/trashbinFilesFolders.feature:217 +apiTrashbin/trashbinFilesFolders.feature:218 +apiTrashbin/trashbinFilesFolders.feature:235 +apiTrashbin/trashbinFilesFolders.feature:236 +apiTrashbin/trashbinFilesFolders.feature:259 +apiTrashbin/trashbinFilesFolders.feature:260 +apiTrashbin/trashbinFilesFolders.feature:273 +apiTrashbin/trashbinFilesFolders.feature:274 +apiTrashbin/trashbinFilesFolders.feature:287 +apiTrashbin/trashbinFilesFolders.feature:288 +# +# https://github.com/owncloud/product/issues/179 Propfind to trashbin endpoint requires UUID +# https://github.com/owncloud/product/issues/178 File deletion using dav gives unique string in filename in the trashbin +apiTrashbin/trashbinRestore.feature:31 +apiTrashbin/trashbinRestore.feature:32 +apiTrashbin/trashbinRestore.feature:62 +apiTrashbin/trashbinRestore.feature:63 +apiTrashbin/trashbinRestore.feature:76 +apiTrashbin/trashbinRestore.feature:77 +apiTrashbin/trashbinRestore.feature:92 +apiTrashbin/trashbinRestore.feature:93 +apiTrashbin/trashbinRestore.feature:112 +apiTrashbin/trashbinRestore.feature:113 +apiTrashbin/trashbinRestore.feature:114 +apiTrashbin/trashbinRestore.feature:115 +apiTrashbin/trashbinRestore.feature:116 +apiTrashbin/trashbinRestore.feature:117 +apiTrashbin/trashbinRestore.feature:141 +apiTrashbin/trashbinRestore.feature:142 +apiTrashbin/trashbinRestore.feature:143 +apiTrashbin/trashbinRestore.feature:144 +apiTrashbin/trashbinRestore.feature:165 +apiTrashbin/trashbinRestore.feature:166 +apiTrashbin/trashbinRestore.feature:188 +apiTrashbin/trashbinRestore.feature:189 +apiTrashbin/trashbinRestore.feature:206 +apiTrashbin/trashbinRestore.feature:207 +apiTrashbin/trashbinRestore.feature:279 +apiTrashbin/trashbinRestore.feature:280 +apiTrashbin/trashbinRestore.feature:323 +apiTrashbin/trashbinRestore.feature:324 +apiTrashbin/trashbinRestore.feature:325 +apiTrashbin/trashbinRestore.feature:326 +apiTrashbin/trashbinRestore.feature:327 +apiTrashbin/trashbinRestore.feature:328 +apiTrashbin/trashbinRestore.feature:343 +apiTrashbin/trashbinRestore.feature:344 +# +# https://github.com/owncloud/ocis-reva/issues/17 uploading with old-chunking does not work +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiVersions/fileVersions.feature:15 +apiVersions/fileVersions.feature:23 +apiVersions/fileVersions.feature:36 +apiVersions/fileVersions.feature:45 +apiVersions/fileVersions.feature:88 +apiVersions/fileVersions.feature:89 +apiVersions/fileVersions.feature:93 +apiVersions/fileVersions.feature:104 +apiVersions/fileVersions.feature:288 +apiVersions/fileVersions.feature:362 +apiVersions/fileVersions.feature:373 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFileAsync.feature:26 +apiWebdavMove1/moveFileAsync.feature:27 +apiWebdavMove1/moveFileAsync.feature:28 +apiWebdavMove1/moveFileAsync.feature:29 +apiWebdavMove1/moveFileAsync.feature:30 +apiWebdavMove1/moveFileAsync.feature:31 +apiWebdavMove1/moveFileAsync.feature:33 +apiWebdavMove1/moveFileAsync.feature:46 +apiWebdavMove1/moveFileAsync.feature:59 +apiWebdavMove1/moveFileAsync.feature:73 +apiWebdavMove1/moveFileAsync.feature:88 +apiWebdavMove1/moveFileAsync.feature:107 +apiWebdavMove1/moveFileAsync.feature:125 +apiWebdavMove1/moveFileAsync.feature:135 +apiWebdavMove1/moveFileAsync.feature:141 +apiWebdavMove1/moveFileAsync.feature:156 +apiWebdavMove1/moveFileAsync.feature:173 +apiWebdavMove1/moveFileAsync.feature:174 +apiWebdavMove1/moveFileAsync.feature:184 +apiWebdavMove1/moveFileAsync.feature:185 +apiWebdavMove1/moveFileAsync.feature:204 +apiWebdavMove1/moveFileAsync.feature:205 +apiWebdavMove1/moveFileAsync.feature:224 +apiWebdavMove1/moveFileAsync.feature:225 +apiWebdavMove1/moveFileAsync.feature:234 +apiWebdavMove1/moveFileAsync.feature:235 +apiWebdavMove1/moveFileAsync.feature:240 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:12 +apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:18 +apiWebdavMove1/moveFileToBlacklistedNameAsync.feature:26 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:12 +apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:19 +apiWebdavMove1/moveFileToExcludedDirectoryAsync.feature:27 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFolder.feature:21 +apiWebdavMove1/moveFolder.feature:22 +apiWebdavMove1/moveFolder.feature:34 +apiWebdavMove1/moveFolder.feature:35 +apiWebdavMove1/moveFolder.feature:47 +apiWebdavMove1/moveFolder.feature:48 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFolderToBlacklistedName.feature:21 +apiWebdavMove1/moveFolderToBlacklistedName.feature:22 +apiWebdavMove1/moveFolderToBlacklistedName.feature:35 +apiWebdavMove1/moveFolderToBlacklistedName.feature:36 +apiWebdavMove1/moveFolderToBlacklistedName.feature:70 +apiWebdavMove1/moveFolderToBlacklistedName.feature:71 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove1/moveFolderToExcludedDirectory.feature:21 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:22 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:34 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:35 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:70 +apiWebdavMove1/moveFolderToExcludedDirectory.feature:71 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove2/moveFile.feature:89 +apiWebdavMove2/moveFile.feature:90 +apiWebdavMove2/moveFile.feature:91 +apiWebdavMove2/moveFile.feature:92 +apiWebdavMove2/moveFile.feature:112 +apiWebdavMove2/moveFile.feature:113 +apiWebdavMove2/moveFile.feature:136 +apiWebdavMove2/moveFile.feature:137 +apiWebdavMove2/moveFile.feature:138 +apiWebdavMove2/moveFile.feature:139 +apiWebdavMove2/moveFile.feature:160 +apiWebdavMove2/moveFile.feature:161 +apiWebdavMove2/moveFile.feature:181 +apiWebdavMove2/moveFile.feature:182 +apiWebdavMove2/moveFile.feature:200 +apiWebdavMove2/moveFile.feature:201 +apiWebdavMove2/moveFile.feature:219 +apiWebdavMove2/moveFile.feature:220 +apiWebdavMove2/moveFile.feature:255 +apiWebdavMove2/moveFile.feature:256 +apiWebdavMove2/moveFile.feature:272 +apiWebdavMove2/moveFile.feature:273 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove2/moveFileToBlacklistedName.feature:18 +apiWebdavMove2/moveFileToBlacklistedName.feature:19 +apiWebdavMove2/moveFileToBlacklistedName.feature:29 +apiWebdavMove2/moveFileToBlacklistedName.feature:30 +apiWebdavMove2/moveFileToBlacklistedName.feature:62 +apiWebdavMove2/moveFileToBlacklistedName.feature:63 +# +# https://github.com/owncloud/ocis-reva/issues/14 renaming a resource does not work +apiWebdavMove2/moveFileToExcludedDirectory.feature:18 +apiWebdavMove2/moveFileToExcludedDirectory.feature:19 +apiWebdavMove2/moveFileToExcludedDirectory.feature:28 +apiWebdavMove2/moveFileToExcludedDirectory.feature:29 +apiWebdavMove2/moveFileToExcludedDirectory.feature:63 +apiWebdavMove2/moveFileToExcludedDirectory.feature:64 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavOperations/deleteFolder.feature:67 +apiWebdavOperations/deleteFolder.feature:68 +apiWebdavOperations/deleteFolder.feature:69 +apiWebdavOperations/deleteFolder.feature:70 +apiWebdavOperations/deleteFolder.feature:91 +apiWebdavOperations/deleteFolder.feature:92 +# +# https://github.com/owncloud/ocis-reva/issues/12 Range Header is not obeyed when downloading a file +apiWebdavOperations/downloadFile.feature:29 +apiWebdavOperations/downloadFile.feature:30 +# +apiWebdavOperations/downloadFile.feature:72 +apiWebdavOperations/downloadFile.feature:73 +# +apiWebdavOperations/downloadFile.feature:84 +apiWebdavOperations/downloadFile.feature:85 +# +apiWebdavOperations/refuseAccess.feature:21 +apiWebdavOperations/refuseAccess.feature:22 +# +apiWebdavOperations/refuseAccess.feature:33 +apiWebdavOperations/refuseAccess.feature:34 +# +# https://github.com/owncloud/ocis-reva/issues/39 REPORT request not implemented +apiWebdavOperations/search.feature:42 +apiWebdavOperations/search.feature:43 +apiWebdavOperations/search.feature:57 +apiWebdavOperations/search.feature:58 +apiWebdavOperations/search.feature:74 +apiWebdavOperations/search.feature:75 +apiWebdavOperations/search.feature:83 +apiWebdavOperations/search.feature:84 +apiWebdavOperations/search.feature:101 +apiWebdavOperations/search.feature:102 +apiWebdavOperations/search.feature:119 +apiWebdavOperations/search.feature:120 +apiWebdavOperations/search.feature:138 +apiWebdavOperations/search.feature:139 +apiWebdavOperations/search.feature:165 +apiWebdavOperations/search.feature:166 +apiWebdavOperations/search.feature:191 +apiWebdavOperations/search.feature:192 +apiWebdavOperations/search.feature:210 +apiWebdavOperations/search.feature:211 +apiWebdavOperations/search.feature:213 +apiWebdavOperations/search.feature:229 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties1/copyFile.feature:65 +apiWebdavProperties1/copyFile.feature:66 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties1/copyFile.feature:85 +apiWebdavProperties1/copyFile.feature:86 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavProperties1/copyFile.feature:102 +apiWebdavProperties1/copyFile.feature:103 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:116 +apiWebdavProperties1/copyFile.feature:117 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:129 +apiWebdavProperties1/copyFile.feature:130 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:146 +apiWebdavProperties1/copyFile.feature:147 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:165 +apiWebdavProperties1/copyFile.feature:166 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:202 +apiWebdavProperties1/copyFile.feature:203 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:350 +apiWebdavProperties1/copyFile.feature:351 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:370 +apiWebdavProperties1/copyFile.feature:371 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:395 +apiWebdavProperties1/copyFile.feature:396 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:422 +apiWebdavProperties1/copyFile.feature:423 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:448 +apiWebdavProperties1/copyFile.feature:449 +# +# https://github.com/owncloud/ocis-reva/issues/387 Getting information about a folder overwritten by a file gives 500 error instead of 404 +apiWebdavProperties1/copyFile.feature:474 +apiWebdavProperties1/copyFile.feature:475 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavProperties1/createFolder.feature:71 +apiWebdavProperties1/createFolder.feature:72 +# +# https://github.com/owncloud/ocis-reva/issues/168 creating a folder that already exists returns an empty body +apiWebdavProperties1/createFolder.feature:85 +apiWebdavProperties1/createFolder.feature:86 +# +# https://github.com/owncloud/ocis-reva/issues/168 creating a folder that already exists returns an empty body +apiWebdavProperties1/createFolder.feature:99 +apiWebdavProperties1/createFolder.feature:100 +# +# https://github.com/owncloud/ocis-reva/issues/101 quota query +apiWebdavProperties1/getQuota.feature:17 +apiWebdavProperties1/getQuota.feature:18 +apiWebdavProperties1/getQuota.feature:27 +apiWebdavProperties1/getQuota.feature:28 +apiWebdavProperties1/getQuota.feature:48 +apiWebdavProperties1/getQuota.feature:49 +apiWebdavProperties1/getQuota.feature:61 +apiWebdavProperties1/getQuota.feature:62 +apiWebdavProperties1/getQuota.feature:77 +apiWebdavProperties1/getQuota.feature:78 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties1/setFileProperties.feature:63 +apiWebdavProperties1/setFileProperties.feature:64 +# +# https://github.com/owncloud/ocis-reva/issues/214 XML properties in webdav response not properly encoded +apiWebdavProperties2/getFileProperties.feature:37 +apiWebdavProperties2/getFileProperties.feature:39 +apiWebdavProperties2/getFileProperties.feature:40 +apiWebdavProperties2/getFileProperties.feature:41 +apiWebdavProperties2/getFileProperties.feature:43 +apiWebdavProperties2/getFileProperties.feature:44 +# +# https://github.com/owncloud/ocis-reva/issues/214 XML properties in webdav response not properly encoded +apiWebdavProperties2/getFileProperties.feature:59 +apiWebdavProperties2/getFileProperties.feature:60 +apiWebdavProperties2/getFileProperties.feature:61 +apiWebdavProperties2/getFileProperties.feature:63 +apiWebdavProperties2/getFileProperties.feature:64 +apiWebdavProperties2/getFileProperties.feature:66 +apiWebdavProperties2/getFileProperties.feature:67 +apiWebdavProperties2/getFileProperties.feature:68 +apiWebdavProperties2/getFileProperties.feature:70 +apiWebdavProperties2/getFileProperties.feature:71 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:135 +apiWebdavProperties2/getFileProperties.feature:136 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:156 +apiWebdavProperties2/getFileProperties.feature:157 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:174 +apiWebdavProperties2/getFileProperties.feature:175 +# +# https://github.com/owncloud/ocis-reva/issues/11 listing received shares does not work +apiWebdavProperties2/getFileProperties.feature:206 +apiWebdavProperties2/getFileProperties.feature:207 +# +apiWebdavProperties2/getFileProperties.feature:218 +apiWebdavProperties2/getFileProperties.feature:219 +# +# https://github.com/owncloud/ocis-reva/issues/216 Private link support +apiWebdavProperties2/getFileProperties.feature:232 +apiWebdavProperties2/getFileProperties.feature:233 +# +# https://github.com/owncloud/ocis-reva/issues/163 trying to access a non-existing resource returns an empty body +apiWebdavProperties2/getFileProperties.feature:242 +apiWebdavProperties2/getFileProperties.feature:243 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:246 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:266 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:301 +apiWebdavProperties2/getFileProperties.feature:302 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:314 +apiWebdavProperties2/getFileProperties.feature:315 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:327 +apiWebdavProperties2/getFileProperties.feature:328 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:376 +apiWebdavProperties2/getFileProperties.feature:377 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:389 +apiWebdavProperties2/getFileProperties.feature:390 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:402 +apiWebdavProperties2/getFileProperties.feature:403 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:415 +apiWebdavProperties2/getFileProperties.feature:416 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:428 +apiWebdavProperties2/getFileProperties.feature:429 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:441 +apiWebdavProperties2/getFileProperties.feature:442 +# +# https://github.com/owncloud/ocis-reva/issues/217 Some failing tests with Webdav custom properties +apiWebdavProperties2/getFileProperties.feature:454 +apiWebdavProperties2/getFileProperties.feature:455 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload1/uploadFile.feature:112 +apiWebdavUpload1/uploadFile.feature:113 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:14 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:31 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:48 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:65 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:83 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:92 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:106 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:143 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:144 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:146 +apiWebdavUpload1/uploadFileAsyncUsingNewChunking.feature:159 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload1/uploadFileToBlacklistedName.feature:19 +apiWebdavUpload1/uploadFileToBlacklistedName.feature:20 +# +# https://github.com/owncloud/ocis-reva/issues/54 system configuration options missing +apiWebdavUpload1/uploadFileToBlacklistedName.feature:31 +apiWebdavUpload1/uploadFileToBlacklistedName.feature:32 +# +# https://github.com/owncloud/ocis-reva/issues/54 system configuration options missing +apiWebdavUpload1/uploadFileToBlacklistedName.feature:65 +apiWebdavUpload1/uploadFileToBlacklistedName.feature:66 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:14 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:23 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:47 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:48 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:49 +apiWebdavUpload1/uploadFileToBlacklistedNameAsyncUsingNewChunking.feature:52 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:20 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:21 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:33 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:34 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:69 +apiWebdavUpload1/uploadFileToExcludedDirectory.feature:70 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:14 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:24 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:49 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:50 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:51 +apiWebdavUpload1/uploadFileToExcludedDirectoryAsyncUsingNewChunking.feature:54 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:12 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:21 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:45 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:46 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:47 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingNewChunking.feature:50 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:13 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:20 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:37 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:38 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:39 +apiWebdavUpload2/uploadFileToBlacklistedNameUsingOldChunking.feature:42 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:12 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:22 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:47 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:48 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:49 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingNewChunking.feature:52 +# +# https://github.com/owncloud/ocis-reva/issues/15 blacklisted filenames like .htaccess & file.parts can be uploaded +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:13 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:21 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:39 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:40 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:41 +apiWebdavUpload2/uploadFileToExcludedDirectoryUsingOldChunking.feature:44 +# +# https://github.com/owncloud/ocis-reva/issues/56 remote.php/dav/uploads endpoint does not exist +apiWebdavUpload2/uploadFileUsingNewChunking.feature:12 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:29 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:43 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:57 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:79 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:85 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:94 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:98 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:106 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:135 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:136 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:137 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:157 +apiWebdavUpload2/uploadFileUsingNewChunking.feature:158 +# +# https://github.com/owncloud/ocis-reva/issues/17 uploading with old-chunking does not work +apiWebdavUpload2/uploadFileUsingOldChunking.feature:13 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:26 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:35 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:44 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:76 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:77 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:97 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:98 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:99 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:100 +apiWebdavUpload2/uploadFileUsingOldChunking.feature:101 diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsDELETEAuth.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsDELETEAuth.feature new file mode 100644 index 0000000000..8be10830f8 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsDELETEAuth.feature @@ -0,0 +1,27 @@ +@api +Feature: auth + + @issue-ocis-reva-30 @issue-ocis-reva-65 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: send DELETE requests to OCS endpoints as admin with wrong password + When the administrator requests these endpoints with "DELETE" using password "invalid" about user "Alice" + | endpoint | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending/123 | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares/pending/123 | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares/123 | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares/123 | + | /ocs/v2.php/apps/files_sharing/api/v1/shares/123 | + | /ocs/v1.php/apps/files_sharing/api/v1/shares/pending/123 | + | /ocs/v2.php/apps/files_sharing/api/v1/shares/pending/123 | + | /ocs/v1.php/cloud/apps/testing | + | /ocs/v2.php/cloud/apps/testing | + | /ocs/v1.php/cloud/groups/group1 | + | /ocs/v2.php/cloud/groups/group1 | + | /ocs/v1.php/cloud/users/%username% | + | /ocs/v2.php/cloud/users/%username% | + | /ocs/v1.php/cloud/users/%username%/groups | + | /ocs/v2.php/cloud/users/%username%/groups | + | /ocs/v1.php/cloud/users/%username%/subadmins | + | /ocs/v2.php/cloud/users/%username%/subadmins | + Then the HTTP status code of responses on all endpoints should be "401" + And the OCS status code of responses on all endpoints should be "notset" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsGETAuth.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsGETAuth.feature new file mode 100644 index 0000000000..d48ec88c0d --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsGETAuth.feature @@ -0,0 +1,112 @@ +@api +Feature: auth + + Background: + Given user "Alice" has been created with default attributes and skeleton files + + @issue-ocis-reva-29 + @issue-ocis-reva-30 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: using OCS anonymously + When a user requests these endpoints with "GET" and no authentication + | endpoint | + | /ocs/v1.php/apps/files_external/api/v1/mounts | + | /ocs/v2.php/apps/files_external/api/v1/mounts | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v1.php/apps/files_sharing/api/v1/shares | + | /ocs/v2.php/apps/files_sharing/api/v1/shares | + | /ocs/v1.php/cloud/apps | + | /ocs/v2.php/cloud/apps | + | /ocs/v1.php/cloud/groups | + | /ocs/v2.php/cloud/groups | + | /ocs/v1.php/cloud/users | + | /ocs/v2.php/cloud/users | + | /ocs/v1.php/config | + | /ocs/v2.php/config | + | /ocs/v1.php/privatedata/getattribute | + | /ocs/v2.php/privatedata/getattribute | + Then the HTTP status code of responses on all endpoints should be "401" + And the OCS status code of responses on all endpoints should be "notset" + + @issue-ocis-reva-11 + @issue-ocis-reva-30 + @issue-ocis-reva-31 + @issue-ocis-reva-32 + @issue-ocis-reva-33 + @issue-ocis-reva-34 + @issue-ocis-reva-35 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: using OCS with non-admin basic auth + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v1.php/apps/files_external/api/v1/mounts | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v1.php/privatedata/getattribute | + | /ocs/v1.php/cloud/groups | + | /ocs/v1.php/cloud/apps | + Then the HTTP status code of responses on all endpoints should be "200" + And the OCS status code of responses on all endpoints should be "998" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v1.php/config | + Then the HTTP status code of responses on all endpoints should be "200" + And the OCS status code of responses on all endpoints should be "100" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v2.php/apps/files_external/api/v1/mounts | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares/pending | + # | /ocs/v1.php/apps/files_sharing/api/v1/shares | 100 | 200 | + # | /ocs/v2.php/apps/files_sharing/api/v1/shares | 100 | 200 | + + | /ocs/v2.php/cloud/apps | + | /ocs/v2.php/cloud/groups | + | /ocs/v2.php/privatedata/getattribute | + Then the HTTP status code of responses on all endpoints should be "404" + And the OCS status code of responses on all endpoints should be "998" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v1.php/cloud/users | + Then the HTTP status code of responses on all endpoints should be "200" + And the OCS status code of responses on all endpoints should be "403" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v2.php/cloud/users | + Then the HTTP status code of responses on all endpoints should be "403" + And the OCS status code of responses on all endpoints should be "403" + When the user "Alice" requests these endpoints with "GET" with basic auth + | endpoint | + | /ocs/v2.php/config | + Then the HTTP status code of responses on all endpoints should be "200" + And the OCS status code of responses on all endpoints should be "200" + + @issue-ocis-reva-29 + @issue-ocis-reva-30 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: using OCS as normal user with wrong password + When user "Alice" requests these endpoints with "GET" using password "invalid" + | endpoint | + | /ocs/v1.php/apps/files_external/api/v1/mounts | + | /ocs/v2.php/apps/files_external/api/v1/mounts | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares/pending | + | /ocs/v1.php/apps/files_sharing/api/v1/shares | + | /ocs/v2.php/apps/files_sharing/api/v1/shares | + | /ocs/v1.php/cloud/apps | + | /ocs/v2.php/cloud/apps | + | /ocs/v1.php/cloud/groups | + | /ocs/v2.php/cloud/groups | + | /ocs/v1.php/cloud/users | + | /ocs/v2.php/cloud/users | + | /ocs/v1.php/config | + | /ocs/v2.php/config | + | /ocs/v1.php/privatedata/getattribute | + | /ocs/v2.php/privatedata/getattribute | + Then the HTTP status code of responses on all endpoints should be "401" + And the OCS status code of responses on all endpoints should be "notset" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsPOSTAuth.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsPOSTAuth.feature new file mode 100644 index 0000000000..3b3927e6e4 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsPOSTAuth.feature @@ -0,0 +1,35 @@ +@api +Feature: auth + + Background: + Given user "Alice" has been created with default attributes and skeleton files + + @issue-ocis-reva-30 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: send POST requests to OCS endpoints as normal user with wrong password + When user "Alice" requests these endpoints with "POST" including body "doesnotmatter" using password "invalid" about user "Alice" + | endpoint | + | /ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending/123 | + | /ocs/v2.php/apps/files_sharing/api/v1/remote_shares/pending/123 | + | /ocs/v1.php/apps/files_sharing/api/v1/shares | + | /ocs/v2.php/apps/files_sharing/api/v1/shares | + | /ocs/v1.php/apps/files_sharing/api/v1/shares/pending/123 | + | /ocs/v2.php/apps/files_sharing/api/v1/shares/pending/123 | + | /ocs/v1.php/cloud/apps/testing | + | /ocs/v2.php/cloud/apps/testing | + | /ocs/v1.php/cloud/groups | + | /ocs/v2.php/cloud/groups | + | /ocs/v1.php/cloud/users | + | /ocs/v2.php/cloud/users | + | /ocs/v1.php/cloud/users/%username%/groups | + | /ocs/v2.php/cloud/users/%username%/groups | + | /ocs/v1.php/cloud/users/%username%/subadmins | + | /ocs/v2.php/cloud/users/%username%/subadmins | + | /ocs/v1.php/person/check | + | /ocs/v2.php/person/check | + | /ocs/v1.php/privatedata/deleteattribute/testing/test | + | /ocs/v2.php/privatedata/deleteattribute/testing/test | + | /ocs/v1.php/privatedata/setattribute/testing/test | + | /ocs/v2.php/privatedata/setattribute/testing/test | + Then the HTTP status code of responses on all endpoints should be "401" + And the OCS status code of responses on all endpoints should be "notset" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsPUTAuth.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsPUTAuth.feature new file mode 100644 index 0000000000..b8e54da9a7 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthOcs-ocsPUTAuth.feature @@ -0,0 +1,18 @@ +@api +Feature: auth + + @issue-ocis-reva-30 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: send PUT request to OCS endpoints as admin with wrong password + When the administrator requests these endpoints with "PUT" with body "doesnotmatter" using password "invalid" about user "Alice" + | endpoint | + | /ocs/v1.php/cloud/users/%username% | + | /ocs/v2.php/cloud/users/%username% | + | /ocs/v1.php/cloud/users/%username%/disable | + | /ocs/v2.php/cloud/users/%username%/disable | + | /ocs/v1.php/cloud/users/%username%/enable | + | /ocs/v2.php/cloud/users/%username%/enable | + | /ocs/v1.php/apps/files_sharing/api/v1/shares/123 | + | /ocs/v2.php/apps/files_sharing/api/v1/shares/123 | + Then the HTTP status code of responses on all endpoints should be "401" + And the OCS status code of responses on all endpoints should be "notset" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiAuthWebDav-webDavLOCKAuth.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthWebDav-webDavLOCKAuth.feature new file mode 100644 index 0000000000..fe5c1c6751 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthWebDav-webDavLOCKAuth.feature @@ -0,0 +1,21 @@ +@api +Feature: LOCK file/folder + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "some data" to "/textfile0.txt" + And user "Alice" has uploaded file with content "some data" to "/textfile1.txt" + And user "Alice" has created folder "/PARENT" + And user "Alice" has created folder "/FOLDER" + And user "Alice" has uploaded file with content "some data" to "/PARENT/parent.txt" + And user "Brian" has been created with default attributes and without skeleton files + + @issue-ocis-reva-9 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: send LOCK requests to another user's webDav endpoints as normal user + When user "Brian" requests these endpoints with "LOCK" to get property "d:shared" about user "Alice" + | endpoint | + | /remote.php/dav/files/%username%/textfile0.txt | + | /remote.php/dav/files/%username%/PARENT | + | /remote.php/dav/files/%username%/PARENT/parent.txt | + Then the HTTP status code of responses on all endpoints should be "200" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiAuthWebDav-webDavMOVEAuth.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthWebDav-webDavMOVEAuth.feature new file mode 100644 index 0000000000..c2291fc5ed --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthWebDav-webDavMOVEAuth.feature @@ -0,0 +1,20 @@ +@api +Feature: MOVE file/folder + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "some data" to "/textfile0.txt" + And user "Alice" has created folder "/PARENT" + And user "Alice" has created folder "/FOLDER" + And user "Alice" has uploaded file with content "some data" to "/PARENT/parent.txt" + And user "Brian" has been created with default attributes and without skeleton files + + @issue-ocis-reva-14 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: send MOVE requests to another user's webDav endpoints as normal user + When user "Brian" requests these endpoints with "MOVE" including body "doesnotmatter" about user "Alice" + | endpoint | + | /remote.php/dav/files/%username%/textfile0.txt | + | /remote.php/dav/files/%username%/PARENT | + | /remote.php/dav/files/%username%/PARENT/parent.txt | + Then the HTTP status code of responses on all endpoints should be "400" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiAuthWebDav-webDavPROPFINDAuth.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthWebDav-webDavPROPFINDAuth.feature new file mode 100644 index 0000000000..478ab74660 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiAuthWebDav-webDavPROPFINDAuth.feature @@ -0,0 +1,20 @@ +@api +Feature: get file info using PROPFIND + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "some data" to "/textfile0.txt" + And user "Alice" has created folder "/PARENT" + And user "Alice" has created folder "/FOLDER" + And user "Alice" has uploaded file with content "some data" to "/PARENT/parent.txt" + And user "Brian" has been created with default attributes and without skeleton files + + @issue-ocis-reva-9 @skipOnOcis-EOS-Storage @issue-ocis-reva-303 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: send PROPFIND requests to another user's webDav endpoints as normal user + When user "Brian" requests these endpoints with "PROPFIND" to get property "d:getetag" about user "Alice" + | endpoint | + | /remote.php/dav/files/%username%/textfile0.txt | + | /remote.php/dav/files/%username%/PARENT | + | /remote.php/dav/files/%username%/PARENT/parent.txt | + Then the HTTP status code of responses on all endpoints should be "207" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiCapabilities-capabilitiesWithNormalUser.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiCapabilities-capabilitiesWithNormalUser.feature new file mode 100644 index 0000000000..cf833d5b24 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiCapabilities-capabilitiesWithNormalUser.feature @@ -0,0 +1,48 @@ +@api @files_sharing-app-required +Feature: default capabilities for normal user + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and without skeleton files + + @issue-ocis-reva-175 @issue-ocis-reva-176 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: getting default capabilities with normal user + When user "Alice" retrieves the capabilities using the capabilities API + Then the capabilities should contain + | capability | path_to_element | value | + | core | pollinterval | 60 | + | core | webdav-root | remote.php/webdav | + | core | status@@@edition | %edition% | + | core | status@@@productname | reva | + | core | status@@@version | 10.0.11.5 | + | core | status@@@versionstring | 10.0.11 | + | files_sharing | api_enabled | 1 | + | files_sharing | default_permissions | 22 | + | files_sharing | search_min_length | 3 | + | files_sharing | public@@@enabled | 1 | + | files_sharing | public@@@multiple | 1 | + | files_sharing | public@@@upload | 1 | + | files_sharing | public@@@supports_upload_only | 1 | + | files_sharing | public@@@send_mail | 1 | + | files_sharing | public@@@social_share | 1 | + | files_sharing | public@@@enforced | EMPTY | + | files_sharing | public@@@enforced_for@@@read_only | EMPTY | + | files_sharing | public@@@enforced_for@@@read_write | EMPTY | + | files_sharing | public@@@enforced_for@@@upload_only | EMPTY | + | files_sharing | public@@@enforced_for@@@read_write_delete | EMPTY | + | files_sharing | public@@@expire_date@@@enabled | 1 | + | files_sharing | public@@@defaultPublicLinkShareName | EMPTY | + | files_sharing | resharing | 1 | + | files_sharing | federation@@@outgoing | 1 | + | files_sharing | federation@@@incoming | 1 | + | files_sharing | group_sharing | 1 | + | files_sharing | share_with_group_members_only | 1 | + | files_sharing | share_with_membership_groups_only | 1 | + | files_sharing | auto_accept_share | 1 | + | files_sharing | user_enumeration@@@enabled | 1 | + | files_sharing | user_enumeration@@@group_members_only | 1 | + | files_sharing | user@@@send_mail | 1 | + | files | bigfilechunking | 0 | + | files | privateLinks | 0 | + | files | privateLinksDetailsParam | EMPTY | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiFavorites-favorites.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiFavorites-favorites.feature new file mode 100644 index 0000000000..95f9a387a2 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiFavorites-favorites.feature @@ -0,0 +1,25 @@ +@api +Feature: favorite + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "some data" to "/textfile0.txt" + And user "Alice" has uploaded file with content "some data" to "/textfile1.txt" + And user "Alice" has uploaded file with content "some data" to "/textfile2.txt" + And user "Alice" has uploaded file with content "some data" to "/textfile3.txt" + And user "Alice" has uploaded file with content "some data" to "/textfile4.txt" + And user "Alice" has created folder "/FOLDER" + And user "Alice" has created folder "/PARENT" + And user "Alice" has uploaded file with content "some data" to "/PARENT/parent.txt" + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-ocis-reva-276 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Favorite a folder + Given using DAV path + When user "Alice" favorites element "/FOLDER" using the WebDAV API + Then the HTTP status code should be "500" + Examples: + | dav_version | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiMain-checksums.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiMain-checksums.feature new file mode 100644 index 0000000000..d536985657 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiMain-checksums.feature @@ -0,0 +1,57 @@ +@api +Feature: checksums + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + + @issue-ocis-reva-98 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Uploading a file with checksum should return the checksum in the download header + Given using DAV path + And user "Alice" has uploaded file "filesForUpload/textfile.txt" to "/myChecksumFile.txt" with checksum "MD5:d70b40f177b14b470d1756a3c12b963a" + When user "Alice" downloads file "/myChecksumFile.txt" using the WebDAV API + Then the following headers should not be set + | header | + | OC-Checksum | + Examples: + | dav_version | + | old | + | new | + + @issue-ocis-reva-98 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Copying file with checksum should return the checksum in the download header using new DAV path + Given using new DAV path + And user "Alice" has uploaded file "filesForUpload/textfile.txt" to "/myChecksumFile.txt" with checksum "MD5:d70b40f177b14b470d1756a3c12b963a" + When user "Alice" copies file "/myChecksumFile.txt" to "/myChecksumFileCopy.txt" using the WebDAV API + And user "Alice" downloads file "/myChecksumFileCopy.txt" using the WebDAV API + Then the following headers should not be set + | header | + | OC-Checksum | + + @issue-ocis-reva-99 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Upload a file where checksum does not match + Given using DAV path + When user "Alice" uploads file with checksum "SHA1:f005ba11" and content "Some Text" to "/chksumtst.txt" using the WebDAV API + Then the HTTP status code should be "201" + And user "Alice" should see the following elements + | /chksumtst.txt | + Examples: + | dav_version | + | old | + | new | + + @issue-ocis-reva-99 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Uploaded file should have the same checksum when downloaded + Given using DAV path + And user "Alice" has uploaded file with checksum "SHA1:ce5582148c6f0c1282335b87df5ed4be4b781399" and content "Some Text" to "/chksumtst.txt" + When user "Alice" downloads file "/chksumtst.txt" using the WebDAV API + Then the following headers should not be set + | header | + | OC-Checksum | + Examples: + | dav_version | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiMain-main.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiMain-main.feature new file mode 100644 index 0000000000..9c4ad50f95 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiMain-main.feature @@ -0,0 +1,8 @@ +@api +Feature: Other tests related to api + + @issue-ocis-reva-100 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: robots.txt file should be accessible + When a user requests "/robots.txt" with "GET" and no authentication + Then the HTTP status code should be "401" or "404" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiShareCreateSpecial2-createShareWithInvalidPermissions.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiShareCreateSpecial2-createShareWithInvalidPermissions.feature new file mode 100644 index 0000000000..8d08de8b99 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiShareCreateSpecial2-createShareWithInvalidPermissions.feature @@ -0,0 +1,45 @@ +@api @files_sharing-app-required @issue-ocis-reva-243 +Feature: cannot share resources with invalid permissions + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "some data" to "/textfile0.txt" + And user "Alice" has created folder "/PARENT" + + @issue-ocis-reva-45 @issue-ocis-reva-243 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Cannot create a share of a file with a user with only create permission + Given using OCS API version "" + And user "Brian" has been created with default attributes and without skeleton files + When user "Alice" creates a share using the sharing API with settings + | path | textfile0.txt | + | shareWith | Brian | + | shareType | user | + | permissions | create | + Then the OCS status code should be "" or "" + And the HTTP status code should be "" or "" + And as "Brian" entry "textfile0.txt" should not exist + Examples: + | ocs_api_version | ocs_status_code | eos_status_code | http_status_code_ocs | http_status_code_eos | + | 1 | 100 | 996 | 200 | 500 | + | 2 | 200 | 996 | 200 | 500 | + + @issue-ocis-reva-45 @issue-ocis-reva-243 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Cannot create a share of a file with a user with only (create,delete) permission + Given using OCS API version "" + And user "Brian" has been created with default attributes and without skeleton files + When user "Alice" creates a share using the sharing API with settings + | path | textfile0.txt | + | shareWith | Brian | + | shareType | user | + | permissions | | + Then the OCS status code should be "" or "" + And the HTTP status code should be "" or "" + And as "Brian" entry "textfile0.txt" should not exist + Examples: + | ocs_api_version | eos_status_code | ocs_status_code | http_status_code_ocs | http_status_code_eos | permissions | + | 1 | 100 | 996 | 200 | 500 | delete | + | 2 | 200 | 996 | 200 | 500 | delete | + | 1 | 100 | 996 | 200 | 500 | create,delete | + | 2 | 200 | 996 | 200 | 500 | create,delete | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiShareManagementBasic-createShare.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiShareManagementBasic-createShare.feature new file mode 100644 index 0000000000..772938353d --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiShareManagementBasic-createShare.feature @@ -0,0 +1,117 @@ +@api @files_sharing-app-required +Feature: sharing + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "ownCloud test text file 0" to "/textfile0.txt" + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-ocis-reva-301 @issue-ocis-reva-302 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Creating a share of a file with a user and asking for various permission combinations + Given using OCS API version "" + And user "Brian" has been created with default attributes and without skeleton files + When user "Alice" shares file "textfile0.txt" with user "Brian" with permissions using the sharing API + Then the OCS status code should be "" + And the HTTP status code should be "200" + And the fields of the last response to user "Alice" sharing with user "Brian" should include + | share_with | %username% | + | file_target | /textfile0.txt | + | path | /textfile0.txt | + | permissions | | + | uid_owner | %username% | + | displayname_owner | | + | item_type | file | + | mimetype | application/octet-stream | + | storage_id | ANY_VALUE | + | share_type | user | + And the fields of the last response should not include + | share_with_displayname | %displayname% | + Examples: + | ocs_api_version | requested_permissions | granted_permissions | ocs_status_code | + # Ask for full permissions. You get share plus read plus update. create and delete do not apply to shares of a file + | 1 | 31 | 19 | 100 | + | 2 | 31 | 19 | 200 | + # Ask for read, share (17), create and delete. You get share plus read + | 1 | 29 | 17 | 100 | + | 2 | 29 | 17 | 200 | + # Ask for read, update, create, delete. You get read plus update. + | 1 | 15 | 3 | 100 | + | 2 | 15 | 3 | 200 | + # Ask for just update. You get exactly update (you do not get read or anything else) + | 1 | 2 | 2 | 100 | + | 2 | 2 | 2 | 200 | + + @issue-ocis-reva-243 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: more tests to demonstrate different ocis-reva issue 243 behaviours + Given using OCS API version "" + And user "Brian" has been created with default attributes and without skeleton files + And user "Alice" has created folder "/home" + And user "Alice" has uploaded file with content "Random data" to "/home/randomfile.txt" + When user "Alice" shares file "/home/randomfile.txt" with user "Brian" using the sharing API + And the HTTP status code should be "" or "" + And as "Brian" file "randomfile.txt" should not exist + Examples: + | ocs_api_version | http_status_code_ocs | http_status_code_eos | + | 1 | 200 | 500 | + | 2 | 200 | 500 | + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-ocis-reva-301 @issue-ocis-reva-302 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Creating a share of a folder with a user, the default permissions are all permissions(31) + Given using OCS API version "" + And user "Brian" has been created with default attributes and without skeleton files + And user "Alice" has created folder "/FOLDER" + When user "Alice" shares folder "/FOLDER" with user "Brian" using the sharing API + Then the OCS status code should be "" + And the HTTP status code should be "200" + And the fields of the last response to user "Alice" sharing with user "Brian" should include + | share_with | %username% | + | file_target | /FOLDER | + | path | /FOLDER | + | permissions | all | + | uid_owner | %username% | + | displayname_owner | | + | item_type | folder | + | mimetype | httpd/unix-directory | + | storage_id | ANY_VALUE | + | share_type | user | + And the fields of the last response should not include + | share_with_displayname | %displayname% | + Examples: + | ocs_api_version | ocs_status_code | + | 1 | 100 | + | 2 | 200 | + + @issue-ocis-reva-372 @issue-ocis-reva-243 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: sharing subfolder of already shared folder, GET result is correct + Given using OCS API version "" + And these users have been created with default attributes and without skeleton files: + | username | + | Brian | + | Carol | + | David | + | Emily | + And user "Alice" has created folder "/folder1" + And user "Alice" has shared folder "/folder1" with user "Brian" + And user "Alice" has shared folder "/folder1" with user "Carol" + And user "Alice" has created folder "/folder1/folder2" + And user "Alice" has shared folder "/folder1/folder2" with user "David" + And user "Alice" has shared folder "/folder1/folder2" with user "Emily" + When user "Alice" sends HTTP method "GET" to OCS API endpoint "/apps/files_sharing/api/v1/shares" + Then the OCS status code should be "" + And the HTTP status code should be "200" + And the response should contain 4 entries + And folder "/folder1" should be included as path in the response + # And folder "/folder1/folder2" should be included as path in the response + And folder "/folder2" should be included as path in the response + And user "Alice" sends HTTP method "GET" to OCS API endpoint "/apps/files_sharing/api/v1/shares?path=/folder1/folder2" + And the response should contain 2 entries + And folder "/folder1" should not be included as path in the response + # And folder "/folder1/folder2" should be included as path in the response + And folder "/folder2" should be included as path in the response + Examples: + | ocs_api_version | ocs_status_code | + | 1 | 100 | + | 2 | 200 | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiShareManagementBasic-deleteShare.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiShareManagementBasic-deleteShare.feature new file mode 100644 index 0000000000..3de47db441 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiShareManagementBasic-deleteShare.feature @@ -0,0 +1,17 @@ +@api @files_sharing-app-required @issue-ocis-reva-243 +Feature: sharing + + @issue-ocis-reva-356 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: delete a share + Given user "Alice" has been created with default attributes and skeleton files + And user "Brian" has been created with default attributes and without skeleton files + And using OCS API version "" + And user "Alice" has shared file "textfile0.txt" with user "Brian" + When user "Alice" deletes the last share using the sharing API + Then the OCS status code should be "" + And the HTTP status code should be "200" + Examples: + | ocs_api_version | ocs_status_code | + | 1 | 100 | + | 2 | 200 | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiShareOperations-accessToShare.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiShareOperations-accessToShare.feature new file mode 100644 index 0000000000..afcc2da740 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiShareOperations-accessToShare.feature @@ -0,0 +1,23 @@ +@api @files_sharing-app-required +Feature: sharing + + Background: + Given these users have been created with default attributes and skeleton files: + | username | + | Alice | + | Brian | + + @issue-ocis-reva-260 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Sharee can't see the share that is filtered out + Given using OCS API version "" + And user "Alice" has shared file "textfile0.txt" with user "Brian" + And user "Alice" has shared file "textfile1.txt" with user "Brian" + When user "Brian" gets all the shares shared with him that are received as file "textfile0 (2).txt" using the provisioning API + Then the OCS status code should be "" + And the HTTP status code should be "200" + And the last share_id should be included in the response + Examples: + | ocs_api_version | ocs_status_code | + | 1 | 100 | + | 2 | 200 | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiShareOperations-getWebDAVSharePermissions.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiShareOperations-getWebDAVSharePermissions.feature new file mode 100644 index 0000000000..f7881377fa --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiShareOperations-getWebDAVSharePermissions.feature @@ -0,0 +1,23 @@ +@api @files_sharing-app-required @issue-ocis-reva-47 +Feature: sharing + + Background: + Given using OCS API version "1" + And these users have been created with default attributes and without skeleton files: + | username | + | Alice | + | Brian | + + @issue-ocis-reva-47 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Empty webdav share-permissions for owned file + Given using DAV path + And user "Alice" has uploaded file with content "foo" to "/tmp.txt" + When user "Alice" gets the following properties of file "/tmp.txt" using the WebDAV API + | propertyName | + | ocs:share-permissions | + Then the single response should contain a property "ocs:share-permissions" with value "5" + Examples: + | dav-path | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiShareOperations-gettingShares.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiShareOperations-gettingShares.feature new file mode 100644 index 0000000000..2007a366a5 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiShareOperations-gettingShares.feature @@ -0,0 +1,37 @@ +@api @files_sharing-app-required +Feature: sharing + + Background: + Given these users have been created with default attributes and skeleton files: + | username | + | Alice | + | Brian | + + @issue-ocis-reva-374 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Get a share with a user that didn't receive the share + Given using OCS API version "" + And user "Carol" has been created with default attributes and without skeleton files + And user "Alice" has shared file "textfile0.txt" with user "Brian" + When user "Carol" gets the info of the last share using the sharing API + Then the OCS status code should be "998" +# Then the OCS status code should be "404" + And the HTTP status code should be "" + Examples: + | ocs_api_version | http_status_code | + | 1 | 200 | + | 2 | 404 | + + @issue-ocis-reva-372 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: getting all the shares inside the folder + Given using OCS API version "" + And user "Alice" has shared file "PARENT/parent.txt" with user "Brian" + When user "Alice" gets all the shares inside the folder "PARENT/parent.txt" using the sharing API + Then the OCS status code should be "" + And the HTTP status code should be "200" + And file "parent.txt" should be included in the response + Examples: + | ocs_api_version | ocs_status_code | + | 1 | 100 | + | 2 | 200 | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink1-createPublicLinkShare.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink1-createPublicLinkShare.feature new file mode 100644 index 0000000000..227bbce627 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink1-createPublicLinkShare.feature @@ -0,0 +1,31 @@ +@api @files_sharing-app-required @public_link_share-feature-required @skipOnOcis-EOS-Storage @issue-ocis-reva-315 @issue-ocis-reva-316 + +Feature: create a public link share + + Background: + Given user "Alice" has been created with default attributes and skeleton files + + @issue-37605 @skipOnOcis-OCIS-Storage + # after fixing all issues make the oC10 scenario like this one, and delete this scenario + Scenario: Get the mtime of a file inside a folder shared by public link using new webDAV version (run on OCIS) + Given user "Alice" has created folder "testFolder" + And user "Alice" has created a public link share with settings + | path | /testFolder | + | permissions | read,update,create,delete | + When the public uploads file "file.txt" to the last shared folder with mtime "Thu, 08 Aug 2019 04:18:13 GMT" using the new public WebDAV API + Then as "Alice" file "testFolder/file.txt" should exist + And as "Alice" the mtime of the file "testFolder/file.txt" should be "Thu, 08 Aug 2019 04:18:13 GMT" + And the mtime of file "file.txt" in the last shared public link using the WebDAV API should be "Thu, 08 Aug 2019 04:18:13 GMT" + + @issue-37605 @skipOnOcis-OCIS-Storage + # after fixing all issues make the oC10 scenario like this one, and delete this scenario + Scenario: overwriting a file changes its mtime (new public webDAV API) (run on OCIS) + Given user "Alice" has created folder "testFolder" + When user "Alice" uploads file with content "uploaded content for file name ending with a dot" to "testFolder/file.txt" using the WebDAV API + And user "Alice" has created a public link share with settings + | path | /testFolder | + | permissions | read,update,create,delete | + And the public uploads file "file.txt" to the last shared folder with mtime "Thu, 08 Aug 2019 04:18:13 GMT" using the new public WebDAV API + Then as "Alice" file "/testFolder/file.txt" should exist + And as "Alice" the mtime of the file "testFolder/file.txt" should be "Thu, 08 Aug 2019 04:18:13 GMT" + And the mtime of file "file.txt" in the last shared public link using the WebDAV API should be "Thu, 08 Aug 2019 04:18:13 GMT" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink2-copyFromPublicLink.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink2-copyFromPublicLink.feature new file mode 100644 index 0000000000..c364374c8c --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink2-copyFromPublicLink.feature @@ -0,0 +1,67 @@ +@api @files_sharing-app-required @public_link_share-feature-required @issue-ocis-reva-310 +Feature: copying from public link share + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has created folder "/PARENT" + And the administrator has enabled DAV tech_preview + + @issue-ocis-reva-373 @issue-core-37683 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Copy folder within a public link folder to the same folder name as an already existing file + Given user "Alice" has created folder "/PARENT/testFolder" + And user "Alice" has uploaded file with content "some data" to "/PARENT/testFolder/testfile.txt" + And user "Alice" has uploaded file with content "some data 1" to "/PARENT/copy1.txt" + And user "Alice" has created a public link share with settings + | path | /PARENT | + | permissions | read,update,create,delete | + When the public copies folder "/testFolder" to "/copy1.txt" using the new public WebDAV API + Then the HTTP status code should be "204" + And as "Alice" folder "/PARENT/testFolder" should exist + And as "Alice" file "/PARENT/copy1.txt" should exist + And the content of file "/PARENT/testFolder/testfile.txt" for user "Alice" should be "some data" + And the content of file "/PARENT/copy1.txt" for user "Alice" should be "some data 1" + + @issue-ocis-reva-373 @issue-core-37683 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Copy file within a public link folder to a file with name same as an existing folder + Given user "Alice" has uploaded file with content "some data" to "/PARENT/testfile.txt" + And user "Alice" has created folder "/PARENT/new-folder" + And user "Alice" has uploaded file with content "some data 1" to "/PARENT/new-folder/testfile1.txt" + And user "Alice" has created a public link share with settings + | path | /PARENT | + | permissions | read,update,create,delete | + When the public copies file "/testfile.txt" to "/new-folder" using the new public WebDAV API + Then the HTTP status code should be "204" + And as "Alice" file "/PARENT/testfile.txt" should exist + And as "Alice" file "/PARENT/new-folder" should exist + And the content of file "/PARENT/testfile.txt" for user "Alice" should be "some data" + + @issue-ocis-reva-368 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Copy file within a public link folder to a file with unusual destination names + Given user "Alice" has uploaded file with content "some data" to "/PARENT/testfile.txt" + And user "Alice" has created a public link share with settings + | path | /PARENT | + | permissions | read,update,create,delete | + When the public copies file "/testfile.txt" to "/" using the new public WebDAV API + Then the HTTP status code should be "204" + And as "Alice" file "/PARENT/" should exist + And the content of file "/PARENT/" for user "Alice" should be "some data" + Examples: + | destination-file-name | + | testfile.txt | + | | + + @issue-ocis-reva-368 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Copy folder within a public link folder to a folder with unusual destination names + Given user "Alice" has created folder "/PARENT/testFolder" + And user "Alice" has uploaded file with content "some data" to "/PARENT/testFolder/testfile.txt" + And user "Alice" has created a public link share with settings + | path | /PARENT | + | permissions | read,update,create,delete | + When the public copies folder "/testFolder" to "/testFolder" using the new public WebDAV API + Then the HTTP status code should be "204" + And as "Alice" folder "/PARENT/testFolder" should exist + And the content of file "/PARENT/testFolder/testfile.txt" for user "Alice" should be "some data" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink2-updatePublicLinkShare.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink2-updatePublicLinkShare.feature new file mode 100644 index 0000000000..e14ed5e6af --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink2-updatePublicLinkShare.feature @@ -0,0 +1,47 @@ +@api @files_sharing-app-required @public_link_share-feature-required @issue-ocis-reva-252 +Feature: update a public link share + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and skeleton files + + @issue-ocis-reva-243 @issue-ocis-reva-349 @issue-37653 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: API responds with a full set of parameters when owner changes the expireDate of a public share + Given using OCS API version "" + When user "Alice" creates a public link share using the sharing API with settings + | path | FOLDER | + And user "Alice" updates the last share using the sharing API with + | expireDate | +3 days | + Then the OCS status code should be "" + And the OCS status message should be "OK" + And the HTTP status code should be "200" + And the fields of the last response to user "Alice" should include + | id | A_STRING | + | share_type | public_link | + | uid_owner | %username% | + | displayname_owner | %displayname% | + | permissions | read | + | stime | A_NUMBER | + | parent | | + | expiration | A_STRING | + | token | A_STRING | + | uid_file_owner | %username% | + | displayname_file_owner | %displayname% | + | additional_info_owner | | + | additional_info_file_owner | | + | state | 0 | + | item_type | folder | + | item_source | A_STRING | + | path | /FOLDER | + | mimetype | httpd/unix-directory | + | storage_id | A_STRING | + | storage | A_NUMBER | + | file_source | A_STRING | + | file_target | /FOLDER | + | mail_send | 0 | + | name | | + Examples: + | ocs_api_version | ocs_status_code | + | 1 | 100 | + | 2 | 200 | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink2-uploadToPublicLinkShare.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink2-uploadToPublicLinkShare.feature new file mode 100644 index 0000000000..320ce525b6 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiSharePublicLink2-uploadToPublicLinkShare.feature @@ -0,0 +1,17 @@ +@api @files_sharing-app-required @public_link_share-feature-required @skipOnOcis-EOS-Storage @issue-ocis-reva-315 @issue-ocis-reva-316 + +Feature: upload to a public link share + + Background: + Given user "Alice" has been created with default attributes and skeleton files + + @issue-ocis-reva-290 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Uploading file to a public upload-only share that was deleted does not work + Given the administrator has enabled DAV tech_preview + And user "Alice" has created a public link share with settings + | path | FOLDER | + | permissions | create | + When user "Alice" deletes file "/FOLDER" using the WebDAV API + And the public uploads file "does-not-matter.txt" with content "does not matter" using the new public WebDAV API + Then the HTTP status code should be "500" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiShareUpdate-updateShare.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiShareUpdate-updateShare.feature new file mode 100644 index 0000000000..f44db6d51e --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiShareUpdate-updateShare.feature @@ -0,0 +1,124 @@ +@api @files_sharing-app-required +Feature: sharing + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and skeleton files + + @skipOnOcis-EOS-Storage @toFixOnOCIS @issue-ocis-reva-243 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Share ownership change after moving a shared file to another share + Given these users have been created with default attributes and without skeleton files: + | username | + | Brian | + | Carol | + And user "Alice" has created folder "/Alice-folder" + And user "Alice" has created folder "/Alice-folder/folder2" + And user "Carol" has created folder "/Carol-folder" + And user "Alice" has shared folder "/Alice-folder" with user "Brian" with permissions "all" + And user "Carol" has shared folder "/Carol-folder" with user "Brian" with permissions "all" + When user "Brian" moves folder "/Alice-folder/folder2" to "/Carol-folder/folder2" using the WebDAV API + And user "Carol" gets the info of the last share using the sharing API + # Note: in the following fields, file_parent has been removed because OCIS does not report that + Then the fields of the last response to user "Carol" sharing with user "Brian" should include + | id | A_STRING | + | item_type | folder | + | item_source | A_STRING | + | share_type | user | + | file_source | A_STRING | + | file_target | /Carol-folder | + | permissions | all | + | stime | A_NUMBER | + | storage | A_STRING | + | mail_send | 0 | + | uid_owner | %username% | + | displayname_owner | %displayname% | + | mimetype | httpd/unix-directory | + # Really folder2 should be gone from Alice-folder and be found in Carol-folder + # like in these 2 suggested steps: + # And as "Alice" folder "/Alice-folder/folder2" should not exist + # And as "Carol" folder "/Carol-folder/folder2" should exist + # + # But this happens on OCIS: + And as "Alice" folder "/Alice-folder/folder2" should exist + And as "Carol" folder "/Carol-folder/folder2" should not exist + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @toFixOnOCIS @issue-ocis-reva-243 + # same as oC10 core Scenario but without displayname_owner because EOS does not report it + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Share ownership change after moving a shared file to another share + Given these users have been created with default attributes and without skeleton files: + | username | + | Brian | + | Carol | + And user "Alice" has created folder "/Alice-folder" + And user "Alice" has created folder "/Alice-folder/folder2" + And user "Carol" has created folder "/Carol-folder" + And user "Alice" has shared folder "/Alice-folder" with user "Brian" with permissions "all" + And user "Carol" has shared folder "/Carol-folder" with user "Brian" with permissions "all" + When user "Brian" moves folder "/Alice-folder/folder2" to "/Carol-folder/folder2" using the WebDAV API + And user "Carol" gets the info of the last share using the sharing API + Then the fields of the last response to user "Carol" sharing with user "Brian" should include + | id | A_STRING | + | item_type | folder | + | item_source | A_STRING | + | share_type | user | + | file_source | A_STRING | + | file_target | /Carol-folder | + | permissions | all | + | stime | A_NUMBER | + | storage | A_STRING | + | mail_send | 0 | + | uid_owner | %username% | + | mimetype | httpd/unix-directory | + And as "Alice" folder "/Alice-folder/folder2" should exist + And as "Carol" folder "/Carol-folder/folder2" should not exist + + @toFixOnOCIS @toFixOnOcV10 @issue-ocis-reva-243 @issue-ocis-reva-349 @issue-ocis-reva-350 @issue-ocis-reva-352 @issue-37653 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: API responds with a full set of parameters when owner changes the permission of a share + Given using OCS API version "" + And user "Brian" has been created with default attributes and without skeleton files + And user "Alice" has created folder "/Alice-folder" + And user "Alice" has shared folder "/Alice-folder" with user "Brian" with permissions "read" + When user "Alice" updates the last share using the sharing API with + | permissions | all | + Then the OCS status code should be "" + And the OCS status message should be "OK" + And the HTTP status code should be "200" + Then the fields of the last response to user "Alice" sharing with user "Brian" should include + | id | A_STRING | + | share_type | user | + | uid_owner | %username% | + | displayname_owner | %displayname% | + | permissions | all | + | stime | A_NUMBER | + | parent | | + | expiration | | + | token | | + | uid_file_owner | %username% | + | displayname_file_owner | %displayname% | + | additional_info_owner | | + | additional_info_file_owner | | + | state | 0 | + | item_type | folder | + | item_source | A_STRING | + | path | /Alice-folder | + | mimetype | httpd/unix-directory | + | storage_id | A_STRING | + | storage | 0 | + | file_source | A_STRING | + | file_target | /Alice-folder | + | share_with | %username% | + | share_with_displayname | %displayname% | + | share_with_additional_info | | + | mail_send | 0 | + | name | | + And the fields of the last response should not include + | attributes | | +# | token | | +# | name | | + Examples: + | ocs_api_version | ocs_status_code | + | 1 | 100 | + | 2 | 200 | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiTrashbin-trashbinDelete.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiTrashbin-trashbinDelete.feature new file mode 100644 index 0000000000..419083598a --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiTrashbin-trashbinDelete.feature @@ -0,0 +1,55 @@ +@api @files_trashbin-app-required +Feature: files and folders can be deleted from the trashbin + As a user + I want to delete files and folders from the trashbin + So that I can control my trashbin space and which files are kept in that space + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "to delete" to "/textfile0.txt" + And user "Alice" has uploaded file with content "to delete" to "/textfile1.txt" + And user "Alice" has created folder "PARENT" + And user "Alice" has created folder "PARENT/CHILD" + And user "Alice" has uploaded file with content "to delete" to "/PARENT/parent.txt" + And user "Alice" has uploaded file with content "to delete" to "/PARENT/CHILD/child.txt" + + @smokeTest + @issue-product-139 + @issue-product-178 + @issue-product-179 + Scenario Outline: Trashbin cannot be emptied + # after fixing all issues delete this Scenario and use the one from oC10 core + # because of @issue-product-178 we cannot perform this test using new dav, so only old dav is being used + Given user "Alice" has uploaded file with content "file with comma" to "sample,0.txt" + And user "Alice" has uploaded file with content "file with comma" to "sample,1.txt" + And using DAV path + And user "Alice" has deleted file "" + And user "Alice" has deleted file "" + And as "Alice" file "" should exist in the trashbin + And as "Alice" file "" should exist in the trashbin + When user "Alice" empties the trashbin using the trashbin API + Then as "Alice" the file with original path "" should exist in the trashbin + And as "Alice" the file with original path "" should exist in the trashbin + Examples: + | dav-path | filename1 | filename2 | + | old | textfile0.txt | textfile1.txt | + | old | sample,0.txt | sample,1.txt | + | new | textfile0.txt | textfile1.txt | + | new | sample,0.txt | sample,1.txt | + + @smokeTest + @issue-ocis-reva-118 + @issue-product-179 + @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: delete a single file from the trashbin + Given user "Alice" has deleted file "/textfile0.txt" + And user "Alice" has deleted file "/textfile1.txt" + And user "Alice" has deleted file "/PARENT/parent.txt" + And user "Alice" has deleted file "/PARENT/CHILD/child.txt" + When user "Alice" deletes the file with original path "textfile1.txt" from the trashbin using the trashbin API + Then the HTTP status code should be "405" + And as "Alice" the file with original path "/textfile1.txt" should exist in the trashbin + But as "Alice" the file with original path "/textfile0.txt" should exist in the trashbin + And as "Alice" the file with original path "/PARENT/parent.txt" should exist in the trashbin + And as "Alice" the file with original path "/PARENT/CHILD/child.txt" should exist in the trashbin diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiVersions-fileVersions.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiVersions-fileVersions.feature new file mode 100644 index 0000000000..bea757a7e8 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiVersions-fileVersions.feature @@ -0,0 +1,125 @@ +@api @files_versions-app-required @skipOnOcis-EOS-Storage @issue-ocis-reva-275 + +Feature: dav-versions + + Background: + Given using OCS API version "2" + And using new DAV path + And user "Alice" has been created with default attributes and without skeleton files + + @issue-ocis-reva-17 @issue-ocis-reva-56 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Upload file and no version is available using various chunking methods + When user "Alice" uploads file "filesForUpload/davtest.txt" to filenames based on "/davtest.txt" with all mechanisms using the WebDAV API + Then the version folder of file "/davtest.txt-olddav-regular" for user "Alice" should contain "0" elements + Then the version folder of file "/davtest.txt-newdav-regular" for user "Alice" should contain "0" elements + And as "Alice" file "/davtest.txt-olddav-oldchunking" should not exist + And as "Alice" file "/davtest.txt-newdav-newchunking" should not exist + + @issue-ocis-reva-17 @issue-ocis-reva-56 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Upload a file twice and versions are available using various chunking methods + When user "Alice" uploads file "filesForUpload/davtest.txt" to filenames based on "/davtest.txt" with all mechanisms using the WebDAV API + And user "Alice" uploads file "filesForUpload/davtest.txt" to filenames based on "/davtest.txt" with all mechanisms using the WebDAV API + Then the version folder of file "/davtest.txt-olddav-regular" for user "Alice" should contain "1" element + And the version folder of file "/davtest.txt-newdav-regular" for user "Alice" should contain "1" element + And as "Alice" file "/davtest.txt-olddav-oldchunking" should not exist + And as "Alice" file "/davtest.txt-newdav-newchunking" should not exist + + @files_sharing-app-required + @issue-ocis-reva-243 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: sharer of a file can see the old version information when the sharee changes the content of the file + Given user "Brian" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "First content" to "sharefile.txt" + And user "Alice" has shared file "sharefile.txt" with user "Brian" + When user "Brian" has uploaded file with content "Second content" to "/sharefile.txt" + Then the HTTP status code should be "201" + And the version folder of file "/sharefile.txt" for user "Alice" should contain "0" element +# And the version folder of file "/sharefile.txt" for user "Alice" should contain "1" element + + @files_sharing-app-required + @issue-ocis-reva-243 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: sharer of a file can restore the original content of a shared file after the file has been modified by the sharee + Given user "Brian" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "First content" to "sharefile.txt" + And user "Alice" has shared file "sharefile.txt" with user "Brian" + And user "Brian" has uploaded file with content "Second content" to "/sharefile.txt" + When user "Alice" restores version index "0" of file "/sharefile.txt" using the WebDAV API +# When user "Alice" restores version index "1" of file "/sharefile.txt" using the WebDAV API + Then the HTTP status code should be "201" + And the content of file "/sharefile.txt" for user "Alice" should be "First content" + And the content of file "/sharefile.txt" for user "Brian" should be "Second content" +# And the content of file "/sharefile.txt" for user "Brian" should be "First content" + + @files_sharing-app-required + @issue-ocis-reva-243 @issue-ocis-reva-386 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Moving a file (with versions) into a shared folder as the sharee and as the sharer + Given using DAV path + And user "Brian" has been created with default attributes and without skeleton files + And user "Brian" has created folder "/testshare" + And user "Brian" has created a share with settings + | path | testshare | + | shareType | user | + | permissions | change | + | shareWith | Alice | + And user "Brian" has uploaded file with content "test data 1" to "/testfile.txt" + And user "Brian" has uploaded file with content "test data 2" to "/testfile.txt" + And user "Brian" has uploaded file with content "test data 3" to "/testfile.txt" + And user "Brian" moves file "/testfile.txt" to "/testshare/testfile.txt" using the WebDAV API + Then the HTTP status code should be "201" + And the content of file "/testshare/testfile.txt" for user "Alice" should be "" +# And the content of file "/testshare/testfile.txt" for user "Alice" should be "test data 3" + And the content of file "/testshare/testfile.txt" for user "Brian" should be "test data 3" + And as "Brian" file "/testfile.txt" should not exist + And as "Alice" file "/testshare/testfile.txt" should not exist + And the content of file "/testshare/testfile.txt" for user "Brian" should be "test data 3" +# And the version folder of file "/testshare/testfile.txt" for user "Alice" should contain "2" elements +# And the version folder of file "/testshare/testfile.txt" for user "Brian" should contain "2" elements + Examples: + | dav_version | + | old | + | new | + + @files_sharing-app-required + @issue-ocis-reva-243 @issue-ocis-reva-386 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Moving a file (with versions) out of a shared folder as the sharee and as the sharer + Given using DAV path + And user "Brian" has been created with default attributes and without skeleton files + And user "Brian" has created folder "/testshare" + And user "Brian" has uploaded file with content "test data 1" to "/testshare/testfile.txt" + And user "Brian" has uploaded file with content "test data 2" to "/testshare/testfile.txt" + And user "Brian" has uploaded file with content "test data 3" to "/testshare/testfile.txt" + And user "Brian" has created a share with settings + | path | testshare | + | shareType | user | + | permissions | change | + | shareWith | Alice | + When user "Brian" moves file "/testshare/testfile.txt" to "/testfile.txt" using the WebDAV API + Then the HTTP status code should be "201" + And the content of file "/testfile.txt" for user "Brian" should be "test data 3" + And as "Alice" file "/testshare/testfile.txt" should not exist + And as "Brian" file "/testshare/testfile.txt" should not exist +# And the version folder of file "/testfile.txt" for user "Brian" should contain "2" elements + Examples: + | dav_version | + | old | + | new | + + @skipOnStorage:ceph @files_primary_s3-issue-161 @files_sharing-app-required + @issue-ocis-reva-376 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Receiver tries get file versions of shared file from the sharer + Given user "Brian" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "textfile0" to "textfile0.txt" + And user "Alice" has uploaded file with content "version 1" to "textfile0.txt" + And user "Alice" has uploaded file with content "version 2" to "textfile0.txt" + And user "Alice" has uploaded file with content "version 3" to "textfile0.txt" + And user "Alice" has shared file "textfile0.txt" with user "Brian" + When user "Brian" tries to get versions of file "textfile0.txt" from "Alice" + Then the HTTP status code should be "207" + And the number of versions should be "4" +# And the number of versions should be "3" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove1-moveFolder.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove1-moveFolder.feature new file mode 100644 index 0000000000..6b5bc6a795 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove1-moveFolder.feature @@ -0,0 +1,45 @@ +@api @issue-ocis-reva-14 +Feature: move (rename) folder + As a user + I want to be able to move and rename folders + So that I can quickly manage my file system + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and without skeleton files + + @issue-ocis-reva-211 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Renaming a folder to a backslash is allowed + Given using DAV path + And user "Alice" has created folder "/testshare" + When user "Alice" moves folder "/testshare" to "\" using the WebDAV API + Then the HTTP status code should be "201" or "500" + Examples: + | dav_version | + | old | + | new | + + @issue-ocis-reva-211 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Renaming a folder beginning with a backslash is allowed + Given using DAV path + And user "Alice" has created folder "/testshare" + When user "Alice" moves folder "/testshare" to "\testshare" using the WebDAV API + Then the HTTP status code should be "201" or "500" + Examples: + | dav_version | + | old | + | new | + + @issue-ocis-reva-211 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Renaming a folder including a backslash encoded is allowed + Given using DAV path + And user "Alice" has created folder "/testshare" + When user "Alice" moves folder "/testshare" to "/hola\hola" using the WebDAV API + Then the HTTP status code should be "201" or "500" + Examples: + | dav_version | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove1-moveFolderToBlacklistedName.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove1-moveFolderToBlacklistedName.feature new file mode 100644 index 0000000000..3d1289d8bf --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove1-moveFolderToBlacklistedName.feature @@ -0,0 +1,22 @@ +@api @issue-ocis-reva-14 +Feature: users cannot move (rename) a folder to a blacklisted name + As an administrator + I want to be able to prevent users from moving (renaming) folders to specified names + So that I can prevent unwanted folder names existing in the cloud storage + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and without skeleton files + + @issue-ocis-reva-211 @skipOnOcis-EOS-Storage @issue-ocis-reva-269 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Renaming a folder to a name that is banned by default is allowed + Given using DAV path + And user "Alice" has created folder "/testshare" + When user "Alice" moves folder "/testshare" to "/.htaccess" using the WebDAV API + Then the HTTP status code should be "201" + And as "Alice" folder "/.htaccess" should exist + Examples: + | dav_version | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove2-moveFile.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove2-moveFile.feature new file mode 100644 index 0000000000..240a259c03 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove2-moveFile.feature @@ -0,0 +1,43 @@ +@api @issue-ocis-reva-14 +Feature: move (rename) file + As a user + I want to be able to move and rename files + So that I can manage my file system + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and skeleton files + + @issue-ocis-reva-211 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: rename a file into an invalid filename + Given using DAV path + When user "Alice" moves file "/welcome.txt" to "/a\\a" using the WebDAV API + Then the HTTP status code should be "201" + And as "Alice" file "/a\\a" should exist + Examples: + | dav_version | + | old | + | new | + + @issue-ocis-reva-211 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Renaming a file to a path with extension .part is possible + Given using DAV path + When user "Alice" moves file "/welcome.txt" to "/welcome.part" using the WebDAV API + Then the HTTP status code should be "201" + And as "Alice" file "/welcome.part" should exist + Examples: + | dav_version | + | old | + | new | + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-ocis-reva-211 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: renaming to a file with special characters + When user "Alice" moves file "/textfile0.txt" to "/" using the WebDAV API + Then the HTTP status code should be "201" + And the content of file "/" for user "Alice" should be "" + Examples: + | renamed_file | + | #oc ab?cd=ef# | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove2-moveFileToBlacklistedName.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove2-moveFileToBlacklistedName.feature new file mode 100644 index 0000000000..9f82828cff --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavMove2-moveFileToBlacklistedName.feature @@ -0,0 +1,21 @@ +@api @issue-ocis-reva-14 +Feature: users cannot move (rename) a file to a blacklisted name + As an administrator + I want to be able to prevent users from moving (renaming) files to specified file names + So that I can prevent unwanted file names existing in the cloud storage + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and skeleton files + + @issue-ocis-reva-211 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: rename a file to a filename that is banned by default + Given using DAV path + When user "Alice" moves file "/welcome.txt" to "/.htaccess" using the WebDAV API + Then the HTTP status code should be "201" + And as "Alice" file "/.htaccess" should exist + Examples: + | dav_version | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavOperations-downloadFile.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavOperations-downloadFile.feature new file mode 100644 index 0000000000..b3dd1a0a9d --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavOperations-downloadFile.feature @@ -0,0 +1,24 @@ +@api +Feature: download file + As a user + I want to be able to download files + So that I can work wih local copies of files on my client system + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file with content "ownCloud test text file 0" to "/textfile0.txt" + And user "Alice" has uploaded file with content "Welcome this is just an example file for developers." to "/welcome.txt" + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-ocis-reva-98 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Get the content-length response header of a pdf file + Given using DAV path + And user "Alice" has uploaded file "filesForUpload/simple.pdf" to "/simple.pdf" + When user "Alice" downloads file "/simple.pdf" using the WebDAV API + And the following headers should not be set + | header | + | OC-JobStatus-Location | + Examples: + | dav_version | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavOperations-refuseAccess.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavOperations-refuseAccess.feature new file mode 100644 index 0000000000..5a1df03453 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavOperations-refuseAccess.feature @@ -0,0 +1,22 @@ +@api +Feature: refuse access + As an administrator + I want to refuse access to unauthenticated and disabled users + So that I can secure the system + + Background: + Given using OCS API version "1" + + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Unauthenticated call + Given using DAV path + When an unauthenticated client connects to the dav endpoint using the WebDAV API + Then the HTTP status code should be "401" + And there should be no duplicate headers + And the following headers should be set + | header | value | + | WWW-Authenticate | Basic realm="%base_url_without_scheme%" | + Examples: + | dav_version | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavPreviews-previews.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavPreviews-previews.feature new file mode 100644 index 0000000000..08d796036c --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavPreviews-previews.feature @@ -0,0 +1,112 @@ +@api @issue-ocis-187 +Feature: previews of files downloaded through the webdav API + + Background: + Given user "Alice" has been created with default attributes and without skeleton files + + @issue-ocis-188 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: download previews with invalid width + Given user "Alice" has uploaded file "filesForUpload/lorem.txt" to "/parent.txt" + When user "Alice" downloads the preview of "/parent.txt" with width "" and height "32" using the WebDAV API + Then the HTTP status code should be "200" + Examples: + | width | + | 0 | + | 0.5 | + | -1 | + | false | + | true | + | A | + | %2F | + + @issue-ocis-188 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: download previews with invalid height + Given user "Alice" has uploaded file "filesForUpload/lorem.txt" to "/parent.txt" + When user "Alice" downloads the preview of "/parent.txt" with width "32" and height "" using the WebDAV API + Then the HTTP status code should be "200" + Examples: + | height | + | 0 | + | 0.5 | + | -1 | + | false | + | true | + | A | + | %2F | + + @issue-ocis-189 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: download previews of file types that don't support preview + Given user "Alice" has uploaded file "filesForUpload/" to "/" + When user "Alice" downloads the preview of "/" with width "32" and height "32" using the WebDAV API + Then the HTTP status code should be "200" + Examples: + | filename | newfilename | + | simple.pdf | test.pdf | + | simple.odt | test.odt | + | new-data.zip | test.zip | + + @issue-ocis-187 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: download previews of different image file types + Given user "Alice" has uploaded file "filesForUpload/" to "/" + When user "Alice" downloads the preview of "/" with width "32" and height "32" using the WebDAV API + Then the HTTP status code should be "200" + And the downloaded image should be "1240" pixels wide and "648" pixels high + Examples: + | imageName | newImageName | + | testavatar.jpg | testimage.jpg | + | testavatar.png | testimage.png | + + @issue-ocis-187 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: download previews of image after renaming it + Given user "Alice" has uploaded file "filesForUpload/testavatar.jpg" to "/testimage.jpg" + When user "Alice" moves file "/testimage.jpg" to "/testimage.txt" using the WebDAV API + And user "Alice" downloads the preview of "/testimage.txt" with width "32" and height "32" using the WebDAV API + Then the HTTP status code should be "200" + And the downloaded image should be "1240" pixels wide and "648" pixels high + + @issue-ocis-thumbnails-191 @skipOnOcis-EOS-Storage @issue-ocis-reva-308 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: download previews of other users files + Given user "Brian" has been created with default attributes and without skeleton files + And user "Alice" has uploaded file "filesForUpload/lorem.txt" to "/parent.txt" + When user "Brian" downloads the preview of "/parent.txt" of "Alice" with width "32" and height "32" using the WebDAV API + Then the HTTP status code should be "200" + + @issue-ocis-190 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: download previews of folders + Given user "Alice" has created folder "subfolder" + When user "Alice" downloads the preview of "/subfolder/" with width "32" and height "32" using the WebDAV API + Then the HTTP status code should be "501" + + @issue-ocis-192 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: Download file previews when it is disabled by the administrator + Given the administrator has updated system config key "enable_previews" with value "false" and type "boolean" + And user "Alice" has uploaded file "filesForUpload/lorem.txt" to "/parent.txt" + When user "Alice" downloads the preview of "/parent.txt" with width "32" and height "32" using the WebDAV API + Then the HTTP status code should be "200" + + @issue-ocis-193 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: unset maximum size of previews + Given user "Alice" has uploaded file "filesForUpload/lorem.txt" to "/parent.txt" + And the administrator has updated system config key "preview_max_x" with value "null" + And the administrator has updated system config key "preview_max_y" with value "null" + When user "Alice" downloads the preview of "/parent.txt" with width "32" and height "32" using the WebDAV API + Then the HTTP status code should be "200" + + @issue-ocis-193 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario: set maximum size of previews + Given user "Alice" has uploaded file "filesForUpload/lorem.txt" to "/parent.txt" + When the administrator updates system config key "preview_max_x" with value "null" using the occ command + And the administrator updates system config key "preview_max_y" with value "null" using the occ command + Then the HTTP status code should be "201" + When user "Alice" downloads the preview of "/parent.txt" with width "null" and height "null" using the WebDAV API + Then the HTTP status code should be "200" diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavProperties1-createFolder.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavProperties1-createFolder.feature new file mode 100644 index 0000000000..47a0b94ff1 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavProperties1-createFolder.feature @@ -0,0 +1,37 @@ +@api +Feature: create folder + As a user + I want to be able to create folders + So that I can organise the files in my file system + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and without skeleton files + + @issue-ocis-reva-168 @skipOnOcis-EOS-Storage @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: try to create a folder that already exists + Given using DAV path + And user "Alice" has created folder "my-data" + When user "Alice" creates folder "my-data" using the WebDAV API + Then the HTTP status code should be "405" + And as "Alice" folder "my-data" should exist + And the body of the response should be empty + Examples: + | dav_version | + | old | + | new | + + @issue-ocis-reva-168 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: try to create a folder with a name of an existing file + Given using DAV path + And user "Alice" has uploaded file with content "uploaded data" to "/my-data.txt" + When user "Alice" creates folder "my-data.txt" using the WebDAV API + Then the HTTP status code should be "405" + And the body of the response should be empty + And the content of file "/my-data.txt" for user "Alice" should be "uploaded data" + Examples: + | dav_version | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavProperties1-setFileProperties.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavProperties1-setFileProperties.feature new file mode 100644 index 0000000000..5ce403a669 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavProperties1-setFileProperties.feature @@ -0,0 +1,21 @@ +@api @issue-ocis-reva-57 +Feature: set file properties + As a user + I want to be able to set meta-information about files + So that I can reccord file meta-information (detailed requirement TBD) + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and without skeleton files + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-ocis-reva-276 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Setting custom DAV property + Given using DAV path + And user "Alice" has uploaded file "filesForUpload/textfile.txt" to "/testcustomprop.txt" + When user "Alice" sets property "very-custom-prop" with namespace "x1='http://whatever.org/ns'" of file "/testcustomprop.txt" to "veryCustomPropValue" using the WebDAV API + Then the HTTP status code should be "500" + Examples: + | dav_version | + | old | + | new | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavProperties2-getFileProperties.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavProperties2-getFileProperties.feature new file mode 100644 index 0000000000..830201e302 --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavProperties2-getFileProperties.feature @@ -0,0 +1,115 @@ +@api +Feature: get file properties + As a user + I want to be able to get meta-information about files + So that I can know file meta-information (detailed requirement TBD) + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and without skeleton files + + @issue-ocis-reva-214 @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Do a PROPFIND of various file names + Given using DAV path + And user "Alice" has uploaded file with content "uploaded content" to "" + When user "Alice" gets the properties of file "" using the WebDAV API + Then the properties response should contain an etag + And the value of the item "//d:response/d:href" in the response to user "Alice" should match "/remote\.php\//" + Examples: + | dav_version | file_name | expected_href | + | old | /C++ file.cpp | webdav\/C\+\+%20file\.cpp | + | old | /file #2.txt | webdav\/file%20%232\.txt | + | old | /file &2.txt | webdav\/file%20&2\.txt | + | new | /C++ file.cpp | dav\/files\/%username%\/C\+\+%20file\.cpp | + | new | /file #2.txt | dav\/files\/%username%\/file%20%232\.txt | + | new | /file &2.txt | dav\/files\/%username%\/file%20&2\.txt | + + @issue-ocis-reva-214 @issue-ocis-reva-265 @skipOnOcis-EOS-Storage @skipOnOcis-OCIS-Storage + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Do a PROPFIND of various file names + Given using DAV path + And user "Alice" has uploaded file with content "uploaded content" to "" + When user "Alice" gets the properties of file "" using the WebDAV API + Then the properties response should contain an etag + And the value of the item "//d:response/d:href" in the response to user "Alice" should match "/remote\.php\//" + Examples: + | dav_version | file_name | expected_href | + | old | /file ?2.txt | webdav\/file%20%3F2\.txt | + | new | /file ?2.txt | dav\/files\/%username%\/file%20%3F2\.txt | + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-ocis-reva-265 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: upload a file to content + Given using DAV path + When user "Alice" uploads file with content "uploaded content" to "" using the WebDAV API + Then the HTTP status code should be "500" + Examples: + | dav_version | file_name | + | old | /file ?2.txt | + | new | /file ?2.txt | + + @issue-ocis-reva-214 @skipOnOcis-OCIS-Storage @issue-ocis-reva-471 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Do a PROPFIND of various folder names + Given using DAV path + And user "Alice" has created folder "" + And user "Alice" has uploaded file with content "uploaded content" to "/file1.txt" + And user "Alice" has uploaded file with content "uploaded content" to "/file2.txt" + When user "Alice" gets the properties of folder "" with depth 1 using the WebDAV API + Then the value of the item "//d:response[1]/d:href" in the response to user "Alice" should match "/remote\.php\/\//" + And the value of the item "//d:response[2]/d:href" in the response to user "Alice" should match "/remote\.php\/\/file1.txt/" + And the value of the item "//d:response[3]/d:href" in the response to user "Alice" should match "/remote\.php\/\/file2.txt/" + Examples: + | dav_version | folder_name | expected_href | + | old | /upload | webdav\/upload | + | old | /strängé folder | webdav\/str%C3%A4ng%C3%A9%20folder | + | old | /C++ folder | webdav\/C\+\+%20folder | + | old | /नेपाली | webdav\/%E0%A4%A8%E0%A5%87%E0%A4%AA%E0%A4%BE%E0%A4%B2%E0%A5%80 | + | old | /folder #2.txt | webdav\/folder%20%232\.txt | + | old | /folder &2.txt | webdav\/folder%20&2\.txt | + | new | /upload | dav\/files\/%username%\/upload | + | new | /strängé folder | dav\/files\/%username%\/str%C3%A4ng%C3%A9%20folder | + | new | /C++ folder | dav\/files\/%username%\/C\+\+%20folder | + | new | /नेपाली | dav\/files\/%username%\/%E0%A4%A8%E0%A5%87%E0%A4%AA%E0%A4%BE%E0%A4%B2%E0%A5%80 | + | new | /folder #2.txt | dav\/files\/%username%\/folder%20%232\.txt | + | new | /folder &2.txt | dav\/files\/%username%\/folder%20&2\.txt | + + @issue-ocis-reva-214 @skipOnOcis-EOS-Storage @issue-ocis-reva-265 @skipOnOcis-OCIS-Storage @issue-ocis-reva-471 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Do a PROPFIND of various folder names + Given using DAV path + And user "Alice" has created folder "" + And user "Alice" has uploaded file with content "uploaded content" to "/file1.txt" + And user "Alice" has uploaded file with content "uploaded content" to "/file2.txt" + When user "Alice" gets the properties of folder "" with depth 1 using the WebDAV API + Then the value of the item "//d:response[1]/d:href" in the response to user "Alice" should match "/remote\.php\/\//" + And the value of the item "//d:response[2]/d:href" in the response to user "Alice" should match "/remote\.php\/\/file1.txt/" + And the value of the item "//d:response[3]/d:href" in the response to user "Alice" should match "/remote\.php\/\/file2.txt/" + Examples: + | dav_version | folder_name | expected_href | + | old | /folder ?2.txt | webdav\/folder%20%3F2\.txt | + | new | /folder ?2.txt | dav\/files\/%username%\/folder%20%3F2\.txt | + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-ocis-reva-265 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Do a PROPFIND of various folder names + Given using DAV path + And user "Alice" has created folder "/folder ?2.txt" + When user "Alice" uploads to these filenames with content "uploaded content" using the webDAV API then the results should be as listed + | filename | http-code | exists | + | /folder ?2.txt/file1.txt | 500 | no | + Examples: + | dav_version | + | old | + | new | + + @issue-ocis-reva-163 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: Do a PROPFIND to a non-existing URL + And user "Alice" requests "" with "PROPFIND" using basic auth + Then the body of the response should be empty + Examples: + | url | + | /remote.php/dav/files/does-not-exist | + | /remote.php/dav/does-not-exist | diff --git a/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavUpload1-uploadFile.feature b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavUpload1-uploadFile.feature new file mode 100644 index 0000000000..c3b133ae8f --- /dev/null +++ b/reva/tests/acceptance/features/apiOcisSpecific/apiWebdavUpload1-uploadFile.feature @@ -0,0 +1,39 @@ +@api +Feature: upload file + As a user + I want to be able to upload files + So that I can store and share files between multiple client systems + + Background: + Given using OCS API version "1" + And user "Alice" has been created with default attributes and without skeleton files + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-ocis-reva-265 + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: upload a file and check download content + Given using DAV path + When user "Alice" uploads file with content "uploaded content" to using the WebDAV API + Then the content of file for user "Alice" should be "" + Examples: + | dav_version | file_name | + | old | "file ?2.txt" | + | new | "file ?2.txt" | + + @skipOnOcis-OC-Storage @skipOnOcis-OCIS-Storage @issue-product-127 + # this scenario passes/fails intermittently on OC storage, so do not run it in CI + # after fixing all issues delete this Scenario and use the one from oC10 core + Scenario Outline: uploading a file inside a folder changes its etag + Given using DAV path + And user "Alice" has created folder "/upload" + And user "Alice" has stored etag of element "/" + When user "Alice" uploads file with content "uploaded content" to "/upload/file.txt" using the WebDAV API + Then the content of file "/upload/file.txt" for user "Alice" should be "uploaded content" +# And the etag of element "/" of user "Alice" should have changed + And the etag of element "/" of user "Alice" should not have changed + Examples: + | dav_version | element | + | old | | + | old | upload | + | new | | + # this example is intermittent - sometimes the etag changes and sometimes not + # | new | upload | diff --git a/reva/tests/acceptance/features/bootstrap/RevaContext.php b/reva/tests/acceptance/features/bootstrap/RevaContext.php new file mode 100644 index 0000000000..2a41222029 --- /dev/null +++ b/reva/tests/acceptance/features/bootstrap/RevaContext.php @@ -0,0 +1,40 @@ +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/reva/tests/acceptance/features/bootstrap/bootstrap.php b/reva/tests/acceptance/features/bootstrap/bootstrap.php new file mode 100644 index 0000000000..1e2175b1ba --- /dev/null +++ b/reva/tests/acceptance/features/bootstrap/bootstrap.php @@ -0,0 +1,14 @@ +addPsr4( + "", $pathToCore . "/tests/acceptance/features/bootstrap", true +); + +$classLoader->register(); diff --git a/reva/tests/config/config.json b/reva/tests/config/config.json new file mode 100644 index 0000000000..99a71225c0 --- /dev/null +++ b/reva/tests/config/config.json @@ -0,0 +1,19 @@ +{ + "server": "http://reva-server:9140", + "theme": "owncloud", + "version": "0.1.0", + "openIdConnect": { + "metadata_url": "https://konnectd:9130/.well-known/openid-configuration", + "authority": "https://konnectd:9130", + "client_id": "phoenix", + "response_type": "code", + "scope": "openid profile email" + }, + "apps": [ + "files", + "draw-io", + "pdf-viewer", + "markdown-editor", + "media-viewer" + ] +} diff --git a/reva/tests/config/identifier-registration.yml b/reva/tests/config/identifier-registration.yml new file mode 100644 index 0000000000..0515385af4 --- /dev/null +++ b/reva/tests/config/identifier-registration.yml @@ -0,0 +1,16 @@ +--- + +# OpenID Connect client registry. +clients: + - id: phoenix + name: OCIS + application_type: web + insecure: yes + trusted: yes + redirect_uris: + - http://phoenix:9100/oidc-callback.html + - http://phoenix:9100/ + origins: + - http://phoenix:9100 + +authorities: diff --git a/reva/tests/data/testusers.ldif b/reva/tests/data/testusers.ldif new file mode 100644 index 0000000000..3e9f7e941c --- /dev/null +++ b/reva/tests/data/testusers.ldif @@ -0,0 +1,49 @@ +dn: ou=TestUsers,dc=owncloud,dc=com +objectclass: top +objectclass: organizationalUnit +ou: TestUsers + +dn: ou=TestGroups,dc=owncloud,dc=com +objectclass: top +objectclass: organizationalUnit +ou: TestGroups + +dn: cn=grp1,ou=TestGroups,dc=owncloud,dc=com +cn: grp1 +gidnumber: 500 +memberuid: tu1 +memberuid: tu2 +objectclass: top +objectclass: posixGroup + +dn: uid=tu1,ou=TestUsers,dc=owncloud,dc=com +cn: TU1 +sn: Owane +displayname: User Owane +gecos: TU1 +gidnumber: 5000 +givenname: TU1 +homedirectory: /home/openldap/tu1 +loginshell: /bin/bash +mail: tu1@example.org +objectclass: posixAccount +objectclass: inetOrgPerson +uid: tu1 +uidnumber: 30001 +userpassword: 1234 + +dn: uid=tu2,ou=TestUsers,dc=owncloud,dc=com +cn: TU2 +sn: Towu +displayname: User Towu +gecos: TU2 +gidnumber: 5000 +givenname: TU2 +homedirectory: /home/openldap/tu2 +loginshell: /bin/bash +mail: tu2@example.org +objectclass: posixAccount +objectclass: inetOrgPerson +uid: tu2 +uidnumber: 30002 +userpassword: AaBb2Cc3Dd4 diff --git a/reva/tools.go b/reva/tools.go new file mode 100644 index 0000000000..fce36f2420 --- /dev/null +++ b/reva/tools.go @@ -0,0 +1,8 @@ +// +build tools + +package main + +import ( + _ "github.com/owncloud/flaex" + _ "github.com/restic/calens" +) diff --git a/reva/vendor-bin/behat/composer.json b/reva/vendor-bin/behat/composer.json new file mode 100644 index 0000000000..807eb10a51 --- /dev/null +++ b/reva/vendor-bin/behat/composer.json @@ -0,0 +1,23 @@ +{ + "config" : { + "platform": { + "php": "7.2" + } + }, + "require": { + "behat/behat": "^3.7", + "behat/mink": "1.7.1", + "behat/mink-extension": "^2.3", + "behat/mink-goutte-driver": "^1.2", + "behat/mink-selenium2-driver": "^1.4", + "ciaranmcnulty/behat-stepthroughextension" : "dev-master", + "jarnaiz/behat-junit-formatter": "^1.3", + "rdx/behat-variables": "^1.2", + "sensiolabs/behat-page-object-extension": "^2.3", + "symfony/translation": "^4.4", + "sabre/xml": "^2.2", + "guzzlehttp/guzzle": "^6.5", + "phpunit/phpunit": "^8.5", + "laminas/laminas-ldap": "^2.10" + } +}